From 471bd05cea3e75179e4c6d1b97a45932d11d9537 Mon Sep 17 00:00:00 2001 From: doxa-maps-88655c70 <88627970+doxa-maps-88655c70@users.noreply.github.com> Date: Fri, 25 Sep 2026 12:16:59 +0000 Subject: [PATCH] Stop showing English where the catalogue already holds the translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A reader on an Arabic page saw a handful of English words among the Arabic: the table's "People Groups" title, its count line, the Engagement column, the Gospel Access chart title, and the side drawer's close button. Every one of them had a correct Arabic entry sitting in the catalogue; nothing looked it up. THE CHECK CAME FIRST, AND IT REPLACES A SWEEP THAT PASSED A BROKEN TREE. The old method sorted every rendered string into third-party / data / chrome and counted only chrome. That split is a guess, and it guessed wrong exactly where the defect lived: single words like "Region", "Prayer" and "Country" are as plausible as values as they are as labels, so they scored as data and the sweep reported zero on a page that was visibly leaking. check:composite-locale-leaks asks a question with an answer instead: the English catalogue holds this exact string as a value, AND this locale holds a DIFFERENT value for that key, AND the page still renders the English one. No judgement about what kind of word it is — if the translation exists and the reader is not getting it, that is the defect. The two surfaces a lookup cannot judge (vendor map chrome, and table/facet cells carrying API values) are muted by NAME with a stated reason, never by word, so muting one can never hide the next real leak that happens to reuse it. The gate failed on this tree naming 9 strings before any of them were fixed. Also threaded here: both composites now accept `lang` / `locale` in profile-config and pass it to the children they mount, alongside `tk` and `provider`. A partner writing {"lang":"ar"} reached nothing before — the knob was documented and read by nobody. The prayer facet's label in DashboardResearchFilters is now a catalogue getter too. Measured before touching it: dashboard.config.js does define prayer_level and FACETS spreads the config last, so that literal never rendered for this config — it is a default for a config that omits the facet, and it stays, with the merge order written down so the next reader need not re-derive it. Four strings remain English with no catalogue entry at all — "Top countries", "Select all {n}", the table dock's title, and the singular "group". They need wording in ten languages that cannot be composed from existing entries, so they are a DECIDE card for the Driver rather than translations invented here. --- .../README-SECTION-3-cli-commands.md | 2 +- library/components/ResearchMapSideMenu.vue | 2 +- package.json | 6 +- .../dashboard-plus-grid.vue | 14 ++ .../research-dashboard/dashboard.config.js | 4 +- .../dashboards/DashboardDataTable.vue | 11 +- .../dashboards/DashboardResearchFilters.vue | 8 +- .../research-map-plus-grid.vue | 14 ++ .../scripts/check-composite-locale-leaks.mjs | 216 ++++++++++++++++++ .../country-posters/countries-map/index.html | 2 +- .../country-poster-wall/index.html | 2 +- .../country-posters-mfe/index.html | 2 +- .../country-posters/country-posters.js | 84 +++---- .../dashboard-plus-grid.js | 62 ++--- .../dashboard-plus-grid/default/index.html | 2 +- .../dashboard-plus-grid/index.html | 2 +- public/doxa-maps/doxa-maps-spa/manifest.json | 24 +- .../doxa-research-map/doxa-research-map.js | 66 +++--- .../doxa-research-map/research-map/index.html | 2 +- .../research-map/maplibre/index.html | 2 +- public/doxa-maps/index.html | 2 +- public/doxa-maps/manifest.json | 24 +- .../research-dashboard/research-dashboard.js | 62 ++--- .../research-dashboard/index.html | 2 +- .../research-map-plus-grid.js | 18 +- .../research-map-plus-grid/default/index.html | 2 +- .../research-map-plus-grid/index.html | 2 +- 27 files changed, 449 insertions(+), 190 deletions(-) create mode 100644 plugin-designs/research-map-plus-grid/scripts/check-composite-locale-leaks.mjs diff --git a/documentation/README-SECTION-3-cli-commands.md b/documentation/README-SECTION-3-cli-commands.md index b3b25bf4d..b3525873f 100644 --- a/documentation/README-SECTION-3-cli-commands.md +++ b/documentation/README-SECTION-3-cli-commands.md @@ -49,7 +49,7 @@ The scripts these commands are grounded in (from this branch's `package.json`): "build": "bash internal/build-lock.sh", "build:unlocked": "bun run gates:pre && bun run library-index && bun run check:library-index && bun run clean && bun run token && bun run build:bundles && bun run tree && bun run gates:post && bun run gallery", "gates:pre": "node internal/run-parallel.mjs --label=pre -- check:template-literal check:mjs-parse check:sfc-parse check:tab-radius check:synced-css check:wp-embed check:doc-scripts", -"gates:post": "node internal/run-parallel.mjs --label=post -- check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:legend-source check:backlog-refs check:composite-embed-knobs check:linked-vocabulary", +"gates:post": "node internal/run-parallel.mjs --label=post -- check:drop check:parse verify check:sri check:public-hygiene check:label-joins check:facet-cascade check:facet-one-field check:heartbeat check:kpi-unit check:composite-reg check:descriptions check:no-abs-paths check:no-codename check:dep-names check:composite-srcs check:embed-targets check:nested-token check:i18n-parity check:tabs-localized check:packets-all check:packet-strings-parity check:zone-census check:share-policy check:library-index check:csv-shape check:capability-citations check:catalog-identity check:no-orphan-gates check:quoted-scripts check:done-evidence check:script-flags check:backlog-status check:capability-exemplars check:packet-fixture check:packet-browser check:provider-switch check:locale-reachable check:url-resolver check:manifest-covers check:one-palette check:legend-source check:backlog-refs check:composite-embed-knobs check:composite-locale-leaks check:linked-vocabulary", "build:bundles": "node internal/run-parallel.mjs --bundles", // the 22 vite builds, 4 at a time "preview": "bun x vite preview", "serve": "node internal/serve-strict.mjs", // 404s a directory, like production diff --git a/library/components/ResearchMapSideMenu.vue b/library/components/ResearchMapSideMenu.vue index bf0ac8c1c..c94e43c79 100644 --- a/library/components/ResearchMapSideMenu.vue +++ b/library/components/ResearchMapSideMenu.vue @@ -97,7 +97,7 @@ useShadowStyles(`