The gap list's lines are sentences, so each is one key

resources-map's gap list read as fragments around its values: "{count} people ·
{iso3}", "way in: {via}", "has {what} — no text found", and a "Showing only …"
whose bold phrase came from a four-branch conditional. Each was a sentence broken
around the data it carries, which is the shape that cannot be reordered.

Nine keys, and one of them does three jobs: the population line appears three
times in near-identical sibling spans, so it is ONE key used three times rather
than three keys — the duplication was in the template, not in the language.

The four filter descriptions are their own keys and slot into the sentence, so a
translator can move "Showing only" around the phrase rather than being handed two
halves to join in English order.

144 -> 124 findings for eleven keys. The ratio is better than the proving case
because the duplicates collapsed; it will worsen again on the one-off sentences.
This commit is contained in:
Doxa Maps 2026-09-29 06:04:55 +00:00
parent c7aa670426
commit 6914f44b2e
12 changed files with 152 additions and 9 deletions

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "تُدرِّس {organisation} منهج SUN بالفعل في {countries}."
},
"gap": {
"popLine": "{pop} نسمة · {iso3}",
"wayIn": "السبيل: {via}",
"hasNoText": "لديها {what} — لا يوجد نص",
"showingOnly": "عرض {what} فقط.",
"seeLargest": "عرض أكبر {n} ←",
"kind": {
"none": "مجموعات لم يُعثر لها على شيء",
"some": "مجموعات لديها بعض الموارد",
"hnr": "مجموعات تستطيع سماع الإنجيل لكن بلا نص مكتوب في المجموعات التي جرى فحصها",
"all": "مجموعات لديها كتاب مقدس وفيلم"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "SUN wird in {countries} bereits von {organisation} unterrichtet."
},
"gap": {
"popLine": "{pop} Menschen · {iso3}",
"wayIn": "Zugang: {via}",
"hasNoText": "hat {what} — kein Text gefunden",
"showingOnly": "Es werden nur {what} angezeigt.",
"seeLargest": "Die {n} größten ansehen →",
"kind": {
"none": "Gruppen ohne jeden Fund",
"some": "Gruppen mit einzelnen Ressourcen",
"hnr": "Gruppen, die das Evangelium hören können, aber keinen Bibeltext in den geprüften Beständen haben",
"all": "Gruppen mit Bibel und Film"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "SUN is already being taught in {countries} by {organisation}."
},
"gap": {
"popLine": "{pop} people · {iso3}",
"wayIn": "way in: {via}",
"hasNoText": "has {what} — no text found",
"showingOnly": "Showing only {what}.",
"seeLargest": "See the {n} largest →",
"kind": {
"none": "groups with nothing found",
"some": "groups with some resource",
"hnr": "groups that can hear the gospel but have no text Scripture in the pools checked",
"all": "groups with Scripture and film"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "{organisation} ya enseña SUN en {countries}."
},
"gap": {
"popLine": "{pop} personas · {iso3}",
"wayIn": "vía de entrada: {via}",
"hasNoText": "tiene {what}: no se encontró texto",
"showingOnly": "Mostrando solo {what}.",
"seeLargest": "Ver los {n} mayores →",
"kind": {
"none": "pueblos sin nada encontrado",
"some": "pueblos con algún recurso",
"hnr": "pueblos que pueden oír el evangelio pero no tienen Escritura escrita en los repositorios consultados",
"all": "pueblos con Escritura y película"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "SUN est déjà enseigné par {organisation} dans : {countries}."
},
"gap": {
"popLine": "{pop} personnes · {iso3}",
"wayIn": "voie d’entrée : {via}",
"hasNoText": "a {what} — aucun texte trouvé",
"showingOnly": "Affichage de {what} uniquement.",
"seeLargest": "Voir les {n} plus grands →",
"kind": {
"none": "peuples sans aucune ressource trouvée",
"some": "peuples avec quelques ressources",
"hnr": "peuples qui peuvent entendre l’Évangile mais n’ont pas d’Écriture écrite dans les fonds consultés",
"all": "peuples avec Écriture et film"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "{organisation} पहले से ही {countries} में SUN सिखा रहा है।"
},
"gap": {
"popLine": "{pop} लोग · {iso3}",
"wayIn": "पहुँच: {via}",
"hasNoText": "{what} है — कोई पाठ नहीं मिला",
"showingOnly": "केवल {what} दिखाए जा रहे हैं।",
"seeLargest": "सबसे बड़े {n} देखें →",
"kind": {
"none": "जिन समूहों के लिए कुछ नहीं मिला",
"some": "कुछ संसाधन वाले समूह",
"hnr": "वे समूह जो सुसमाचार सुन सकते हैं पर जाँचे गए स्रोतों में लिखित पवित्रशास्त्र नहीं है",
"all": "पवित्रशास्त्र और फ़िल्म वाले समूह"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "SUN è già insegnato da {organisation} in: {countries}."
},
"gap": {
"popLine": "{pop} persone · {iso3}",
"wayIn": "via d’accesso: {via}",
"hasNoText": "ha {what} — nessun testo trovato",
"showingOnly": "Mostrati solo {what}.",
"seeLargest": "Vedi i {n} maggiori →",
"kind": {
"none": "popoli senza nulla di trovato",
"some": "popoli con qualche risorsa",
"hnr": "popoli che possono udire il vangelo ma non hanno Scrittura scritta nei repertori consultati",
"all": "popoli con Scrittura e film"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "SUN já é ensinado por {organisation} em: {countries}."
},
"gap": {
"popLine": "{pop} pessoas · {iso3}",
"wayIn": "via de entrada: {via}",
"hasNoText": "tem {what} — nenhum texto encontrado",
"showingOnly": "Mostrando apenas {what}.",
"seeLargest": "Ver os {n} maiores →",
"kind": {
"none": "povos sem nada encontrado",
"some": "povos com algum recurso",
"hnr": "povos que podem ouvir o evangelho mas não têm Escritura escrita nos acervos consultados",
"all": "povos com Escritura e filme"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "SUN este deja predat în {countries} de {organisation}."
},
"gap": {
"popLine": "{pop} persoane · {iso3}",
"wayIn": "cale de acces: {via}",
"hasNoText": "are {what} — niciun text găsit",
"showingOnly": "Se afișează doar {what}.",
"seeLargest": "Vezi cele mai mari {n} →",
"kind": {
"none": "grupuri fără nimic găsit",
"some": "grupuri cu unele resurse",
"hnr": "grupuri care pot auzi Evanghelia dar nu au Scriptură scrisă în colecțiile verificate",
"all": "grupuri cu Scriptură și film"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "{organisation} уже преподаёт SUN: {countries}."
},
"gap": {
"popLine": "{pop} человек · {iso3}",
"wayIn": "путь: {via}",
"hasNoText": "есть {what} — текст не найден",
"showingOnly": "Показаны только {what}.",
"seeLargest": "Показать {n} крупнейших →",
"kind": {
"none": "народы, для которых ничего не найдено",
"some": "народы, у которых есть какие-то ресурсы",
"hnr": "народы, которые могут услышать Евангелие, но не имеют письменного Писания в проверенных источниках",
"all": "народы с Писанием и фильмом"
}
}
}

View file

@ -369,5 +369,18 @@
},
"deaf": {
"sunTaughtIn": "{organisation}已在{countries}教授 SUN。"
},
"gap": {
"popLine": "{pop} 人 · {iso3}",
"wayIn": "切入点:{via}",
"hasNoText": "有 {what} — 未找到文本",
"showingOnly": "仅显示{what}。",
"seeLargest": "查看最大的 {n} 个 →",
"kind": {
"none": "未找到任何资源的族群",
"some": "有部分资源的族群",
"hnr": "能听到福音但在已查询资源库中没有文字圣经的族群",
"all": "有圣经和影片的族群"
}
}
}

View file

@ -2379,10 +2379,10 @@ useShadowStyles(
</button>
</div>
<div v-if="pinFilter !== 'all' && legendOpen" class="gm-filtered">
Showing only <b>{{ pinFilter === 'none' ? 'groups with nothing found'
: pinFilter === 'some' ? 'groups with some resource'
: pinFilter === 'hnr' ? 'groups that can hear the gospel but have no text Scripture in the pools checked'
: 'groups with Scripture and film' }}</b>.
<!-- ONE SENTENCE, ONE KEY: the bold phrase varies by filter, so each branch is its own
key and slots into the sentence. Concatenating "Showing only" with a branch would
fix the clause order in English. -->
{{ t('gospel.gap.showingOnly', { what: t('gospel.gap.kind.' + (pinFilter === 'none' ? 'none' : pinFilter === 'some' ? 'some' : pinFilter === 'hnr' ? 'hnr' : 'all')) }) }}
<button type="button" class="gm-kclear" @click="setPinFilter('all')">{{ t('gospel.filter.showAll', { count: fmt(pinTally.total) }) }}</button>
<button v-if="pinFilter === 'none'" type="button" class="gm-kclear" @click="openGapList">
See the 40 largest →
@ -2603,8 +2603,8 @@ useShadowStyles(
<template v-if="gapBy === 'hnr'">
<button v-for="g in gapHnr" :key="g.i" type="button" class="gm-pg gm-pg-btn" @click="gotoGap(g)">
<span class="gm-pg-n">{{ g.name }}</span>
<span class="gm-pg-l">{{ fmt(g.pop) }} people · {{ g.iso3 }}<code class="gm-code">{{ g.code || 'no code' }}</code></span>
<span class="gm-pg-rel">has {{ g.has }} — no text found</span>
<span class="gm-pg-l">{{ t('gospel.gap.popLine', { pop: fmt(g.pop), iso3: g.iso3 }) }}<code class="gm-code">{{ g.code || 'no code' }}</code></span>
<span class="gm-pg-rel">{{ t('gospel.gap.hasNoText', { what: g.has }) }}</span>
</button>
</template>
@ -2612,7 +2612,7 @@ useShadowStyles(
<a v-for="g in gapNoPrayer" :key="g.i" class="gm-pg gm-pg-btn" :href="g.url"
target="_blank" rel="noopener noreferrer">
<span class="gm-pg-n">{{ g.name }}</span>
<span class="gm-pg-l">{{ fmt(g.pop) }} people · {{ g.iso3 }}<code class="gm-code">{{ g.code || 'no code' }}</code></span>
<span class="gm-pg-l">{{ t('gospel.gap.popLine', { pop: fmt(g.pop), iso3: g.iso3 }) }}<code class="gm-code">{{ g.code || 'no code' }}</code></span>
<span class="gm-pg-rel"><bdi dir="ltr">nothing found, and nobody praying — open their prayer page ↗</bdi></span>
</a>
</template>
@ -2637,8 +2637,8 @@ useShadowStyles(
<button v-else v-for="g in gapList" :key="g.i" type="button" class="gm-pg gm-pg-btn" @click="gotoGap(g)">
<span class="gm-pg-n">{{ g.name }}</span>
<span class="gm-pg-l">{{ fmt(g.pop) }} people · {{ g.iso3 }}<code class="gm-code">{{ g.code || 'no code' }}</code></span>
<span v-if="g.wayIn" class="gm-pg-way">way in: {{ g.wayIn }}</span>
<span class="gm-pg-l">{{ t('gospel.gap.popLine', { pop: fmt(g.pop), iso3: g.iso3 }) }}<code class="gm-code">{{ g.code || 'no code' }}</code></span>
<span v-if="g.wayIn" class="gm-pg-way">{{ t('gospel.gap.wayIn', { via: g.wayIn }) }}</span>
<span v-if="g.rel" class="gm-pg-rel"
:title="'ISO 639-3 files this under macrolanguage ' + g.rel.m + ' with ' + g.rel.l + ', which has resources. That is how the standard groups the codes, not a claim they are mutually intelligible.'">
related: {{ g.rel.l }} has resources