Portuguese said "Application" above the population figure

Widening the locale comparison from ten hand-picked terms to EVERY catalogue
string their page renders found two more in the clone's own catalogue, one of
them a real mistranslation we had inherited: pt Population was "Aplicação",
which means Application, and dx-life has since corrected it on live to
"População". hi Population differed by a diacritic, जनसँख्या against live's
जनसंख्या. Both were verbatim in the clone, so both were copied faithfully.

With those two fixed, regions.json now has ZERO divergences against live across
all seven upstream locales for every string that appears on their page.

The comparison maps english -> localised from their own pages rather than from
any reading of the language: their /en and /LOC pages are the same template,
measured at 262 comparable leaves with an identical tag+class sequence across
en, ru, de, es, fr, hi, pt and ar, so leaf i on one is leaf i on the other. It
refuses rather than guesses: a locale whose leaf count or shape differs is
skipped, an English string appearing twice with different localisations is
dropped as ambiguous (74 of them), only strings that exactly equal one of our
own en values are considered so page data cannot be mistaken for catalogue text,
and templates carrying placeholders are never auto-applied.

Two defects in that probe, both caught before anything shipped:

It read the page through a template literal holding code, where `\s` is not a
recognised escape, so `.replace(/\s+/g,' ')` silently became
`.replace(/s+/g,' ')` and every run of the letter s turned into a space. German
came back as "Volk gruppen" for Volksgruppen and "1+ Men chen beten" for
"1+ Menschen beten". The bug hid in Arabic, which has no Latin s, and the
earlier sweeps happened to use the doubled `/\\s+/g` form that survives a
template literal. The extractor is now a FUNCTION passed to evaluate, which
removes the whole class of escape bug rather than patching this instance.

And it was about to hand a navigation translation to a button. Their page's only
"Pray" is an <a> inside .menu-item -- the site nav -- while our regions.json
"Pray" is the pin-popup's button, which their page never renders because popups
exist only after a click. Text identity cannot tell two components apart, so nav,
header, footer and menu items are now excluded before anything is paired; our
catalogue covers the embed, not the site shell.

The 23 remaining divergences are all in library/i18n/locales/*/legend.json --
our own shared map legend, which reaches every bundle and is not part of the
clone. They are reported, not changed: it is a cross-bundle decision, and their
English merely coincides with dx-life's.
This commit is contained in:
doxa-maps-88655c70 2026-09-25 01:41:57 +00:00
parent 379f959038
commit 754dddd5a1
8 changed files with 11 additions and 11 deletions

View file

@ -38,7 +38,7 @@
"People committed to praying": "प्रार्थना के लिए प्रतिबद्ध लोग",
"Pick a region above, or click any dot to open that people group's country.": "ऊपर कोई क्षेत्र चुनें, या उस लोगों के समूह का देश खोलने के लिए किसी बिंदु पर क्लिक करें।",
"Pick a region or a country on the Regions List tab to narrow this dashboard.": "इस डैशबोर्ड को सीमित करने के लिए क्षेत्रों की सूची टैब में कोई क्षेत्र या देश चुनें।",
"Population": "जनसँख्या",
"Population": "जनसंख्या",
"Prayer Coverage": "प्रार्थना कवरेज",
"Prayer coverage progress": "प्रार्थना कवरेज की प्रगति",
"Region Dashboards": "क्षेत्र डैशबोर्ड",

View file

@ -38,7 +38,7 @@
"People committed to praying": "Pessoas comprometidas com a oração",
"Pick a region above, or click any dot to open that people group's country.": "Escolha uma região acima, ou clique em qualquer ponto para abrir o país desse povo.",
"Pick a region or a country on the Regions List tab to narrow this dashboard.": "Escolha uma região ou um país na aba Lista de regiões para restringir este painel.",
"Population": "Aplicação",
"Population": "População",
"Prayer Coverage": "Cobertura de oração",
"Prayer coverage progress": "Progresso da cobertura de oração",
"Region Dashboards": "Painéis das regiões",

File diff suppressed because one or more lines are too long

View file

@ -879,7 +879,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d",
"integrity": "sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe",
"elements": [
"regions-dashboard"
],
@ -899,7 +899,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -913,7 +913,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -927,7 +927,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
}
]

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-EyPu6NfDP/zobw0CzQYbKyoSDfOveFoTxGMjW3AfOgARngY7GKPy6wUusPrrYE0d" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-8JsVgIo2ZAMZIr1GUBuoLAzfjQRGVEFSNKSz7LUh45+09ryrQDibdhMEhWrWuOfe" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: