From 646c23cc0ecc962f459ddf3a125f74722bf754cc Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 00:25:14 +0000 Subject: [PATCH] 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. --- internal/check-packet-map-missing-loud.mjs | 9 ++++++--- library/packet/packet-render.js | 5 ----- library/scripts/posters/packet-strings.json | 12 +++++++++++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/internal/check-packet-map-missing-loud.mjs b/internal/check-packet-map-missing-loud.mjs index 09e3bbc56..0cfd50231 100644 --- a/internal/check-packet-map-missing-loud.mjs +++ b/internal/check-packet-map-missing-loud.mjs @@ -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) { diff --git a/library/packet/packet-render.js b/library/packet/packet-render.js index 5b24deef6..f6068a263 100644 --- a/library/packet/packet-render.js +++ b/library/packet/packet-render.js @@ -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 `
${esc(t('map_unavailable'))}
`; diff --git a/library/scripts/posters/packet-strings.json b/library/scripts/posters/packet-strings.json index 23ce3cef4..478b95170 100644 --- a/library/scripts/posters/packet-strings.json +++ b/library/scripts/posters/packet-strings.json @@ -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": "沒有照片",