doxa-maps/library/i18n
Doxa Maps 311b5c24a0 Two drawer links said "Gospel recordings" and "Disciple-making training" in every language
GiDrawer's LINKS table names gospelInternet.drawer.gospelAudio and
.drawer.training at src/components/GiDrawer.vue:30 and :32, but neither key
existed in ANY of the eleven locales. The call-site English then stood in
everywhere, so an Arabic or Chinese reader opening a people group saw two
English labels beside five translated ones.

The keys reach T() from a data table rather than a literal T('key', 'en') call,
which is why a call-site scan does not see them: the gate reports the fallback
string, and the fallback was doing its job too well to notice.

Added in all eleven. Parity and keys-exist pass; key count is +2 per locale,
249 -> 251, with nothing else moved.

The plugin's hardcoded-english count stays at 200 either way: that gate counts
the English fallback ARGUMENT, not whether the key resolves, so it cannot
distinguish a wired string from an unwired one.
2026-09-28 23:23:58 +00:00
..
locales Two drawer links said "Gospel recordings" and "Disciple-making training" in every language 2026-09-28 23:23:58 +00:00
index.js CLDR plural selection, and the "N countries / N regions" keys it was blocking 2026-09-28 23:23:56 +00:00
README.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00

library/i18n/ — the map's translations

One of the three customization seams (colors/, api/, i18n/). This one owns every user-facing string. Translations are one folder per locale, one JSON file per area, inlined at build time into a Vue I18n instance (one per <doxa-map>, so embeds don't bleed state).

  i18n/
  ┌───────────────────────────────┐
  │ index.js   ← engine, don't edit │
  │ locales/                        │
  │   en/  buttons.json legend.json …│  ← en is the source of truth + fallback
  │   es/ ar/ zh/ …  (same keys)     │  ← 11 shipped locales, drop in your own
  └───────────────────────────────┘
     filename → namespace:  buttons.json → $t('buttons.prayForThem')
  • 11 shipped locales; ar renders right-to-left (RTL_LOCALES).
  • Add a language by copying locales/en/ to locales/<code>/ — never by editing index.js (except adding the code to SUPPORTED_LOCALES).
  • Missing keys fall back to English silently.

Adding or overriding a locale? The full contract (locale matrix, checklist, integration) is in ../../documentation/architecture/i18n.md.