New Feature: Enhance Translation with Keyword Group

新功能:使用关键词组增强翻译功能
This commit is contained in:
Physton
2023-08-17 11:40:38 +08:00
parent 0e6a7432c4
commit fbfd2a5075
9 changed files with 309 additions and 107 deletions

View File

@@ -148,7 +148,10 @@
"lora_blacklist_list": "Lora 黑名单列表", "lora_blacklist_list": "Lora 黑名单列表",
"lycoris_blacklist_list": "Lycoris 黑名单列表", "lycoris_blacklist_list": "Lycoris 黑名单列表",
"embedding_blacklist_list": "Embedding 黑名单列表", "embedding_blacklist_list": "Embedding 黑名单列表",
"one_keyword_per_line": "每行一个关键词" "one_keyword_per_line": "每行一个关键词",
"Keyword_group": "关键词组",
"enhance_translation_use_keyword_group": "使用关键词组增强翻译功能",
"enhance_translation_use_Keyword_group_desc": "<p>关键词组文件位于 group_tags 目录中。</p><p>启用该功能后,优先使用 yaml 文件中的内容进行翻译匹配。如果没有匹配到,再使用翻译接口进行翻译。</p><p>你可以前往 <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> 查看 group_tags 中文件的具体说明。</p>"
} }
}, },
{ {
@@ -298,7 +301,10 @@
"lora_blacklist_list": "Lora 黑名單列表", "lora_blacklist_list": "Lora 黑名單列表",
"lycoris_blacklist_list": "Lycoris 黑名單列表", "lycoris_blacklist_list": "Lycoris 黑名單列表",
"embedding_blacklist_list": "Embedding 黑名單列表", "embedding_blacklist_list": "Embedding 黑名單列表",
"one_keyword_per_line": "每行一個關鍵詞" "one_keyword_per_line": "每行一個關鍵詞",
"Keyword_group": "關鍵詞組",
"enhance_translation_use_keyword_group": "使用關鍵詞組增強翻譯功能",
"enhance_translation_use_Keyword_group_desc": "<p>關鍵詞組文件位於 group_tags 目錄中。</p><p>啟用該功能後,優先使用 yaml 文件中的內容進行翻譯匹配。如果沒有匹配到,再使用翻譯接口進行翻譯。</p><p>你可以前往 <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> 查看 group_tags 中文件的具體說明。</p>"
} }
}, },
{ {
@@ -448,7 +454,10 @@
"lora_blacklist_list": "Lora 黑名單清單", "lora_blacklist_list": "Lora 黑名單清單",
"lycoris_blacklist_list": "Lycoris 黑名單清單", "lycoris_blacklist_list": "Lycoris 黑名單清單",
"embedding_blacklist_list": "Embedding 黑名單清單", "embedding_blacklist_list": "Embedding 黑名單清單",
"one_keyword_per_line": "每行一個關鍵字" "one_keyword_per_line": "每行一個關鍵字",
"Keyword_group": "關鍵詞組",
"enhance_translation_use_keyword_group": "使用關鍵詞組增強翻譯功能",
"enhance_translation_use_Keyword_group_desc": "<p>關鍵詞組文件位於 group_tags 目錄中。</p><p>啟用該功能後,優先使用 yaml 文件中的內容進行翻譯匹配。如果沒有匹配到,再使用翻譯接口進行翻譯。</p><p>你可以前往 <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> 查看 group_tags 中文件的具體說明。</p>"
} }
}, },
{ {
@@ -598,7 +607,10 @@
"lora_blacklist_list": "Lora Blacklist", "lora_blacklist_list": "Lora Blacklist",
"lycoris_blacklist_list": "Lycoris Blacklist", "lycoris_blacklist_list": "Lycoris Blacklist",
"embedding_blacklist_list": "Embedding Blacklist", "embedding_blacklist_list": "Embedding Blacklist",
"one_keyword_per_line": "One keyword per line" "one_keyword_per_line": "One keyword per line",
"Keyword_group": "Keyword Group",
"enhance_translation_use_keyword_group": "Enhance Translation with Keyword Group",
"enhance_translation_use_Keyword_group_desc": "<p>The keyword group file is located in the group_tags directory.</p><p>When this feature is enabled, the contents in the YAML file are prioritized for translation matching. If no match is found, the translation interface is used.</p><p>You can visit <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> for specific instructions on the files in the group_tags directory.</p>"
} }
}, },
{ {
@@ -759,7 +771,10 @@
"lora_blacklist_list": "قائمة Lora السوداء", "lora_blacklist_list": "قائمة Lora السوداء",
"lycoris_blacklist_list": "قائمة Lycoris السوداء", "lycoris_blacklist_list": "قائمة Lycoris السوداء",
"embedding_blacklist_list": "قائمة Embedding السوداء", "embedding_blacklist_list": "قائمة Embedding السوداء",
"one_keyword_per_line": "كلمة رئيسية واحدة في كل سطر" "one_keyword_per_line": "كلمة رئيسية واحدة في كل سطر",
"Keyword_group": "مجموعة الكلمات الرئيسية",
"enhance_translation_use_keyword_group": "استخدام مجموعة الكلمات الرئيسية لتعزيز الترجمة",
"enhance_translation_use_Keyword_group_desc": "<p>ملف مجموعة الكلمات الرئيسية موجود في دليل group_tags.</p><p>عند تمكين هذه الميزة، يتم إعطاء الأولوية لمحتويات ملف YAML لمطابقة الترجمة. إذا لم يتم العثور على تطابق، يتم استخدام واجهة الترجمة.</p><p>يمكنك زيارة <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> للحصول على تعليمات محددة حول الملفات في دليل group_tags.</p>"
} }
}, },
{ {
@@ -1008,7 +1023,10 @@
"lora_blacklist_list": "Liste noire Lora", "lora_blacklist_list": "Liste noire Lora",
"lycoris_blacklist_list": "Liste noire Lycoris", "lycoris_blacklist_list": "Liste noire Lycoris",
"embedding_blacklist_list": "Liste noire d'embedding", "embedding_blacklist_list": "Liste noire d'embedding",
"one_keyword_per_line": "Un mot-clé par ligne" "one_keyword_per_line": "Un mot-clé par ligne",
"Keyword_group": "Groupe de mots-clés",
"enhance_translation_use_keyword_group": "Utiliser le groupe de mots-clés pour améliorer la traduction",
"enhance_translation_use_Keyword_group_desc": "<p>Le fichier du groupe de mots-clés est situé dans le répertoire group_tags.</p><p>Lorsque cette fonctionnalité est activée, les contenus du fichier YAML sont prioritaires pour la correspondance de traduction. Si aucune correspondance n'est trouvée, l'interface de traduction est utilisée.</p><p>Vous pouvez consulter <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> pour des instructions spécifiques sur les fichiers du répertoire group_tags.</p>"
} }
}, },
{ {
@@ -1172,7 +1190,10 @@
"lora_blacklist_list": "Schwarze Liste Lora", "lora_blacklist_list": "Schwarze Liste Lora",
"lycoris_blacklist_list": "Schwarze Liste Lycoris", "lycoris_blacklist_list": "Schwarze Liste Lycoris",
"embedding_blacklist_list": "Schwarze Liste der Einbettung", "embedding_blacklist_list": "Schwarze Liste der Einbettung",
"one_keyword_per_line": "Ein Schlüsselwort pro Zeile" "one_keyword_per_line": "Ein Schlüsselwort pro Zeile",
"Keyword_group": "Schlüsselwortgruppe",
"enhance_translation_use_keyword_group": "Übersetzung mit Schlüsselwortgruppe verbessern",
"enhance_translation_use_Keyword_group_desc": "<p>Die Schlüsselwortgruppendatei befindet sich im Verzeichnis group_tags.</p><p>Wenn diese Funktion aktiviert ist, haben die Inhalte in der YAML-Datei Vorrang für die Übersetzungsübereinstimmung. Wenn keine Übereinstimmung gefunden wird, wird die Übersetzungs-Schnittstelle verwendet.</p><p>Sie können <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> besuchen, um spezifische Anweisungen zu den Dateien im Verzeichnis group_tags zu erhalten.</p>"
} }
}, },
{ {
@@ -1386,7 +1407,10 @@
"lora_blacklist_list": "Elenco nero di Lora", "lora_blacklist_list": "Elenco nero di Lora",
"lycoris_blacklist_list": "Elenco nero di Lycoris", "lycoris_blacklist_list": "Elenco nero di Lycoris",
"embedding_blacklist_list": "Elenco nero dell'embedding", "embedding_blacklist_list": "Elenco nero dell'embedding",
"one_keyword_per_line": "Una parola chiave per riga" "one_keyword_per_line": "Una parola chiave per riga",
"Keyword_group": "Gruppo di parole chiave",
"enhance_translation_use_keyword_group": "Migliora la traduzione con il gruppo di parole chiave",
"enhance_translation_use_Keyword_group_desc": "<p>Il file del gruppo di parole chiave si trova nella directory group_tags.</p><p>Quando questa funzionalità è abilitata, i contenuti nel file YAML hanno la priorità per la corrispondenza di traduzione. Se non viene trovata alcuna corrispondenza, viene utilizzata l'interfaccia di traduzione.</p><p>Puoi visitare <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> per istruzioni specifiche sui file nella directory group_tags.</p>"
} }
}, },
{ {
@@ -1535,7 +1559,10 @@
"lora_blacklist_list": "Loraのブラックリスト", "lora_blacklist_list": "Loraのブラックリスト",
"lycoris_blacklist_list": "Lycorisのブラックリスト", "lycoris_blacklist_list": "Lycorisのブラックリスト",
"embedding_blacklist_list": "Embeddingのブラックリスト", "embedding_blacklist_list": "Embeddingのブラックリスト",
"one_keyword_per_line": "1行に1つのキーワード" "one_keyword_per_line": "1行に1つのキーワード",
"Keyword_group": "キーワードグループ",
"enhance_translation_use_keyword_group": "キーワードグループを使用して翻訳を強化する",
"enhance_translation_use_Keyword_group_desc": "<p>キーワードグループファイルは、group_tagsディレクトリにあります。</p><p>この機能を有効にすると、翻訳のマッチングにはYAMLファイルの内容が優先されます。マッチが見つからない場合は、翻訳インターフェースが使用されます。</p><p>group_tagsディレクトリのファイルの具体的な説明については、<a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a>をご覧ください。</p>"
} }
}, },
{ {
@@ -1709,7 +1736,10 @@
"lora_blacklist_list": "Lora 블랙리스트", "lora_blacklist_list": "Lora 블랙리스트",
"lycoris_blacklist_list": "Lycoris 블랙리스트", "lycoris_blacklist_list": "Lycoris 블랙리스트",
"embedding_blacklist_list": "Embedding 블랙리스트", "embedding_blacklist_list": "Embedding 블랙리스트",
"one_keyword_per_line": "한 줄에 하나의 키워드" "one_keyword_per_line": "한 줄에 하나의 키워드",
"Keyword_group": "키워드 그룹",
"enhance_translation_use_keyword_group": "키워드 그룹을 사용하여 번역 개선",
"enhance_translation_use_Keyword_group_desc": "<p>키워드 그룹 파일은 group_tags 디렉터리에 있습니다.</p><p>이 기능을 활성화하면 YAML 파일의 내용이 번역 매칭에 우선적으로 사용됩니다. 일치하는 항목이 없는 경우 번역 인터페이스가 사용됩니다.</p><p>group_tags 디렉터리의 파일에 대한 구체적인 설명은 <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a>을 참조하십시오.</p>"
} }
}, },
{ {
@@ -1973,7 +2003,10 @@
"lora_blacklist_list": "Lista negra de Lora", "lora_blacklist_list": "Lista negra de Lora",
"lycoris_blacklist_list": "Lista negra de Lycoris", "lycoris_blacklist_list": "Lista negra de Lycoris",
"embedding_blacklist_list": "Lista negra de Embedding", "embedding_blacklist_list": "Lista negra de Embedding",
"one_keyword_per_line": "Uma palavra-chave por linha" "one_keyword_per_line": "Uma palavra-chave por linha",
"Keyword_group": "Grupo de palavras-chave",
"enhance_translation_use_keyword_group": "Melhorar a tradução com o grupo de palavras-chave",
"enhance_translation_use_Keyword_group_desc": "<p>O arquivo do grupo de palavras-chave está localizado no diretório group_tags.</p><p>Quando essa funcionalidade está ativada, o conteúdo do arquivo YAML tem prioridade para a correspondência de tradução. Se nenhuma correspondência for encontrada, a interface de tradução é usada.</p><p>Você pode visitar <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> para obter instruções específicas sobre os arquivos no diretório group_tags.</p>"
} }
}, },
{ {
@@ -2137,7 +2170,10 @@
"lora_blacklist_list": "Черный список Lora", "lora_blacklist_list": "Черный список Lora",
"lycoris_blacklist_list": "Черный список Lycoris", "lycoris_blacklist_list": "Черный список Lycoris",
"embedding_blacklist_list": "Черный список Embedding", "embedding_blacklist_list": "Черный список Embedding",
"one_keyword_per_line": "Одно ключевое слово на строку" "one_keyword_per_line": "Одно ключевое слово на строку",
"Keyword_group": "Группа ключевых слов",
"enhance_translation_use_keyword_group": "Улучшить перевод с помощью группы ключевых слов",
"enhance_translation_use_Keyword_group_desc": "<p>Файл группы ключевых слов находится в каталоге group_tags.</p><p>При включении этой функции приоритет отдается содержимому файла YAML для соответствия перевода. Если соответствие не найдено, используется интерфейс перевода.</p><p>Вы можете посетить <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> для получения конкретных инструкций по файлам в каталоге group_tags.</p>"
} }
}, },
{ {
@@ -2316,7 +2352,10 @@
"lora_blacklist_list": "Lista negra de Lora", "lora_blacklist_list": "Lista negra de Lora",
"lycoris_blacklist_list": "Lista negra de Lycoris", "lycoris_blacklist_list": "Lista negra de Lycoris",
"embedding_blacklist_list": "Lista negra de Embedding", "embedding_blacklist_list": "Lista negra de Embedding",
"one_keyword_per_line": "Una palabra clave por línea" "one_keyword_per_line": "Una palabra clave por línea",
"Keyword_group": "Grupo de palabras clave",
"enhance_translation_use_keyword_group": "Mejorar la traducción con el grupo de palabras clave",
"enhance_translation_use_Keyword_group_desc": "<p>El archivo del grupo de palabras clave se encuentra en el directorio group_tags.</p><p>Cuando esta función está habilitada, se priorizan los contenidos del archivo YAML para la coincidencia de traducción. Si no se encuentra ninguna coincidencia, se utiliza la interfaz de traducción.</p><p>Puedes visitar <a href='https://aiodoc.physton.com/GroupTags.html' target='_blank'>https://aiodoc.physton.com/GroupTags.html</a> para obtener instrucciones específicas sobre los archivos en el directorio group_tags.</p>"
} }
}, },
{ {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -32,6 +32,7 @@
@click:blacklist="onBlacklistClick" @click:blacklist="onBlacklistClick"
v-model:tag-complete-file="tagCompleteFile" v-model:tag-complete-file="tagCompleteFile"
v-model:only-csv-on-auto="onlyCsvOnAuto" v-model:only-csv-on-auto="onlyCsvOnAuto"
v-model:group-tags-translate="groupTagsTranslate"
@click:select-language="onSelectLanguageClick" @click:select-language="onSelectLanguageClick"
@click:select-theme="onSelectThemeClick" @click:select-theme="onSelectThemeClick"
@click:show-chatgpt="onShowChatgpt(item.id, $event)" @click:show-chatgpt="onShowChatgpt(item.id, $event)"
@@ -48,7 +49,9 @@
:group-tags="groupTags" :group-tags="groupTags"
:hide-group-tags="item.hideGroupTags" :hide-group-tags="item.hideGroupTags"
v-model:group-tags-color="groupTagsColor" v-model:group-tags-color="groupTagsColor"
:group-tags-color-key-cache="groupTagsColorKeyCache"
@update:hide-group-tags="onUpdateHideGroupTags(item.id, $event)" @update:hide-group-tags="onUpdateHideGroupTags(item.id, $event)"
:group-tags-translate-cache="groupTagsTranslateCache"
:blacklist="blacklist" :blacklist="blacklist"
></physton-prompt> ></physton-prompt>
</template> </template>
@@ -57,6 +60,7 @@
@forceUpdate:translateApi="updateTranslateApiConfig" @forceUpdate:translateApi="updateTranslateApiConfig"
v-model:tag-complete-file="tagCompleteFile" v-model:tag-complete-file="tagCompleteFile"
v-model:only-csv-on-auto="onlyCsvOnAuto" v-model:only-csv-on-auto="onlyCsvOnAuto"
v-model:group-tags-translate="groupTagsTranslate"
v-model:translate-api="translateApi"></translate-setting> v-model:translate-api="translateApi"></translate-setting>
<select-language ref="selectLanguage" v-model:language-code="languageCode" <select-language ref="selectLanguage" v-model:language-code="languageCode"
:translate-apis="translateApis" :translate-apis="translateApis"
@@ -290,6 +294,12 @@ export default {
groupTags: [], groupTags: [],
groupTagsColor: {}, groupTagsColor: {},
groupTagsColorKeyCache: {},
groupTagsTranslate: true,
groupTagsTranslateCache: {
toEn: new Map(),
toLocal: new Map()
},
blacklist: {}, blacklist: {},
} }
@@ -467,6 +477,16 @@ export default {
deep: true, deep: true,
immediate: false, immediate: false,
}, },
groupTagsTranslate: {
handler: function (val, oldVal) {
if (!this.startWatchSave) return
console.log('onGroupTagsTranslateChange', val, oldVal)
this.gradioAPI.setData('groupTagsTranslate', val).then(data => {
}).catch(err => {
})
},
immediate: false,
},
onlyCsvOnAuto() { onlyCsvOnAuto() {
if (!this.startWatchSave) return if (!this.startWatchSave) return
console.log('onOnlyCsvOnAutoChange', this.onlyCsvOnAuto) console.log('onOnlyCsvOnAutoChange', this.onlyCsvOnAuto)
@@ -522,7 +542,7 @@ export default {
}, },
init() { init() {
this.loadExtraNetworks() this.loadExtraNetworks()
let dataListsKeys = ['languageCode', 'autoTranslate', 'autoTranslateToEnglish', 'autoTranslateToLocal', 'autoRemoveSpace', 'autoRemoveLastComma', 'autoKeepWeightZero', 'autoKeepWeightOne', 'autoBreakBeforeWrap', 'autoBreakAfterWrap', /*'hideDefaultInput', */'translateApi', 'enableTooltip', 'tagCompleteFile', 'onlyCsvOnAuto', 'extensionSelect.minimalist', 'groupTagsColor', 'blacklist'] let dataListsKeys = ['languageCode', 'autoTranslate', 'autoTranslateToEnglish', 'autoTranslateToLocal', 'autoRemoveSpace', 'autoRemoveLastComma', 'autoKeepWeightZero', 'autoKeepWeightOne', 'autoBreakBeforeWrap', 'autoBreakAfterWrap', /*'hideDefaultInput', */'translateApi', 'enableTooltip', 'tagCompleteFile', 'onlyCsvOnAuto', 'extensionSelect.minimalist', 'groupTagsColor', 'groupTagsTranslate', 'blacklist']
this.prompts.forEach(item => { this.prompts.forEach(item => {
dataListsKeys.push(item.hideDefaultInputKey) dataListsKeys.push(item.hideDefaultInputKey)
dataListsKeys.push(item.hidePanelKey) dataListsKeys.push(item.hidePanelKey)
@@ -647,6 +667,10 @@ export default {
} }
} }
if (data.groupTagsTranslate !== null) {
this.groupTagsTranslate = data.groupTagsTranslate
}
if (data.blacklist !== null) { if (data.blacklist !== null) {
this.blacklist = data.blacklist this.blacklist = data.blacklist
} }
@@ -715,8 +739,53 @@ export default {
this.groupTags = [] this.groupTags = []
} }
} }
this._handleGroupTags()
}) })
}, },
_handleGroupTags() {
let data = {toEn: new Map(), toLocal: new Map()}
let setData = (en, local) => {
const texts = [
en,
en.replace(/\_/g, ' '),
en.replace(/\-/g, ' '),
]
texts.forEach((t) => {
if (data.toLocal.has(t)) {
let oldLocal = data.toLocal.get(t)
if (!oldLocal.includes(local)) {
oldLocal.push(local)
}
} else {
data.toLocal.set(t, [local])
}
})
data.toEn.set(local, en)
}
for (let item of this.groupTags) {
for (let group of item.groups) {
if (group.type && group.typ == 'wrap') continue
let key = common.getTagsColorKey(item.name, group.name)
if (!this.groupTagsColor[key]) {
this.groupTagsColor[key] = ref(common.fitterInputColor(group.color))
}
for (let en in group.tags) {
if (!en) continue
this.groupTagsColorKeyCache[en] = key
let local = group.tags[en]
if (!local || en == local) continue
setData(en, local)
}
}
}
this.groupTagsTranslateCache = data
console.log(this.groupTagsColorKeyCache)
console.log(this.groupTagsTranslateCache)
},
updateTippyState() { updateTippyState() {
for (const $tippy of this.$tippyList) { for (const $tippy of this.$tippyList) {
if (this.enableTooltip) { if (this.enableTooltip) {

View File

@@ -618,6 +618,10 @@ export default {
type: Object, type: Object,
default: () => ({}), default: () => ({}),
}, },
groupTagsColorKeyCache: {
type: Object,
default: () => ({}),
},
blacklist: { blacklist: {
type: Object, type: Object,
default: () => ({}), default: () => ({}),
@@ -1228,10 +1232,11 @@ export default {
translateGroup() translateGroup()
} }
if (this.tagCompleteFile) { let translateByCSV = (tags) => {
// 开启了使用tagcomplete翻译 // 开启了使用tagcomplete翻译
console.log('translateByCSV', tags.map(tag => tag.value).join(', '))
let promises = [] let promises = []
needTranslateTags.forEach(tag => { tags.forEach(tag => {
// 是否被括号包裹 // 是否被括号包裹
const splitTag = common.splitTag(tag.value) const splitTag = common.splitTag(tag.value)
if (splitTag.value !== tag.value) { if (splitTag.value !== tag.value) {
@@ -1249,7 +1254,7 @@ export default {
Promise.all(promises).then(results => { Promise.all(promises).then(results => {
let needs = [] let needs = []
results.forEach((result, index) => { results.forEach((result, index) => {
let tag = needTranslateTags[index] let tag = tags[index]
if (tag.splits) { if (tag.splits) {
// 如果被括号包裹,还原 // 如果被括号包裹,还原
tag.value = tag.splits.left + tag.value + tag.splits.right tag.value = tag.splits.left + tag.value + tag.splits.right
@@ -1265,6 +1270,7 @@ export default {
setTag(tag, result) setTag(tag, result)
} }
}) })
console.log('No translated keywords: ', needs.map(tag => tag.value).join(', '))
if (useNetwork) { if (useNetwork) {
translate(needs) translate(needs)
} else { } else {
@@ -1273,10 +1279,74 @@ export default {
} }
}).catch(error => { }).catch(error => {
// 有一个错误,就不翻译了 // 有一个错误,就不翻译了
setLoadings(needTranslateTags, false) setLoadings(tags, false)
this.$toastr.error(error) this.$toastr.error(error)
reject(error) reject(error)
}) })
}
let translateByGroupTags = (tags) => {
// 开启了使用关键词组翻译
console.log('translateByGroupTags', tags.map(tag => tag.value).join(', '))
let promises = []
tags.forEach(tag => {
// 是否被括号包裹
const splitTag = common.splitTag(tag.value)
if (splitTag.value !== tag.value) {
tag.value = splitTag.value
tag.splits = splitTag
}
if (tag.toLocal) {
// 翻译到本地语言
promises.push(this.translateToLocalByGroupTags(tag.value))
} else {
// 翻译到英文
promises.push(this.translateToEnByGroupTags(tag.value))
}
})
Promise.all(promises).then(results => {
let needs = []
results.forEach((result, index) => {
let tag = tags[index]
if (tag.splits) {
// 如果被括号包裹,还原
tag.value = tag.splits.left + tag.value + tag.splits.right
}
if (result === '') {
needs.push(tag)
} else {
if (tag.splits) {
result = tag.splits.left + result + tag.splits.right
}
setLoading(tag, false)
setTag(tag, result)
}
})
console.log('No translated keywords: ', needs.map(tag => tag.value).join(', '))
if (this.tagCompleteFile) {
// 开启了使用tagcomplete翻译
translateByCSV(needs)
} else {
if (useNetwork) {
translate(needs)
} else {
setLoadings(needs, false)
resolve()
}
}
}).catch(error => {
// 有一个错误,就不翻译了
setLoadings(tags, false)
this.$toastr.error(error)
reject(error)
})
}
if (this.groupTagsTranslate) {
translateByGroupTags(needTranslateTags)
} else if (this.tagCompleteFile) {
translateByCSV(needTranslateTags)
} else { } else {
if (useNetwork) { if (useNetwork) {
translate(needTranslateTags) translate(needTranslateTags)

View File

@@ -78,6 +78,16 @@
<textarea class="test-input" v-if="translatedText" v-model="translatedText"></textarea> <textarea class="test-input" v-if="translatedText" v-model="translatedText"></textarea>
</div> </div>
</div> </div>
<div class="setting-line">
<div class="line-title">{{ getLang('Keyword_group') }}</div>
<div class="line-content">
<div v-html="getLang('enhance_translation_use_Keyword_group_desc')"></div>
<label class="onlyCsvOnAuto">
<input class="hover-scale-120" type="checkbox" value="1" v-model="groupTagsTranslateValue">
<span>{{ getLang('enhance_translation_use_keyword_group') }}</span>
</label>
</div>
</div>
<div class="setting-line"> <div class="setting-line">
<div class="line-title">TagComplete</div> <div class="line-title">TagComplete</div>
<div class="line-content"> <div class="line-content">
@@ -102,7 +112,7 @@
</label> </label>
</div> </div>
</div> </div>
<div class="setting-line" v-show="tagCompleteFileKey"> <div class="setting-line" v-show="tagCompleteFileKey">
<div class="line-title"></div> <div class="line-title"></div>
<div class="line-content"> <div class="line-content">
<div class="hover-scale-120 test-btn" @click="onTagCompleteTestClick">{{ getLang('test') }}</div> <div class="hover-scale-120 test-btn" @click="onTagCompleteTestClick">{{ getLang('test') }}</div>
@@ -145,6 +155,8 @@ export default {
tagCompleteResults: [], tagCompleteResults: [],
onlyCsvOnAutoValue: false, onlyCsvOnAutoValue: false,
groupTagsTranslateValue: true,
mbart50Loading: false, mbart50Loading: false,
mbart50Success: false, mbart50Success: false,
mbart50Message: '', mbart50Message: '',
@@ -172,7 +184,7 @@ export default {
this.translatedText = '' this.translatedText = ''
this.loading = false this.loading = false
}, },
emits: ['update:translateApi', 'forceUpdate:translateApi', 'update:tagCompleteFile', 'update:onlyCsvOnAuto'], emits: ['update:translateApi', 'forceUpdate:translateApi', 'update:tagCompleteFile', 'update:onlyCsvOnAuto', 'update:groupTagsTranslate'],
watch: { watch: {
apiKey: { apiKey: {
handler: function (val, oldVal) { handler: function (val, oldVal) {
@@ -225,6 +237,7 @@ Github: {{name}}`
this.loading = false this.loading = false
this.tagCompleteFileKey = this.tagCompleteFile this.tagCompleteFileKey = this.tagCompleteFile
this.onlyCsvOnAutoValue = this.onlyCsvOnAuto this.onlyCsvOnAutoValue = this.onlyCsvOnAuto
this.groupTagsTranslateValue = this.groupTagsTranslate
this.mbart50Success = false this.mbart50Success = false
this.mbart50Message = '' this.mbart50Message = ''
this.refreshCSVs() this.refreshCSVs()
@@ -314,6 +327,7 @@ Github: {{name}}`
this.$emit('update:translateApi', this.apiKey) this.$emit('update:translateApi', this.apiKey)
this.$emit('update:tagCompleteFile', this.tagCompleteFileKey) this.$emit('update:tagCompleteFile', this.tagCompleteFileKey)
this.$emit('update:onlyCsvOnAuto', this.onlyCsvOnAutoValue) this.$emit('update:onlyCsvOnAuto', this.onlyCsvOnAutoValue)
this.$emit('update:groupTagsTranslate', this.groupTagsTranslateValue)
this.gradioAPI.setData('translate_api.' + this.apiKey, configs).then(res => { this.gradioAPI.setData('translate_api.' + this.apiKey, configs).then(res => {
if (this.apiKey === this.translateApi) this.$emit('forceUpdate:translateApi') if (this.apiKey === this.translateApi) this.$emit('forceUpdate:translateApi')
}) })

View File

@@ -31,7 +31,20 @@ export default {
onlyCsvOnAuto: { onlyCsvOnAuto: {
type: Boolean, type: Boolean,
default: false default: false
} },
groupTagsTranslate: {
type: Boolean,
default: true
},
groupTagsTranslateCache: {
type: Object,
default: () => {
return {
toEn: new Map(),
toLocal: new Map()
}
},
},
}, },
data() { data() {
return { return {
@@ -164,5 +177,20 @@ export default {
} }
return '' return ''
}, },
async translateToLocalByGroupTags(text) {
text = text.trim().toLowerCase()
if (this.groupTagsTranslateCache.toLocal.has(text)) {
let value = this.groupTagsTranslateCache.toLocal.get(text)
return value.join(' / ')
}
return ''
},
async translateToEnByGroupTags(text) {
text = text.trim().toLowerCase()
if (this.groupTagsTranslateCache.toEn.has(text)) {
return this.groupTagsTranslateCache.toEn.get(text)
}
return ''
},
} }
} }

View File

@@ -6,29 +6,9 @@ export default {
return { return {
groupTagsActive: 0, groupTagsActive: 0,
subGroupTagsActive: 0, subGroupTagsActive: 0,
groupTagsColorKeyCache: {},
} }
}, },
watch: { watch: {},
groupTags: {
handler() {
for (let item of this.groupTags) {
for (let group of item.groups) {
if (group.type && group.typ == 'wrap') continue
let key = this.getTagsColorKey(item.name, group.name)
if (!this.groupTagsColor[key]) {
this.groupTagsColor[key] = ref(common.fitterInputColor(group.color))
}
for (let en in group.tags) {
this.groupTagsColorKeyCache[en] = key
}
}
}
},
deep: true,
immediate: true,
},
},
methods: { methods: {
activeGroupTab(index) { activeGroupTab(index) {
this.groupTagsActive = index this.groupTagsActive = index
@@ -59,7 +39,7 @@ export default {
}, },
getGroupTagStyle(groupName, subGroupName) { getGroupTagStyle(groupName, subGroupName) {
let style = {} let style = {}
let colorKey = this.getTagsColorKey(groupName, subGroupName) let colorKey = common.getTagsColorKey(groupName, subGroupName)
let color = '' let color = ''
if (this.groupTagsColor[colorKey]) { if (this.groupTagsColor[colorKey]) {
color = this.groupTagsColor[colorKey] color = this.groupTagsColor[colorKey]
@@ -74,7 +54,7 @@ export default {
return style return style
}, },
getTagsColorKey(groupName, subGroupName) { getTagsColorKey(groupName, subGroupName) {
return groupName + '||' + subGroupName return common.getTagsColorKey(groupName, subGroupName)
}, },
onTagsColorChange(key) { onTagsColorChange(key) {
this.$emit('update:groupTagsColor', this.groupTagsColor) this.$emit('update:groupTagsColor', this.groupTagsColor)
@@ -83,7 +63,7 @@ export default {
for (let item of this.groupTags) { for (let item of this.groupTags) {
for (let group of item.groups) { for (let group of item.groups) {
if (group.type && group.typ == 'wrap') continue if (group.type && group.typ == 'wrap') continue
let key2 = this.getTagsColorKey(item.name, group.name) let key2 = common.getTagsColorKey(item.name, group.name)
if (key === key2) { if (key === key2) {
this.groupTagsColor[key] = ref(common.fitterInputColor(group.color)) this.groupTagsColor[key] = ref(common.fitterInputColor(group.color))
} }

View File

@@ -2,8 +2,6 @@ import splitTags from "@/utils/splitTags";
import globals from "../../globals"; import globals from "../../globals";
import tinycolor from "tinycolor2"; import tinycolor from "tinycolor2";
const cache = {}
export default { export default {
loraRegex: /^\<lora:\s*([^\:]+)\s*(:)?\s*([0-9\.]+)?\>$/, loraRegex: /^\<lora:\s*([^\:]+)\s*(:)?\s*([0-9\.]+)?\>$/,
lycoRegex: /^\<lyco:\s*([^\:]+)\s*(:)?\s*([0-9\.]+)?\>$/, lycoRegex: /^\<lyco:\s*([^\:]+)\s*(:)?\s*([0-9\.]+)?\>$/,
@@ -603,25 +601,29 @@ export default {
fitterInputColor(color, defaultColor = 'rgba(0,0,0,0)') { fitterInputColor(color, defaultColor = 'rgba(0,0,0,0)') {
let cacheKey = 'fitterInputColor:' + color + ':' + defaultColor let cacheKey = 'fitterInputColor:' + color + ':' + defaultColor
if (cache[cacheKey]) return cache[cacheKey] if (localStorage[cacheKey]) return localStorage[cacheKey]
if (!color || color === '' || color === 'default' || color === 'none' || color === 'null' || color === 'undefined' || color === 'false' || color === 'true') { if (!color || color === '' || color === 'default' || color === 'none' || color === 'null' || color === 'undefined' || color === 'false' || color === 'true') {
cache[cacheKey] = defaultColor localStorage[cacheKey] = defaultColor
return defaultColor return defaultColor
} }
if (!tinycolor(color).isValid()) { if (!tinycolor(color).isValid()) {
cache[cacheKey] = defaultColor localStorage[cacheKey] = defaultColor
return defaultColor return defaultColor
} }
cache[cacheKey] = color localStorage[cacheKey] = color
return color return color
}, },
isColorTransparent(color) { isColorTransparent(color) {
let cacheKey = 'isColorTransparent:' + color let cacheKey = 'isColorTransparent:' + color
if (cache[cacheKey]) return cache[cacheKey] if (localStorage[cacheKey]) return localStorage[cacheKey]
let result = tinycolor(color).getAlpha() === 0 let result = tinycolor(color).getAlpha() === 0
cache[cacheKey] = result localStorage[cacheKey] = result
return result return result
}, },
getTagsColorKey(groupName, subGroupName) {
return groupName + '||' + subGroupName
},
} }