Claude i18n
July 28, 2026 · View on GitHub
Claude i18n
Provide community-driven internationalization and multi-language support for Claude.ai.
| Supported platforms | Supported languages |
|---|---|
| Current locale pack | Main pack | Dynamic pack | Total |
|---|---|---|---|
Simplified Chinese zh-CN | 20,570 | 50 | 20,620 |
Traditional Chinese zh-TW | 20,570 | 50 | 20,620 |
Preview
View more screenshots
Installation
| Use case | Recommended route | Link |
|---|---|---|
| Daily Chrome / Edge use | Store build | Chrome Web Store / Microsoft Edge Add-ons |
| Firefox Desktop or macOS Safari | Experimental userscript | userscript/README.md |
| Manual install or archival package | .crx from Releases | Releases |
After installation, open Claude.ai, go to the language setting from the bottom-left account menu, and select the Chinese option for zh-CN or zh-TW.
Store Build
This is the most reliable distribution path for Chrome and Edge. Once installed from the store, browser updates are handled for you.
Experimental Userscript
The userscript build is for non-Chromium browsers, mainly Firefox Desktop and macOS Safari.
- Firefox Desktop: Tampermonkey or Violentmonkey is recommended; Greasemonkey is best-effort.
- macOS Safari: currently verified only with Safari + Userscripts App.
- Installation, debugging notes, and limitations are in userscript/README.md.
Manual .crx Install
- Download the latest
.crxfrom Releases. - Open
chrome://extensions/in Chrome or Edge. - Enable Developer mode.
- Drag the
.crxinto the extensions page and confirm installation.
Local Development
git clone https://github.com/Pectics/claude-i18n.git
cd claude-i18n
In chrome://extensions/, enable Developer mode, choose "Load unpacked", and select the extension/ directory.
To rebuild hosted locale artifacts:
./build.sh
How It Works
Claude.ai already has a locale-loading pipeline; it just only accepts official locales. Claude i18n adds a thin coordination layer: the page can see extra locales, the backend still receives en-US where it needs an official locale, and the missing locale files are served by the extension.
Runtime Flow
hook.jsis injected into the page's main world atdocument_start, before Claude.ai finishes wiring its locale state.- When Claude.ai builds the official locale array, the extension appends extra locales from the remote
locales.json. - When same-origin app requests carry
locale=zh-CNorlocale=zh-TW, the transport locale falls back toen-US, while the browser remembers the user's selected extension locale. - When the page requests
/i18n/*.jsonor/i18n/dynamic/*.json, the extension backend returns the matching locale pack. - Same-origin JSON responses with top-level
localeorgated_messages.localeare restored in the browser to the user's selected extension locale.
Components
| File | Role |
|---|---|
extension/hook.js | Main-world page hook for locale-list injection, request rewriting, response restoration, and i18n interception. |
extension/script.js | Message bridge between the page and the extension background worker. |
extension/service.js | Background worker that reads the remote manifest, downloads locale packs, and maintains cache state. |
locales.json | Hosted locale manifest, currently listing zh-CN and zh-TW. |
<locale>/<locale>.json | Main UI locale pack. |
<locale>/<locale>.dynamic.json | Dynamic / gated_messages locale pack. |
Cache Strategy
- The locale manifest is cached in
localStorageand refreshed against the remote manifest version. - Locale pack version metadata is cached in
chrome.storage.local, keyed by hashes from/version/{locale}.json. - Locale pack bodies are cached in Cache Storage; they are re-downloaded only when the hash changes, and old hash entries are pruned.
/i18n/*.overrides.jsoncurrently returns an empty{}for extension locales so Claude.ai does not fail on missing override files.
Supported Languages
Counts come from the locale files currently in this repository.
| Language | Locale | Main pack | Dynamic pack | Status |
|---|---|---|---|---|
| Simplified Chinese | zh-CN | 20,570 | 50 | Available |
| Traditional Chinese | zh-TW | 20,570 | 50 | Available |
Additional locales are welcome when they have a real product audience. Use the full-locale creation flow below instead of copying directories by hand.
Contributing
Improve Existing Translations
Edit the locale files directly:
- Main UI copy:
zh-CN/zh-CN.json,zh-TW/zh-TW.json - Dynamic copy:
zh-CN/zh-CN.dynamic.json,zh-TW/zh-TW.dynamic.json - Latest English source:
.original/upstream/en-US.json,.original/upstream/en-US.dynamic.json
Preserve placeholders, HTML tags, ICU MessageFormat, URLs, commands, code spans, and backticks. The wording can be more natural; the structure must remain compatible.
Sync Claude Upstream Changes
GitHub Actions checks Claude.ai's upstream locale files every 6 hours. Latest snapshots are stored under .original/upstream; each target locale is compared with its verified baseline under .original/baselines/<locale>, and its diff is written under .pending/locale-update/<locale>.
After each successful fetch, GitHub Actions compares the locale packs on main with the latest upstream snapshot and publishes coverage.json plus pre-rendered badges/<locale>.svg files to GitHub Pages. Translation work on bot/locale-update is not counted until it is merged into main.
Coverage badges are green at 90% or higher, yellow at 75% or higher, red below 75%, and gray with invalid when a locale pack cannot be read.
Maintainers usually apply the update like this:
# 1. Generate translation chunks for the target locale
node scripts/locale-update/prepare_translation.mjs --locale zh-CN
# 2. Translate JSONL chunks under .pending/locale-update/<locale>/translation/chunks/
# Write outputs to the manifest-provided out/ paths
# Recommended built-in workflow:
# Claude Code: /apply-locale-update
# Codex: /apply-locale-update
# 3. Validate and apply translations
node scripts/locale-update/apply_translation.mjs --locale zh-CN
apply_translation.mjs validates row counts, key order, placeholders, HTML tags, ICU structure, source hashes, and obvious untranslated content. On success it rebuilds the target locale packs, atomically advances that locale's English baseline, updates the locale statistics in all three READMEs, and clears only .pending/locale-update/<locale>.
Add a New Locale
For a brand-new locale, generate a full translation task first:
node scripts/create-full-locale/prepare_translation.mjs --locale fr-FR
The script reads .original/upstream/en-US*.json, can use .original/upstream/ja-JP*.json and existing zh-CN as context, and writes chunked work under .pending/create-full-locale/<locale>/.
After translating the chunks, run:
node scripts/create-full-locale/apply_translation.mjs --locale fr-FR
./build.sh
On success it writes <locale>/<locale>.json, <locale>/<locale>.dynamic.json, and appends the locale to locales.json.
Recent Changes
Full history is available in Releases.
1.1.2
- Renamed
statsig-related language-pack handling todynamicto match Claude.ai's current locale structure.
1.1.1
- Moved request rewriting from fixed endpoint names to a generic locale transport layer covering query strings, JSON, forms,
URLSearchParams, andFormData. - Same-origin JSON responses now restore
localeandgated_messages.localegenerically. - Simplified the remote
locales.jsonshape to a string array.
1.1.0
- Split the runtime into
hook.js,script.js, andservice.js. - Switched locale discovery to lazy-loaded remote metadata, and language-pack updates to hash validation plus browser cache.
- Added handling for
/i18n/*.overrides.json, Dynamic locale packs, and related request paths.
FAQ
Does it translate my conversations with Claude?
Claude i18n only handles Claude.ai interface text; prompts, replies, and file content stay in Claude.ai's normal flow.
Will this affect my Claude account?
The extension coordinates locale handling in the browser. Account settings remain in Claude.ai's normal state, and backend-facing requests still fall back to an official locale.
Why do backend requests fall back to en-US?
Claude's backend does not currently accept extension locales. The fallback prevents profile, bootstrap, and experience requests from failing; the browser then restores the interface locale the user selected.
Are locale packs updated automatically?
Yes. The extension checks remote version hashes and downloads fresh packs when hashes change.
Is the userscript build stable?
It is experimental. Chrome and Edge users should prefer the store build; Firefox and Safari users can try the userscript and use userscript/README.md for injection or cache troubleshooting.

