Files
rustfs-console/components/language-switcher.vue
T
安正超 6b40c2bc16 feat: Add 7 new language packs (DE, ES, IT, JA, KO, PT-BR, RU) and refactor language switcher (#29)
* 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
2025-12-05 22:02:45 +08:00

52 lines
1.8 KiB
Vue

<template>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button variant="ghost">
<Icon :name="currentLanguage.icon" class="h-4 w-4 shrink-0" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent class="w-40" align="start">
<DropdownMenuItem v-for="option in options" :key="option.key" @select="() => handleSelect(option.key)">
{{ option.label }}
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</template>
<script setup lang="ts">
import { Icon } from '#components'
import { Button } from '@/components/ui/button'
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'
import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
const { locale, setLocale } = useI18n()
const languageConfig = {
en: { text: 'English', icon: 'ri:translate' },
zh: { text: '中文', icon: 'ri:translate-2' },
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 = 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' | 'fr' | 'tr' | 'ja' | 'ko' | 'de' | 'es' | 'pt' | 'it' | 'ru')
}
</script>