name: translate-arroxy-i18n description: Arroxy app i18n workflow. Use when changing English app copy, translating app locales, updating src/shared/i18n/locales JSON, updating i18n PO/POT catalogs, checking stale/out-of-sync translation keys, or answering whether app i18n is correct.
Arroxy App i18n
Use this skill for Arroxy application translations and i18n audits.
Files
- English source:
src/shared/i18n/locales/en.json - Runtime locale JSON:
src/shared/i18n/locales/*.json - Translator catalogs:
i18n/app.potandi18n/locales/*.po - Catalog scripts:
scripts/i18n-catalog.tsandscripts/i18n-catalog-core.ts
Runtime non-English JSON is generated from PO catalogs. Do not hand-edit non-English runtime JSON.
PO field meaning:
msgctxt: stable i18next keymsgid: current English source stringmsgstr: localized string
Change Workflow
- Edit
src/shared/i18n/locales/en.jsononly. - Stop and get explicit user approval for the English copy. Plan approval is not translation approval.
- Run
bun run i18n:syncto updatei18n/app.potand merge English changes intoi18n/locales/*.po. - Translate only PO entries that are fuzzy, untranslated, or intentionally changed by the task.
- Preserve
msgctxtandmsgid. Edit onlymsgstrand removefuzzyonly after reviewing the translation against the currentmsgid. - Preserve placeholders, interpolation, markup, shortcut text, product names, and punctuation semantics.
- Run
bun run i18n:compileto regenerate runtime locale JSON. - Run
bun run check:appand fix every issue before reporting done.
Audit Workflow
When asked whether app i18n is correct, run both commands manually:
bun run check:app
bun run check:app:unused --strict
check:app validates key drift, placeholders, PO catalog freshness, stale English source, fuzzy entries, untranslated entries, and runtime JSON freshness.
check:app:unused --strict catches English keys that stopped being referenced in UI code and often exposes hard-coded English copy.
Sync Semantics
English changes are detected through gettext's msgid model. A stable i18next key lives in msgctxt; when the English string changes for the same key, msgmerge marks the old translation fuzzy so the catalog cannot pass until reviewed.
If bun run i18n:sync fails because msgmerge is missing, install GNU gettext in the environment or report that the sync step is blocked. Do not bypass this by editing generated JSON manually.
README Translations
README files are generated from readme-src/ and are separate from app i18n. If a task touches README copy, update readme-src/ and run:
bun run build:readme
bun run check:readme