Lingui Best Practices
B0und/WikiSpeedrun
Implement internationalization with Lingui in React and JavaScript applications.
A skill your agent uses when adding a new interface language (locale) to the app, or when asked to translate the UI into another language.
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ZoneMinder/zmNinjaNg add-language --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ZoneMinder/zmNinjaNg.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-language .claude/skills/add-language && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-language" agent skill from https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-language into .claude/skills/add-language/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-language", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-languageType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ZoneMinder/zmNinjaNg add-language --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZoneMinder/zmNinjaNg.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/add-language .agents/skills/add-language && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-language" agent skill from https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-language into .agents/skills/add-language/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-language", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ZoneMinder/zmNinjaNg add-language --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZoneMinder/zmNinjaNg.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/add-language .cursor/skills/add-language && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-language" agent skill from https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-language into .cursor/skills/add-language/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-language", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ZoneMinder/zmNinjaNg.git --path .claude/skills/add-language--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ZoneMinder/zmNinjaNg add-language --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZoneMinder/zmNinjaNg.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/add-language .gemini/skills/add-language && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-language" agent skill from https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-language into .gemini/skills/add-language/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-language", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ZoneMinder/zmNinjaNg add-languageInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ZoneMinder/zmNinjaNg.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/add-language .github/skills/add-language && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-language" agent skill from https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-language into .github/skills/add-language/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-language", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ZoneMinder/zmNinjaNg add-language --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ZoneMinder/zmNinjaNg.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/add-language .opencode/skills/add-language && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-language" agent skill from https://github.com/ZoneMinder/zmNinjaNg/tree/main/.claude/skills/add-language into .opencode/skills/add-language/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-language", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-languageA skill your agent uses when adding a new interface language (locale) to the app, or when asked to translate the UI into another language.
Add Language is an agent skill from ZoneMinder/zmNinjaNg. Use when adding a new interface language (locale) to the app, or when asked to translate the UI into another language. Covers the translation file, the i18n resources, the plural forms the language needs, and the user doc that names the available languages.
Its SKILL.md is about 1.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Translation and Internationalization. It works with React. The repository describes itself as: ZoneMinder client for iOS, Android, Windows, macOS, Linux and web. Live camera view, event review, montage, timeline, push notifications. Rewrite of zmNinja. The licence is Apache-2.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3f90042. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmnpxnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm and npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Language loads about 1.1k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 516 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ZoneMinder/zmNinjaNg at commit 3f90042, republished under its Apache-2.0 licence (© ZoneMinder). 516 words, ~1,138 tokens.
.claude/skills/add-language/SKILL.md (or your agent's skills folder).The app bundles translations at build time. Adding a locale means touching three code locations plus two prose locations. Miss any one and the failure is silent: i18next falls back to English mid-screen, or the new locale ships with no key-parity coverage.
Run all npm commands from app/.
Below, {code} is the ISO code (it) and {Name} is the language's own name
for itself (Italiano).
mkdir -p app/src/locales/{code}
cp app/src/locales/en/translation.json app/src/locales/{code}/translation.jsonTranslate every value in app/src/locales/{code}/translation.json. Do not
change, add, or drop keys. The key-parity test in step 5 fails if the shape
drifts from en.
Labels must fit 320px (project rule in AGENTS.project.md), so prefer the
concise translation where two options exist.
The languages section of each locale lists all languages, so the picker reads
correctly whatever language the UI is currently in. Add "{code}": "{Name}" to
the languages section of every translation.json under app/src/locales/,
the new one included. List them first rather than working from memory:
ls app/src/localesUse the same string {Name} in all of them. Language names are not translated.
In app/src/locales/resources.ts, add the import alongside the others and the
entry in LANGUAGE_RESOURCES:
import {code}Translation from './{code}/translation.json';export const LANGUAGE_RESOURCES = {
// ...
{code}: { translation: {code}Translation },
};Both pickers and i18next read this map, so nothing else registers a locale.
Both of them, Settings → Appearance and the sidebar globe dropdown, render
useLanguageOptions (app/src/hooks/useLanguageOptions.ts), which reads the
codes registered in step 4 and orders them English first, then by label. The
order is covered by app/src/components/layout/__tests__/LanguageSwitcher.test.tsx,
which pins the expected sequence, so add the new code there.
docs/user-guide/settings.md, Appearance table, Language row, names the
available languages in English. Add the new one.
English declares _one and _other. A language with more plural categories
needs the rest, or i18next finds no key for those counts and silently renders
English: Russian showed "2 monitors" until _few and _many were added. The
parity test checks every category Intl.PluralRules reports for counts up to
100, so it tells you which keys are missing.
node -e "console.log(new Intl.PluralRules('{code}').resolvedOptions().pluralCategories)"These already take the active locale as data, so none of them needs a per-locale entry:
app/src/lib/relative-time.ts passes the code straight to
Intl.RelativeTimeFormat.app/src/lib/assistant/system-prompt.ts interpolates the locale into the
prompt and asks the model to answer in the user's language.app/src/locales/__tests__/translation-keys.test.ts discovers locale
directories on disk, so the new one is key-checked against en with no edit.npm test
npx tsc -b
npm run build
npm run test:e2e -- settings.featuresettings.feature has a language-change scenario, so it is the relevant e2e
run for this change.
Then check the UI by hand: Settings → Appearance → Language, and the sidebar globe dropdown. Both should list the new language, and selecting it should change the visible text.
app/src/locales/{code}/translation.json created and fully translatedlanguages.{code} added to every translation file under app/src/locales/app/src/i18n.ts import and resources entryLanguageSwitcher.test.tsxdocs/user-guide/settings.md Language rownpm test, npx tsc -b, npm run build, npm run test:e2e -- settings.feature© ZoneMinder, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/add-language of ZoneMinder/zmNinjaNg.
Open the folder on GitHubat commit 3f90042
Add Language next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Language this skillZoneMinder/zmNinjaNg | 110 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Lingui Best PracticesB0und/WikiSpeedrun | 133 | 2 repos | ~4.2k | Automated safety check: Pass | MIT | |
| I18next Localizationi18next/i18next-cli | 242 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Experience UI Bundle Localizeforcedotcom/sf-skills | 1.1k | — | ~5.8k | Automated safety check: Pass | Apache-2.0 | |
| Translate CraftEliasOulkadi/shokunin | 114 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Frontend I18nlangflow-ai/langflow | 156k | — | ~1k | Automated safety check: Pass | MIT |
B0und/WikiSpeedrun
Implement internationalization with Lingui in React and JavaScript applications.
i18next/i18next-cli
Takes an app from hardcoded strings to a localized, continuously translated one with i18next (Locize optional): stack detection, config, wrapping strings in t(), key extraction, Locize sync, and AI…
forcedotcom/sf-skills
MUST activate to localize / internationalize a uiBundles//src/ project (React or Angular): extract hardcoded user-facing strings into Custom Labels, wire a runtime i18n library over the Platform SDK…
EliasOulkadi/shokunin
Professional translation and localization for 8 languages (ES, JA, FR, DE, PT, ZH, KO, AR).
langflow-ai/langflow
Add, change, or review user-facing text in the Langflow frontend using the i18n system (i18next / react-i18next).
Y80/bmm
A skill your agent uses when the user wants to translate a repository README, make a repo multilingual, localize docs, add a language switcher, internationalize the README, or update localized…
ZoneMinder/zmNinjaNg
A skill your agent uses when asked for a full codebase review, health check, quality audit, or scorecard of this repo, or for a "fable review" / multi-pillar review whose output another agent will…
ZoneMinder/zmNinjaNg
A skill your agent uses when asked to mine the commit history for lessons the agent instruction files have not captured, to audit whether domain-context and contracts reflect what actually broke, or…
Works with
Categories
A skill your agent uses when adding a new interface language (locale) to the app, or when asked to translate the UI into another language. Add Language is an agent skill from ZoneMinder/zmNinjaNg. Use when adding a new interface language (locale) to the app, or when asked to translate the UI into another language.
Add Language fits situations like: adding a new interface language (locale) to the app; asked to translate the UI into another language.
Run `npx skills add ZoneMinder/zmNinjaNg --skill add-language -a claude-code`. Or copy the skill folder (.claude/skills/add-language in ZoneMinder/zmNinjaNg) into .claude/skills/add-language in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ZoneMinder/zmNinjaNg --skill add-language -a codex`. Or copy the skill folder (.claude/skills/add-language in ZoneMinder/zmNinjaNg) into .agents/skills/add-language in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ZoneMinder/zmNinjaNg --skill add-language -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-language, .gemini/skills/add-language, .github/skills/add-language and .opencode/skills/add-language in your project.
Going by SKILL.md and its folder, Add Language needs the command-line tools its instructions call (npm, npx and node). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npm and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add Language is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.1k tokens (SKILL.md is roughly 4.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add Language: Lingui Best Practices (B0und/WikiSpeedrun, 133 stars), I18next Localization (i18next/i18next-cli, 242 stars), Experience UI Bundle Localize (forcedotcom/sf-skills, 1.1k stars) and Translate Craft (EliasOulkadi/shokunin, 114 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ZoneMinder (a GitHub organization) maintains it in ZoneMinder/zmNinjaNg, which has 110 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 6, 2026.
Source: ZoneMinder/zmNinjaNg on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.