Skip to content

Commit acaa4e5

Browse files
feat(i18n): add zh-TW Traditional Chinese locale with Taiwan terminology (#248)
- Add zh-TW locale with Taiwan-specific terms (檔案, 終端機, 記憶體, 市集, 設定, 儲存, 搜尋, 載入中 etc.) - Update getLocale() to match full navigator.language before splitting, ensuring zh-TW users are not routed to Simplified Chinese - Rename zh label to 中文(简体)for clarity Co-authored-by: 你的名字 <你的電子信箱>
1 parent 0d4b39a commit acaa4e5

1 file changed

Lines changed: 71 additions & 7 deletions

File tree

src/lib/i18n.ts

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,18 @@
33
* Add new languages by adding a locale map below.
44
*/
55

6-
export type LocaleId = 'en' | 'es' | 'fr' | 'de' | 'zh' | 'ja' | 'ko' | 'pt' | 'ru' | 'ar'
6+
export type LocaleId =
7+
| 'en'
8+
| 'es'
9+
| 'fr'
10+
| 'de'
11+
| 'zh'
12+
| 'zh-TW'
13+
| 'ja'
14+
| 'ko'
15+
| 'pt'
16+
| 'ru'
17+
| 'ar'
718

819
const EN = {
920
// Nav
@@ -81,7 +92,8 @@ const ES: LocaleTranslations = {
8192
'jobs.newJob': 'Nuevo Trabajo',
8293
'settings.title': 'Configuración',
8394
'settings.language': 'Idioma',
84-
'settings.languageDesc': 'Elige el idioma de la interfaz del espacio de trabajo.',
95+
'settings.languageDesc':
96+
'Elige el idioma de la interfaz del espacio de trabajo.',
8597
'common.save': 'Guardar',
8698
'common.cancel': 'Cancelar',
8799
'common.delete': 'Eliminar',
@@ -119,7 +131,8 @@ const FR: LocaleTranslations = {
119131
'jobs.newJob': 'Nouvelle tâche',
120132
'settings.title': 'Paramètres',
121133
'settings.language': 'Langue',
122-
'settings.languageDesc': "Choisissez la langue d'affichage de l'espace de travail.",
134+
'settings.languageDesc':
135+
"Choisissez la langue d'affichage de l'espace de travail.",
123136
'common.save': 'Enregistrer',
124137
'common.cancel': 'Annuler',
125138
'common.delete': 'Supprimer',
@@ -205,16 +218,65 @@ const RU: LocaleTranslations = {
205218
'common.noData': 'Нет данных',
206219
}
207220

221+
const ZH_TW: LocaleTranslations = {
222+
'nav.dashboard': '儀表板',
223+
'nav.chat': '聊天',
224+
'nav.files': '檔案',
225+
'nav.terminal': '終端機',
226+
'nav.jobs': '工作',
227+
'nav.tasks': '任務',
228+
'nav.memory': '記憶體',
229+
'nav.skills': '技能',
230+
'nav.profiles': '個人資料',
231+
'nav.settings': '設定',
232+
'skills.installed': '已安裝',
233+
'skills.marketplace': '市集',
234+
'skills.search': '依名稱、標籤或描述搜尋',
235+
'skills.noResults': '找不到技能',
236+
'profiles.profiles': '個人資料',
237+
'profiles.monitoring': '監控',
238+
'tasks.title': '任務',
239+
'tasks.newTask': '新增任務',
240+
'tasks.backlog': '待辦清單',
241+
'tasks.todo': '待處理',
242+
'tasks.inProgress': '進行中',
243+
'tasks.review': '審查',
244+
'tasks.done': '完成',
245+
'jobs.title': '工作',
246+
'jobs.newJob': '新增工作',
247+
'settings.title': '設定',
248+
'settings.language': '語言',
249+
'settings.languageDesc': '選擇工作區介面的顯示語言。',
250+
'common.save': '儲存',
251+
'common.cancel': '取消',
252+
'common.delete': '刪除',
253+
'common.search': '搜尋',
254+
'common.loading': '載入中...',
255+
'common.error': '錯誤',
256+
'common.noData': '無資料',
257+
}
258+
208259
const LOCALES: Record<LocaleId, LocaleTranslations> = {
209-
en: EN, es: ES, fr: FR, de: EN, zh: ZH, ja: EN, ko: EN, pt: EN, ru: RU, ar: EN,
260+
en: EN,
261+
es: ES,
262+
fr: FR,
263+
de: EN,
264+
zh: ZH,
265+
'zh-TW': ZH_TW,
266+
ja: EN,
267+
ko: EN,
268+
pt: EN,
269+
ru: RU,
270+
ar: EN,
210271
}
211272

212273
export const LOCALE_LABELS: Record<LocaleId, string> = {
213274
en: 'English',
214275
es: 'Español',
215276
fr: 'Français',
216277
de: 'Deutsch',
217-
zh: '中文',
278+
zh: '中文(简体)',
279+
'zh-TW': '繁體中文',
218280
ja: '日本語',
219281
ko: '한국어',
220282
pt: 'Português',
@@ -228,8 +290,10 @@ export function getLocale(): LocaleId {
228290
if (typeof window === 'undefined') return 'en'
229291
const stored = localStorage.getItem(STORAGE_KEY)
230292
if (stored && stored in LOCALES) return stored as LocaleId
231-
const browser = navigator.language.split('-')[0]
232-
if (browser in LOCALES) return browser as LocaleId
293+
const full = navigator.language
294+
if (full in LOCALES) return full as LocaleId
295+
const lang = full.split('-')[0]
296+
if (lang in LOCALES) return lang as LocaleId
233297
return 'en'
234298
}
235299

0 commit comments

Comments
 (0)