From 7fd1c6bcd19f111feed3a1754fd9ace8a6a177cf Mon Sep 17 00:00:00 2001 From: doxa-maps-88655c70 <88627970+doxa-maps-88655c70@users.noreply.github.com> Date: Thu, 24 Sep 2026 05:43:21 +0000 Subject: [PATCH] feat(i18n): the poster wall's own labels now translate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Last tick made the 11 locales selectable. That immediately exposed what was sitting behind the door: the wall's labels — Poster Map, Prayer List, Card Deck, Print Options, Show on map, Close — were hardcoded English, so a reader who chose Spanish got Spanish page furniture around English buttons. All six are now keys in buttons.json, translated across all 11 locales, plus the aria-label which interpolates the item name rather than concatenating it. ★ AND IT CLOSED TWO OLDER ORPHANS. buttons.json had 21 keys in English and 19 everywhere else: `share` and `shareSteps` — the Share button's title and its five-step explainer, rendered on EVERY map. Ten locales had been shipping an English Share button since those keys were added, invisibly, because vue-i18n falls back to English rather than erroring. Both are translated now. Verified in a real browser across four languages: the wall's buttons read "Lista de oración | Mapa del cartel" under ?lang=es, "Liste de prière | Carte de l'affiche" under ?lang=fr, and the Arabic text renders with dir=rtl — zero page errors in each. The Share button's title follows too: Compartir, Поделиться. The wall's `t` and `locale` come from the SAME useI18n instance, so a label and a printed card deck can never disagree about which language the reader chose. --- library/components/poster/PosterWall.vue | 21 +- library/i18n/locales/ar/buttons.json | 17 +- library/i18n/locales/de/buttons.json | 17 +- library/i18n/locales/en/buttons.json | 9 +- library/i18n/locales/es/buttons.json | 17 +- library/i18n/locales/fr/buttons.json | 17 +- library/i18n/locales/hi/buttons.json | 17 +- library/i18n/locales/it/buttons.json | 17 +- library/i18n/locales/pt/buttons.json | 17 +- library/i18n/locales/ro/buttons.json | 17 +- library/i18n/locales/ru/buttons.json | 17 +- library/i18n/locales/zh/buttons.json | 17 +- .../country-posters/countries-map/index.html | 2 +- .../country-poster-wall/index.html | 2 +- .../country-posters-mfe/index.html | 2 +- .../country-posters/country-posters.js | 216 +++++++++--------- public/doxa-maps/index.html | 2 +- public/doxa-maps/key-cities/key-cities.js | 134 +++++------ public/doxa-maps/manifest.json | 28 +-- .../region-dashboards/index.html | 2 +- .../regions-dashboard/regions-dashboard.js | 166 +++++++------- .../regions-dashboard/regions-list/index.html | 2 +- .../regions-dashboard/regions-mfe/index.html | 2 +- 23 files changed, 459 insertions(+), 299 deletions(-) diff --git a/library/components/poster/PosterWall.vue b/library/components/poster/PosterWall.vue index 3c0e77771..b22afe511 100644 --- a/library/components/poster/PosterWall.vue +++ b/library/components/poster/PosterWall.vue @@ -228,7 +228,10 @@ async function exportPoster(item) { // than offering an action that cannot work. // The wall follows the app's locale: the card deck and its QR codes are localised, // and packet-strings.json falls back per key. -const { locale: wallLocale } = useI18n() +// `t` for the wall's own labels, `locale` for the card deck's language. Both come +// from the SAME instance so a label and a printed deck can never disagree about +// which language the reader chose. +const { t, locale: wallLocale } = useI18n() // ⚠ ONE exportState, not two. The composable owns a ref of its own; if the HUD // keeps rendering the wall's while the print actions write to the composable's, a // card-deck print shows NO progress and its errors vanish silently — the mechanism @@ -440,10 +443,10 @@ useShadowStyles( :class="{ 'is-last': lastShown === item.id }" :data-list-id="item.id">
@@ -465,14 +468,14 @@ useShadowStyles(
- Print Options - + {{ t('buttons.printOptions') }} + - + @click="prints.printCardDeck(item)">{{ t('buttons.cardDeck') }} +
@@ -485,12 +488,12 @@ useShadowStyles(