From bba78d1dcaded7c6fd934b6aa210617d8e8ffcd7 Mon Sep 17 00:00:00 2001 From: kura Date: Thu, 30 Apr 2026 17:56:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ei18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 67 +++++++++++++++++++++++++- package.json | 3 +- src-tauri/src/lib.rs | 8 ++++ src/App.vue | 80 +++++++++++++++++-------------- src/components/SubtitleEditor.vue | 22 ++++----- src/components/TaskQueue.vue | 20 ++------ src/i18n.ts | 26 ++++++++++ src/locales/en.ts | 77 +++++++++++++++++++++++++++++ src/locales/zh-CN.ts | 77 +++++++++++++++++++++++++++++ src/main.ts | 3 +- 10 files changed, 319 insertions(+), 64 deletions(-) create mode 100644 src/i18n.ts create mode 100644 src/locales/en.ts create mode 100644 src/locales/zh-CN.ts diff --git a/package-lock.json b/package-lock.json index 3376cbd..625df19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "@tauri-apps/api": "^2.0.0", "@tauri-apps/plugin-dialog": "^2.0.0", "pinia": "^2.1.7", - "vue": "^3.5.13" + "vue": "^3.5.13", + "vue-i18n": "^9.14.4" }, "devDependencies": { "@tauri-apps/cli": "^2.0.4", @@ -525,6 +526,50 @@ "node": ">=18" } }, + "node_modules/@intlify/core-base": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.14.4.tgz", + "integrity": "sha512-vtZCt7NqWhKEtHa3SD/322DlgP5uR9MqWxnE0y8Q0tjDs9H5Lxhss+b5wv8rmuXRoHKLESNgw9d+EN9ybBbj9g==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.14.4", + "@intlify/shared": "9.14.4" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.14.4.tgz", + "integrity": "sha512-vcyCLiVRN628U38c3PbahrhbbXrckrM9zpy0KZVlDk2Z0OnGwv8uQNNXP3twwGtfLsCf4gu3ci6FMIZnPaqZsw==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.14.4", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.14.4.tgz", + "integrity": "sha512-P9zv6i1WvMc9qDBWvIgKkymjY2ptIiQ065PjDv7z7fDqH3J/HBRBN5IoiR46r/ujRcU7hCuSIZWvCAFCyuOYZA==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2848,6 +2893,26 @@ } } }, + "node_modules/vue-i18n": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.14.4.tgz", + "integrity": "sha512-B934C8yUyWLT0EMud3DySrwSUJI7ZNiWYsEEz2gknTthqKiG4dzWE/WSa8AzCuSQzwBEv4HtG1jZDhgzPfWSKQ==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "9.14.4", + "@intlify/shared": "9.14.4", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-tsc": { "version": "2.2.12", "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.12.tgz", diff --git a/package.json b/package.json index e13f64c..0181ef1 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "@tauri-apps/api": "^2.0.0", "@tauri-apps/plugin-dialog": "^2.0.0", "pinia": "^2.1.7", - "vue": "^3.5.13" + "vue": "^3.5.13", + "vue-i18n": "^9.14.4" }, "devDependencies": { "@tauri-apps/cli": "^2.0.4", diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 85dd90e..c6cf154 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -146,6 +146,11 @@ fn configure_macos_menu(app: &AppHandle) -> tauri::Result<()> { .item(&MenuItemBuilder::with_id("reset_models", "恢复默认模型路径").build(app)?) .build()?; + let language_menu = SubmenuBuilder::new(app, "语言") + .item(&MenuItemBuilder::with_id("set_lang_zh_cn", "中文").build(app)?) + .item(&MenuItemBuilder::with_id("set_lang_en", "English").build(app)?) + .build()?; + let window_menu = SubmenuBuilder::new(app, "窗口") .item(&PredefinedMenuItem::minimize(app, None)?) .item(&PredefinedMenuItem::maximize(app, None)?) @@ -158,6 +163,7 @@ fn configure_macos_menu(app: &AppHandle) -> tauri::Result<()> { .item(&file_menu) .item(&edit_menu) .item(&settings_menu) + .item(&language_menu) .item(&window_menu) .build()?; @@ -171,6 +177,8 @@ fn configure_macos_menu(app: &AppHandle) -> tauri::Result<()> { "toggle_advanced" => Some("toggle-advanced"), "toggle_bilingual" => Some("toggle-bilingual"), "reset_models" => Some("reset-models"), + "set_lang_zh_cn" => Some("set-lang-zh-CN"), + "set_lang_en" => Some("set-lang-en"), _ => None, }; diff --git a/src/App.vue b/src/App.vue index 6abacb5..cbe3b37 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,6 @@ @@ -246,10 +255,10 @@ async function handleExport(format: 'srt' | 'vtt' | 'ass') {
@@ -258,22 +267,23 @@ async function handleExport(format: 'srt' | 'vtt' | 'ass') {
@@ -294,42 +304,42 @@ async function handleExport(format: 'srt' | 'vtt' | 'ass') {
- 高级设置 + {{ $t('app.advanced') }}
diff --git a/src/components/SubtitleEditor.vue b/src/components/SubtitleEditor.vue index 2048f09..f12da08 100644 --- a/src/components/SubtitleEditor.vue +++ b/src/components/SubtitleEditor.vue @@ -48,9 +48,9 @@ function updateTranslatedText(segment: SubtitleSegment, value: string) {
- {{ task?.fileName ?? '字幕工作区' }} + {{ task?.fileName ?? $t('editor.title') }}

- {{ task ? `${segments.length} 条片段` : '选择左侧任务后开始查看' }} + {{ task ? $t('editor.segments', { count: segments.length }) : $t('editor.selectTask') }}

@@ -61,14 +61,14 @@ function updateTranslatedText(segment: SubtitleSegment, value: string) {
-

选择任务后显示字幕

-

点击左侧任务列表中的任务开始查看

+

{{ $t('editor.empty') }}

+

{{ $t('editor.emptyHint') }}

- - - + + +
@@ -81,11 +81,11 @@ function updateTranslatedText(segment: SubtitleSegment, value: string) { {{ formatTime(segment.start) }} - {{ formatTime(segment.end) }} {{ segment.id }}
-

{{ segment.sourceText || '等待识别结果...' }}

+

{{ segment.sourceText || $t('editor.waiting') }}