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.