Chatbox i18n Translator
chatboxai/chatbox
Translates new or changed i18n keys from a Chatbox Pro diff, staged changes or a commit range, writing the locale JSON files directly with a built-in glossary.
Helps to understand and manage i18n JSON translation files for the Welcome To My Garden (WTMG) SvelteKit project.
$ npx skills add WelcometoMyGarden/welcometomygarden --skill i18n -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install WelcometoMyGarden/welcometomygarden i18n --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/WelcometoMyGarden/welcometomygarden.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/i18n .claude/skills/i18n && 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 "i18n" agent skill from https://github.com/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18n into .claude/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", 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/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18nType 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 WelcometoMyGarden/welcometomygarden --skill i18n -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install WelcometoMyGarden/welcometomygarden i18n --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/WelcometoMyGarden/welcometomygarden.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/i18n .agents/skills/i18n && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "i18n" agent skill from https://github.com/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18n into .agents/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", 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 WelcometoMyGarden/welcometomygarden --skill i18n -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install WelcometoMyGarden/welcometomygarden i18n --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/WelcometoMyGarden/welcometomygarden.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/i18n .cursor/skills/i18n && 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 "i18n" agent skill from https://github.com/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18n into .cursor/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", 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/WelcometoMyGarden/welcometomygarden.git --path .agents/skills/i18n--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 WelcometoMyGarden/welcometomygarden --skill i18n -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install WelcometoMyGarden/welcometomygarden i18n --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/WelcometoMyGarden/welcometomygarden.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/i18n .gemini/skills/i18n && 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 "i18n" agent skill from https://github.com/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18n into .gemini/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", 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 WelcometoMyGarden/welcometomygarden i18nInstalls 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 WelcometoMyGarden/welcometomygarden --skill i18n -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/WelcometoMyGarden/welcometomygarden.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/i18n .github/skills/i18n && 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 "i18n" agent skill from https://github.com/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18n into .github/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", 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 WelcometoMyGarden/welcometomygarden --skill i18n -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install WelcometoMyGarden/welcometomygarden i18n --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/WelcometoMyGarden/welcometomygarden.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/i18n .opencode/skills/i18n && 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 "i18n" agent skill from https://github.com/WelcometoMyGarden/welcometomygarden/tree/master/.agents/skills/i18n into .opencode/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", 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.
i18nHelps to understand and manage i18n JSON translation files for the Welcome To My Garden (WTMG) SvelteKit project.
I18n is an agent skill from WelcometoMyGarden/welcometomygarden. Helps to understand and manage i18n JSON translation files for the Welcome To My Garden (WTMG) SvelteKit project. Use whenever you need to find, add or update i18n keys.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including scripts (for example `guidelines.md`, `scripts/missing.py` and `scripts/patch.py`).
It sits in Frontend & Design, covering Internationalization and Translation. It works with SvelteKit. The repository describes itself as: Welcome To My Garden is a network of citizens offering camping spots in their gardens to slow travellers. The licence is AGPL-3.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 51c8c32. 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.
Ships 8 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
I18n loads about 3.4k tokens when it runs. Until then it costs about 44 tokens; SKILL.md has 1,736 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); the scripts in this folder are not scanned.
The full file from WelcometoMyGarden/welcometomygarden at commit 51c8c32, republished under its AGPL-3.0 licence (© WelcometoMyGarden). 1,736 words, ~3,429 tokens.
.claude/skills/i18n/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.You are helping the user manage i18n JSON translation files for the Welcome To My Garden (WTMG) SvelteKit project.
All locale files live in src/locales/. Enumerate them using find src/locales -name "*.json" | head -20 (from the repo root). The currently supported languages are defined in the SUPPORTED_LANGUAGES constant in src/lib/types/general.ts.
The 5 standard locales are: en, nl, de, fr, es.
If no args are given, ask the user what they want to do — options include:
since.py)unused.py){} subtrees left behind after removing keys (prune-empty.py)If args are given, interpret them as the task. Common forms:
add <key-path> "<english value>" — add a new key to all locale filesfind <key-path> — show the current value of a key in all localesmissing — list keys present in en.json but absent in at least one other localeedit <key-path> — show current values and update translationsscripts/. Do not edit the JSON files by hand or with the Edit tool — use the scripts. They preserve the file's indent=2 formatting, UTF-8 (non-ASCII) characters, and trailing newline, so diffs stay clean.guidelines.md.en.json.src/locales/. Do not seed or scaffold a *.json for a language that isn't there yet (e.g. pl) — adding a language is a separate, deliberate step (registering it in SUPPORTED_LANGUAGES and wiring it up). When asked to translate into a not-yet-supported language, deliver the translations in the since.py CSV worksheet instead (see below), never in a new locale file.svelte-i18n falls back to the English value whenever a key is absent from a locale (fallbackLocale: 'en' in src/routes/+layout.ts). So if the correct translation for a locale is exactly the same string as en — a proper name, a do-not-translate term (WTMG, Superfan, Welcome To My Garden), or a value that's "" in English too — leave the key absent from that locale instead of duplicating the English string. This is intentional, not an oversight: don't "fix" it by filling these in when you see them in missing.py output, and don't re-add them after they've been removed for this reason, unless the user explicitly asks for full key parity across locales. This only applies when the value would be truly identical — if it differs even slightly (e.g. French adding a space before ?), it's a real translation and belongs in the file.Translation keys are referenced via $_('key.path') or $t('key.path') in Svelte components, and get(_)('key.path') or get(t)('key.path') in JS/TS files.
To find where a key is used:
grep -r "key.path" src/Keys can also be dynamically generated (e.g. root.${dynamicKeyPart}.subkey), so grep doesn't give a 100% guarantee.
The skill ships three Python scripts in the scripts/ folder next to this file. Run them from the repo root so that src/locales resolves. They require only the Python 3 standard library. Each accepts --help and an optional --base <dir> to point at a different locales directory.
Reference the scripts by their path relative to the repo root, e.g. .agents/skills/i18n/scripts/show.py.
show.py <key-path> [--lang en] — read a key or sectionPrints the value at a dot-notation path for every locale. Works for leaf keys (prints the string) and whole sections (dumps the subtree). Use it to inspect current state before editing, to answer find <key-path>, or to see a section's structure before adding keys to it.
python3 .agents/skills/i18n/scripts/show.py chat.archive # one key, all locales
python3 .agents/skills/i18n/scripts/show.py chat # whole section
python3 .agents/skills/i18n/scripts/show.py chat.archive --lang enMissing keys print as <missing>.
missing.py [--lang nl] — diff locales against en.jsonReports, for each non-English locale, the keys present in en.json but absent there ("missing"), and any keys present there but not in en.json ("extra"). Use it for the missing request and to audit translation completeness.
Not every "missing" key is a gap to fill — per key rule 5, a key that's intentionally left absent because its translation is identical to English will show up here too. Before translating a reported-missing key, check whether it's actually one of these identical-to-English cases; if so, leave it absent.
python3 .agents/skills/i18n/scripts/missing.py
python3 .agents/skills/i18n/scripts/missing.py --lang nlpatch.py [patch.json] — add or update keysReads a JSON patch keyed by locale, whose values mirror the nested JSON structure (not dot-notation), and deep-merges it into each locale file — so only the keys you specify are touched and sibling keys are preserved. It works for a single key or a large batch.
Pass the patch as a file argument or pipe it on stdin (a heredoc is usually easiest):
python3 .agents/skills/i18n/scripts/patch.py << 'EOF'
{
"en": { "chat": { "archive-confirm": "Are you sure you want to archive this conversation?" } },
"nl": { "chat": { "archive-confirm": "Weet je zeker dat je dit gesprek wilt archiveren?" } },
"de": { "chat": { "archive-confirm": "Möchten Sie diese Unterhaltung wirklich archivieren?" } },
"fr": { "chat": { "archive-confirm": "Voulez-vous vraiment archiver cette conversation ?" } },
"es": { "chat": { "archive-confirm": "¿Seguro que quieres archivar esta conversación?" } }
}
EOFIt prints which keys it touched per file. Nested sections (e.g. no-archived.title) and ICU placeholders ({name}, {count}) are just normal JSON values — include them verbatim.
remove.py <key-path> [--lang nl] — delete a key or sectionDeletes the key at a dot-notation path from every locale (or one with --lang). Works for a leaf or a whole subtree. Any parent object left empty by the deletion is pruned, so no empty {} husks remain.
python3 .agents/skills/i18n/scripts/remove.py chat.archived-new-activity
python3 .agents/skills/i18n/scripts/remove.py chat.tip # whole subtreerename.py <old-path> <new-path> [--lang nl] — rename/move a keyMoves a key (leaf or section) to a new dot-notation path in every locale, preserving each locale's own translated value. Creates destination parents as needed and prunes emptied source parents. It does not touch source code — grep for $_('old.path') / get(_)('old.path') references in components and update them yourself.
# 1. update the component reference(s) first:
grep -rn "chat.archived-new-activity" src/
# 2. then move the key across all locales:
python3 .agents/skills/i18n/scripts/rename.py chat.archived-new-activity chat.open-archivesince.py <commit> <lang> — translation worksheet for changes since a commitCompares English (en.json) at a baseline <commit> against the current working-tree en.json and reports everything that changed after that commit (the commit itself is the baseline and is not included). Output is markdown:
Both tables have three columns: the dot-notation key, the current English value, and a column for <lang>. That last column is pre-filled with the locale's current value (empty for new keys, the stale value for updated keys). Use it as a worklist: replace those cells with freshly generated translations for <lang> that follow guidelines.md.
Alongside the markdown, the two tables are also written to CSV files in the repo root: i18n-added-<lang>.csv and i18n-updated-<lang>.csv (columns key,en,<lang>).
Where the finished translations go depends on whether <lang> already exists in src/locales/:
patch.py. Here the CSVs are scratch — delete them once applied, and don't commit them.pl, with no pl.json): <lang> does not have to be a standard locale — its column just comes back empty. Write the translations into the CSV worksheet files and leave them there as the deliverable. Do NOT create or seed a <lang>.json (or any missing locale file) yourself — adding a new locale to the project is a separate, deliberate step (registering it in SUPPORTED_LANGUAGES and wiring it up), not something this worksheet does. The filled CSVs are the output to hand off.python3 .agents/skills/i18n/scripts/since.py HEAD~5 fr # what changed in the last 5 commits, for French
python3 .agents/skills/i18n/scripts/since.py a1b2c3d nl
python3 .agents/skills/i18n/scripts/since.py a1b2c3d pl # a new language not yet in the repoThe script only reads English values for the diff — it does not translate. Generating the <lang> translations (including for brand-new languages) and applying them are your job, per the key rules above.
unused.py — find keys that look unused, for review before deletionScans the source tree (--src, default src) for every i18n reference and compares it against the keys defined in en.json. It detects references in the call forms $_(...), $t(...), _(...), t(...), get(_)(...), get(t)(...), transKeyExists(...), the subtree accessors json(...) and the WTMG helpers getNode(...) / getNodeArray(...) / getNodeKeys(...) / getNodeChildren(...) (which mark a path and all its descendants as used), and { key: ... } LocalizedMessage objects, classifying the first argument as:
${...}) matching the key shape word.word2-word3.0.word_word → the key is used.${...}, e.g. index.steps.${key}.title) → turned into a glob to best-effort match candidate keys.error.key or prefix + '.name') → listed for manual reasoning; embedded literal keys inside it (e.g. the fallback in labelKey ?? 'generics.email') are still counted as used.Output is sorted into confidence tiers:
en.json (typos / stale refs).python3 .agents/skills/i18n/scripts/unused.pyThe script never deletes anything, and "likely unused" is not a guarantee. Always reason about the dynamic templates and indirect references first (a key built from a runtime variable can be real even with zero static hits), grep to confirm, then remove confirmed keys across all locales with remove.py.
prune-empty.py — delete empty {} subtrees left behind after removalsRemoving keys can leave empty husks ("tabs": {}, "three-features": {}). This finds every object that is recursively empty (a bare {} or a tree of nested empty objects) and removes it — but only when it is empty or absent in every locale. A section that is {} in fr/nl but still has content in en is an untranslated section, not cruft: those inconsistent cases are reported separately and left untouched. Only the top of each empty subtree is removed (e.g. index.slowby, not also index.slowby.banner).
python3 .agents/skills/i18n/scripts/prune-empty.py --dry-run # preview
python3 .agents/skills/i18n/scripts/prune-empty.py # applyA natural follow-up to unused.py + remove.py: remove dead keys, then prune the empty parents they leave behind.
User: add chat.archive-confirm "Are you sure you want to archive this conversation?"
show.py chat to see what already exists in the chat section and confirm the key isn't taken.patch.py.show.py chat.archive-confirm.© WelcometoMyGarden, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 9 other files (scripts) in .agents/skills/i18n of WelcometoMyGarden/welcometomygarden.
Open the folder on GitHubat commit 51c8c32
I18n 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 |
|---|---|---|---|---|---|---|
| I18n this skillWelcometoMyGarden/welcometomygarden | 118 | — | ~3.4k | Automated safety check: Pass | AGPL-3.0 | |
| Chatbox i18n Translatorchatboxai/chatbox | 42k | — | ~508 | Automated safety check: Pass | GPL-3.0 | |
| Internationalization Workflow with i18niOfficeAI/AionUi | 33k | 1 repos | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Enforce Rules For I18nmoeru-ai/airi | 50k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Claude Desktop Chinese Localizationjavaht/claude-desktop-zh-cn | 7.5k | — | ~1.6k | Automated safety check: Pass | MIT | |
| Translation ReviewDevolutions/UniGetUI | 26k | — | ~1.3k | Automated safety check: Pass | MIT |
chatboxai/chatbox
Translates new or changed i18n keys from a Chatbox Pro diff, staged changes or a commit range, writing the locale JSON files directly with a built-in glossary.
iOfficeAI/AionUi
Standards for keeping all user-facing text translatable: read the i18n config first, use namespaced keys, reuse shared strings and follow the key naming rules.
moeru-ai/airi
Review pending AIRI translations on Crowdin in a batch, then sync them into the repository.
javaht/claude-desktop-zh-cn
Adds missing Simplified and Traditional Chinese translations to the Claude Desktop Chinese patch across three layers, then checks how many mappings actually hit.
Devolutions/UniGetUI
Reviews UniGetUI .json language files for localization quality, detects parity issues, English-equal entries, wrong-script content, and cross-language outliers, then generates a dataset for…
langflow-ai/langflow
Add, change, or review user-facing text in the Langflow frontend using the i18n system (i18next / react-i18next).
Works with
Categories
Helps to understand and manage i18n JSON translation files for the Welcome To My Garden (WTMG) SvelteKit project. I18n is an agent skill from WelcometoMyGarden/welcometomygarden. Helps to understand and manage i18n JSON translation files for the Welcome To My Garden (WTMG) SvelteKit project.
I18n fits situations like: you need to find; update i18n keys.
Run `npx skills add WelcometoMyGarden/welcometomygarden --skill i18n -a claude-code`. Or copy the skill folder (.agents/skills/i18n in WelcometoMyGarden/welcometomygarden) into .claude/skills/i18n in your project. Claude Code loads it when a task matches its description.
Run `npx skills add WelcometoMyGarden/welcometomygarden --skill i18n -a codex`. Or copy the skill folder (.agents/skills/i18n in WelcometoMyGarden/welcometomygarden) into .agents/skills/i18n 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 WelcometoMyGarden/welcometomygarden --skill i18n -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/i18n, .gemini/skills/i18n, .github/skills/i18n and .opencode/skills/i18n in your project.
Going by SKILL.md and its folder, I18n needs Python for the scripts in its folder and the command-line tools its instructions call (python3). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
I18n is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k 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 I18n: Chatbox i18n Translator (chatboxai/chatbox, 42k stars), Internationalization Workflow with i18n (iOfficeAI/AionUi, 33k stars), Enforce Rules For I18n (moeru-ai/airi, 50k stars) and Claude Desktop Chinese Localization (javaht/claude-desktop-zh-cn, 7.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
WelcometoMyGarden (a GitHub organization) maintains it in WelcometoMyGarden/welcometomygarden, which has 118 GitHub stars. The repository was last updated on September 21, 2026.
Source: WelcometoMyGarden/welcometomygarden on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.