diff --git a/locales/en.json b/locales/en.json index bb3bf221..85b026b7 100644 --- a/locales/en.json +++ b/locales/en.json @@ -543,6 +543,27 @@ "valuePlaceholder": "Value", "add": "Add" }, + "triggerWords": { + "label": "Trigger Words", + "noTriggerWordsNeeded": "No trigger word needed", + "edit": "Edit trigger words", + "cancel": "Cancel editing", + "save": "Save changes", + "addPlaceholder": "Type to add or click suggestions below", + "copyWord": "Copy trigger word", + "deleteWord": "Delete trigger word", + "suggestions": { + "noSuggestions": "No suggestions available", + "noTrainedWords": "No trained words or class tokens found in this model. You can manually enter trigger words.", + "classToken": "Class Token", + "classTokenDescription": "Add to your prompt for best results", + "wordSuggestions": "Word Suggestions", + "wordsFound": "{count} words found", + "loading": "Loading suggestions...", + "frequency": "Frequency", + "alreadyAdded": "Already added" + } + }, "description": { "noDescription": "No model description available", "failedToLoad": "Failed to load model description", diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 7d24b2fe..2a6a58a8 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -543,6 +543,27 @@ "valuePlaceholder": "值", "add": "添加" }, + "triggerWords": { + "label": "触发词", + "noTriggerWordsNeeded": "无需触发词", + "edit": "编辑触发词", + "cancel": "取消编辑", + "save": "保存更改", + "addPlaceholder": "输入以添加或点击下方建议", + "copyWord": "复制触发词", + "deleteWord": "删除触发词", + "suggestions": { + "noSuggestions": "暂无可用建议", + "noTrainedWords": "此模型未找到训练词或类别标记。您可以手动输入触发词。", + "classToken": "类别标记", + "classTokenDescription": "添加到提示词以获得最佳效果", + "wordSuggestions": "词语建议", + "wordsFound": "已找到 {count} 个词", + "loading": "正在加载建议...", + "frequency": "出现频率", + "alreadyAdded": "已添加" + } + }, "description": { "noDescription": "无模型描述信息", "failedToLoad": "加载模型描述失败", diff --git a/static/js/api/baseModelApi.js b/static/js/api/baseModelApi.js index 6e0593d5..3c057f23 100644 --- a/static/js/api/baseModelApi.js +++ b/static/js/api/baseModelApi.js @@ -1,6 +1,6 @@ import { state, getCurrentPageState } from '../state/index.js'; import { showToast } from '../utils/uiHelpers.js'; -import { translate } from '../utils/i18n.js'; +import { translate } from '../utils/i18nHelpers.js'; import { getStorageItem, getSessionItem, saveMapToStorage } from '../utils/storageHelpers.js'; import { getCompleteApiConfig, diff --git a/static/js/components/shared/TriggerWords.js b/static/js/components/shared/TriggerWords.js index c73dacfe..28d1f173 100644 --- a/static/js/components/shared/TriggerWords.js +++ b/static/js/components/shared/TriggerWords.js @@ -4,6 +4,7 @@ * Moved to shared directory for consistency */ import { showToast, copyToClipboard } from '../../utils/uiHelpers.js'; +import { translate } from '../../utils/i18nHelpers.js'; import { getModelApiClient } from '../../api/modelApiFactory.js'; /** @@ -48,9 +49,9 @@ function createSuggestionDropdown(trainedWords, classTokens, existingWords = []) // No suggestions case if ((!trainedWords || trainedWords.length === 0) && !classTokens) { - header.innerHTML = 'No suggestions available'; + header.innerHTML = `${translate('modals.model.triggerWords.suggestions.noSuggestions')}`; dropdown.appendChild(header); - dropdown.innerHTML += '
No trained words or class tokens found in this model. You can manually enter trigger words.
'; + dropdown.innerHTML += `
${translate('modals.model.triggerWords.suggestions.noTrainedWords')}
`; return dropdown; } @@ -65,8 +66,8 @@ function createSuggestionDropdown(trainedWords, classTokens, existingWords = []) const classTokensHeader = document.createElement('div'); classTokensHeader.className = 'metadata-suggestions-header'; classTokensHeader.innerHTML = ` - Class Token - Add to your prompt for best results + ${translate('modals.model.triggerWords.suggestions.classToken')} + ${translate('modals.model.triggerWords.suggestions.classTokenDescription')} `; dropdown.appendChild(classTokensHeader); @@ -77,13 +78,13 @@ function createSuggestionDropdown(trainedWords, classTokens, existingWords = []) // Create a special item for the class token const tokenItem = document.createElement('div'); tokenItem.className = `metadata-suggestion-item class-token-item ${existingWords.includes(classTokens) ? 'already-added' : ''}`; - tokenItem.title = `Class token: ${classTokens}`; + tokenItem.title = `${translate('modals.model.triggerWords.suggestions.classToken')}: ${classTokens}`; tokenItem.innerHTML = ` ${classTokens}
- Class Token + ${translate('modals.model.triggerWords.suggestions.classToken')} ${existingWords.includes(classTokens) ? - '' : ''} + `` : ''}
`; @@ -119,8 +120,8 @@ function createSuggestionDropdown(trainedWords, classTokens, existingWords = []) // Add trained words header if we have any if (trainedWords && trainedWords.length > 0) { header.innerHTML = ` - Word Suggestions - ${trainedWords.length} words found + ${translate('modals.model.triggerWords.suggestions.wordSuggestions')} + ${translate('modals.model.triggerWords.suggestions.wordsFound', { count: trainedWords.length })} `; dropdown.appendChild(header); @@ -139,7 +140,7 @@ function createSuggestionDropdown(trainedWords, classTokens, existingWords = []) ${word}
${frequency} - ${isAdded ? '' : ''} + ${isAdded ? `` : ''}
`; @@ -166,7 +167,7 @@ function createSuggestionDropdown(trainedWords, classTokens, existingWords = []) dropdown.appendChild(container); } else if (!classTokens) { // If we have neither class tokens nor trained words - dropdown.innerHTML += '
No word suggestions found in this model. You can manually enter trigger words.
'; + dropdown.innerHTML += `
${translate('modals.model.triggerWords.suggestions.noTrainedWords')}
`; } return dropdown; @@ -182,22 +183,22 @@ export function renderTriggerWords(words, filePath) { if (!words.length) return `
- -
- No trigger word needed + ${translate('modals.model.triggerWords.noTriggerWordsNeeded')}
`; @@ -205,20 +206,20 @@ export function renderTriggerWords(words, filePath) { return `
- -
${words.map(word => ` -
+
${word} -
@@ -226,12 +227,12 @@ export function renderTriggerWords(words, filePath) {
`; @@ -265,7 +266,7 @@ export function setupTriggerWordsEditMode() { if (isEditMode) { this.innerHTML = ''; // Change to cancel icon - this.title = "Cancel editing"; + this.title = translate('modals.model.triggerWords.cancel'); // Store original trigger words for potential restoration originalTriggerWords = Array.from(triggerWordTags).map(tag => tag.dataset.word); @@ -302,7 +303,7 @@ export function setupTriggerWordsEditMode() { // Add loading indicator const loadingIndicator = document.createElement('div'); loadingIndicator.className = 'metadata-loading'; - loadingIndicator.innerHTML = ' Loading suggestions...'; + loadingIndicator.innerHTML = ` ${translate('modals.model.triggerWords.suggestions.loading')}`; addForm.appendChild(loadingIndicator); // Get currently added trigger words @@ -329,7 +330,7 @@ export function setupTriggerWordsEditMode() { } else { this.innerHTML = ''; // Change back to edit icon - this.title = "Edit trigger words"; + this.title = translate('modals.model.triggerWords.edit'); // Hide edit controls and input form editControls.style.display = 'none';