Internationalization (apback)

Backend notification and email strings use i18next with locale files under locales/.

Layout

Path Content
locales/en/apback.json English source
locales/{de,fr,it,es-US}/apback.json Translations only (Weblate + bin/translate.mjs)
locale-src/{de,fr,it,es-US}/apback.json English snapshot for machine-translation diffing (CI/local only)

Community locales (es, pt, ta, etc.) have no sidecars. Only en, fr, de, it, pt, and ta are registered at runtime (api/abstractplay.ts).

Scripts

npm run extract                    # i18next-parser from api/**/*.ts, utils/**/*.ts
node bin/translate.mjs locales/en/apback.json   # Gemini translate de/fr/it/es-US
node bin/check-locale-readiness.js               # Audit vs English
node bin/split-locale-src.mjs                    # One-time _src_* extraction (reference)

Weblate

Weblate syncs locales/ only. locale-src/ is never in scope, so PRs cannot strip translation-tracking metadata. Close any in-flight Weblate PRs that remove _src_* keys before merging the locale-src migration.