Summary
The dashboard currently ships 3 languages: English (en), Chinese (zh), Vietnamese (vi). I'd love to support more — Spanish, German, French, Japanese, Portuguese, etc. — but I'm only fluent in English, Vietnamese, and Chinese, so I can't author or vouch for the correctness of other languages myself.
This is an open call for community contributors. If you're fluent in a language we don't support yet, please add it! One language per PR is ideal.
The bar: same standard as the existing languages
A new language is only useful if it's correct, comprehensive, and complete. That means:
- Full coverage — all ~1,452 translation keys across 15 namespaces must be present in the new locale. No missing keys, no silent fall-back to English in the UI. (For reference,
en has 1,452 leaf strings today; zh/vi are at 1,446 — a small pre-existing drift new locales should not copy; match en exactly.)
- Correctness — a fluent/native speaker must review every namespace. AI tools (incl. Claude) are fine for a first pass and are encouraged to move fast, but a human who actually speaks the language must verify the output before it's merged. Machine translation alone is not acceptable — UI microcopy, button labels, pluralization, and domain terms break in subtle ways that only a speaker catches.
- Consistency with our conventions — keep technical identifiers and the "Agent" terminology untranslated the way
zh/vi already do (there's a test that enforces this). Don't translate interpolation variables or placeholders — {{count}}, {{name}}, <code>…</code>, etc. must stay intact. Match tone/length so the UI doesn't overflow.
What "adding a language <xx>" actually involves
Please read docs/I18N.md first — it documents the architecture (i18next + react-i18next, detection order, namespaces). Concretely, a complete PR touches:
client/src/i18n/locales/<xx>/*.json — translate all 15 namespaces:
activity, alerts, analytics, ccConfig, common, dashboard, errors, kanban, nav, run, sessions, settings, splash, updates, workflows.
Largest are workflows (411), settings (269), ccConfig (227), common (163), run (141). Keep the exact key structure as en.
client/src/i18n/index.ts — import each <ns>_<xx> bundle, add to resources, and add "<xx>" to supportedLngs.
client/src/i18n/format.ts — wire locale-aware date/number/model-name formatting for the new locale.
client/src/i18n/__tests__/i18n.test.ts — extend the assertions to cover <xx> (key parity vs en, "Agent" left untranslated, non-explicit tag like es-ES → es). Bonus: a real parity test that fails on any missing key would help all locales.
README-<XX>.md — a full translation of README.md (we keep README-VN.md / README-CN.md as standalone files; add the language switcher link at the top like the others).
wiki/ — add <xx> entries to wiki/i18n-content.js following .claude/rules/wiki-i18n.md, then bump the cache: CACHE_NAME in wiki/sw.js and the i18n-content.js?v= query in wiki/index.html.
docs/I18N.md — add the language to "Supported languages" and the supportedLngs list.
Acceptance criteria
Notes for contributors
- One language per PR keeps review tractable.
- If you can only do part (e.g. the client UI but not the README/wiki), open a draft PR and say so — partial-but-correct beats complete-but-wrong, and others can build on it.
- Not sure where to start? The client
locales/<xx>/*.json files are the highest-impact piece. Copy en/ as the scaffold and translate in place.
- Questions welcome in this thread. 🙏
Filed as a standing community task — comment to claim a language so we don't duplicate effort.
Summary
The dashboard currently ships 3 languages: English (
en), Chinese (zh), Vietnamese (vi). I'd love to support more — Spanish, German, French, Japanese, Portuguese, etc. — but I'm only fluent in English, Vietnamese, and Chinese, so I can't author or vouch for the correctness of other languages myself.This is an open call for community contributors. If you're fluent in a language we don't support yet, please add it! One language per PR is ideal.
The bar: same standard as the existing languages
A new language is only useful if it's correct, comprehensive, and complete. That means:
enhas 1,452 leaf strings today;zh/viare at 1,446 — a small pre-existing drift new locales should not copy; matchenexactly.)zh/vialready do (there's a test that enforces this). Don't translate interpolation variables or placeholders —{{count}},{{name}},<code>…</code>, etc. must stay intact. Match tone/length so the UI doesn't overflow.What "adding a language
<xx>" actually involvesPlease read
docs/I18N.mdfirst — it documents the architecture (i18next + react-i18next, detection order, namespaces). Concretely, a complete PR touches:client/src/i18n/locales/<xx>/*.json— translate all 15 namespaces:activity,alerts,analytics,ccConfig,common,dashboard,errors,kanban,nav,run,sessions,settings,splash,updates,workflows.Largest are
workflows(411),settings(269),ccConfig(227),common(163),run(141). Keep the exact key structure asen.client/src/i18n/index.ts— import each<ns>_<xx>bundle, add toresources, and add"<xx>"tosupportedLngs.client/src/i18n/format.ts— wire locale-aware date/number/model-name formatting for the new locale.client/src/i18n/__tests__/i18n.test.ts— extend the assertions to cover<xx>(key parity vsen, "Agent" left untranslated, non-explicit tag likees-ES→es). Bonus: a real parity test that fails on any missing key would help all locales.README-<XX>.md— a full translation ofREADME.md(we keepREADME-VN.md/README-CN.mdas standalone files; add the language switcher link at the top like the others).wiki/— add<xx>entries towiki/i18n-content.jsfollowing.claude/rules/wiki-i18n.md, then bump the cache:CACHE_NAMEinwiki/sw.jsand thei18n-content.js?v=query inwiki/index.html.docs/I18N.md— add the language to "Supported languages" and thesupportedLngslist.Acceptance criteria
client/src/i18n/locales/<xx>/with the same keys asen(no missing, no extra)index.ts(resources+supportedLngs) andformat.tsnpm run test:clientpasses, including the i18n test extended for<xx><code>/identifiers/"Agent" terminology preservedREADME-<XX>.mdadded; switcher links updated across README variantsi18n-content.jsupdated per the wiki-i18n rule + cache version bumpeddocs/I18N.mdupdatedNotes for contributors
locales/<xx>/*.jsonfiles are the highest-impact piece. Copyen/as the scaffold and translate in place.Filed as a standing community task — comment to claim a language so we don't duplicate effort.