From 3c07e437eab50273ac44d7a8a25e335f604352b3 Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Sat, 29 Nov 2025 11:00:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/PromptEditor.vue | 118 +++++++ src/components/TranslationPopup.vue | 490 ++++++++++++++++++++++++++++ 2 files changed, 608 insertions(+) create mode 100644 src/components/TranslationPopup.vue diff --git a/src/components/PromptEditor.vue b/src/components/PromptEditor.vue index 467b63c..c6222fc 100644 --- a/src/components/PromptEditor.vue +++ b/src/components/PromptEditor.vue @@ -4,6 +4,7 @@ import { usePromptStore } from '../stores/promptStore'; import type { LangCode } from '../types'; import NotificationToast from './NotificationToast.vue'; import PresetDropdown from './PresetDropdown.vue'; +import TranslationPopup from './TranslationPopup.vue'; const store = usePromptStore(); const draggingIndex = ref(null); @@ -37,6 +38,7 @@ const addingMapValue = ref(''); const presetName = ref(''); const viewMode = ref<'compact' | 'detail'>('compact'); const showPresetDropdown = ref(false); +const showTranslationPopup = ref(false); const notification = ref<{ message: string; type: 'success' | 'error' | 'info'; show: boolean }>({ message: '', type: 'info', @@ -612,6 +614,45 @@ function applyEditSuggestion(s: string) { updateEditSuggestions(); } +const unmappedTokens = computed(() => { + return tokens.value.filter(k => displayTrans(k) === k); +}); + +function handleApplyTranslation(results: { key: string; trans: string }[]) { + results.forEach(({ key, trans }) => { + store.addMapping(key, selectedLang.value, trans); + }); + showNotification(`已添加 ${results.length} 条映射`, 'success'); +} + +async function autoTranslateSingle() { + if (addingMapIndex.value == null) return; + const key = tokens.value[addingMapIndex.value]; + if (!key) return; + + try { + let target = selectedLang.value as string; + if (target === 'zh_CN') target = 'zh'; + + // 移除包裹层和下划线 + const { core } = store.parseTokenWrappers(key); + const cleanText = core.replace(/_/g, ' '); + + const url = `https://sywb.top/api/translate2?text=${encodeURIComponent(cleanText)}&sourceLang=auto&targetLang=${target}`; + + const res = await fetch(url); + const data = await res.json(); + + if (data.success && data.translation) { + addingMapValue.value = data.translation; + } else { + showNotification('翻译失败', 'error'); + } + } catch { + showNotification('翻译请求失败', 'error'); + } +} + function displayTrans(key: string): string { const { core, wrappers } = store.parseTokenWrappers(key); const m = core.match(/:(\d+(?:\.\d+)?)$/); @@ -762,6 +803,22 @@ function isRemoveDisabled(token: string): boolean {
提示词映射(双击修改) +
@@ -945,6 +1002,16 @@ function isRemoveDisabled(token: string): boolean {
+
@@ -955,6 +1022,15 @@ function isRemoveDisabled(token: string): boolean {
+ + + \ No newline at end of file diff --git a/src/components/TranslationPopup.vue b/src/components/TranslationPopup.vue new file mode 100644 index 0000000..5b59c93 --- /dev/null +++ b/src/components/TranslationPopup.vue @@ -0,0 +1,490 @@ + + + + +