Agent skill

Add Language

by ZoneMinder in ZoneMinder/zmNinjaNg

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.

Apache-2.0Auto-check passedFrontend & Design

Install Add Language

skills CLI
$ npx skills add ZoneMinder/zmNinjaNg --skill add-language -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ZoneMinder/zmNinjaNg add-language --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
add-language
GitHub stars
110
Token cost
~1.1k tokens
SKILL.md length
516 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
Apache-2.0

At a glance

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.

  • Works in 7 steps: Create the translation file → Translate the values → Add the language name to every… → …
  • Adding a new interface language (locale) to the app
  • SKILL.md covers 1. Create the translation file, 2. Translate the values, 3. Add the language name to… and 4. Register the locale, plus 6 more sections
  • Calls npm, npx and node

What it does

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.

When your agent uses it

  • Adding a new interface language (locale) to the app
  • Asked to translate the UI into another language

Example prompts

  • “/add-language”

Requirements

  • Node.js

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Create the translation file
  2. Translate the values
  3. Add the language name to every translation file
  4. Register the locale
  5. Nothing to do for the pickers
  6. Update the user doc
  7. Add the plural forms the language needs

What it can do on your machine

Read from SKILL.md and the folder at commit 3f90042. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • npx
    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~68
When it runs · the whole SKILL.md, loaded when a task matches
~1.1k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from ZoneMinder/zmNinjaNg at commit 3f90042, republished under its Apache-2.0 licence (© ZoneMinder). 516 words, ~1,138 tokens.

Download SKILL.mdSave it as .claude/skills/add-language/SKILL.md (or your agent's skills folder).
name
add-language
description
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.

Adding a new interface language

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).

1. Create the translation file

bash
mkdir -p app/src/locales/{code}
cp app/src/locales/en/translation.json app/src/locales/{code}/translation.json

2. Translate the values

Translate 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.

3. Add the language name to every translation file

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:

bash
ls app/src/locales

Use the same string {Name} in all of them. Language names are not translated.

4. Register the locale

In app/src/locales/resources.ts, add the import alongside the others and the entry in LANGUAGE_RESOURCES:

typescript
import {code}Translation from './{code}/translation.json';
typescript
export const LANGUAGE_RESOURCES = {
  // ...
  {code}: { translation: {code}Translation },
};

Both pickers and i18next read this map, so nothing else registers a locale.

5. Nothing to do for the pickers

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.

6. Update the user doc

docs/user-guide/settings.md, Appearance table, Language row, names the available languages in English. Add the new one.

Show full SKILL.md (224 more words)Show less

7. Add the plural forms the language needs

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.

bash
node -e "console.log(new Intl.PluralRules('{code}').resolvedOptions().pluralCategories)"

Nothing to do for dates, the assistant, or the parity test

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.

Verify

bash
npm test
npx tsc -b
npm run build
npm run test:e2e -- settings.feature

settings.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.

Checklist

  • app/src/locales/{code}/translation.json created and fully translated
  • languages.{code} added to every translation file under app/src/locales/
  • app/src/i18n.ts import and resources entry
  • expected order updated in LanguageSwitcher.test.tsx
  • plural forms for every category the language needs
  • docs/user-guide/settings.md Language row
  • npm 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

Files

Just SKILL.md in .claude/skills/add-language of ZoneMinder/zmNinjaNg.

Open the folder on GitHubat commit 3f90042

Compare with similar skills

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.

Add Language compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Language this skillZoneMinder/zmNinjaNg110—~1.1kAutomated safety check: PassApache-2.0
Lingui Best PracticesB0und/WikiSpeedrun1332 repos~4.2kAutomated safety check: PassMIT
I18next Localizationi18next/i18next-cli242—~1.6kAutomated safety check: PassMIT
Experience UI Bundle Localizeforcedotcom/sf-skills1.1k—~5.8kAutomated safety check: PassApache-2.0
Translate CraftEliasOulkadi/shokunin114—~2.4kAutomated safety check: PassMIT
Frontend I18nlangflow-ai/langflow156k—~1kAutomated safety check: PassMIT

Similar skills

  • Lingui Best Practices

    B0und/WikiSpeedrun

    Implement internationalization with Lingui in React and JavaScript applications.

    133 GitHub starsUsed in 2 repos~4.2k tokens
    Frontend & DesignAuto-check passed
  • I18next Localization

    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…

    242 GitHub stars~1.6k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Experience UI Bundle Localize

    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…

    1.1k GitHub stars~5.8k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Translate Craft

    EliasOulkadi/shokunin

    Professional translation and localization for 8 languages (ES, JA, FR, DE, PT, ZH, KO, AR).

    114 GitHub stars~2.4k tokensUpdated 3 days ago
    Frontend & DesignAuto-check passed
  • Frontend I18n

    langflow-ai/langflow

    Add, change, or review user-facing text in the Langflow frontend using the i18n system (i18next / react-i18next).

    156k GitHub stars~1k tokensUpdated today
    Frontend & DesignAuto-check passed
  • 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…

    344 GitHub starsUsed in 2 repos~1.9k tokens
    Frontend & DesignAuto-check passed

More from ZoneMinder/zmNinjaNg

  • Fable Review

    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…

    110 GitHub stars~4.2k tokensUpdated yesterday
    Auto-check passed
  • Mine History

    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…

    110 GitHub stars~1k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Add Language

What does Add Language do?

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.

When should I use Add Language?

Add Language fits situations like: adding a new interface language (locale) to the app; asked to translate the UI into another language.

How do I install Add Language in Claude Code?

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.

How do I install Add Language in Codex?

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.

Can I use Add Language in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Add Language need to run?

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.

Does Add Language access the network?

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.

Is Add Language safe to install?

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.

What licence does Add Language use?

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.

How many tokens does Add Language use?

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.

What are the alternatives to Add Language?

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.

Who maintains Add Language?

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.