mirror of
https://github.com/Physton/sd-webui-prompt-all-in-one.git
synced 2026-01-26 19:29:56 +00:00
New Feature: Enhance Translation with Keyword Group
新功能:使用关键词组增强翻译功能
This commit is contained in:
65
i18n.json
65
i18n.json
@@ -148,7 +148,10 @@
|
||||
"lora_blacklist_list": "Lora 黑名单列表",
|
||||
"lycoris_blacklist_list": "Lycoris 黑名单列表",
|
||||
"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 黑名單列表",
|
||||
"lycoris_blacklist_list": "Lycoris 黑名單列表",
|
||||
"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 黑名單清單",
|
||||
"lycoris_blacklist_list": "Lycoris 黑名單清單",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Lycoris 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 السوداء",
|
||||
"lycoris_blacklist_list": "قائمة Lycoris السوداء",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Liste noire Lycoris",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Schwarze Liste Lycoris",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Elenco nero di Lycoris",
|
||||
"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のブラックリスト",
|
||||
"lycoris_blacklist_list": "Lycorisのブラックリスト",
|
||||
"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 블랙리스트",
|
||||
"lycoris_blacklist_list": "Lycoris 블랙리스트",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Lista negra de Lycoris",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Черный список Lycoris",
|
||||
"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",
|
||||
"lycoris_blacklist_list": "Lista negra de Lycoris",
|
||||
"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
@@ -32,6 +32,7 @@
|
||||
@click:blacklist="onBlacklistClick"
|
||||
v-model:tag-complete-file="tagCompleteFile"
|
||||
v-model:only-csv-on-auto="onlyCsvOnAuto"
|
||||
v-model:group-tags-translate="groupTagsTranslate"
|
||||
@click:select-language="onSelectLanguageClick"
|
||||
@click:select-theme="onSelectThemeClick"
|
||||
@click:show-chatgpt="onShowChatgpt(item.id, $event)"
|
||||
@@ -48,7 +49,9 @@
|
||||
:group-tags="groupTags"
|
||||
:hide-group-tags="item.hideGroupTags"
|
||||
v-model:group-tags-color="groupTagsColor"
|
||||
:group-tags-color-key-cache="groupTagsColorKeyCache"
|
||||
@update:hide-group-tags="onUpdateHideGroupTags(item.id, $event)"
|
||||
:group-tags-translate-cache="groupTagsTranslateCache"
|
||||
:blacklist="blacklist"
|
||||
></physton-prompt>
|
||||
</template>
|
||||
@@ -57,6 +60,7 @@
|
||||
@forceUpdate:translateApi="updateTranslateApiConfig"
|
||||
v-model:tag-complete-file="tagCompleteFile"
|
||||
v-model:only-csv-on-auto="onlyCsvOnAuto"
|
||||
v-model:group-tags-translate="groupTagsTranslate"
|
||||
v-model:translate-api="translateApi"></translate-setting>
|
||||
<select-language ref="selectLanguage" v-model:language-code="languageCode"
|
||||
:translate-apis="translateApis"
|
||||
@@ -290,6 +294,12 @@ export default {
|
||||
|
||||
groupTags: [],
|
||||
groupTagsColor: {},
|
||||
groupTagsColorKeyCache: {},
|
||||
groupTagsTranslate: true,
|
||||
groupTagsTranslateCache: {
|
||||
toEn: new Map(),
|
||||
toLocal: new Map()
|
||||
},
|
||||
|
||||
blacklist: {},
|
||||
}
|
||||
@@ -467,6 +477,16 @@ export default {
|
||||
deep: true,
|
||||
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() {
|
||||
if (!this.startWatchSave) return
|
||||
console.log('onOnlyCsvOnAutoChange', this.onlyCsvOnAuto)
|
||||
@@ -522,7 +542,7 @@ export default {
|
||||
},
|
||||
init() {
|
||||
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 => {
|
||||
dataListsKeys.push(item.hideDefaultInputKey)
|
||||
dataListsKeys.push(item.hidePanelKey)
|
||||
@@ -647,6 +667,10 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
if (data.groupTagsTranslate !== null) {
|
||||
this.groupTagsTranslate = data.groupTagsTranslate
|
||||
}
|
||||
|
||||
if (data.blacklist !== null) {
|
||||
this.blacklist = data.blacklist
|
||||
}
|
||||
@@ -715,8 +739,53 @@ export default {
|
||||
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() {
|
||||
for (const $tippy of this.$tippyList) {
|
||||
if (this.enableTooltip) {
|
||||
|
||||
@@ -618,6 +618,10 @@ export default {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
groupTagsColorKeyCache: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
blacklist: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
@@ -1228,10 +1232,11 @@ export default {
|
||||
translateGroup()
|
||||
}
|
||||
|
||||
if (this.tagCompleteFile) {
|
||||
let translateByCSV = (tags) => {
|
||||
// 开启了使用tagcomplete翻译
|
||||
console.log('translateByCSV', tags.map(tag => tag.value).join(', '))
|
||||
let promises = []
|
||||
needTranslateTags.forEach(tag => {
|
||||
tags.forEach(tag => {
|
||||
// 是否被括号包裹
|
||||
const splitTag = common.splitTag(tag.value)
|
||||
if (splitTag.value !== tag.value) {
|
||||
@@ -1249,7 +1254,7 @@ export default {
|
||||
Promise.all(promises).then(results => {
|
||||
let needs = []
|
||||
results.forEach((result, index) => {
|
||||
let tag = needTranslateTags[index]
|
||||
let tag = tags[index]
|
||||
if (tag.splits) {
|
||||
// 如果被括号包裹,还原
|
||||
tag.value = tag.splits.left + tag.value + tag.splits.right
|
||||
@@ -1265,6 +1270,7 @@ export default {
|
||||
setTag(tag, result)
|
||||
}
|
||||
})
|
||||
console.log('No translated keywords: ', needs.map(tag => tag.value).join(', '))
|
||||
if (useNetwork) {
|
||||
translate(needs)
|
||||
} else {
|
||||
@@ -1273,10 +1279,74 @@ export default {
|
||||
}
|
||||
}).catch(error => {
|
||||
// 有一个错误,就不翻译了
|
||||
setLoadings(needTranslateTags, false)
|
||||
setLoadings(tags, false)
|
||||
this.$toastr.error(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 {
|
||||
if (useNetwork) {
|
||||
translate(needTranslateTags)
|
||||
|
||||
@@ -78,6 +78,16 @@
|
||||
<textarea class="test-input" v-if="translatedText" v-model="translatedText"></textarea>
|
||||
</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="line-title">TagComplete</div>
|
||||
<div class="line-content">
|
||||
@@ -102,7 +112,7 @@
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting-line" v-show="tagCompleteFileKey">
|
||||
<div class="setting-line" v-show="tagCompleteFileKey">
|
||||
<div class="line-title"></div>
|
||||
<div class="line-content">
|
||||
<div class="hover-scale-120 test-btn" @click="onTagCompleteTestClick">{{ getLang('test') }}</div>
|
||||
@@ -145,6 +155,8 @@ export default {
|
||||
tagCompleteResults: [],
|
||||
onlyCsvOnAutoValue: false,
|
||||
|
||||
groupTagsTranslateValue: true,
|
||||
|
||||
mbart50Loading: false,
|
||||
mbart50Success: false,
|
||||
mbart50Message: '',
|
||||
@@ -172,7 +184,7 @@ export default {
|
||||
this.translatedText = ''
|
||||
this.loading = false
|
||||
},
|
||||
emits: ['update:translateApi', 'forceUpdate:translateApi', 'update:tagCompleteFile', 'update:onlyCsvOnAuto'],
|
||||
emits: ['update:translateApi', 'forceUpdate:translateApi', 'update:tagCompleteFile', 'update:onlyCsvOnAuto', 'update:groupTagsTranslate'],
|
||||
watch: {
|
||||
apiKey: {
|
||||
handler: function (val, oldVal) {
|
||||
@@ -225,6 +237,7 @@ Github: {{name}}`
|
||||
this.loading = false
|
||||
this.tagCompleteFileKey = this.tagCompleteFile
|
||||
this.onlyCsvOnAutoValue = this.onlyCsvOnAuto
|
||||
this.groupTagsTranslateValue = this.groupTagsTranslate
|
||||
this.mbart50Success = false
|
||||
this.mbart50Message = ''
|
||||
this.refreshCSVs()
|
||||
@@ -314,6 +327,7 @@ Github: {{name}}`
|
||||
this.$emit('update:translateApi', this.apiKey)
|
||||
this.$emit('update:tagCompleteFile', this.tagCompleteFileKey)
|
||||
this.$emit('update:onlyCsvOnAuto', this.onlyCsvOnAutoValue)
|
||||
this.$emit('update:groupTagsTranslate', this.groupTagsTranslateValue)
|
||||
this.gradioAPI.setData('translate_api.' + this.apiKey, configs).then(res => {
|
||||
if (this.apiKey === this.translateApi) this.$emit('forceUpdate:translateApi')
|
||||
})
|
||||
|
||||
@@ -31,7 +31,20 @@ export default {
|
||||
onlyCsvOnAuto: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
groupTagsTranslate: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
groupTagsTranslateCache: {
|
||||
type: Object,
|
||||
default: () => {
|
||||
return {
|
||||
toEn: new Map(),
|
||||
toLocal: new Map()
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -164,5 +177,20 @@ export default {
|
||||
}
|
||||
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 ''
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -6,29 +6,9 @@ export default {
|
||||
return {
|
||||
groupTagsActive: 0,
|
||||
subGroupTagsActive: 0,
|
||||
groupTagsColorKeyCache: {},
|
||||
}
|
||||
},
|
||||
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,
|
||||
},
|
||||
},
|
||||
watch: {},
|
||||
methods: {
|
||||
activeGroupTab(index) {
|
||||
this.groupTagsActive = index
|
||||
@@ -59,7 +39,7 @@ export default {
|
||||
},
|
||||
getGroupTagStyle(groupName, subGroupName) {
|
||||
let style = {}
|
||||
let colorKey = this.getTagsColorKey(groupName, subGroupName)
|
||||
let colorKey = common.getTagsColorKey(groupName, subGroupName)
|
||||
let color = ''
|
||||
if (this.groupTagsColor[colorKey]) {
|
||||
color = this.groupTagsColor[colorKey]
|
||||
@@ -74,7 +54,7 @@ export default {
|
||||
return style
|
||||
},
|
||||
getTagsColorKey(groupName, subGroupName) {
|
||||
return groupName + '||' + subGroupName
|
||||
return common.getTagsColorKey(groupName, subGroupName)
|
||||
},
|
||||
onTagsColorChange(key) {
|
||||
this.$emit('update:groupTagsColor', this.groupTagsColor)
|
||||
@@ -83,7 +63,7 @@ export default {
|
||||
for (let item of this.groupTags) {
|
||||
for (let group of item.groups) {
|
||||
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) {
|
||||
this.groupTagsColor[key] = ref(common.fitterInputColor(group.color))
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@ import splitTags from "@/utils/splitTags";
|
||||
import globals from "../../globals";
|
||||
import tinycolor from "tinycolor2";
|
||||
|
||||
const cache = {}
|
||||
|
||||
export default {
|
||||
loraRegex: /^\<lora:\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)') {
|
||||
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') {
|
||||
cache[cacheKey] = defaultColor
|
||||
localStorage[cacheKey] = defaultColor
|
||||
return defaultColor
|
||||
}
|
||||
if (!tinycolor(color).isValid()) {
|
||||
cache[cacheKey] = defaultColor
|
||||
localStorage[cacheKey] = defaultColor
|
||||
return defaultColor
|
||||
}
|
||||
cache[cacheKey] = color
|
||||
localStorage[cacheKey] = color
|
||||
return color
|
||||
},
|
||||
|
||||
isColorTransparent(color) {
|
||||
let cacheKey = 'isColorTransparent:' + color
|
||||
if (cache[cacheKey]) return cache[cacheKey]
|
||||
if (localStorage[cacheKey]) return localStorage[cacheKey]
|
||||
let result = tinycolor(color).getAlpha() === 0
|
||||
cache[cacheKey] = result
|
||||
localStorage[cacheKey] = result
|
||||
return result
|
||||
},
|
||||
|
||||
getTagsColorKey(groupName, subGroupName) {
|
||||
return groupName + '||' + subGroupName
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user