From 6b40c2bc166304564acd3dbf7d825d99b8589472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E6=AD=A3=E8=B6=85?= Date: Fri, 5 Dec 2025 22:02:45 +0800 Subject: [PATCH] feat: Add 7 new language packs (DE, ES, IT, JA, KO, PT-BR, RU) and refactor language switcher (#29) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 补充任务状态和操作相关的翻译键 - 添加小写版本的状态翻译键:waiting, in progress, success, failed, paused, canceled - 添加 Upload 翻译键 - 更新任务状态显示使用新的翻译键 - 统一翻译键命名规范 * feat: 为法语语言包补充任务状态和操作相关的翻译键 - 添加小写版本的状态翻译键:waiting, in progress, success, failed, paused, canceled - 添加 Upload 翻译键 - 修复 In Progress 参数名(deleting -> processing) - 更新 Success Status 和 Failed Status 翻译 * fix: 对齐所有语言包的翻译键 - 为法语语言包添加 Processing (with count) 键 - 为土耳其语语言包添加 success 和 Success Status 键 - 为中文和英文语言包添加 Success Status 键 - 确保所有语言包(中文、英文、土耳其语、法语)的键完全对齐 - 所有语言包现在都有 880 个键 * feat: 添加国际主流语言支持 新增语言包: - 日语 (ja-JP) - 日本語 - 韩语 (ko-KR) - 한국어 - 德语 (de-DE) - Deutsch - 西班牙语 (es-ES) - Español - 俄语 (ru-RU) - Русский - 葡萄牙语 (pt-BR) - Português - 意大利语 (it-IT) - Italiano 更新内容: - 更新 nuxt.config.ts 添加新语言配置 - 更新 language-switcher.vue 组件添加新语言选项 - 所有新语言包包含 880 个翻译键(目前使用英文作为占位符) 现在支持共 11 种语言:英语、中文、日语、韩语、德语、法语、西班牙语、葡萄牙语、意大利语、俄语、土耳其语 * fix: 暂时隐藏未翻译的语言选项 - 从语言选择器中移除尚未翻译的语言(日语、韩语、德语、西班牙语、葡萄牙语、意大利语、俄语) - 只保留已完整翻译的语言:英语、中文、法语、土耳其语 - 未翻译的语言配置已注释,待翻译完成后可重新启用 这些语言包文件已创建但内容为英文占位符,切换后会显示英文内容 * feat: 完成德语和日语语言包翻译 - 将德语文件 (de-DE.json) 中的所有英文值翻译为德语 - 将日语文件 (ja-JP.json) 中的所有英文值翻译为日语 - 技术术语(如 API、KMS、IAM、MQTT 等)保持英文或使用适当的本地化形式 - 遵循德语和日语的本地化习惯和语言环境 * feat: 完成意大利语、韩语、巴西葡萄牙语和俄语翻译 * feat: 完成西班牙语翻译 * refactor: remove duplicate language options in language-switcher - Generate options array dynamically from languageConfig - Eliminate redundant language definitions - Maintain single source of truth for language data * fix: input shadow --- AGENTS.md | 2 + components/language-switcher.vue | 21 +- components/modal.vue | 10 +- components/object/task/item.vue | 14 +- i18n/locales/de-DE.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/en-US.json | 20 +- i18n/locales/es-ES.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/fr-FR.json | 20 +- i18n/locales/it-IT.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/ja-JP.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/ko-KR.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/pt-BR.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/ru-RU.json | 882 +++++++++++++++++++++++++++++++ i18n/locales/tr-TR.json | 19 +- i18n/locales/zh-CN.json | 21 +- nuxt.config.ts | 58 +- package.json | 1 + pnpm-lock.yaml | 20 + scripts/pre-commit-check.sh | 17 +- translate-locales.js | 63 +++ utils/config.ts | 23 +- 21 files changed, 6397 insertions(+), 86 deletions(-) create mode 100644 i18n/locales/de-DE.json create mode 100644 i18n/locales/es-ES.json create mode 100644 i18n/locales/it-IT.json create mode 100644 i18n/locales/ja-JP.json create mode 100644 i18n/locales/ko-KR.json create mode 100644 i18n/locales/pt-BR.json create mode 100644 i18n/locales/ru-RU.json create mode 100644 translate-locales.js diff --git a/AGENTS.md b/AGENTS.md index 783f027..148c0c3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -65,6 +65,8 @@ Before committing any code changes, you MUST run and pass: - Follow conventional, action-oriented commit subjects (e.g. `feat: add bucket selector`). - Each pull request should include: a concise summary, linked issue or task, screenshots for UI work, and testing notes (`pnpm test:run`, `pnpm vue-tsc`, etc.). - Keep PRs scoped; large refactors should be coordinated in advance. +- Commit message and PR title must be in English. +- **⚠️ MANDATORY: PR descriptions MUST strictly follow the format specified in `.github/pull_request_template.md`**. All required sections must be filled out completely and accurately before submitting a PR. ## UI Theme Overrides diff --git a/components/language-switcher.vue b/components/language-switcher.vue index 13f5844..7c0e979 100644 --- a/components/language-switcher.vue +++ b/components/language-switcher.vue @@ -25,22 +25,27 @@ const { locale, setLocale } = useI18n() const languageConfig = { en: { text: 'English', icon: 'ri:translate' }, zh: { text: '中文', icon: 'ri:translate-2' }, - tr: { text: 'Türkçe', icon: 'ri:translate' }, fr: { text: 'Français', icon: 'ri:translate' }, + tr: { text: 'Türkçe', icon: 'ri:translate' }, + ja: { text: '日本語', icon: 'ri:translate' }, + ko: { text: '한국어', icon: 'ri:translate' }, + de: { text: 'Deutsch', icon: 'ri:translate' }, + es: { text: 'Español', icon: 'ri:translate' }, + pt: { text: 'Português', icon: 'ri:translate' }, + it: { text: 'Italiano', icon: 'ri:translate' }, + ru: { text: 'Русский', icon: 'ri:translate' }, } as const -const options = [ - { label: 'English', key: 'en' }, - { label: '中文', key: 'zh' }, - { label: 'Türkçe', key: 'tr' }, - { label: 'Français', key: 'fr' }, -] +const options = Object.entries(languageConfig).map(([key, config]) => ({ + label: config.text, + key, +})) const currentLanguage = computed(() => { return languageConfig[locale.value as keyof typeof languageConfig] || languageConfig.en }) const handleSelect = async (key: string) => { - await setLocale(key as 'en' | 'zh' | 'tr' | 'fr') + await setLocale(key as 'en' | 'zh' | 'fr' | 'tr' | 'ja' | 'ko' | 'de' | 'es' | 'pt' | 'it' | 'ru') } diff --git a/components/modal.vue b/components/modal.vue index 24d4df9..35546d7 100644 --- a/components/modal.vue +++ b/components/modal.vue @@ -61,12 +61,8 @@ const handleEscape = (event: Event) => {