Translating Eagle Animation
SkillFiles & storageExtract new UI strings and translate every language file in resources/i18n, leaving no key untranslated.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Translating Eagle Animation skill
What this skill tells your AI
The instructions your AI receives, as published by brick-a-brack/eagle-animation in .claude/skills/translate/SKILL.md and read by ahel’s review.
Fills in every missing translation across all resources/i18n/*.json files so no
__NOT_TRANSLATED__ sentinel remains.
How the i18n model works
- The scanner (
i18next-scanner, config at repo root) collects everyt('...')call insrc/**. - Keys are the English source strings. Files are a flat map, no nesting,
no namespaces (
nsSeparator/keySeparatorare off). en.jsonmaps each key to itself. Every other language maps the English key to its translation, or to the literal__NOT_TRANSLATED__for keys nobody has translated yet.- Interpolation uses
{{variable}}— these placeholders must survive translation verbatim.
Languages (22 besides English): bg, cs, da, de, el, eo, es, fi, fr, hr, hu, it, lt, lv, nl, pl, pt, ro, ru, sk, sl, sv.
Procedure
1. Extract strings
Run from the repo root — this adds any new keys and stamps __NOT_TRANSLATED__
into every non-English file:
npm run extract-strings
2. See what needs translating
node .claude/skills/translate/scripts/untranslated.mjs
Prints a per-language count and a total. 0 everywhere means you're done — stop.
Otherwise translate each language that has a non-zero count.
3. Translate, one language at a time
For each language with missing keys, get a fill-in skeleton (a JSON object of the untranslated English keys mapped to empty strings):
node .claude/skills/translate/scripts/untranslated.mjs --lang fr --skeleton
Translate each English key into the target language and fill the values. Rules:
- Keep
{{placeholders}}exactly — same name, same braces, do not translate or reorder their surrounding words in a way that drops them. - Keep the meaning and the UI tone — these are terse button/label/toast strings, not prose. Match length and register.
- Preserve leading/trailing spaces, trailing
:/…, capitalization style, and any HTML/markup or format specifiers. - Do not translate the product name "Eagle Animation", "Brick à Brack", or language endonyms that are themselves keys ("English", "Français", "Deutsch"…) — leave those as-is.
- Never leave a value empty and never write
__NOT_TRANSLATED__yourself.
Write the completed map to a scratch file, then apply it — the script only
overwrites __NOT_TRANSLATED__ values, preserves key order and formatting, and
reports anything it skipped:
# after writing e.g. /tmp/fr.json (or pipe via - )
node .claude/skills/translate/scripts/apply.mjs fr /tmp/fr.json
For many languages, translate them in parallel with subagents (one language per
agent, each returning its filled map), then apply.mjs each result. This keeps
each context small and avoids mixing languages.
4. Verify nothing is left
node .claude/skills/translate/scripts/untranslated.mjs # must print total 0 (exit 0)
Then keep the files consistent with repo formatting:
npx prettier --write resources/i18n/*.json
The task is complete only when the summary reports 0 untranslated across all 22 languages.
Signals
- GitHub stars
- 76
- Forks
- 11
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
translate-brick-a-brack- Source
- github.com/brick-a-brack/eagle-animation