From 5d8bac1bb17d575cc2c51d0a4a566b82d5a01c2b Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Sun, 30 Nov 2025 11:42:58 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BF=BB=E8=AF=91bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/PromptEditor.vue | 47 ++++++++------- src/components/TranslationPopup.vue | 21 +++++-- src/stores/promptStore.ts | 90 ++++++++++------------------- 3 files changed, 71 insertions(+), 87 deletions(-) diff --git a/src/components/PromptEditor.vue b/src/components/PromptEditor.vue index 9d3a403..06936ee 100644 --- a/src/components/PromptEditor.vue +++ b/src/components/PromptEditor.vue @@ -133,7 +133,7 @@ function currentEditEl(): HTMLInputElement | null { return Array.isArray(raw) ? (raw[0] ?? null) : raw; } const priorityStyle = ref<'{}' | '()' | '[]' | '<>' | 'suffix'>('{}'); -const priorityStep = ref(1); +const priorityStep = ref(0.1); function splitTokensLocal(txt: string): string[] { return splitTokens(txt); } @@ -176,9 +176,12 @@ function adjustWeight(core: string, delta: number): string { const decimals = stepStr.includes('.') ? stepStr.split('.')[1]!.length : 0; const cur = w == null ? 1.0 : w; let nw = cur + delta; - if (delta < 0 && nw <= 1.0) return base; - nw = Math.min(2.0, Math.max(0.1, nw)); + nw = roundToDecimals(nw, decimals); + + // If weight is 1, return base without suffix + if (nw === 1) return base; + return base + ':' + nw; } const text = ref(''); @@ -773,9 +776,15 @@ function applyEditSuggestion(s: string) { } const unmappedTokens = computed(() => { - return tokens.value.filter(k => displayTrans(k) === k); + return tokens.value.filter(k => isUnmapped(k)); }); +function isUnmapped(key: string): boolean { + const { core } = parseDetailedToken(key); + const tag = store.getTagByKey(core); + return !tag || !tag.translation?.[selectedLang.value]; +} + function handleApplyTranslation(results: { key: string; trans: string }[]) { results.forEach(({ key, trans }) => { store.addMapping(key, selectedLang.value, trans); @@ -792,9 +801,11 @@ async function autoTranslateSingle() { let target = selectedLang.value as string; if (target === 'zh_CN') target = 'zh'; - // 移除包裹层和下划线 - const { core } = store.parseTokenWrappers(key); - const cleanText = core.replace(/_/g, ' '); + // 移除包裹层和下划线,提取核心词 + const { core } = parseDetailedToken(key); + // 再次清理可能残留的括号(针对复杂嵌套或未闭合情况) + const cleanCore = core.replace(/^[\(\[\{<]+/, '').replace(/[\)\]\}>]+$/, ''); + const cleanText = cleanCore.replace(/_/g, ' '); const url = `https://sywb.top/api/translate2?text=${encodeURIComponent(cleanText)}&sourceLang=auto&targetLang=${target}`; @@ -812,23 +823,11 @@ async function autoTranslateSingle() { } function displayTrans(key: string): string { - const { core, weight, wrappers } = parseDetailedToken(key); + const { core, weight, wrappers, prefix, suffix } = parseDetailedToken(key); const tag = store.getTagByKey(core); const translatedCore = tag?.translation?.[selectedLang.value] ?? tag?.key ?? core; - let result = translatedCore; - let currentWrappers = [...wrappers]; - - if (weight !== undefined && weight !== 1) { - const lastWrapper = currentWrappers[currentWrappers.length - 1]; - if (lastWrapper === '()') { - currentWrappers.pop(); - } - const wStr = Number.isInteger(weight) ? weight.toString() : weight.toFixed(2).replace(/\.?0+$/, ''); - result = `(${result}:${wStr})`; - } - - return store.wrapToken(result, currentWrappers); + return constructToken(translatedCore, weight, wrappers, prefix, suffix); } function isRemoveDisabled(token: string): boolean { @@ -1066,7 +1065,7 @@ function isRemoveDisabled(token: string): boolean {