Put the missing-map sentence in every packet language

The page-1 notice for a missing map existed only in English, which
turns check:packet-strings-parity red: the packet catalogue must be
whole in every language, and English-by-choice is not one of its
declared exceptions (only the licensed Mark 5 passage is).

All eleven blocks now carry the sentence, reusing each block's own
page-1 wording for "prayer list" so the notice reads like the line
above it. The English says "prayer list" rather than "zone": zone is an
internal term, and the page itself calls it a prayer list. The Chinese
block is Traditional script, so the sentence is too, with the Taiwan
term for printing.

The loud gate's note described the old English-only state; it now
reports which locales fall back, or that none do.
This commit is contained in:
Doxa Maps 2026-09-29 00:25:14 +00:00
parent ef6000c5d7
commit 646c23cc0e
3 changed files with 17 additions and 9 deletions

View file

@ -87,10 +87,13 @@ for (const lang of ['en', 'es', 'ar']) {
notes.push(` ok ${lang.padEnd(4)} full + lightweight: loud when missing, quiet when present`)
}
// Per-key fallback, stated separately because it is a property of the STRINGS, not the renderer:
// every non-English locale deliberately lacks the key and must inherit the English sentence.
// Per-key fallback, stated separately because it is a property of the STRINGS, not the renderer. Every
// block carries its own sentence (check:packet-strings-parity requires it); a block that ever lacks it
// still prints the English one rather than the raw key, which side (1) above asserts.
const missingIn = Object.keys(strings).filter((k) => k !== '_meta' && k !== 'en' && !strings[k].map_unavailable)
notes.push(` ok ${missingIn.length} locales fall back to the English sentence (no invented translations)`)
notes.push(missingIn.length
? ` ok ${missingIn.length} locale(s) fall back to the English sentence: ${missingIn.join(', ')}`
: ' ok every locale carries its own sentence')
for (const n of notes) console.log(n)
if (fails.length) {

View file

@ -365,11 +365,6 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
* Why a notice and not a thrown error: the packet is still worth printing, and a partner holding
* it should be able to SEE that one illustration is missing rather than wonder whether the
* project ships half-finished documents. This is the fail-loud half of fail-soft.
*
* ⚠ English-only key, on purpose. `t()` falls back to English per key, so the other ten locales
* print this sentence in English until a translator supplies their own — which is honest. The
* alternative was inventing ten translations I cannot verify, and a wrong sentence reads as
* AUTHORITATIVE to someone who cannot check it.
*/
function missingMapNotice() {
return `<div class="map-missing">${esc(t('map_unavailable'))}</div>`;

View file

@ -10,7 +10,7 @@
"en": {
"map_page_kicker": "UNENGAGED PEOPLE GROUPS",
"map_page_sub": "A prayer list of {count} unreached people groups",
"map_unavailable": "The map for this zone is not included in this printing.",
"map_unavailable": "The map for this prayer list is not included in this printing.",
"list_header": "{from}–{to} of {count} · pray for them by name",
"people_suffix": "people",
"no_photo": "no photo available",
@ -232,6 +232,7 @@
"es": {
"map_page_kicker": "GRUPOS ÉTNICOS NO EVANGELIZADOS",
"map_page_sub": "Una lista de oración de {count} grupos étnicos no alcanzados",
"map_unavailable": "El mapa de esta lista de oración no se incluye en esta impresión.",
"list_header": "{from}–{to} de {count} · ora por ellos por nombre",
"people_suffix": "personas",
"no_photo": "sin fotografía disponible",
@ -453,6 +454,7 @@
"fr": {
"map_page_kicker": "GROUPES ETHNIQUES NON ATTEINTS",
"map_page_sub": "Une liste de prière de {count} groupes ethniques non atteints",
"map_unavailable": "La carte de cette liste de prière n’est pas incluse dans cette impression.",
"list_header": "{from}–{to} sur {count} · priez pour eux par leur nom",
"people_suffix": "personnes",
"no_photo": "aucune photo disponible",
@ -674,6 +676,7 @@
"pt": {
"map_page_kicker": "GRUPOS ÉTNICOS NÃO ALCANÇADOS",
"map_page_sub": "Uma lista de oração de {count} grupos étnicos não alcançados",
"map_unavailable": "O mapa desta lista de oração não está incluído nesta impressão.",
"list_header": "{from}–{to} de {count} · ore por eles pelo nome",
"people_suffix": "pessoas",
"no_photo": "sem fotografia disponível",
@ -893,6 +896,7 @@
"de": {
"map_page_kicker": "UNERREICHTE VOLKSGRUPPEN",
"map_page_sub": "Eine Gebetsliste von {count} unerreichten Volksgruppen",
"map_unavailable": "Die Karte zu dieser Gebetsliste ist in diesem Ausdruck nicht enthalten.",
"list_header": "{from}–{to} von {count} · betet namentlich für sie",
"people_suffix": "Menschen",
"no_photo": "kein Foto verfügbar",
@ -1114,6 +1118,7 @@
"it": {
"map_page_kicker": "GRUPPI ETNICI NON RAGGIUNTI",
"map_page_sub": "Una lista di preghiera di {count} gruppi etnici non raggiunti",
"map_unavailable": "La mappa di questa lista di preghiera non è inclusa in questa stampa.",
"list_header": "{from}–{to} di {count} · pregate per loro per nome",
"people_suffix": "persone",
"no_photo": "nessuna foto disponibile",
@ -1333,6 +1338,7 @@
"ro": {
"map_page_kicker": "GRUPURI ETNICE NEATINSE",
"map_page_sub": "O listă de rugăciune pentru {count} grupuri etnice neatinse",
"map_unavailable": "Harta acestei liste de rugăciune nu este inclusă în această tipărire.",
"list_header": "{from}–{to} din {count} · rugați-vă pentru ei pe nume",
"people_suffix": "persoane",
"no_photo": "nicio fotografie disponibilă",
@ -1552,6 +1558,7 @@
"ru": {
"map_page_kicker": "НЕОХВАЧЕННЫЕ НАРОДЫ",
"map_page_sub": "Молитвенный список из {count} неохваченных народов",
"map_unavailable": "Карта этого молитвенного списка не включена в эту распечатку.",
"list_header": "{from}–{to} из {count} · молитесь за них поимённо",
"people_suffix": "человек",
"no_photo": "фотография недоступна",
@ -1773,6 +1780,7 @@
"ar": {
"map_page_kicker": "شعوب غير مبلَّغة",
"map_page_sub": "قائمة صلاة من أجل {count} شعبًا غير مبلَّغ",
"map_unavailable": "خريطة قائمة الصلاة هذه غير مضمَّنة في هذه النسخة المطبوعة.",
"list_header": "{from}–{to} من {count} · صلّوا لأجلهم بالاسم",
"people_suffix": "نسمة",
"no_photo": "لا توجد صورة متاحة",
@ -1994,6 +2002,7 @@
"hi": {
"map_page_kicker": "अनछुए जनसमूह",
"map_page_sub": "{count} अनछुए जनसमूहों की प्रार्थना सूची",
"map_unavailable": "इस प्रार्थना सूची का नक्शा इस प्रिंट में शामिल नहीं है।",
"list_header": "{count} में से {from}–{to} · उनके नाम लेकर प्रार्थना करें",
"people_suffix": "लोग",
"no_photo": "कोई चित्र उपलब्ध नहीं",
@ -2213,6 +2222,7 @@
"zh": {
"map_page_kicker": "未得之民",
"map_page_sub": "為 {count} 個未得之民的禱告名單",
"map_unavailable": "此禱告名單的地圖未包含在本次列印中。",
"list_header": "{count} 之中的 {from}–{to} · 按名為他們禱告",
"people_suffix": "人",
"no_photo": "沒有照片",