Pin wording: shared points and key-city clusters claim only what is certain

A pin's position is generalised, so it does not tell a reader the locality or where a group is
centred.

- pins.sharedPoint in all 11 locales and ApproxPinNote.vue's fallback: the groups sharing the point
  are named and counted ("{n} groups share this dot"); the locality claim is gone.
- keyCities map.note, map.sheetNote and list.caveat.row in all 11 locales: a cluster is of
  people-group pins, not centroids, and each pin marks a people group, not a town.
- The key-cities and languages-per-city caveats in build-tabulator-tables.mjs and in every committed
  copy of those two tables (only that one field changes), derive-city-candidates.mjs's caveat, and
  the matching comments in key-cities, name-clusters and the poster generator.
- check-approx-pin-note's pass line no longer calls pins localities. Two UI-strings baseline entries
  whose strings no longer exist in their files are dropped.
This commit is contained in:
Doxa Maps 2026-10-02 09:21:54 +00:00
parent a56e775bf8
commit 7cd40a6e8e
38 changed files with 66 additions and 68 deletions

View file

@ -2,7 +2,7 @@
"meta": { "meta": {
"title": "Key Cities / Location Clusters", "title": "Key Cities / Location Clusters",
"grain": "one row per ~25km location cluster", "grain": "one row per ~25km location cluster",
"caveat": "A cluster is people-group CENTROIDS, not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.", "caveat": "A cluster is people-group PINS (each marks a people group, not a town), not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.",
"internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale." "internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale."
}, },
"columns": [ "columns": [

View file

@ -3,7 +3,7 @@
"title": "Languages per City x Resources", "title": "Languages per City x Resources",
"grain": "one row per location cluster x language spoken there", "grain": "one row per location cluster x language spoken there",
"why": "399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.", "why": "399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.",
"place_caveat": "A location is a cluster of people-group centroids within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.", "place_caveat": "A location is a cluster of people-group pins within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.",
"resolution_caveat": "resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.", "resolution_caveat": "resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.",
"pools_caveat": "Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked." "pools_caveat": "Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked."
}, },

View file

@ -74,4 +74,4 @@ try {
check('Arabic joins the names with و, never an English comma inside Arabic prose', /Koraga وMaila/.test(ar2) && !/Koraga, Maila/.test(ar2), ar2) check('Arabic joins the names with و, never an English comma inside Arabic prose', /Koraga وMaila/.test(ar2) && !/Koraga, Maila/.test(ar2), ar2)
} finally { await server.close() } } finally { await server.close() }
if (bad) { console.log(`APPROX-PIN-NOTE: FAIL — ${bad} case(s).`); process.exit(1) } if (bad) { console.log(`APPROX-PIN-NOTE: FAIL — ${bad} case(s).`); process.exit(1) }
console.log('APPROX-PIN-NOTE: PASS — pins say they are localities, and name the groups that share a point.') console.log('APPROX-PIN-NOTE: PASS — pins say what they are, and name the groups that share a point.')

View file

@ -22,7 +22,7 @@ const props = defineProps({
// the English below renders, with the same placeholders filled. // the English below renders, with the same placeholders filled.
const APPROX_FALLBACK = { const APPROX_FALLBACK = {
'pins.approximate': 'The dot marks a people group, not a town or a boundary.', 'pins.approximate': 'The dot marks a people group, not a town or a boundary.',
'pins.sharedPoint': 'It sits on the same point as {names} — {n} groups share this coordinate, so the position tells you the locality and not which group is where.', 'pins.sharedPoint': 'It sits on the same point as {names} — {n} groups share this dot.',
} }
// C4: the guard is library/composables/useOptionalT.js now. The fallback MAP stays exactly as it was, // C4: the guard is library/composables/useOptionalT.js now. The fallback MAP stays exactly as it was,
// passed in, so a bare host renders the same English it rendered before. // passed in, so a bare host renders the same English it rendered before.

View file

@ -6,7 +6,7 @@
"multi": "متعدد الشعوب", "multi": "متعدد الشعوب",
"single": "شعب واحد" "single": "شعب واحد"
}, },
"note": "النقطة عنقود من مراكز الشعوب ضمن نحو 25 كم، وليست حدودًا بلدية. النقاط المُسمّاة مأخوذة من معجم جغرافي موثّق.", "note": "النقطة عنقود من نقاط الشعوب ضمن نحو 25 كم، وليست حدودًا بلدية. النقاط المُسمّاة مأخوذة من معجم جغرافي موثّق.",
"unnamed": "موقع بلا اسم — {lat}، {lng}", "unnamed": "موقع بلا اسم — {lat}، {lng}",
"close": "إغلاق", "close": "إغلاق",
"country": "الدولة", "country": "الدولة",
@ -17,7 +17,7 @@
"unknown": "غير معروف", "unknown": "غير معروف",
"pgHere": "الشعوب هنا", "pgHere": "الشعوب هنا",
"languages": "اللغات", "languages": "اللغات",
"sheetNote": "عنقود من مراكز الشعوب ضمن نحو 25 كم، وليس حدودًا بلدية. النقاط المُسمّاة مأخوذة من معجم جغرافي موثّق (Nominatim/OSM)؛ والنقاط بلا اسم تُظهر الإحداثيات بدل اسم مختلَق.", "sheetNote": "عنقود من نقاط الشعوب ضمن نحو 25 كم، وليس حدودًا بلدية. النقاط المُسمّاة مأخوذة من معجم جغرافي موثّق (Nominatim/OSM)؛ والنقاط بلا اسم تُظهر الإحداثيات بدل اسم مختلَق.",
"national": "أرقام الإنترنت وطنية.", "national": "أرقام الإنترنت وطنية.",
"engineMissing": "تعذّر تحميل محرك الخريطة." "engineMissing": "تعذّر تحميل محرك الخريطة."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "الشعوب: {n}", "peopleGroups": "الشعوب: {n}",
"caveat": { "caveat": {
"rowLead": "ما الذي يمثّله الصف.", "rowLead": "ما الذي يمثّله الصف.",
"row": "عنقود من مراكز الشعوب ضمن نحو 25 كم، وليس حدودًا بلدية. تدل النقاط على مكان تمركز الشعب، لا على مستوطنة، لذلك لا تُسمّى العناقيد بالاستنتاج أبدًا: حُدِّدت المراكز متعددة الشعوب وعددها {n} عبر {source} (ODbL، مع ذكر المصدر في كل صف)، وتبقى البقية بلا اسم بدل التخمين.", "row": "عنقود من نقاط الشعوب ضمن نحو 25 كم، وليس حدودًا بلدية. تمثّل كل نقطة شعبًا، لا بلدة، لذلك لا تُسمّى العناقيد بالاستنتاج أبدًا: حُدِّدت المراكز متعددة الشعوب وعددها {n} عبر {source} (ODbL، مع ذكر المصدر في كل صف)، وتبقى البقية بلا اسم بدل التخمين.",
"internet": "تُعرض كسياق: بيانات الاتصال لكل مدينة غير متاحة للعموم بهذا المستوى، ولا يجوز قراءة الرقم الوطني على أنه قياس للمدينة.", "internet": "تُعرض كسياق: بيانات الاتصال لكل مدينة غير متاحة للعموم بهذا المستوى، ولا يجوز قراءة الرقم الوطني على أنه قياس للمدينة.",
"scope": "تحمل هذه الصفحة مواقع الشعوب وبيانات الاتصال فقط — لا بيانات عن كنائس أو مؤمنين أو أماكن اجتماع، وذلك عن قصد." "scope": "تحمل هذه الصفحة مواقع الشعوب وبيانات الاتصال فقط — لا بيانات عن كنائس أو مؤمنين أو أماكن اجتماع، وذلك عن قصد."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "تمثّل النقطة شعبًا، لا بلدة ولا حدودًا.", "approximate": "تمثّل النقطة شعبًا، لا بلدة ولا حدودًا.",
"sharedPoint": "تقع في النقطة نفسها مع {names} — {n} مجموعات تتشارك هذا الإحداثي، لذا يدل الموقع على المنطقة لا على مكان كل مجموعة." "sharedPoint": "تقع في النقطة نفسها مع {names} — {n} مجموعات تتشارك هذه النقطة."
} }

View file

@ -6,7 +6,7 @@
"multi": "mehrere Gruppen", "multi": "mehrere Gruppen",
"single": "eine Gruppe" "single": "eine Gruppe"
}, },
"note": "Ein Punkt ist ein Cluster von Volksgruppen-Mittelpunkten im Umkreis von ~25 km, keine Gemeindegrenze. Benannte Punkte stammen aus einem belegten Ortsverzeichnis.", "note": "Ein Punkt ist ein Cluster von Volksgruppen-Punkten im Umkreis von ~25 km, keine Gemeindegrenze. Benannte Punkte stammen aus einem belegten Ortsverzeichnis.",
"unnamed": "unbenannter Ort — {lat}, {lng}", "unnamed": "unbenannter Ort — {lat}, {lng}",
"close": "Schließen", "close": "Schließen",
"country": "Land", "country": "Land",
@ -17,7 +17,7 @@
"unknown": "unbekannt", "unknown": "unbekannt",
"pgHere": "Volksgruppen hier", "pgHere": "Volksgruppen hier",
"languages": "Sprachen", "languages": "Sprachen",
"sheetNote": "Ein Cluster von Volksgruppen-Mittelpunkten im Umkreis von ~25 km, keine Gemeindegrenze. Benannte Punkte stammen aus einem belegten Ortsverzeichnis (Nominatim/OSM); unbenannte zeigen Koordinaten statt eines erfundenen Ortsnamens.", "sheetNote": "Ein Cluster von Volksgruppen-Punkten im Umkreis von ~25 km, keine Gemeindegrenze. Benannte Punkte stammen aus einem belegten Ortsverzeichnis (Nominatim/OSM); unbenannte zeigen Koordinaten statt eines erfundenen Ortsnamens.",
"national": "Internetzahlen sind NATIONAL.", "national": "Internetzahlen sind NATIONAL.",
"engineMissing": "Die Karten-Engine konnte nicht geladen werden." "engineMissing": "Die Karten-Engine konnte nicht geladen werden."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "Volksgruppen: {n}", "peopleGroups": "Volksgruppen: {n}",
"caveat": { "caveat": {
"rowLead": "Was eine Zeile ist.", "rowLead": "Was eine Zeile ist.",
"row": "Ein Cluster von Volksgruppen-Mittelpunkten im Umkreis von ~25 km, keine Gemeindegrenze. Die Punkte markieren, wo eine Volksgruppe ihren Mittelpunkt hat, nicht eine Siedlung, daher werden Cluster nie durch Schlussfolgerung benannt: Die {n} Zentren mit mehreren Volksgruppen wurden über {source} bestimmt (ODbL, pro Zeile zitiert), der Rest bleibt unbenannt, statt geraten zu werden.", "row": "Ein Cluster von Volksgruppen-Punkten im Umkreis von ~25 km, keine Gemeindegrenze. Jeder Punkt steht für eine Volksgruppe, nicht für einen Ort, daher werden Cluster nie durch Schlussfolgerung benannt: Die {n} Zentren mit mehreren Volksgruppen wurden über {source} bestimmt (ODbL, pro Zeile zitiert), der Rest bleibt unbenannt, statt geraten zu werden.",
"internet": "Sie dienen als Kontext: Konnektivität pro Stadt ist in diesem Maßstab nicht öffentlich verfügbar, und eine nationale Zahl darf nicht als Messung für eine Stadt gelesen werden.", "internet": "Sie dienen als Kontext: Konnektivität pro Stadt ist in diesem Maßstab nicht öffentlich verfügbar, und eine nationale Zahl darf nicht als Messung für eine Stadt gelesen werden.",
"scope": "Diese Seite enthält nur Standorte von Volksgruppen und Konnektivität — bewusst keine Daten zu Gemeinden, Gläubigen oder Treffpunkten." "scope": "Diese Seite enthält nur Standorte von Volksgruppen und Konnektivität — bewusst keine Daten zu Gemeinden, Gläubigen oder Treffpunkten."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "Der Punkt steht für ein Volk, nicht für eine Stadt oder eine Grenze.", "approximate": "Der Punkt steht für ein Volk, nicht für eine Stadt oder eine Grenze.",
"sharedPoint": "Er liegt auf demselben Punkt wie {names} — {n} Gruppen teilen sich diese Koordinate; die Position nennt also die Gegend, nicht wo welche Gruppe lebt." "sharedPoint": "Er liegt auf demselben Punkt wie {names} — {n} Gruppen teilen sich diesen Punkt."
} }

View file

@ -6,7 +6,7 @@
"multi": "multi-group", "multi": "multi-group",
"single": "single group" "single": "single group"
}, },
"note": "A point is a cluster of people-group centroids within ~25 km, not a municipal boundary. Named points come from a cited gazetteer.", "note": "A point is a cluster of people-group pins within ~25 km, not a municipal boundary. Named points come from a cited gazetteer.",
"unnamed": "unnamed location — {lat}, {lng}", "unnamed": "unnamed location — {lat}, {lng}",
"close": "Close", "close": "Close",
"country": "Country", "country": "Country",
@ -17,7 +17,7 @@
"unknown": "unknown", "unknown": "unknown",
"pgHere": "People groups here", "pgHere": "People groups here",
"languages": "Languages", "languages": "Languages",
"sheetNote": "A cluster of people-group centroids within ~25 km, not a municipal boundary. Named points come from a cited gazetteer (Nominatim/OSM); unnamed ones show coordinates rather than an invented place name.", "sheetNote": "A cluster of people-group pins within ~25 km, not a municipal boundary. Named points come from a cited gazetteer (Nominatim/OSM); unnamed ones show coordinates rather than an invented place name.",
"national": "Internet figures are NATIONAL.", "national": "Internet figures are NATIONAL.",
"engineMissing": "The map engine could not be loaded." "engineMissing": "The map engine could not be loaded."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "people groups: {n}", "peopleGroups": "people groups: {n}",
"caveat": { "caveat": {
"rowLead": "What a row is.", "rowLead": "What a row is.",
"row": "A cluster of people-group centroids within ~25 km, not a municipal boundary. Pins mark where a people group is centred, not a settlement, so clusters are never named by inference: the {n} multi-group centres were resolved by {source} (ODbL, cited per row), and the rest stay unnamed rather than guessed.", "row": "A cluster of people-group pins within ~25 km, not a municipal boundary. Each pin marks a people group, not a town, so clusters are never named by inference: the {n} multi-group centres were resolved by {source} (ODbL, cited per row), and the rest stay unnamed rather than guessed.",
"internet": "They are shown as context: per-city connectivity is not publicly available at this scale, and a national figure must not be read as a city measurement.", "internet": "They are shown as context: per-city connectivity is not publicly available at this scale, and a national figure must not be read as a city measurement.",
"scope": "This page carries people-group locations and connectivity only — no church, believer or meeting-point data, by design." "scope": "This page carries people-group locations and connectivity only — no church, believer or meeting-point data, by design."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "The dot marks a people group, not a town or a boundary.", "approximate": "The dot marks a people group, not a town or a boundary.",
"sharedPoint": "It sits on the same point as {names} — {n} groups share this coordinate, so the position tells you the locality and not which group is where." "sharedPoint": "It sits on the same point as {names} — {n} groups share this dot."
} }

View file

@ -6,7 +6,7 @@
"multi": "varios pueblos", "multi": "varios pueblos",
"single": "un pueblo" "single": "un pueblo"
}, },
"note": "Un punto es un grupo de centroides de pueblos en ~25 km, no un límite municipal. Los puntos con nombre provienen de un nomenclátor citado.", "note": "Un punto es un grupo de marcadores de pueblos en ~25 km, no un límite municipal. Los puntos con nombre provienen de un nomenclátor citado.",
"unnamed": "lugar sin nombre — {lat}, {lng}", "unnamed": "lugar sin nombre — {lat}, {lng}",
"close": "Cerrar", "close": "Cerrar",
"country": "País", "country": "País",
@ -17,7 +17,7 @@
"unknown": "desconocido", "unknown": "desconocido",
"pgHere": "Pueblos aquí", "pgHere": "Pueblos aquí",
"languages": "Idiomas", "languages": "Idiomas",
"sheetNote": "Un grupo de centroides de pueblos en ~25 km, no un límite municipal. Los puntos con nombre provienen de un nomenclátor citado (Nominatim/OSM); los sin nombre muestran coordenadas en lugar de un nombre inventado.", "sheetNote": "Un grupo de marcadores de pueblos en ~25 km, no un límite municipal. Los puntos con nombre provienen de un nomenclátor citado (Nominatim/OSM); los sin nombre muestran coordenadas en lugar de un nombre inventado.",
"national": "Las cifras de internet son NACIONALES.", "national": "Las cifras de internet son NACIONALES.",
"engineMissing": "No se pudo cargar el motor del mapa." "engineMissing": "No se pudo cargar el motor del mapa."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "pueblos: {n}", "peopleGroups": "pueblos: {n}",
"caveat": { "caveat": {
"rowLead": "Qué es una fila.", "rowLead": "Qué es una fila.",
"row": "Un grupo de centroides de pueblos en ~25 km, no un límite municipal. Los puntos marcan dónde se centra un pueblo, no un asentamiento, así que los grupos nunca se nombran por deducción: los {n} centros con varios pueblos se identificaron con {source} (ODbL, citado en cada fila) y el resto queda sin nombre en lugar de adivinarlo.", "row": "Un grupo de marcadores de pueblos en ~25 km, no un límite municipal. Cada marcador representa un pueblo, no una ciudad, así que los grupos nunca se nombran por deducción: los {n} centros con varios pueblos se identificaron con {source} (ODbL, citado en cada fila) y el resto queda sin nombre en lugar de adivinarlo.",
"internet": "Se muestran como contexto: la conectividad por ciudad no está disponible públicamente a esta escala, y una cifra nacional no debe leerse como una medición de la ciudad.", "internet": "Se muestran como contexto: la conectividad por ciudad no está disponible públicamente a esta escala, y una cifra nacional no debe leerse como una medición de la ciudad.",
"scope": "Esta página contiene solo ubicaciones de pueblos y conectividad; a propósito, no hay datos de iglesias, creyentes ni lugares de reunión." "scope": "Esta página contiene solo ubicaciones de pueblos y conectividad; a propósito, no hay datos de iglesias, creyentes ni lugares de reunión."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "El punto representa un pueblo, no una ciudad ni una frontera.", "approximate": "El punto representa un pueblo, no una ciudad ni una frontera.",
"sharedPoint": "Está en el mismo punto que {names}: {n} grupos comparten esta coordenada, así que la posición indica la zona y no dónde está cada grupo." "sharedPoint": "Está en el mismo punto que {names}: {n} grupos comparten este punto."
} }

View file

@ -6,7 +6,7 @@
"multi": "plusieurs peuples", "multi": "plusieurs peuples",
"single": "un seul peuple" "single": "un seul peuple"
}, },
"note": "Un point est un regroupement de centroïdes de peuples dans un rayon d’environ 25 km, pas une limite municipale. Les points nommés proviennent d’un répertoire géographique cité.", "note": "Un point est un regroupement de repères de peuples dans un rayon d’environ 25 km, pas une limite municipale. Les points nommés proviennent d’un répertoire géographique cité.",
"unnamed": "lieu sans nom — {lat}, {lng}", "unnamed": "lieu sans nom — {lat}, {lng}",
"close": "Fermer", "close": "Fermer",
"country": "Pays", "country": "Pays",
@ -17,7 +17,7 @@
"unknown": "inconnu", "unknown": "inconnu",
"pgHere": "Peuples ici", "pgHere": "Peuples ici",
"languages": "Langues", "languages": "Langues",
"sheetNote": "Un regroupement de centroïdes de peuples dans un rayon d’environ 25 km, pas une limite municipale. Les points nommés proviennent d’un répertoire géographique cité (Nominatim/OSM) ; les points sans nom affichent des coordonnées plutôt qu’un nom inventé.", "sheetNote": "Un regroupement de repères de peuples dans un rayon d’environ 25 km, pas une limite municipale. Les points nommés proviennent d’un répertoire géographique cité (Nominatim/OSM) ; les points sans nom affichent des coordonnées plutôt qu’un nom inventé.",
"national": "Les chiffres Internet sont NATIONAUX.", "national": "Les chiffres Internet sont NATIONAUX.",
"engineMissing": "Le moteur de carte n’a pas pu être chargé." "engineMissing": "Le moteur de carte n’a pas pu être chargé."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "peuples : {n}", "peopleGroups": "peuples : {n}",
"caveat": { "caveat": {
"rowLead": "Ce qu’est une ligne.", "rowLead": "Ce qu’est une ligne.",
"row": "Un regroupement de centroïdes de peuples dans un rayon d’environ 25 km, pas une limite municipale. Les points indiquent où un peuple est centré, pas une localité, donc les regroupements ne sont jamais nommés par déduction : les {n} centres à plusieurs peuples ont été identifiés avec {source} (ODbL, cité à chaque ligne) et les autres restent sans nom plutôt que devinés.", "row": "Un regroupement de repères de peuples dans un rayon d’environ 25 km, pas une limite municipale. Chaque repère représente un peuple, pas une ville, donc les regroupements ne sont jamais nommés par déduction : les {n} centres à plusieurs peuples ont été identifiés avec {source} (ODbL, cité à chaque ligne) et les autres restent sans nom plutôt que devinés.",
"internet": "Ils sont donnés comme contexte : la connectivité par ville n’est pas publique à cette échelle, et un chiffre national ne doit pas être lu comme une mesure de la ville.", "internet": "Ils sont donnés comme contexte : la connectivité par ville n’est pas publique à cette échelle, et un chiffre national ne doit pas être lu comme une mesure de la ville.",
"scope": "Cette page ne contient que les emplacements des peuples et la connectivité — aucune donnée sur les églises, les croyants ou les lieux de réunion, à dessein." "scope": "Cette page ne contient que les emplacements des peuples et la connectivité — aucune donnée sur les églises, les croyants ou les lieux de réunion, à dessein."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "Le point représente un peuple, pas une ville ni une frontière.", "approximate": "Le point représente un peuple, pas une ville ni une frontière.",
"sharedPoint": "Il se trouve au même point que {names} — {n} groupes partagent cette coordonnée : la position indique la région, pas où se trouve chaque groupe." "sharedPoint": "Il se trouve au même point que {names} — {n} groupes partagent ce point."
} }

View file

@ -6,7 +6,7 @@
"multi": "कई जनसमूह", "multi": "कई जनसमूह",
"single": "एक जनसमूह" "single": "एक जनसमूह"
}, },
"note": "एक बिंदु लगभग 25 किमी के भीतर जनसमूह केंद्रों का समूह है, नगरपालिका सीमा नहीं। नामित बिंदु एक उद्धृत भौगोलिक सूची से लिए गए हैं।", "note": "एक बिंदु लगभग 25 किमी के भीतर जनसमूह बिंदुओं का समूह है, नगरपालिका सीमा नहीं। नामित बिंदु एक उद्धृत भौगोलिक सूची से लिए गए हैं।",
"unnamed": "बिना नाम का स्थान — {lat}, {lng}", "unnamed": "बिना नाम का स्थान — {lat}, {lng}",
"close": "बंद करें", "close": "बंद करें",
"country": "देश", "country": "देश",
@ -17,7 +17,7 @@
"unknown": "अज्ञात", "unknown": "अज्ञात",
"pgHere": "यहाँ के जनसमूह", "pgHere": "यहाँ के जनसमूह",
"languages": "भाषाएँ", "languages": "भाषाएँ",
"sheetNote": "लगभग 25 किमी के भीतर जनसमूह केंद्रों का समूह, नगरपालिका सीमा नहीं। नामित बिंदु एक उद्धृत भौगोलिक सूची (Nominatim/OSM) से हैं; बिना नाम वाले बिंदु गढ़े हुए नाम के बजाय निर्देशांक दिखाते हैं।", "sheetNote": "लगभग 25 किमी के भीतर जनसमूह बिंदुओं का समूह, नगरपालिका सीमा नहीं। नामित बिंदु एक उद्धृत भौगोलिक सूची (Nominatim/OSM) से हैं; बिना नाम वाले बिंदु गढ़े हुए नाम के बजाय निर्देशांक दिखाते हैं।",
"national": "इंटरनेट के आँकड़े राष्ट्रीय हैं।", "national": "इंटरनेट के आँकड़े राष्ट्रीय हैं।",
"engineMissing": "नक्शे का इंजन लोड नहीं हो सका।" "engineMissing": "नक्शे का इंजन लोड नहीं हो सका।"
}, },
@ -33,7 +33,7 @@
"peopleGroups": "जनसमूह: {n}", "peopleGroups": "जनसमूह: {n}",
"caveat": { "caveat": {
"rowLead": "एक पंक्ति क्या है।", "rowLead": "एक पंक्ति क्या है।",
"row": "लगभग 25 किमी के भीतर जनसमूह केंद्रों का समूह, नगरपालिका सीमा नहीं। बिंदु दिखाते हैं कि कोई जनसमूह कहाँ केंद्रित है, कोई बस्ती नहीं, इसलिए समूहों का नाम कभी अनुमान से नहीं रखा जाता: कई जनसमूहों वाले {n} केंद्र {source} (ODbL, हर पंक्ति में उद्धृत) से पहचाने गए, और बाकी अनुमान के बजाय बिना नाम के रहते हैं।", "row": "लगभग 25 किमी के भीतर जनसमूह बिंदुओं का समूह, नगरपालिका सीमा नहीं। हर बिंदु एक जनसमूह को दर्शाता है, किसी कस्बे को नहीं, इसलिए समूहों का नाम कभी अनुमान से नहीं रखा जाता: कई जनसमूहों वाले {n} केंद्र {source} (ODbL, हर पंक्ति में उद्धृत) से पहचाने गए, और बाकी अनुमान के बजाय बिना नाम के रहते हैं।",
"internet": "इन्हें संदर्भ के रूप में दिखाया गया है: इस स्तर पर शहर-वार कनेक्टिविटी सार्वजनिक रूप से उपलब्ध नहीं है, और राष्ट्रीय आँकड़े को शहर का माप नहीं समझना चाहिए।", "internet": "इन्हें संदर्भ के रूप में दिखाया गया है: इस स्तर पर शहर-वार कनेक्टिविटी सार्वजनिक रूप से उपलब्ध नहीं है, और राष्ट्रीय आँकड़े को शहर का माप नहीं समझना चाहिए।",
"scope": "इस पृष्ठ पर केवल जनसमूहों के स्थान और कनेक्टिविटी है — जानबूझकर कलीसिया, विश्वासियों या मिलने के स्थानों का कोई डेटा नहीं।" "scope": "इस पृष्ठ पर केवल जनसमूहों के स्थान और कनेक्टिविटी है — जानबूझकर कलीसिया, विश्वासियों या मिलने के स्थानों का कोई डेटा नहीं।"
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "बिंदु एक जन-समूह को दर्शाता है, किसी शहर या सीमा को नहीं।", "approximate": "बिंदु एक जन-समूह को दर्शाता है, किसी शहर या सीमा को नहीं।",
"sharedPoint": "यह {names} के साथ एक ही बिंदु पर है — {n} समूह यह निर्देशांक साझा करते हैं, इसलिए स्थान क्षेत्र बताता है, यह नहीं कि कौन-सा समूह कहाँ है।" "sharedPoint": "यह {names} के साथ एक ही बिंदु पर है — {n} समूह यह बिंदु साझा करते हैं।"
} }

View file

@ -6,7 +6,7 @@
"multi": "più popoli", "multi": "più popoli",
"single": "un solo popolo" "single": "un solo popolo"
}, },
"note": "Un punto è un raggruppamento di centroidi di popoli entro ~25 km, non un confine comunale. I punti con nome provengono da un gazetteer citato.", "note": "Un punto è un raggruppamento di segnaposto di popoli entro ~25 km, non un confine comunale. I punti con nome provengono da un gazetteer citato.",
"unnamed": "luogo senza nome — {lat}, {lng}", "unnamed": "luogo senza nome — {lat}, {lng}",
"close": "Chiudi", "close": "Chiudi",
"country": "Paese", "country": "Paese",
@ -17,7 +17,7 @@
"unknown": "sconosciuto", "unknown": "sconosciuto",
"pgHere": "Popoli qui", "pgHere": "Popoli qui",
"languages": "Lingue", "languages": "Lingue",
"sheetNote": "Un raggruppamento di centroidi di popoli entro ~25 km, non un confine comunale. I punti con nome provengono da un gazetteer citato (Nominatim/OSM); quelli senza nome mostrano le coordinate invece di un nome inventato.", "sheetNote": "Un raggruppamento di segnaposto di popoli entro ~25 km, non un confine comunale. I punti con nome provengono da un gazetteer citato (Nominatim/OSM); quelli senza nome mostrano le coordinate invece di un nome inventato.",
"national": "I dati su Internet sono NAZIONALI.", "national": "I dati su Internet sono NAZIONALI.",
"engineMissing": "Impossibile caricare il motore della mappa." "engineMissing": "Impossibile caricare il motore della mappa."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "popoli: {n}", "peopleGroups": "popoli: {n}",
"caveat": { "caveat": {
"rowLead": "Che cos’è una riga.", "rowLead": "Che cos’è una riga.",
"row": "Un raggruppamento di centroidi di popoli entro ~25 km, non un confine comunale. I punti indicano dove si concentra un popolo, non un insediamento, quindi i raggruppamenti non vengono mai nominati per deduzione: i {n} centri con più popoli sono stati identificati con {source} (ODbL, citato in ogni riga) e gli altri restano senza nome invece di essere indovinati.", "row": "Un raggruppamento di segnaposto di popoli entro ~25 km, non un confine comunale. Ogni segnaposto rappresenta un popolo, non una città, quindi i raggruppamenti non vengono mai nominati per deduzione: i {n} centri con più popoli sono stati identificati con {source} (ODbL, citato in ogni riga) e gli altri restano senza nome invece di essere indovinati.",
"internet": "Sono mostrati come contesto: la connettività per città non è pubblicamente disponibile a questa scala, e un dato nazionale non va letto come una misura della città.", "internet": "Sono mostrati come contesto: la connettività per città non è pubblicamente disponibile a questa scala, e un dato nazionale non va letto come una misura della città.",
"scope": "Questa pagina contiene solo le posizioni dei popoli e la connettività — nessun dato su chiese, credenti o luoghi di incontro, per scelta." "scope": "Questa pagina contiene solo le posizioni dei popoli e la connettività — nessun dato su chiese, credenti o luoghi di incontro, per scelta."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "Il punto rappresenta un popolo, non una città né un confine.", "approximate": "Il punto rappresenta un popolo, non una città né un confine.",
"sharedPoint": "Si trova nello stesso punto di {names} — {n} gruppi condividono questa coordinata, quindi la posizione indica la zona e non dove si trova ciascun gruppo." "sharedPoint": "Si trova nello stesso punto di {names} — {n} gruppi condividono questo punto."
} }

View file

@ -6,7 +6,7 @@
"multi": "vários povos", "multi": "vários povos",
"single": "um povo" "single": "um povo"
}, },
"note": "Um ponto é um agrupamento de centroides de povos num raio de ~25 km, não um limite municipal. Os pontos com nome vêm de um gazetteer citado.", "note": "Um ponto é um agrupamento de marcadores de povos num raio de ~25 km, não um limite municipal. Os pontos com nome vêm de um gazetteer citado.",
"unnamed": "local sem nome — {lat}, {lng}", "unnamed": "local sem nome — {lat}, {lng}",
"close": "Fechar", "close": "Fechar",
"country": "País", "country": "País",
@ -17,7 +17,7 @@
"unknown": "desconhecido", "unknown": "desconhecido",
"pgHere": "Povos aqui", "pgHere": "Povos aqui",
"languages": "Idiomas", "languages": "Idiomas",
"sheetNote": "Um agrupamento de centroides de povos num raio de ~25 km, não um limite municipal. Os pontos com nome vêm de um gazetteer citado (Nominatim/OSM); os sem nome mostram coordenadas em vez de um nome inventado.", "sheetNote": "Um agrupamento de marcadores de povos num raio de ~25 km, não um limite municipal. Os pontos com nome vêm de um gazetteer citado (Nominatim/OSM); os sem nome mostram coordenadas em vez de um nome inventado.",
"national": "Os números de internet são NACIONAIS.", "national": "Os números de internet são NACIONAIS.",
"engineMissing": "Não foi possível carregar o motor do mapa." "engineMissing": "Não foi possível carregar o motor do mapa."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "povos: {n}", "peopleGroups": "povos: {n}",
"caveat": { "caveat": {
"rowLead": "O que é uma linha.", "rowLead": "O que é uma linha.",
"row": "Um agrupamento de centroides de povos num raio de ~25 km, não um limite municipal. Os pontos marcam onde um povo se concentra, não um povoado, por isso os agrupamentos nunca são nomeados por dedução: os {n} centros com vários povos foram identificados com {source} (ODbL, citado em cada linha) e os restantes ficam sem nome em vez de adivinhados.", "row": "Um agrupamento de marcadores de povos num raio de ~25 km, não um limite municipal. Cada marcador representa um povo, não uma cidade, por isso os agrupamentos nunca são nomeados por dedução: os {n} centros com vários povos foram identificados com {source} (ODbL, citado em cada linha) e os restantes ficam sem nome em vez de adivinhados.",
"internet": "São mostrados como contexto: a conectividade por cidade não está disponível publicamente nesta escala, e um número nacional não deve ser lido como uma medição da cidade.", "internet": "São mostrados como contexto: a conectividade por cidade não está disponível publicamente nesta escala, e um número nacional não deve ser lido como uma medição da cidade.",
"scope": "Esta página contém apenas localizações de povos e conectividade — por opção, nenhum dado sobre igrejas, crentes ou locais de reunião." "scope": "Esta página contém apenas localizações de povos e conectividade — por opção, nenhum dado sobre igrejas, crentes ou locais de reunião."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "O ponto representa um povo, não uma cidade nem uma fronteira.", "approximate": "O ponto representa um povo, não uma cidade nem uma fronteira.",
"sharedPoint": "Está no mesmo ponto que {names} — {n} grupos partilham esta coordenada, por isso a posição indica a região e não onde está cada grupo." "sharedPoint": "Está no mesmo ponto que {names} — {n} grupos partilham este ponto."
} }

View file

@ -6,7 +6,7 @@
"multi": "mai multe popoare", "multi": "mai multe popoare",
"single": "un singur popor" "single": "un singur popor"
}, },
"note": "Un punct este un grup de centroizi ai popoarelor pe o rază de ~25 km, nu o limită municipală. Punctele numite provin dintr-un gazetteer citat.", "note": "Un punct este un grup de marcaje ale popoarelor pe o rază de ~25 km, nu o limită municipală. Punctele numite provin dintr-un gazetteer citat.",
"unnamed": "loc fără nume — {lat}, {lng}", "unnamed": "loc fără nume — {lat}, {lng}",
"close": "Închide", "close": "Închide",
"country": "Țară", "country": "Țară",
@ -17,7 +17,7 @@
"unknown": "necunoscut", "unknown": "necunoscut",
"pgHere": "Popoare aici", "pgHere": "Popoare aici",
"languages": "Limbi", "languages": "Limbi",
"sheetNote": "Un grup de centroizi ai popoarelor pe o rază de ~25 km, nu o limită municipală. Punctele numite provin dintr-un gazetteer citat (Nominatim/OSM); cele fără nume arată coordonate în loc de un nume inventat.", "sheetNote": "Un grup de marcaje ale popoarelor pe o rază de ~25 km, nu o limită municipală. Punctele numite provin dintr-un gazetteer citat (Nominatim/OSM); cele fără nume arată coordonate în loc de un nume inventat.",
"national": "Cifrele de internet sunt NAȚIONALE.", "national": "Cifrele de internet sunt NAȚIONALE.",
"engineMissing": "Motorul hărții nu a putut fi încărcat." "engineMissing": "Motorul hărții nu a putut fi încărcat."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "popoare: {n}", "peopleGroups": "popoare: {n}",
"caveat": { "caveat": {
"rowLead": "Ce este un rând.", "rowLead": "Ce este un rând.",
"row": "Un grup de centroizi ai popoarelor pe o rază de ~25 km, nu o limită municipală. Punctele arată unde este centrat un popor, nu o așezare, așa că grupurile nu sunt numite niciodată prin deducție: cele {n} centre cu mai multe popoare au fost identificate prin {source} (ODbL, citat pe fiecare rând), iar restul rămân fără nume în loc să fie ghicite.", "row": "Un grup de marcaje ale popoarelor pe o rază de ~25 km, nu o limită municipală. Fiecare marcaj reprezintă un popor, nu un oraș, așa că grupurile nu sunt numite niciodată prin deducție: cele {n} centre cu mai multe popoare au fost identificate prin {source} (ODbL, citat pe fiecare rând), iar restul rămân fără nume în loc să fie ghicite.",
"internet": "Sunt afișate drept context: conectivitatea pe oraș nu este disponibilă public la această scară, iar o cifră națională nu trebuie citită ca măsurătoare a orașului.", "internet": "Sunt afișate drept context: conectivitatea pe oraș nu este disponibilă public la această scară, iar o cifră națională nu trebuie citită ca măsurătoare a orașului.",
"scope": "Această pagină conține doar locațiile popoarelor și conectivitatea — intenționat, fără date despre biserici, credincioși sau locuri de întâlnire." "scope": "Această pagină conține doar locațiile popoarelor și conectivitatea — intenționat, fără date despre biserici, credincioși sau locuri de întâlnire."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "Punctul reprezintă un popor, nu un oraș sau o graniță.", "approximate": "Punctul reprezintă un popor, nu un oraș sau o graniță.",
"sharedPoint": "Se află în același punct cu {names} — {n} grupuri împart această coordonată, deci poziția arată zona, nu unde se află fiecare grup." "sharedPoint": "Se află în același punct cu {names} — {n} grupuri împart acest punct."
} }

View file

@ -6,7 +6,7 @@
"multi": "несколько народов", "multi": "несколько народов",
"single": "один народ" "single": "один народ"
}, },
"note": "Точка — это скопление центров народов в радиусе ~25 км, а не граница муниципалитета. Названия точек взяты из цитируемого справочника.", "note": "Точка — это скопление меток народов в радиусе ~25 км, а не граница муниципалитета. Названия точек взяты из цитируемого справочника.",
"unnamed": "место без названия — {lat}, {lng}", "unnamed": "место без названия — {lat}, {lng}",
"close": "Закрыть", "close": "Закрыть",
"country": "Страна", "country": "Страна",
@ -17,7 +17,7 @@
"unknown": "неизвестно", "unknown": "неизвестно",
"pgHere": "Народы здесь", "pgHere": "Народы здесь",
"languages": "Языки", "languages": "Языки",
"sheetNote": "Скопление центров народов в радиусе ~25 км, а не граница муниципалитета. Названия точек взяты из цитируемого справочника (Nominatim/OSM); у точек без названия показаны координаты, а не выдуманное название.", "sheetNote": "Скопление меток народов в радиусе ~25 км, а не граница муниципалитета. Названия точек взяты из цитируемого справочника (Nominatim/OSM); у точек без названия показаны координаты, а не выдуманное название.",
"national": "Данные об интернете — НАЦИОНАЛЬНЫЕ.", "national": "Данные об интернете — НАЦИОНАЛЬНЫЕ.",
"engineMissing": "Не удалось загрузить движок карты." "engineMissing": "Не удалось загрузить движок карты."
}, },
@ -33,7 +33,7 @@
"peopleGroups": "народов: {n}", "peopleGroups": "народов: {n}",
"caveat": { "caveat": {
"rowLead": "Что такое строка.", "rowLead": "Что такое строка.",
"row": "Скопление центров народов в радиусе ~25 км, а не граница муниципалитета. Точки показывают, где сосредоточен народ, а не поселение, поэтому скопления никогда не называются по догадке: {n} центров с несколькими народами определены через {source} (ODbL, источник в каждой строке), а остальные остаются без названия, а не угаданы.", "row": "Скопление меток народов в радиусе ~25 км, а не граница муниципалитета. Каждая метка обозначает народ, а не город, поэтому скопления никогда не называются по догадке: {n} центров с несколькими народами определены через {source} (ODbL, источник в каждой строке), а остальные остаются без названия, а не угаданы.",
"internet": "Они даны как контекст: данные о подключении по городам на этом уровне публично недоступны, и национальный показатель нельзя читать как измерение для города.", "internet": "Они даны как контекст: данные о подключении по городам на этом уровне публично недоступны, и национальный показатель нельзя читать как измерение для города.",
"scope": "На этой странице только местоположения народов и данные о подключении — намеренно никаких данных о церквях, верующих или местах встреч." "scope": "На этой странице только местоположения народов и данные о подключении — намеренно никаких данных о церквях, верующих или местах встреч."
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "Точка обозначает народ, а не город и не границу.", "approximate": "Точка обозначает народ, а не город и не границу.",
"sharedPoint": "Она совпадает с точкой {names} — {n} групп делят эту координату, поэтому положение указывает местность, а не где какая группа." "sharedPoint": "Она совпадает с точкой {names} — {n} групп делят эту точку."
} }

View file

@ -6,7 +6,7 @@
"multi": "多个族群", "multi": "多个族群",
"single": "单一族群" "single": "单一族群"
}, },
"note": "一个点是约 25 公里内族群中心点的聚合,并非市级边界。已命名的点来自有出处的地名录。", "note": "一个点是约 25 公里内族群标记点的聚合,并非市级边界。已命名的点来自有出处的地名录。",
"unnamed": "未命名地点 — {lat},{lng}", "unnamed": "未命名地点 — {lat},{lng}",
"close": "关闭", "close": "关闭",
"country": "国家", "country": "国家",
@ -17,7 +17,7 @@
"unknown": "未知", "unknown": "未知",
"pgHere": "此处的族群", "pgHere": "此处的族群",
"languages": "语言", "languages": "语言",
"sheetNote": "约 25 公里内族群中心点的聚合,并非市级边界。已命名的点来自有出处的地名录(Nominatim/OSM);未命名的点显示坐标,而不是编造的地名。", "sheetNote": "约 25 公里内族群标记点的聚合,并非市级边界。已命名的点来自有出处的地名录(Nominatim/OSM);未命名的点显示坐标,而不是编造的地名。",
"national": "互联网数据为全国数据。", "national": "互联网数据为全国数据。",
"engineMissing": "无法加载地图引擎。" "engineMissing": "无法加载地图引擎。"
}, },
@ -33,7 +33,7 @@
"peopleGroups": "族群:{n}", "peopleGroups": "族群:{n}",
"caveat": { "caveat": {
"rowLead": "每一行代表什么。", "rowLead": "每一行代表什么。",
"row": "约 25 公里内族群中心点的聚合,并非市级边界。点标示的是族群的中心位置,而非居民点,因此聚合从不靠推断命名:{n} 个多族群中心通过 {source}(ODbL,每行注明出处)确定,其余的保持未命名,而不是猜测。", "row": "约 25 公里内族群标记点的聚合,并非市级边界。每个标记点代表一个族群,而不是城镇,因此聚合从不靠推断命名:{n} 个多族群中心通过 {source}(ODbL,每行注明出处)确定,其余的保持未命名,而不是猜测。",
"internet": "仅作背景参考:在此尺度上没有公开的城市级联网数据,全国数据不能当作城市的测量值。", "internet": "仅作背景参考:在此尺度上没有公开的城市级联网数据,全国数据不能当作城市的测量值。",
"scope": "本页只包含族群位置和联网情况——刻意不含任何教会、信徒或聚会地点的数据。" "scope": "本页只包含族群位置和联网情况——刻意不含任何教会、信徒或聚会地点的数据。"
}, },

View file

@ -1,4 +1,4 @@
{ {
"approximate": "此点代表一个民族,而非某个城镇或边界。", "approximate": "此点代表一个民族,而非某个城镇或边界。",
"sharedPoint": "它与 {names} 位于同一点 — {n} 个群体共用此坐标,因此位置只表示所在地区,而非各群体的具体位置。" "sharedPoint": "它与 {names} 位于同一点 — {n} 个群体共用这个点。"
} }

View file

@ -164,7 +164,7 @@ const records = await loadRecords();
// Run FORMAT=3x4 separately for the oversize tier. // Run FORMAT=3x4 separately for the oversize tier.
// ── CITY MODE (CITIES=1) ───────────────────────────────────────────────────── // ── CITY MODE (CITIES=1) ─────────────────────────────────────────────────────
// One sheet per NAMED POPULATION CENTRE — the Key City Posters app. // One sheet per NAMED POPULATION CENTRE — the Key City Posters app.
// A "city" here is a cluster of people-group centroids within ~25km that holds // A "city" here is a cluster of people-group pins within ~25km that holds
// MORE THAN ONE group, named by a CITED gazetteer (Nominatim/OSM). Unnamed and // MORE THAN ONE group, named by a CITED gazetteer (Nominatim/OSM). Unnamed and
// single-group clusters are excluded: a poster titled "unnamed location" is not a // single-group clusters are excluded: a poster titled "unnamed location" is not a
// poster, and naming one by inference would fabricate a placename. // poster, and naming one by inference would fabricate a placename.

View file

@ -336,7 +336,7 @@ if (has('city-candidates.json')) {
], { ], {
title: 'Key Cities / Location Clusters', title: 'Key Cities / Location Clusters',
grain: 'one row per ~25km location cluster', grain: 'one row per ~25km location cluster',
caveat: 'A cluster is people-group CENTROIDS, not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.', caveat: 'A cluster is people-group PINS (each marks a people group, not a town), not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.',
internet_caveat: 'Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale.', internet_caveat: 'Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale.',
}, (r) => { }, (r) => {
const namedRows = r.filter((x) => x.named); const namedRows = r.filter((x) => x.named);
@ -729,7 +729,7 @@ if (has('city-candidates.json') && has('language-resources.json')) {
title: 'Languages per City x Resources', title: 'Languages per City x Resources',
grain: 'one row per location cluster x language spoken there', grain: 'one row per location cluster x language spoken there',
why: '399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.', why: '399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.',
place_caveat: 'A location is a cluster of people-group centroids within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.', place_caveat: 'A location is a cluster of people-group pins within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.',
resolution_caveat: 'resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.', resolution_caveat: 'resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.',
pools_caveat: 'Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked.', pools_caveat: 'Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked.',
}, (r) => { }, (r) => {

View file

@ -100,7 +100,7 @@ for (const [key, members] of cells) {
provenance: { provenance: {
derived_from: 'doxa people-group records (lat/lng centroids)', derived_from: 'doxa people-group records (lat/lng centroids)',
method: `~25km cell aggregation (quarter-degree), cell=${key}`, method: `~25km cell aggregation (quarter-degree), cell=${key}`,
caveat: 'NOT a settlement. A cluster of people-group centroids; place_name is unresolved.', caveat: 'NOT a settlement. A cluster of people-group pins; place_name is unresolved.',
derived_on: '2026-08-01', derived_on: '2026-08-01',
}, },
}); });

View file

@ -5,8 +5,8 @@
// ALL=1 node name-clusters.mjs # all 1,646 (slow: ~28 min at 1 req/s) // ALL=1 node name-clusters.mjs # all 1,646 (slow: ~28 min at 1 req/s)
// //
// ═══ WHY A GAZETTEER AND NOT CLUSTERING ═════════════════════════════════════ // ═══ WHY A GAZETTEER AND NOT CLUSTERING ═════════════════════════════════════
// derive-city-candidates.mjs deliberately emits place_name:null. Pins are // derive-city-candidates.mjs deliberately emits place_name:null. Each pin marks
// people-group CENTROIDS, not settlements, so inferring a placename from pin // a people group, not a settlement, so inferring a placename from pin
// geometry would MANUFACTURE it — and a fabricated placename in a // geometry would MANUFACTURE it — and a fabricated placename in a
// persecution-sensitive dataset is the dangerous kind of wrong. Naming must come // persecution-sensitive dataset is the dangerous kind of wrong. Naming must come
// from a source that can be cited per row. This is that step. // from a source that can be cited per row. This is that step.

View file

@ -2,7 +2,7 @@
"meta": { "meta": {
"title": "Key Cities / Location Clusters", "title": "Key Cities / Location Clusters",
"grain": "one row per ~25km location cluster", "grain": "one row per ~25km location cluster",
"caveat": "A cluster is people-group CENTROIDS, not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.", "caveat": "A cluster is people-group PINS (each marks a people group, not a town), not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.",
"internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale." "internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale."
}, },
"columns": [ "columns": [

View file

@ -3,7 +3,7 @@
"title": "Languages per City x Resources", "title": "Languages per City x Resources",
"grain": "one row per location cluster x language spoken there", "grain": "one row per location cluster x language spoken there",
"why": "399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.", "why": "399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.",
"place_caveat": "A location is a cluster of people-group centroids within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.", "place_caveat": "A location is a cluster of people-group pins within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.",
"resolution_caveat": "resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.", "resolution_caveat": "resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.",
"pools_caveat": "Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked." "pools_caveat": "Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked."
}, },

View file

@ -2,7 +2,7 @@
"meta": { "meta": {
"title": "Key Cities / Location Clusters", "title": "Key Cities / Location Clusters",
"grain": "one row per ~25km location cluster", "grain": "one row per ~25km location cluster",
"caveat": "A cluster is people-group CENTROIDS, not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.", "caveat": "A cluster is people-group PINS (each marks a people group, not a town), not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.",
"internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale." "internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale."
}, },
"columns": [ "columns": [

View file

@ -1,15 +1,15 @@
<script setup> <script setup>
/** /**
* cities-list.vue — KEY CITIES: where the unengaged people groups actually live. * cities-list.vue — KEY CITIES: clusters of unengaged people-group pins.
* *
* The population centres derived from people-group locations, grouped by region, * Clusters of people-group pins, grouped by region, each showing which groups'
* each showing which groups are there and what languages they speak. * pins fall in it and what languages they speak.
* *
* ═══ WHAT A "KEY CITY" IS HERE — READ THIS BEFORE TRUSTING A ROW ════════════ * ═══ WHAT A "KEY CITY" IS HERE — READ THIS BEFORE TRUSTING A ROW ════════════
* A row is a CLUSTER OF PEOPLE-GROUP CENTROIDS within ~25km, not a municipal * A row is a CLUSTER OF PEOPLE-GROUP PINS within ~25km, not a municipal
* boundary. The distinction is the integrity of the whole dataset. * boundary. The distinction is the integrity of the whole dataset.
* *
* The pins are people-group centroids, not settlements — measured: India's 855 * Each pin marks a people group, not a settlement — measured: India's 855
* pins resolve to 625 distinct ~11km cells. So clustering them into "cities" and * pins resolve to 625 distinct ~11km cells. So clustering them into "cities" and
* naming those clusters ourselves would MANUFACTURE placenames, and a fabricated * naming those clusters ourselves would MANUFACTURE placenames, and a fabricated
* placename in a persecution-sensitive dataset is the dangerous kind of wrong. * placename in a persecution-sensitive dataset is the dangerous kind of wrong.

View file

@ -24,8 +24,8 @@
* geojson in the bundle would block first paint) * geojson in the bundle would block first paint)
* *
* ═══ WHAT A POINT IS, AND WHAT IT IS NOT ═══════════════════════════════════ * ═══ WHAT A POINT IS, AND WHAT IT IS NOT ═══════════════════════════════════
* A point is a CLUSTER OF PEOPLE-GROUP CENTROIDS within ~25km — not a municipal * A point is a CLUSTER OF PEOPLE-GROUP PINS within ~25km — not a municipal
* boundary. Pins mark where a group is centred, not a settlement. * boundary. Each pin marks a people group, not a settlement.
* *
* NAMED points were resolved by a cited gazetteer (Nominatim/OSM). UNNAMED ones * NAMED points were resolved by a cited gazetteer (Nominatim/OSM). UNNAMED ones
* show as "unnamed location" with their coordinates rather than an invented * show as "unnamed location" with their coordinates rather than an invented

View file

@ -2,7 +2,7 @@
"meta": { "meta": {
"title": "Key Cities / Location Clusters", "title": "Key Cities / Location Clusters",
"grain": "one row per ~25km location cluster", "grain": "one row per ~25km location cluster",
"caveat": "A cluster is people-group CENTROIDS, not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.", "caveat": "A cluster is people-group PINS (each marks a people group, not a town), not a settlement. place_name comes from a cited gazetteer (Nominatim/OSM, ODbL); an unnamed row is honest, not missing.",
"internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale." "internet_caveat": "Internet figures are NATIONAL. Per-city connectivity is not publicly available at this scale."
}, },
"columns": [ "columns": [

View file

@ -3,7 +3,7 @@
"title": "Languages per City x Resources", "title": "Languages per City x Resources",
"grain": "one row per location cluster x language spoken there", "grain": "one row per location cluster x language spoken there",
"why": "399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.", "why": "399 of 1,646 clusters are multi-language — a city-level bridge can exist that a country average hides.",
"place_caveat": "A location is a cluster of people-group centroids within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.", "place_caveat": "A location is a cluster of people-group pins within ~25km, NOT a municipal boundary. An empty place_name is an unnamed cluster, never an invented one.",
"resolution_caveat": "resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.", "resolution_caveat": "resolved:false means the language LABEL did not match an ISO 639-3 record here — its resource status is UNKNOWN, not absent.",
"pools_caveat": "Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked." "pools_caveat": "Resource status is from eBible + JESUS Film only. GRN and FCBH audio are key-blocked."
}, },

View file

@ -110,7 +110,6 @@
"groups (", "groups (",
"groups doxa.life publishes a page for can appear here at all.", "groups doxa.life publishes a page for can appear here at all.",
"groups have nothing ·", "groups have nothing ·",
"groups share this coordinate, so the position tells you the locality and not which group is where.",
"groups sharing this language.", "groups sharing this language.",
"groups with nothing ·", "groups with nothing ·",
"groups ·", "groups ·",
@ -142,7 +141,6 @@
"way in:" "way in:"
], ],
"plugin-designs/key-cities/cities-list.vue": [ "plugin-designs/key-cities/cities-list.vue": [
"A cluster of people-group centroids within ~25km —",
"Internet figures are NATIONAL", "Internet figures are NATIONAL",
"Nominatim/OpenStreetMap", "Nominatim/OpenStreetMap",
"This page carries people-group locations and connectivity only — no church, believer or meeting-point data, by design.", "This page carries people-group locations and connectivity only — no church, believer or meeting-point data, by design.",