Claude i18n

July 28, 2026 · View on GitHub

Claude i18n Logo

Claude i18n

Provide community-driven internationalization and multi-language support for Claude.ai.

English | 简体中文 | 繁體中文

Release License Downloads

Issues Pull Requests Locale Update Vercel Build

Supported platformsSupported languages
Chrome Edge Userscriptzh-CN zh-TW zh-HK
Current locale packMain packDynamic packTotal
Simplified Chinese zh-CN20,5705020,620
Traditional Chinese zh-TW20,5705020,620

Preview

Claude.ai Chinese interface preview
View more screenshots Claude.ai extension page in Chinese Claude.ai plan page in Chinese

Installation

Use caseRecommended routeLink
Daily Chrome / Edge useStore buildChrome Web Store / Microsoft Edge Add-ons
Firefox Desktop or macOS SafariExperimental userscriptuserscript/README.md
Manual install or archival package.crx from ReleasesReleases

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

  1. Download the latest .crx from Releases.
  2. Open chrome://extensions/ in Chrome or Edge.
  3. Enable Developer mode.
  4. Drag the .crx into 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

  1. hook.js is injected into the page's main world at document_start, before Claude.ai finishes wiring its locale state.
  2. When Claude.ai builds the official locale array, the extension appends extra locales from the remote locales.json.
  3. When same-origin app requests carry locale=zh-CN or locale=zh-TW, the transport locale falls back to en-US, while the browser remembers the user's selected extension locale.
  4. When the page requests /i18n/*.json or /i18n/dynamic/*.json, the extension backend returns the matching locale pack.
  5. Same-origin JSON responses with top-level locale or gated_messages.locale are restored in the browser to the user's selected extension locale.

Components

FileRole
extension/hook.jsMain-world page hook for locale-list injection, request rewriting, response restoration, and i18n interception.
extension/script.jsMessage bridge between the page and the extension background worker.
extension/service.jsBackground worker that reads the remote manifest, downloads locale packs, and maintains cache state.
locales.jsonHosted locale manifest, currently listing zh-CN and zh-TW.
<locale>/<locale>.jsonMain UI locale pack.
<locale>/<locale>.dynamic.jsonDynamic / gated_messages locale pack.

Cache Strategy

  • The locale manifest is cached in localStorage and 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.json currently 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.

LanguageLocaleMain packDynamic packStatus
Simplified Chinesezh-CN20,57050Available
Traditional Chinesezh-TW20,57050Available

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 to dynamic to 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, and FormData.
  • Same-origin JSON responses now restore locale and gated_messages.locale generically.
  • Simplified the remote locales.json shape to a string array.

1.1.0

  • Split the runtime into hook.js, script.js, and service.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.

License

MIT © 2026 Pectics

If you want to support the project, stars, translation fixes, and new-locale contributions all help. Sponsorship is also welcome through the links below.

afdian PayPal

WeChat PayAlipay
WeChat Pay QR CodeAlipay QR Code