feat(i18n): add Traditional Chinese locale (#1360)

* feat: add Traditional Chinese locale

* feat: add Traditional Chinese locale

* feat(i18n): Update Traditional Chinese translation

* fix(i18n): sync Traditional Chinese locale keys

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Jia
2026-05-26 02:34:58 +03:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent 5cde9ca88c
commit 6dbe7d0445
11 changed files with 4051 additions and 14 deletions
+1
View File
@@ -6,6 +6,7 @@ export const dict = {
'common.unavailable': 'Unavailable', 'common.unavailable': 'Unavailable',
'common.language.english': 'English', 'common.language.english': 'English',
'common.language.simplifiedChinese': 'Chinese (Simplified)', 'common.language.simplifiedChinese': 'Chinese (Simplified)',
'common.language.traditionalChinese': 'Chinese (Traditional)',
'common.language.ukrainian': 'Ukrainian', 'common.language.ukrainian': 'Ukrainian',
'common.language.spanish': 'Spanish', 'common.language.spanish': 'Spanish',
'common.language.brazilianPortuguese': 'Brazilian Portuguese', 'common.language.brazilianPortuguese': 'Brazilian Portuguese',
+1
View File
@@ -7,6 +7,7 @@ export const dict: Record<I18nKey, string> = {
"common.unavailable": "No disponible", "common.unavailable": "No disponible",
"common.language.english": "Inglés", "common.language.english": "Inglés",
"common.language.simplifiedChinese": "Chino (simplificado)", "common.language.simplifiedChinese": "Chino (simplificado)",
"common.language.traditionalChinese": "Chino (tradicional)",
"common.language.ukrainian": "Ucraniano", "common.language.ukrainian": "Ucraniano",
"common.language.spanish": "Español", "common.language.spanish": "Español",
"common.language.brazilianPortuguese": "Portugués brasileño", "common.language.brazilianPortuguese": "Portugués brasileño",
+1
View File
@@ -7,6 +7,7 @@ export const dict: Record<I18nKey, string> = {
'common.unavailable': '사용할 수 없음', 'common.unavailable': '사용할 수 없음',
'common.language.english': '영어', 'common.language.english': '영어',
'common.language.simplifiedChinese': '중국어(간체)', 'common.language.simplifiedChinese': '중국어(간체)',
'common.language.traditionalChinese': '중국어(번체)',
'common.language.ukrainian': '우크라이나어', 'common.language.ukrainian': '우크라이나어',
'common.language.spanish': '스페인어', 'common.language.spanish': '스페인어',
'common.language.brazilianPortuguese': '브라질 포르투갈어', 'common.language.brazilianPortuguese': '브라질 포르투갈어',
+1
View File
@@ -8,6 +8,7 @@ export const dict: Record<I18nKey, string> = {
'common.unavailable': 'Niedostępne', 'common.unavailable': 'Niedostępne',
'common.language.english': 'Angielski', 'common.language.english': 'Angielski',
'common.language.simplifiedChinese': 'Chiński (Uproszczony)', 'common.language.simplifiedChinese': 'Chiński (Uproszczony)',
'common.language.traditionalChinese': 'Chiński (Tradycyjny)',
'common.language.ukrainian': 'Ukraiński', 'common.language.ukrainian': 'Ukraiński',
'common.language.spanish': 'Hiszpański', 'common.language.spanish': 'Hiszpański',
'common.language.brazilianPortuguese': 'Portugalski (Brazylia)', 'common.language.brazilianPortuguese': 'Portugalski (Brazylia)',
@@ -7,6 +7,7 @@ export const dict: Record<I18nKey, string> = {
"common.unavailable": "Indisponível", "common.unavailable": "Indisponível",
"common.language.english": "Inglês", "common.language.english": "Inglês",
"common.language.simplifiedChinese": "Chinês (simplificado)", "common.language.simplifiedChinese": "Chinês (simplificado)",
"common.language.traditionalChinese": "Chinês (tradicional)",
"common.language.ukrainian": "Ucraniano", "common.language.ukrainian": "Ucraniano",
"common.language.spanish": "Espanhol", "common.language.spanish": "Espanhol",
"common.language.brazilianPortuguese": "Português brasileiro", "common.language.brazilianPortuguese": "Português brasileiro",
+1
View File
@@ -7,6 +7,7 @@ export const dict: Record<I18nKey, string> = {
"common.unavailable": "Недоступно", "common.unavailable": "Недоступно",
"common.language.english": "англійська", "common.language.english": "англійська",
"common.language.simplifiedChinese": "Китайська (спрощена)", "common.language.simplifiedChinese": "Китайська (спрощена)",
"common.language.traditionalChinese": "Китайська (традиційна)",
"common.language.ukrainian": "Українська", "common.language.ukrainian": "Українська",
"common.language.spanish": "Іспанська", "common.language.spanish": "Іспанська",
"common.language.brazilianPortuguese": "Бразильська португальська", "common.language.brazilianPortuguese": "Бразильська португальська",
@@ -7,6 +7,7 @@ export const dict: Record<I18nKey, string> = {
'common.unavailable': '不可用', 'common.unavailable': '不可用',
'common.language.english': 'English', 'common.language.english': 'English',
'common.language.simplifiedChinese': '简体中文', 'common.language.simplifiedChinese': '简体中文',
'common.language.traditionalChinese': '繁体中文',
'common.language.ukrainian': '乌克兰语', 'common.language.ukrainian': '乌克兰语',
'common.language.spanish': '西班牙语', 'common.language.spanish': '西班牙语',
'common.language.brazilianPortuguese': '巴西葡萄牙语', 'common.language.brazilianPortuguese': '巴西葡萄牙语',
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+7 -3
View File
@@ -1,12 +1,13 @@
export type Locale = 'en' | 'zh-CN' | 'uk' | 'es' | 'pt-BR' | 'ko' | 'pl'; export type Locale = 'en' | 'zh-CN' | 'zh-TW' | 'uk' | 'es' | 'pt-BR' | 'ko' | 'pl';
export const LOCALES = ['en', 'zh-CN', 'uk', 'es', 'pt-BR', 'ko', 'pl'] as const satisfies readonly Locale[]; export const LOCALES = ['en', 'zh-CN', 'zh-TW', 'uk', 'es', 'pt-BR', 'ko', 'pl'] as const satisfies readonly Locale[];
export const DEFAULT_LOCALE: Locale = 'en'; export const DEFAULT_LOCALE: Locale = 'en';
export const LOCALE_LABEL_KEYS: Record<Locale, 'common.language.english' | 'common.language.simplifiedChinese' | 'common.language.ukrainian' | 'common.language.spanish' | 'common.language.brazilianPortuguese' | 'common.language.korean' | 'common.language.polish'> = { export const LOCALE_LABEL_KEYS: Record<Locale, 'common.language.english' | 'common.language.simplifiedChinese' | 'common.language.traditionalChinese' | 'common.language.ukrainian' | 'common.language.spanish' | 'common.language.brazilianPortuguese' | 'common.language.korean' | 'common.language.polish'> = {
en: 'common.language.english', en: 'common.language.english',
'zh-CN': 'common.language.simplifiedChinese', 'zh-CN': 'common.language.simplifiedChinese',
'zh-TW': 'common.language.traditionalChinese',
uk: 'common.language.ukrainian', uk: 'common.language.ukrainian',
es: 'common.language.spanish', es: 'common.language.spanish',
'pt-BR': 'common.language.brazilianPortuguese', 'pt-BR': 'common.language.brazilianPortuguese',
@@ -29,6 +30,9 @@ export function normalizeLocale(value: string | undefined | null): Locale {
if (normalized === 'zh-cn' || normalized === 'zh-hans' || normalized.startsWith('zh-hans-')) { if (normalized === 'zh-cn' || normalized === 'zh-hans' || normalized.startsWith('zh-hans-')) {
return 'zh-CN'; return 'zh-CN';
} }
if (normalized === 'zh-tw' || normalized === 'zh-hant' || normalized.startsWith('zh-hant-')) {
return 'zh-TW';
}
if (normalized.startsWith('zh')) { if (normalized.startsWith('zh')) {
return 'zh-CN'; return 'zh-CN';
} }
+13 -11
View File
@@ -28,17 +28,19 @@ async function loadDictionary(locale: Locale): Promise<I18nDictionary> {
const mod = locale === 'zh-CN' const mod = locale === 'zh-CN'
? await import('./messages/zh-CN') as { dict: I18nDictionary } ? await import('./messages/zh-CN') as { dict: I18nDictionary }
: locale === 'es' : locale === 'zh-TW'
? await import('./messages/es') as { dict: I18nDictionary } ? await import('./messages/zh-TW') as { dict: I18nDictionary }
: locale === 'pt-BR' : locale === 'es'
? await import('./messages/pt-BR') as { dict: I18nDictionary } ? await import('./messages/es') as { dict: I18nDictionary }
: locale === 'uk' : locale === 'pt-BR'
? await import('./messages/uk') as { dict: I18nDictionary } ? await import('./messages/pt-BR') as { dict: I18nDictionary }
: locale === 'ko' : locale === 'uk'
? await import('./messages/ko') as { dict: I18nDictionary } ? await import('./messages/uk') as { dict: I18nDictionary }
: locale === 'pl' : locale === 'ko'
? await import('./messages/pl') as { dict: I18nDictionary } ? await import('./messages/ko') as { dict: I18nDictionary }
: { dict: enDict }; : locale === 'pl'
? await import('./messages/pl') as { dict: I18nDictionary }
: { dict: enDict };
dictionaries.set(locale, mod.dict); dictionaries.set(locale, mod.dict);
return mod.dict; return mod.dict;
} }