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.
Use it when adding a new language to the claude-code-gui webview UI or when extending and verifying translations for an existing locale.
Avoid it for another project's i18n setup, or for non-UI strings such as backend messages, documentation, or README content.
Security analysis
SafeThe 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 madeExamples
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.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.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>'toLANGUAGE_TO_LOCALE.
b. webview/src/pages/SettingsPage/General/index.tsx
- Add
{ value: '<setting value>', label: '<endonym>' }toLANGUAGE_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 filesThis 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.mdFrom 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.
React Hook Form Best Practices
Development
Master React Hook Form: avoid anti-patterns, manage subscriptions, and handle reset, dirty state, and controlled inputs correctly.
Emotion to Mantine Migration
Development
Migrate Emotion styled-components to Mantine components with style props and CSS modules. Use when converting .styled.tsx files or removing @emotion imports.
Scope Creep Detector
Development
Analyzes git diffs against a stated intent to detect scope creep, unrelated files, broad PRs, and oversized changes, then suggests keep, split, or justify actions.