Skip to content

Commit 095432e

Browse files
authored
feat(i18n): add Traditional Chinese language support & rename 'Chinese' to 'Chinese (Simplified)' (anomalyco#9887)
1 parent 9ef357c commit 095432e

11 files changed

Lines changed: 668 additions & 11 deletions

File tree

packages/app/src/context/language.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
55
import { Persist, persisted } from "@/utils/persist"
66
import { dict as en } from "@/i18n/en"
77
import { dict as zh } from "@/i18n/zh"
8+
import { dict as zht } from "@/i18n/zht"
89
import { dict as ko } from "@/i18n/ko"
910
import { dict as de } from "@/i18n/de"
1011
import { dict as es } from "@/i18n/es"
@@ -15,6 +16,7 @@ import { dict as pl } from "@/i18n/pl"
1516
import { dict as ru } from "@/i18n/ru"
1617
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
1718
import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
19+
import { dict as uiZht } from "@opencode-ai/ui/i18n/zht"
1820
import { dict as uiKo } from "@opencode-ai/ui/i18n/ko"
1921
import { dict as uiDe } from "@opencode-ai/ui/i18n/de"
2022
import { dict as uiEs } from "@opencode-ai/ui/i18n/es"
@@ -24,20 +26,23 @@ import { dict as uiJa } from "@opencode-ai/ui/i18n/ja"
2426
import { dict as uiPl } from "@opencode-ai/ui/i18n/pl"
2527
import { dict as uiRu } from "@opencode-ai/ui/i18n/ru"
2628

27-
export type Locale = "en" | "zh" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru"
29+
export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru"
2830

2931
type RawDictionary = typeof en & typeof uiEn
3032
type Dictionary = i18n.Flatten<RawDictionary>
3133

32-
const LOCALES: readonly Locale[] = ["en", "zh", "ko", "de", "es", "fr", "da", "ja", "pl", "ru"]
34+
const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru"]
3335

3436
function detectLocale(): Locale {
3537
if (typeof navigator !== "object") return "en"
3638

3739
const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
3840
for (const language of languages) {
3941
if (!language) continue
40-
if (language.toLowerCase().startsWith("zh")) return "zh"
42+
if (language.toLowerCase().startsWith("zh")) {
43+
if (language.toLowerCase().includes("hant")) return "zht"
44+
return "zh"
45+
}
4146
if (language.toLowerCase().startsWith("ko")) return "ko"
4247
if (language.toLowerCase().startsWith("de")) return "de"
4348
if (language.toLowerCase().startsWith("es")) return "es"
@@ -63,6 +68,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
6368

6469
const locale = createMemo<Locale>(() => {
6570
if (store.locale === "zh") return "zh"
71+
if (store.locale === "zht") return "zht"
6672
if (store.locale === "ko") return "ko"
6773
if (store.locale === "de") return "de"
6874
if (store.locale === "es") return "es"
@@ -84,6 +90,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
8490
const dict = createMemo<Dictionary>(() => {
8591
if (locale() === "en") return base
8692
if (locale() === "zh") return { ...base, ...i18n.flatten({ ...zh, ...uiZh }) }
93+
if (locale() === "zht") return { ...base, ...i18n.flatten({ ...zht, ...uiZht }) }
8794
if (locale() === "de") return { ...base, ...i18n.flatten({ ...de, ...uiDe }) }
8895
if (locale() === "es") return { ...base, ...i18n.flatten({ ...es, ...uiEs }) }
8996
if (locale() === "fr") return { ...base, ...i18n.flatten({ ...fr, ...uiFr }) }
@@ -99,6 +106,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
99106
const labelKey: Record<Locale, keyof Dictionary> = {
100107
en: "language.en",
101108
zh: "language.zh",
109+
zht: "language.zht",
102110
ko: "language.ko",
103111
de: "language.de",
104112
es: "language.es",

packages/app/src/i18n/da.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ export const dict = {
269269
"context.usage.clickToView": "Klik for at se kontekst",
270270

271271
"language.en": "Engelsk",
272-
"language.zh": "Kinesisk",
272+
"language.zh": "Kinesisk (forenklet)",
273+
"language.zht": "Kinesisk (traditionelt)",
273274
"language.ko": "Koreansk",
274275
"language.de": "Tysk",
275276
"language.es": "Spansk",

packages/app/src/i18n/de.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,8 @@ export const dict = {
274274
"context.usage.clickToView": "Klicken, um Kontext anzuzeigen",
275275

276276
"language.en": "Englisch",
277-
"language.zh": "Chinesisch",
277+
"language.zh": "Chinesisch (Vereinfacht)",
278+
"language.zht": "Chinesisch (Traditionell)",
278279
"language.ko": "Koreanisch",
279280
"language.de": "Deutsch",
280281
"language.es": "Spanisch",

packages/app/src/i18n/en.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,8 @@ export const dict = {
286286
"context.usage.clickToView": "Click to view context",
287287

288288
"language.en": "English",
289-
"language.zh": "Chinese",
289+
"language.zh": "Chinese (Simplified)",
290+
"language.zht": "Chinese (Traditional)",
290291
"language.ko": "Korean",
291292
"language.de": "German",
292293
"language.es": "Spanish",

packages/app/src/i18n/es.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ export const dict = {
269269
"context.usage.clickToView": "Haz clic para ver contexto",
270270

271271
"language.en": "Inglés",
272-
"language.zh": "Chino",
272+
"language.zh": "Chino (simplificado)",
273+
"language.zht": "Chino (tradicional)",
273274
"language.ko": "Coreano",
274275
"language.de": "Alemán",
275276
"language.es": "Español",

packages/app/src/i18n/fr.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ export const dict = {
269269
"context.usage.clickToView": "Cliquez pour voir le contexte",
270270

271271
"language.en": "Anglais",
272-
"language.zh": "Chinois",
272+
"language.zh": "Chinois (simplifié)",
273+
"language.zht": "Chinois (traditionnel)",
273274
"language.ko": "Coréen",
274275
"language.de": "Allemand",
275276
"language.es": "Espagnol",

packages/app/src/i18n/ja.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ export const dict = {
267267
"context.usage.clickToView": "クリックしてコンテキストを表示",
268268

269269
"language.en": "英語",
270-
"language.zh": "中国語",
270+
"language.zh": "中国語(簡体字)",
271+
"language.zht": "中国語(繁体字)",
271272
"language.ko": "韓国語",
272273
"language.de": "ドイツ語",
273274
"language.es": "スペイン語",

packages/app/src/i18n/ko.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ export const dict = {
271271
"context.usage.clickToView": "컨텍스트를 보려면 클릭",
272272

273273
"language.en": "영어",
274-
"language.zh": "중국어",
274+
"language.zh": "중국어 (간체)",
275+
"language.zht": "중국어 (번체)",
275276
"language.ko": "한국어",
276277
"language.de": "독일어",
277278
"language.es": "스페인어",

packages/app/src/i18n/zh.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ export const dict = {
267267
"context.usage.clickToView": "点击查看上下文",
268268

269269
"language.en": "英语",
270-
"language.zh": "中文",
270+
"language.zh": "简体中文",
271+
"language.zht": "繁体中文",
271272
"language.ko": "韩语",
272273
"language.de": "德语",
273274
"language.es": "西班牙语",

0 commit comments

Comments
 (0)