Add a UI locale

VerifiedSafe

Add a new language/locale to the webview UI by creating translation JSON files, registering the locale, and verifying parity with existing locales.

Sby Skills Guide Bot
DevelopmentIntermediate
7/29/2026
Claude Code
#i18n#localization#translations#react-i18next#webview

Recommended for

Automated summary

Adds a new UI language to the claude-code-gui webview's react-i18next translation system by creating per-namespace JSON catalogs, registering the locale, and verifying key parity against English.

Strengths

  • Step-by-step walkthrough: enumerate the namespaces, mirror the English key structure exactly, and preserve interpolation placeholders such as {{count}} and {{value}}.
  • Explicit rules on what not to translate (brand, env vars, paths, URLs, acronyms) and on producing the correct plural suffix sets per language.
  • Registration is confined to two files (languageMap.ts and the Settings page), with a note that config.ts auto-loads catalogs via a Vite glob.
  • Ships a Node script to check leaf-key parity between the new locale and English.

Limitations

  • Tightly coupled to one repository layout (webview/src/i18n/locales), so it is not directly reusable on another project.
  • The parity-check script appears truncated in the SKILL.md, so it may not run as written.
  • No translation tooling is included; string quality depends entirely on the translator or model.
When to use it

Use it when adding a new language to the claude-code-gui webview UI or when extending and verifying translations for an existing locale.

When not to use it

Avoid it for another project's i18n setup, or for non-UI strings such as backend messages, documentation, or README content.

Security analysis

Safe
Quality score93/100

The skill only provides documentation and commands for creating translation files, registering a locale, and running project lint/test scripts. No destructive, exfiltrating, or obfuscated actions are present; the verification script reads local JSON files and the bash commands are standard project build checks.

No concerns found

How this analysis is made

Examples

New language
Add Italian (it) as a new UI language to the claude-code-gui webview: create the translation files for every namespace, register the locale in languageMap.ts and the Settings page, and verify key parity.
Regional variant
Add Traditional Chinese as a locale using zh-TW as the folder code, chinese-traditional as the setting value and 繁體中文 as the dropdown label, then make sure every namespace matches the English keys.
Contribute translations
I want to contribute a Russian translation of the webview UI — create the locale files with the _one/_few/_many plural forms where needed and check the key parity against en.

name: add-locale description: Add a new UI language/locale to the claude-code-gui webview i18n system, or extend/verify an existing one. Walks a contributor (or agent) through creating the per-namespace translation JSON files, registering the locale, and verifying parity — consistently with how the shipped locales are structured. Use when someone wants to translate the UI into a new language, add a locale, or contribute translations. Trigger on: 언어 추가, 로케일 추가, 새 언어, 번역 추가, 번역 기여, add language, add locale, new language, translate the UI, contribute a translation, i18n locale.

Add a UI locale to the webview

The webview UI is internationalized with react-i18next. Every language is a folder of JSON catalogs under webview/src/i18n/locales/<locale>/, one file per namespace (page/area). English (en) is the source of truth and the fallback for any missing key.

Adding a language = (1) create that folder of translated JSON, (2) register the language in two small code spots. config.ts auto-loads locale files via a Vite glob, so you never edit config.ts.

0. Pick the identifiers

  • locale — a BCP-47 code and the folder name, e.g. it (Italian), pt-BR (Brazilian Portuguese), zh-TW (Traditional Chinese).
  • setting value — the value stored in settings, a lowercase English name, e.g. italian. For script/region variants use a - suffix, e.g. chinese-traditional.
  • endonym — the language's own name for the dropdown label, e.g. Italiano, 繁體中文. (Labels are endonym-only — no romanized prefix.)

1. Create the translation files

List the namespaces (these are the English source files):

ls webview/src/i18n/locales/en/
# chat chatTools commandPalette common notifications permissions
# projectSelector sessionPanel settings switchAccount

Create webview/src/i18n/locales/<locale>/<namespace>.json for every file in en/. Translate the string values; keep the key structure identical to the English file.

Rules — same as the shipped locales:

  • Mirror keys exactly. Same nesting, same key names as en/. Only values change.
  • Preserve interpolation placeholders verbatim: {{value}}, {{count}}, {{n}}, {{seconds}}, {{error}}, {{label}}, {{appName}}, … Keep whatever the English value uses, in place.
  • Plurals: if an English key uses i18next plural suffixes (foo_one/foo_other), produce the plural set your language needs. Languages with no plural distinction (ko/ja/zh) keep the same suffix keys with identical text. Languages with more categories (e.g. Russian: _one/_few/_many) may add those suffix keys — that is correct even though it means more keys than English for those entries.
  • Do NOT translate: the brand "Claude Code", ALL-CAPS env vars (CLAUDE_CONFIG_DIR), file paths, URLs, acronyms (CLI, MCP, IDE, OS, URL), code identifiers, model names/IDs, shell commands, keyboard tokens (Cmd+K).
  • Natural, concise UI phrasing. Match the tone of the existing locales.
  • Every file must be valid JSON.

2. Register the locale (two spots)

a. webview/src/i18n/languageMap.ts

  • Add the locale to SUPPORTED_LOCALES.
  • Add '<setting value>': '<locale>' to LANGUAGE_TO_LOCALE.

b. webview/src/pages/SettingsPage/General/index.tsx

  • Add { value: '<setting value>', label: '<endonym>' } to LANGUAGE_OPTIONS.

config.ts picks up the new files automatically (glob) — do not edit it.

3. Verify

  • Key parity — every locale namespace must have the same leaf keys as en (plural suffix variants aside). Run:
node -e '
const fs=require("fs"),p=require("path");
const base="webview/src/i18n/locales", L=process.argv[1];
const NS=fs.readdirSync(base+"/en").map(f=>f.replace(".json",""));
const leaves=(o,pre="")=>Object.entries(o).flatMap(([k,v])=>v&&typeof v==="object"&&!Array.isArray(v)?leaves(v,pre+k+"."):[pre+k]);
const norm=k=>k.replace(/_(zero|one|two|few|many|other)$/,"");
let miss=0;
for(const ns of NS){
  const en=new Set(leaves(JSON.parse(fs.readFileSync(`${base}/en/${ns}.json`))).map(norm));
  let tr; try{tr=new Set(leaves(JSON.parse(fs.readFileSync(`${base}/${L}/${ns}.json`))).map(norm));}catch(e){console.log(`MISSING FILE ${L}/${ns}.json`);miss++;continue;}
  for(const k of en) if(!tr.has(k)){console.log(`${L}/${ns}: missing ${k}`);miss++;}
}
console.log(miss?`❌ ${miss} problems`:`✅ ${L} matches en`);
' <locale>
  • Type check — bash ./scripts/build.sh wv-lint (must be clean).
  • Tests — bash ./scripts/build.sh wv-test.
  • Eyeball it — run the standalone dev server, open Settings → General → Interface Language, pick the new language, and click through the app.

Notes

  • The Interface Language (this) is separate from the Claude response language (a free-text field). Adding a UI locale only affects the interface.
  • If you only ship some namespaces, untranslated keys fall back to English — the app still works. But aim for full parity per §3.

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/add-a-ui-locale-ms5lrg86/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/add-a-ui-locale-ms5lrg86' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/add-a-ui-locale-ms5lrg86/download' --output '.skill-downloads/add-a-ui-locale-ms5lrg86/SKILL.md.part' && mv '.skill-downloads/add-a-ui-locale-ms5lrg86/SKILL.md.part' '.skill-downloads/add-a-ui-locale-ms5lrg86/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

This file does not provide a usable name/description header for this native procedure. It remains available to download and inspect; use the manual method below.

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/add-a-ui-locale-ms5lrg86/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills