Gospel charts: the titles and the counts inside them are translatable

The three chart titles, subtitles and axis units were the last inline English in
this leaf. The subtitles carry a count, so they are held whole in the catalogue
with a placeholder and the number arrives as a parameter — a sentence built by
gluing a number between two fragments cannot be translated, because word order
differs and several of these locales put the number where English does not.

The fallback interpolates too. Without that, a host that never installed i18n
would render the placeholder literally on screen, which is worse than the English
sentence the fallback exists to protect.

The leak gate could not have caught any of this. Whole-label equality is the
right unit for a fixed label and blind to a sentence carrying a number: the
catalogue holds "Across all {n} languages in the corpus." and the screen shows
"Across all 5,067 languages in the corpus." Those are never equal, so three
subtitles could have shipped untranslated in eleven locales with the gate
reporting PASS. A placeholder is now a wildcard and those keys are compared by
pattern; everything else stays equality, which is what keeps a word inside a
sentence from impersonating a label. Comparison went from 2,100 pairs to 2,244.
This commit is contained in:
doxa-maps-88655c70 2026-09-25 20:39:19 +00:00
parent ebf43e6001
commit acb837ff02
21 changed files with 190 additions and 56 deletions

View file

@ -183,10 +183,33 @@ try {
looking for a rendering bug that did not exist. */
if (!labels.length) { unmeasured.push(leaf + ' ' + lc + ': the walk collected no labels'); continue }
const labelSet = new Set(labels)
/* ═══ AN INTERPOLATED STRING NEVER EQUALS ITS CATALOGUE ENTRY ════════════════════
* Whole-label equality is the right unit for a fixed label and blind to a sentence
* carrying a number: the catalogue holds "Across all {n} languages in the corpus." and
* the screen shows "Across all 5,067 languages in the corpus." Those are never equal, so
* three chart subtitles could have shipped untranslated in eleven locales with this gate
* reporting PASS — coverage I would have claimed and not had.
* So a placeholder becomes a wildcard and the comparison is by pattern. Everything else
* is still compared by equality, which is what keeps a word inside a sentence from
* impersonating a label. */
const PLACEHOLDER = /\{\w+\}/
const asPattern = (str) => new RegExp('^' + str.split(/\{\w+\}/)
.map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('.{1,40}') + '$')
const someLabelMatches = (str) => {
const re = asPattern(str)
for (const l of labelSet) if (re.test(l)) return true
return false
}
for (const [key, e] of Object.entries(en)) {
const t = loc[key]
if (!t || t === e) continue
compared++
if (PLACEHOLDER.test(e)) {
if (someLabelMatches(e) && !someLabelMatches(t)) {
leaks.push(leaf + ' ' + lc + ' ' + key + ': an interpolated label reads English "' + e.slice(0, 40) + '"')
}
continue
}
if (labelSet.has(e) && !labelSet.has(t)) leaks.push(leaf + ' ' + lc + ' ' + key + ': a label reads English "' + e.slice(0, 40) + '"')
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "الكتاب المقدس",
"keyFilmStories": "الفيلم / القصص",
"keyAudioEtc": "صوتيات / عرض / تدريب",
"unresolvedCode": "رمز خارج ISO 639-3 — غير محسوم، لم يُقَس"
"unresolvedCode": "رمز خارج ISO 639-3 — غير محسوم، لم يُقَس",
"c1Title": "ما الذي وُجد، بحسب نوع المورد",
"c1Sub": "عبر جميع اللغات البالغة {n} في مجموعة البيانات. كل عمود يَعُدّ اللغات، لا الشعوب.",
"c1Unit": "لغات وُجد فيها المورد ضمن المصادر التي جرى البحث فيها",
"c2Title": "أكبر التجمعات السكانية التي لم يُعثر لها على شيء",
"c2Sub": "اللغات الـ{n} التي لا يوجد لها كتاب مقدس ولا فيلم في المصادر التي جرى البحث فيها، مرتَّبة بحسب عدد سكان الشعوب التي تتحدثها.",
"c2Unit": "أشخاص في الشعوب التي هذه لغتها الأساسية — لا المتحدثين بها عمومًا",
"c3Title": "البلدان الأكثر لغاتٍ غير مخدومة",
"c3Sub": "البلدان الـ{n} الأكثر لغاتٍ لم يُعثر لها على شيء. طول العمود هو كل لغة موجودة في ذلك البلد.",
"c3Unit": "لغات موجودة في البلد (اللغة العابرة للحدود تُحتسب في كل بلد)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "Bibeltext",
"keyFilmStories": "Film / Geschichten",
"keyAudioEtc": "Audio / Präsentation / Schulung",
"unresolvedCode": "Code außerhalb ISO 639-3 — ungeklärt, nicht gemessen"
"unresolvedCode": "Code außerhalb ISO 639-3 — ungeklärt, nicht gemessen",
"c1Title": "Was GEFUNDEN wurde, nach Ressourcentyp",
"c1Sub": "Über alle {n} Sprachen im Datenbestand. Jeder Balken zählt SPRACHEN, nicht Volksgruppen.",
"c1Unit": "Sprachen, in denen die Ressource in den geprüften Quellen gefunden wurde",
"c2Title": "Größte Bevölkerungen ohne jeden Fund",
"c2Sub": "Die {n} Sprachen ohne Bibeltext und ohne Film in den geprüften Quellen, sortiert nach der Bevölkerung der Volksgruppen, die sie sprechen.",
"c2Unit": "Menschen in den Volksgruppen, deren PRIMÄRE Sprache dies ist — nicht Sprecher der Sprache",
"c3Title": "Länder mit den meisten unversorgten Sprachen",
"c3Sub": "Die {n} Länder mit den meisten Sprachen, für die nichts gefunden wurde. Die Balkenlänge ist jede im Land vorhandene Sprache.",
"c3Unit": "im Land vorhandene Sprachen (eine grenzüberschreitende Sprache zählt in jedem Land)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "scripture",
"keyFilmStories": "film / stories",
"keyAudioEtc": "audio / presentation / training",
"unresolvedCode": "code outside ISO 639-3 — unresolved, not measured"
"unresolvedCode": "code outside ISO 639-3 — unresolved, not measured",
"c1Title": "What was FOUND, by resource type",
"c1Sub": "Across all {n} languages in the corpus. Each bar counts LANGUAGES, not people groups.",
"c1Unit": "languages where the resource was found in the pools checked",
"c2Title": "Largest populations with nothing found",
"c2Sub": "The {n} languages with no scripture and no film in the pools checked, ranked by the population of the people groups who speak them.",
"c2Unit": "people in the people groups whose PRIMARY language this is — not speakers of the language",
"c3Title": "Countries with the most unserved languages",
"c3Sub": "The {n} countries with the most languages that have nothing found. Bar length is every language present in that country.",
"c3Unit": "languages present in the country (a cross-border language counts in each)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "escrituras",
"keyFilmStories": "película / historias",
"keyAudioEtc": "audio / presentación / formación",
"unresolvedCode": "código fuera de ISO 639-3 — sin resolver, no medido"
"unresolvedCode": "código fuera de ISO 639-3 — sin resolver, no medido",
"c1Title": "Qué se ENCONTRÓ, por tipo de recurso",
"c1Sub": "En las {n} lenguas del conjunto de datos. Cada barra cuenta LENGUAS, no etnias.",
"c1Unit": "lenguas en las que se encontró el recurso en las fuentes consultadas",
"c2Title": "Mayores poblaciones sin nada encontrado",
"c2Sub": "Las {n} lenguas sin escrituras ni película en las fuentes consultadas, ordenadas por la población de las etnias que las hablan.",
"c2Unit": "personas en las etnias cuya lengua PRINCIPAL es esta — no hablantes de la lengua",
"c3Title": "Países con más lenguas desatendidas",
"c3Sub": "Los {n} países con más lenguas sin nada encontrado. La longitud de la barra es cada lengua presente en ese país.",
"c3Unit": "lenguas presentes en el país (una lengua transfronteriza cuenta en cada uno)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "écritures",
"keyFilmStories": "film / histoires",
"keyAudioEtc": "audio / présentation / formation",
"unresolvedCode": "code hors ISO 639-3 — non résolu, non mesuré"
"unresolvedCode": "code hors ISO 639-3 — non résolu, non mesuré",
"c1Title": "Ce qui a été TROUVÉ, par type de ressource",
"c1Sub": "Sur l'ensemble des {n} langues du corpus. Chaque barre compte des LANGUES, pas des peuples.",
"c1Unit": "langues où la ressource a été trouvée dans les sources consultées",
"c2Title": "Populations les plus nombreuses sans rien de trouvé",
"c2Sub": "Les {n} langues sans Écritures ni film dans les sources consultées, classées selon la population des peuples qui les parlent.",
"c2Unit": "personnes dans les peuples dont c'est la langue PRINCIPALE — non les locuteurs de la langue",
"c3Title": "Pays comptant le plus de langues non desservies",
"c3Sub": "Les {n} pays comptant le plus de langues sans rien de trouvé. La longueur de la barre correspond à chaque langue présente dans ce pays.",
"c3Unit": "langues présentes dans le pays (une langue transfrontalière compte dans chacun)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "पवित्र शास्त्र",
"keyFilmStories": "फ़िल्म / कहानियाँ",
"keyAudioEtc": "ऑडियो / प्रस्तुति / प्रशिक्षण",
"unresolvedCode": "ISO 639-3 से बाहर कोड — अनसुलझा, मापा नहीं गया"
"unresolvedCode": "ISO 639-3 से बाहर कोड — अनसुलझा, मापा नहीं गया",
"c1Title": "क्या मिला, संसाधन के प्रकार के अनुसार",
"c1Sub": "डेटा की सभी {n} भाषाओं में। हर बार भाषाओं की गिनती करता है, जनसमूहों की नहीं।",
"c1Unit": "भाषाएँ जिनमें जाँचे गए स्रोतों में संसाधन मिला",
"c2Title": "सबसे बड़ी आबादी जिनके लिए कुछ नहीं मिला",
"c2Sub": "{n} भाषाएँ जिनके लिए जाँचे गए स्रोतों में न पवित्र शास्त्र है न फ़िल्म, उन्हें बोलने वाले जनसमूहों की आबादी के क्रम में।",
"c2Unit": "उन जनसमूहों के लोग जिनकी मुख्य भाषा यही है — भाषा के सभी वक्ता नहीं",
"c3Title": "सबसे अधिक असेवित भाषाओं वाले देश",
"c3Sub": "{n} देश जिनमें सबसे अधिक भाषाओं के लिए कुछ नहीं मिला। बार की लंबाई उस देश में मौजूद हर भाषा है।",
"c3Unit": "देश में मौजूद भाषाएँ (सीमा-पार भाषा हर देश में गिनी जाती है)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "scritture",
"keyFilmStories": "film / storie",
"keyAudioEtc": "audio / presentazione / formazione",
"unresolvedCode": "codice fuori ISO 639-3 — non risolto, non misurato"
"unresolvedCode": "codice fuori ISO 639-3 — non risolto, non misurato",
"c1Title": "Che cosa è stato TROVATO, per tipo di risorsa",
"c1Sub": "Su tutte le {n} lingue del corpus. Ogni barra conta LINGUE, non gruppi etnici.",
"c1Unit": "lingue in cui la risorsa è stata trovata nelle fonti controllate",
"c2Title": "Popolazioni più numerose senza nulla trovato",
"c2Sub": "Le {n} lingue senza Scritture né film nelle fonti controllate, ordinate per la popolazione dei gruppi che le parlano.",
"c2Unit": "persone nei gruppi la cui lingua PRINCIPALE è questa — non i parlanti della lingua",
"c3Title": "Paesi con più lingue non servite",
"c3Sub": "I {n} paesi con più lingue per cui non è stato trovato nulla. La lunghezza della barra è ogni lingua presente in quel paese.",
"c3Unit": "lingue presenti nel paese (una lingua transfrontaliera conta in ciascuno)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "escrituras",
"keyFilmStories": "filme / histórias",
"keyAudioEtc": "áudio / apresentação / treinamento",
"unresolvedCode": "código fora da ISO 639-3 — não resolvido, não medido"
"unresolvedCode": "código fora da ISO 639-3 — não resolvido, não medido",
"c1Title": "O que foi ENCONTRADO, por tipo de recurso",
"c1Sub": "Em todas as {n} línguas do conjunto de dados. Cada barra conta LÍNGUAS, não etnias.",
"c1Unit": "línguas em que o recurso foi encontrado nas fontes consultadas",
"c2Title": "Maiores populações sem nada encontrado",
"c2Sub": "As {n} línguas sem Escrituras e sem filme nas fontes consultadas, ordenadas pela população das etnias que as falam.",
"c2Unit": "pessoas nas etnias cuja língua PRINCIPAL é esta — não falantes da língua",
"c3Title": "Países com mais línguas desatendidas",
"c3Sub": "Os {n} países com mais línguas sem nada encontrado. O comprimento da barra é cada língua presente nesse país.",
"c3Unit": "línguas presentes no país (uma língua transfronteiriça conta em cada um)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "scripturi",
"keyFilmStories": "film / povestiri",
"keyAudioEtc": "audio / prezentare / instruire",
"unresolvedCode": "cod în afara ISO 639-3 — nerezolvat, nemăsurat"
"unresolvedCode": "cod în afara ISO 639-3 — nerezolvat, nemăsurat",
"c1Title": "Ce s-a GĂSIT, după tipul resursei",
"c1Sub": "Pe toate cele {n} limbi din setul de date. Fiecare bară numără LIMBI, nu grupuri etnice.",
"c1Unit": "limbi în care resursa a fost găsită în sursele verificate",
"c2Title": "Cele mai mari populații fără nimic găsit",
"c2Sub": "Cele {n} limbi fără Scripturi și fără film în sursele verificate, ordonate după populația grupurilor care le vorbesc.",
"c2Unit": "persoane din grupurile a căror limbă PRINCIPALĂ este aceasta — nu vorbitorii limbii",
"c3Title": "Țări cu cele mai multe limbi neservite",
"c3Sub": "Cele {n} țări cu cele mai multe limbi pentru care nu s-a găsit nimic. Lungimea barei este fiecare limbă prezentă în acea țară.",
"c3Unit": "limbi prezente în țară (o limbă transfrontalieră se numără în fiecare)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "писание",
"keyFilmStories": "фильм / истории",
"keyAudioEtc": "аудио / презентация / обучение",
"unresolvedCode": "код вне ISO 639-3 — не определён, не измерен"
"unresolvedCode": "код вне ISO 639-3 — не определён, не измерен",
"c1Title": "Что НАЙДЕНО, по типу ресурса",
"c1Sub": "По всем {n} языкам в наборе данных. Каждый столбец считает ЯЗЫКИ, а не народы.",
"c1Unit": "языки, в которых ресурс найден в проверенных источниках",
"c2Title": "Самые многочисленные народы, для которых ничего не найдено",
"c2Sub": "{n} языков, для которых в проверенных источниках нет ни Писания, ни фильма, упорядоченные по численности говорящих на них народов.",
"c2Unit": "люди в народах, для которых это ОСНОВНОЙ язык, — не все говорящие на нём",
"c3Title": "Страны с наибольшим числом неохваченных языков",
"c3Sub": "{n} стран с наибольшим числом языков, для которых ничего не найдено. Длина столбца — каждый язык, присутствующий в этой стране.",
"c3Unit": "языки, присутствующие в стране (трансграничный язык считается в каждой)"
}
}

View file

@ -168,6 +168,15 @@
"keyScripture": "圣经",
"keyFilmStories": "影片 / 故事",
"keyAudioEtc": "音频 / 简介 / 训练",
"unresolvedCode": "ISO 639-3 之外的代码 — 未确定,未测量"
"unresolvedCode": "ISO 639-3 之外的代码 — 未确定,未测量",
"c1Title": "按资源类型统计已找到的内容",
"c1Sub": "涵盖数据中全部 {n} 种语言。每个条形统计的是语言,不是族群。",
"c1Unit": "在已检索的资源库中找到该资源的语言",
"c2Title": "一无所获的最大人口",
"c2Sub": "在已检索的资源库中既无圣经也无影片的 {n} 种语言,按使用这些语言的族群人口排序。",
"c2Unit": "以该语言为主要语言的族群人口 — 不是该语言的全部使用者",
"c3Title": "未得服事语言最多的国家",
"c3Sub": "一无所获语言最多的 {n} 个国家。条形长度为该国存在的全部语言。",
"c3Unit": "该国存在的语言(跨境语言在每个国家各计一次)"
}
}

View file

@ -55,10 +55,22 @@ import { useShadowStyles } from '@map/composables/useShadowStyles.js'
and the shipped English catalogue is the fallback rather than a broken key. */
const enLookup = (key) =>
String(key).replace(/^gospel\./, '').split('.').reduce((o, k) => (o == null ? o : o[k]), EN_MESSAGES.gospel || {})
let tr = (key) => enLookup(key) ?? String(key)
/* ★ NUMBERS ARRIVE AS PARAMETERS, NEVER CONCATENATED. The subtitles carry a count, and a
sentence built by gluing a number between two fragments cannot be translated — word order
differs and several of these locales put the number where English does not. The catalogue
holds the whole sentence with a {n} placeholder instead.
THE FALLBACK HAS TO INTERPOLATE TOO. Without it a host that never installed i18n would render
the placeholder literally — "Across all {n} languages" on screen — which is worse than the
English sentence the fallback exists to protect. */
const interpolate = (str, params) =>
params ? String(str).replace(/\{(\w+)\}/g, (m, k) => (params[k] != null ? params[k] : m)) : str
let tr = (key, params) => interpolate(enLookup(key) ?? String(key), params)
try {
const i18n = useI18n()
tr = (key) => { const v = i18n.t(key); return v === key ? (enLookup(key) ?? key) : v }
tr = (key, params) => {
const v = params ? i18n.t(key, params) : i18n.t(key)
return v === key ? interpolate(enLookup(key) ?? key, params) : v
}
} catch (_) { /* no i18n on this host */ }
@ -457,9 +469,9 @@ useShadowStyles(
v-if="active === 'coverage'"
:series="coverage"
:is-dark="isDark"
title="What was FOUND, by resource type"
:subtitle="`Across all ${fmt(nLang)} languages in the corpus. Each bar counts LANGUAGES, not people groups.`"
unit="languages where the resource was found in the pools checked"
:title="tr('gospel.charts.c1Title')"
:subtitle="tr('gospel.charts.c1Sub', { n: fmt(nLang) })"
:unit="tr('gospel.charts.c1Unit')"
:max="nLang"
:legend="[
{ label: tr('gospel.charts.keyScripture'), color: C.scripture },
@ -477,9 +489,9 @@ useShadowStyles(
v-else-if="active === 'gap'"
:series="topNone"
:is-dark="isDark"
title="Largest populations with nothing found"
:subtitle="`The ${TOP_N} languages with no scripture and no film in the pools checked, ranked by the population of the people groups who speak them.`"
unit="people in the people groups whose PRIMARY language this is — not speakers of the language"
:title="tr('gospel.charts.c2Title')"
:subtitle="tr('gospel.charts.c2Sub', { n: TOP_N })"
:unit="tr('gospel.charts.c2Unit')"
:legend="[
{ label: tr('gospel.charts.noResourceInPools'), color: C.none },
{ label: tr('gospel.charts.unresolvedCode'), color: C.unresolved },
@ -495,9 +507,9 @@ useShadowStyles(
v-else
:series="byCountry"
:is-dark="isDark"
title="Countries with the most unserved languages"
:subtitle="`The ${TOP_N} countries with the most languages that have nothing found. Bar length is every language present in that country.`"
unit="languages present in the country (a cross-border language counts in each)"
:title="tr('gospel.charts.c3Title')"
:subtitle="tr('gospel.charts.c3Sub', { n: TOP_N })"
:unit="tr('gospel.charts.c3Unit')"
:legend="[
{ label: tr('gospel.charts.nothingInPoolsLower'), color: C.none },
{ label: tr('gospel.charts.aResourceFound'), color: C.found },

View file

@ -579,7 +579,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh",
"integrity": "sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z",
"elements": [
"gospel-resources-map"
],
@ -599,7 +599,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -613,7 +613,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -627,7 +627,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -641,7 +641,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -655,7 +655,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
}
]

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z" 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 <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z" 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

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -579,7 +579,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh",
"integrity": "sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z",
"elements": [
"gospel-resources-map"
],
@ -599,7 +599,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -613,7 +613,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -627,7 +627,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -641,7 +641,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -655,7 +655,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-A9zQRY/dLxpH6lWgp0tp3+kHnmmIm8vBi25+AcyisLClYwlMjG47iefHXv+3zSYh\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3k/X19NmT6V4QNjKm+ehUKhvFH1DKXGNTwdaxrnYwIUz+LgkJVQa+sIK/ANpjo/z\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
}
]