From 89bf1feb5415a762cb34a77c4991a503b70302af Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 17:27:25 +0000 Subject: [PATCH 1/8] A composite's panes follow the outer profile-config, instead of freezing at mount regions-mfe built each pane by creating the child element and writing its profile-config once, inside onMounted, and nothing rewrote it. The pane is handed a JSON STRING rather than a reactive object, so a later change to the OUTER element's profile-config updated the composite's own cfg and reached nothing below it. regions-dashboard is kept alive by v-show rather than remounted, so the one code path that would have rewritten the attribute never runs again and the panes stay in the old language for the whole session. The leaf was never at fault: ProfileLoader's config is a computed over its prop, lang is a computed over config, and a watchEffect drives appI18n on every change. Every link is reactive -- it simply never receives a new prop. library/composables/usePaneConfig.js owns the missing half: a composite registers each pane element with a getter for its config, and a watchEffect re-forwards whenever any reactive source that getter reads changes. It writes only when the serialised config actually differs, because setting profile-config re-parses it in the child and can remount what it drives -- an unconditional write per tick would be a rerender loop. Stale elements (a rebuilt pane column) are skipped. It is a library helper rather than three copies because regions-mfe, upg-100-mfe and country-posters-mfe all assemble a config and set the attribute once; they differ only in which keys they inherit, so each keeps its own INHERITED_PAGE_KEYS and hands the result to the helper. This commit adopts it in regions-mfe only; the other two are upg100's to adopt. Two-sided, headlessly: a check that fails when a composite writes profile-config on a child without re-forwarding names all THREE composites on development, and on this branch regions-dashboard reports "re-forwarding=usePaneConfig" while the other two still fail. NOT VERIFIED IN A BROWSER YET. rega's LIVEDIAG is the falsifier: the nested [profile-config] should show the OLD locale on development and the NEW one here. --- library/composables/usePaneConfig.js | 80 +++++++++++++++++++ .../regions-dashboard/regions-mfe.vue | 23 ++++-- 2 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 library/composables/usePaneConfig.js diff --git a/library/composables/usePaneConfig.js b/library/composables/usePaneConfig.js new file mode 100644 index 000000000..793e7be1b --- /dev/null +++ b/library/composables/usePaneConfig.js @@ -0,0 +1,80 @@ +/** + * usePaneConfig — keep a composite's panes' profile-config in step with the outer element's. + * + * ★ THE BUG THIS EXISTS FOR. A composite builds each pane by creating the child custom element and + * writing its profile-config ONCE, inside onMounted: + * + * el.setAttribute('profile-config', JSON.stringify(pcfg)) // and never again + * + * That is correct at mount and wrong for the rest of the session. The pane is handed a JSON STRING, + * not a reactive object, so a later change to the OUTER element's profile-config updates the + * composite's own `cfg` and reaches nothing below it. MEASURED on Regions: a live locale switch + * en -> ar left the panes in English for the whole session, because regions-dashboard is kept alive + * by v-show rather than remounted — the one code path that would have rewritten the attribute never + * runs again. The leaf's own chain is fully reactive and was never at fault: it is reactive to its + * own prop, and its prop is frozen. + * + * ★ WHY A HELPER RATHER THAN THREE FIXES. regions-mfe, upg-100-mfe and country-posters-mfe all build + * their panes the same way — assemble a config object, stringify it, set the attribute once. They + * differ only in WHICH keys they inherit. So the composite keeps its own INHERITED_PAGE_KEYS and its + * own assembly, and hands the result here; this owns the part that was missing everywhere. + * + * ★ IT WRITES ONLY WHEN THE STRING CHANGES. Setting profile-config re-parses it in the child and can + * remount what it drives, so an unconditional write on every reactive tick would be a rerender loop. + * The previous value is remembered per element and compared before touching the DOM. + * + * const panes = usePaneConfig(() => stage.value, TAG) + * panes.register(el, () => paneConfigFor(pane)) // at mount, after appendChild + * + * Re-forwarding happens inside a watchEffect, so any reactive source the getter reads — the outer + * config, a computed spec, the pane's own config — triggers it. + */ +import { watchEffect, onBeforeUnmount } from 'vue' + +/** + * @param {() => (Element|null|undefined)} hostGetter the element the panes were appended under; used + * only to drop registrations whose element has left the DOM (a pane column can be rebuilt). + * @param {string} tag the child element's tag name, for the same staleness check. + * @returns {{ register: (el: Element, configGetter: () => object) => void, count: () => number }} + */ +export function usePaneConfig(hostGetter, tag) { + /** @type {Array<{el: Element, get: () => object, last: string|null}>} */ + const entries = [] + let stop = null + + const alive = (el) => { + if (!el || !el.isConnected) return false + const host = typeof hostGetter === 'function' ? hostGetter() : hostGetter + // A pane column rebuild replaces the elements; an entry whose element is no longer under the + // current host is stale and must not be written to. + return !host || host.contains(el) + } + + function register(el, configGetter) { + if (!el || typeof configGetter !== 'function') return + // The attribute the caller already set at mount is the baseline: recording it here means the + // first watchEffect pass does not rewrite an identical value. + const last = el.getAttribute('profile-config') + entries.push({ el, get: configGetter, last }) + if (!stop) { + stop = watchEffect(() => { + for (const entry of entries) { + let next + // A getter that throws must not take the other panes down with it: this runs inside a + // watchEffect, where an exception would stop every later entry in the same pass. + try { next = JSON.stringify(entry.get()) } catch (_) { continue } + if (next === entry.last) continue + if (!alive(entry.el)) continue + entry.last = next + entry.el.setAttribute('profile-config', next) + } + }) + } + } + + onBeforeUnmount(() => { if (stop) { stop(); stop = null } entries.length = 0 }) + + return { register, count: () => entries.length } +} + +export default usePaneConfig diff --git a/plugin-designs/regions-dashboard/regions-mfe.vue b/plugin-designs/regions-dashboard/regions-mfe.vue index 180fe84be..44b793b20 100644 --- a/plugin-designs/regions-dashboard/regions-mfe.vue +++ b/plugin-designs/regions-dashboard/regions-mfe.vue @@ -25,6 +25,7 @@ * wall's 'show-on-map', and it keeps each pane under its own ProfileLoader/Pinia. */ import { ref, computed, inject, onMounted, onBeforeUnmount } from 'vue' +import { usePaneConfig } from '@map/composables/usePaneConfig.js' import { buildPaneColumn, PANE_GRID_STYLES } from '@map/layouts/pane-wrapper/pane-wrapper.js' import { useShadowStyles } from '@map/composables/useShadowStyles.js' import { SHADOW_BOX_SIZING_RESET } from './src/shadowReset.js' @@ -113,16 +114,25 @@ let offScroll = null // below), and this was the one genuinely missing. const INHERITED_PAGE_KEYS = ['assetsBase', 'apiBaseUrl', 'prayBaseUrl', 'tokenUrl', 'dataSource', 'locale', 'lang', 'languageCode', 'isDark', 'qa', 'pinHint', 'urlSync', 'provider', 'list'] -function paneElement(pane) { - const el = document.createElement(TAG) +// ★ SPLIT OUT SO IT CAN BE RE-EVALUATED. This reads cfg.value and spec.value, so calling it again +// after the outer profile-config changes yields the NEW pane config. It used to be inline in +// paneElement, which ran once per pane in onMounted and never again -- that is the whole defect: +// the pane is handed a JSON STRING, so a later locale change reached this element and stopped. +const paneConfig = usePaneConfig(() => stage.value, TAG) + +function paneConfigFor(pane) { const host = cfg.value || {} const inherited = {} for (const k of INHERITED_PAGE_KEYS) { if (host[k] !== undefined && host[k] !== null && host[k] !== '') inherited[k] = host[k] } if (inherited.locale === undefined && inherited.lang !== undefined) inherited.locale = inherited.lang - const pcfg = { ...inherited, ...spec.value.config, ...pane.config } - el.setAttribute('profile-config', JSON.stringify(pcfg)) + return { ...inherited, ...spec.value.config, ...pane.config } +} + +function paneElement(pane) { + const el = document.createElement(TAG) + el.setAttribute('profile-config', JSON.stringify(paneConfigFor(pane))) return el } @@ -160,7 +170,10 @@ onMounted(() => { if (!column) return for (const pane of column.panes) { if (!pane.config) continue - column.mountEl(pane.id)?.appendChild(paneElement(pane)) + const el = paneElement(pane) + column.mountEl(pane.id)?.appendChild(el) + // Keep this pane's profile-config in step with the outer element's for the rest of the session. + paneConfig.register(el, () => paneConfigFor(pane)) } // Tabs are a readout as well as a control — follow the user's scroll. offScroll = column.onScroll(() => { From 6493872170a0d3e89a72e7a633d5d3389554b7fc Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 17:32:33 +0000 Subject: [PATCH 2/8] Track every pane's getter, prune detached ones, and say when one throws Studio's 5B review found a dependency-tracking hole by testing the helper with real Vue rather than reading it. entries was a plain array, so the watchEffect tracked only what the FIRST registered getter read: with two panes reading different refs, changing pane 2's source produced ZERO writes, and pane 2 caught up only when pane 1's source happened to change. That is this helper's own bug reappearing for any adopter whose panes read different sources. regions-mfe is safe today because every getter reads the same cfg and spec -- which is exactly why a reading could not find it. entries is now shallowReactive, so register() re-runs the effect and every getter is tracked. Also from the review: - stale entries are PRUNED, not skipped: an adopter that rebuilds its pane column would otherwise keep detached elements and re-run their getters on every pass forever; - a getter that throws is reported once per entry instead of being swallowed, since silence recreates the symptom this helper exists to fix; - the unused `tag` parameter is gone -- a documented check that does not exist misleads the next adopter; - the host argument now documents that it must be in the SAME tree as the panes, because Element.contains() does not cross a shadow boundary and passing the custom element would silently skip every write. regions-dashboard rebuilt so public/ is servable at this sha for the browser A/B. It is the only bundle that compiles the helper. --- library/composables/usePaneConfig.js | 32 ++-- .../regions-dashboard/regions-mfe.vue | 4 +- public/dx-maps/doxa-maps-spa/manifest.json | 12 +- public/dx-maps/manifest.json | 12 +- .../region-dashboards/index.html | 2 +- .../regions-dashboard/regions-dashboard.js | 146 +++++++++--------- .../regions-dashboard/regions-list/index.html | 2 +- .../regions-dashboard/regions-mfe/index.html | 2 +- 8 files changed, 114 insertions(+), 98 deletions(-) diff --git a/library/composables/usePaneConfig.js b/library/composables/usePaneConfig.js index 793e7be1b..07bcbf5dd 100644 --- a/library/composables/usePaneConfig.js +++ b/library/composables/usePaneConfig.js @@ -29,17 +29,25 @@ * Re-forwarding happens inside a watchEffect, so any reactive source the getter reads — the outer * config, a computed spec, the pane's own config — triggers it. */ -import { watchEffect, onBeforeUnmount } from 'vue' +import { watchEffect, onBeforeUnmount, shallowReactive } from 'vue' /** * @param {() => (Element|null|undefined)} hostGetter the element the panes were appended under; used * only to drop registrations whose element has left the DOM (a pane column can be rebuilt). - * @param {string} tag the child element's tag name, for the same staleness check. + * ★ IT MUST BE IN THE SAME TREE AS THE PANES. Element.contains() does NOT cross a shadow + * boundary, so passing the custom element while its panes live in its shadow root would make + * every pane look detached and skip every write, silently. * @returns {{ register: (el: Element, configGetter: () => object) => void, count: () => number }} */ -export function usePaneConfig(hostGetter, tag) { - /** @type {Array<{el: Element, get: () => object, last: string|null}>} */ - const entries = [] +export function usePaneConfig(hostGetter) { + // ★ shallowReactive, NOT a plain array. The watchEffect below runs once, at the FIRST register(); + // with a plain array a LATER entry's getter is never tracked, so its pane stays frozen until + // something the first entry reads happens to change. MEASURED with real Vue by studio: two panes + // reading different refs, changing only pane 2's source produced ZERO writes. That is the very bug + // this helper exists to fix, reappearing for any adopter whose panes read different sources. + // Making the list reactive re-runs the effect on register() and re-tracks every getter. + /** @type {Array<{el: Element, get: () => object, last: string|null, warned: boolean}>} */ + const entries = shallowReactive([]) let stop = null const alive = (el) => { @@ -55,16 +63,22 @@ export function usePaneConfig(hostGetter, tag) { // The attribute the caller already set at mount is the baseline: recording it here means the // first watchEffect pass does not rewrite an identical value. const last = el.getAttribute('profile-config') - entries.push({ el, get: configGetter, last }) + entries.push({ el, get: configGetter, last, warned: false }) if (!stop) { stop = watchEffect(() => { + // PRUNE rather than skip: an adopter that rebuilds its pane column would otherwise keep + // detached elements in the list and re-run their getters on every pass, forever. + for (let i = entries.length - 1; i >= 0; i--) if (!alive(entries[i].el)) entries.splice(i, 1) for (const entry of entries) { let next // A getter that throws must not take the other panes down with it: this runs inside a - // watchEffect, where an exception would stop every later entry in the same pass. - try { next = JSON.stringify(entry.get()) } catch (_) { continue } + // watchEffect, where an exception would stop every later entry in the same pass. It is + // reported ONCE per entry -- silence here would recreate the symptom this helper fixes. + try { next = JSON.stringify(entry.get()) } catch (e) { + if (!entry.warned) { entry.warned = true; console.error('[usePaneConfig] pane config getter threw; this pane will not follow the outer config:', e) } + continue + } if (next === entry.last) continue - if (!alive(entry.el)) continue entry.last = next entry.el.setAttribute('profile-config', next) } diff --git a/plugin-designs/regions-dashboard/regions-mfe.vue b/plugin-designs/regions-dashboard/regions-mfe.vue index 44b793b20..bccb01811 100644 --- a/plugin-designs/regions-dashboard/regions-mfe.vue +++ b/plugin-designs/regions-dashboard/regions-mfe.vue @@ -118,7 +118,9 @@ const INHERITED_PAGE_KEYS = ['assetsBase', 'apiBaseUrl', 'prayBaseUrl', 'tokenUr // after the outer profile-config changes yields the NEW pane config. It used to be inline in // paneElement, which ran once per pane in onMounted and never again -- that is the whole defect: // the pane is handed a JSON STRING, so a later locale change reached this element and stopped. -const paneConfig = usePaneConfig(() => stage.value, TAG) +// stage is the element the panes are appended UNDER, in the same tree as them -- contains() does +// not cross a shadow boundary, so the host must not be the custom element itself. +const paneConfig = usePaneConfig(() => stage.value) function paneConfigFor(pane) { const host = cfg.value || {} diff --git a/public/dx-maps/doxa-maps-spa/manifest.json b/public/dx-maps/doxa-maps-spa/manifest.json index 6d34eeccd..aeb67bee3 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -1144,7 +1144,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-+u2vDSnYni3VeNKSYdNWfw5bjKtriFjik/k10lugA0nw6Ozfi/vKUYp3a9sbMAp6", + "integrity": "sha384-z4ZtI4c3ouh3yVdWy9vGTsmNm0aK7GfGlsBMGtrGa+9UhUtf7iXng+k9XsBEfev3", "elements": [ "regions-dashboard" ], @@ -1167,8 +1167,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1184,7 +1184,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1200,8 +1200,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index 6d34eeccd..aeb67bee3 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -1144,7 +1144,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-+u2vDSnYni3VeNKSYdNWfw5bjKtriFjik/k10lugA0nw6Ozfi/vKUYp3a9sbMAp6", + "integrity": "sha384-z4ZtI4c3ouh3yVdWy9vGTsmNm0aK7GfGlsBMGtrGa+9UhUtf7iXng+k9XsBEfev3", "elements": [ "regions-dashboard" ], @@ -1167,8 +1167,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1184,7 +1184,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1200,8 +1200,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/regions-dashboard/region-dashboards/index.html b/public/dx-maps/regions-dashboard/region-dashboards/index.html index 1706f1e7c..0987b736b 100644 --- a/public/dx-maps/regions-dashboard/region-dashboards/index.html +++ b/public/dx-maps/regions-dashboard/region-dashboards/index.html @@ -70,7 +70,7 @@ - + + - + \n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1184,7 +1184,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1200,8 +1200,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index aeb67bee3..0345561ef 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -1144,7 +1144,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-z4ZtI4c3ouh3yVdWy9vGTsmNm0aK7GfGlsBMGtrGa+9UhUtf7iXng+k9XsBEfev3", + "integrity": "sha384-yO7462/K+x8yGefpEiZG7GWviAwgJe/N6J7WUhC3qK8mQyCLIq0SeyszkL+1FUhh", "elements": [ "regions-dashboard" ], @@ -1167,8 +1167,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1184,7 +1184,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1200,8 +1200,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/regions-dashboard/region-dashboards/index.html b/public/dx-maps/regions-dashboard/region-dashboards/index.html index 0987b736b..21d9d9027 100644 --- a/public/dx-maps/regions-dashboard/region-dashboards/index.html +++ b/public/dx-maps/regions-dashboard/region-dashboards/index.html @@ -70,7 +70,7 @@ - + - + - + + + diff --git a/library/i18n/locales/ar/mapInfo.json b/library/i18n/locales/ar/mapInfo.json new file mode 100644 index 000000000..4cc7f6f31 --- /dev/null +++ b/library/i18n/locales/ar/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "ماذا يمكن أن تقدّم لك هذه الخريطة؟", + "title": "ماذا يمكن أن تقدّم لك هذه الخريطة؟", + "pointer": "ماذا تفعل هذه الخريطة؟", + "close": "إغلاق", + "takeaway": "ما تحصل عليه:", + "poster": "ملصق", + "packet": "حزمة الصلاة", + "cards": "بطاقات الصلاة", + "spreadsheet": "جدول بيانات", + "example": "مثال", + "expandPages": "عرض كل الصفحات ({n})", + "collapsePages": "عرض الصفحة الأولى فقط", + "expandDeck": "عرض كل البطاقات ({n})", + "collapseDeck": "تجميع البطاقات", + "moreRows": "صفوف إضافية في جدول البيانات الكامل: {n}", + "openFull": "فتح بالحجم الكامل", + "pointerOff": "لا تُشِر إلى هذا الزر مرة أخرى", + "tab": { + "upg-100": { + "lead": "قائمة UPG-100 على خريطة واحدة: الشعوب غير المُبشَّرة، مجمّعة في مناطق يمكنك أن تتبنّاها بالصلاة.", + "takeaway": "لكل منطقة: ملصق للحائط، وحزمة صلاة للتوزيع، ومجموعة من بطاقات الصلاة. المثال أدناه هو المنطقة التي تضم أكبر عدد من الناس في شعوب لا يعمل أحد بعد على غرس كنائس بينها." + } + } +} diff --git a/library/i18n/locales/de/mapInfo.json b/library/i18n/locales/de/mapInfo.json new file mode 100644 index 000000000..0771ff873 --- /dev/null +++ b/library/i18n/locales/de/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "Was kann diese Karte für Sie tun?", + "title": "Was kann diese Karte für Sie tun?", + "pointer": "Was kann diese Karte?", + "close": "Schließen", + "takeaway": "Was Sie mitnehmen:", + "poster": "Poster", + "packet": "Gebetsheft", + "cards": "Gebetskarten", + "spreadsheet": "Tabelle", + "example": "Beispiel", + "expandPages": "Alle Seiten anzeigen ({n})", + "collapsePages": "Nur die erste Seite anzeigen", + "expandDeck": "Alle Karten anzeigen ({n})", + "collapseDeck": "Karten stapeln", + "moreRows": "Weitere Zeilen in der vollständigen Tabelle: {n}", + "openFull": "In voller Größe öffnen", + "pointerOff": "Nicht mehr auf diese Schaltfläche hinweisen", + "tab": { + "upg-100": { + "lead": "Die UPG-100-Liste auf einer Karte: unerreichte Volksgruppen, zusammengefasst in Zonen, die Sie im Gebet übernehmen können.", + "takeaway": "für jede Zone ein Wandposter, ein Gebetsheft zum Weitergeben und ein Satz Gebetskarten. Das Beispiel unten ist die Zone mit den meisten Menschen in Volksgruppen, unter denen noch niemand Gemeinden gründet." + } + } +} diff --git a/library/i18n/locales/en/mapInfo.json b/library/i18n/locales/en/mapInfo.json new file mode 100644 index 000000000..f407683b1 --- /dev/null +++ b/library/i18n/locales/en/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "What can this map do for you?", + "title": "What can this map do for you?", + "pointer": "What can this map do?", + "close": "Close", + "takeaway": "What you take away:", + "poster": "Poster", + "packet": "Prayer packet", + "cards": "Prayer cards", + "spreadsheet": "Spreadsheet", + "example": "Example", + "expandPages": "Show all pages ({n})", + "collapsePages": "Show the first page only", + "expandDeck": "Show all cards ({n})", + "collapseDeck": "Stack the cards", + "moreRows": "More rows in the full spreadsheet: {n}", + "openFull": "Open full size", + "pointerOff": "Don't point at this button again", + "tab": { + "upg-100": { + "lead": "The UPG-100 list on one map: unreached people groups, gathered into zones you can adopt in prayer.", + "takeaway": "for any zone, a wall poster, a prayer packet to hand out and a deck of prayer cards. The example below is the zone with the most people in groups where no one is planting churches yet." + } + } +} diff --git a/library/i18n/locales/es/mapInfo.json b/library/i18n/locales/es/mapInfo.json new file mode 100644 index 000000000..448ba65ad --- /dev/null +++ b/library/i18n/locales/es/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "¿Qué puede hacer este mapa por usted?", + "title": "¿Qué puede hacer este mapa por usted?", + "pointer": "¿Qué hace este mapa?", + "close": "Cerrar", + "takeaway": "Lo que se lleva:", + "poster": "Póster", + "packet": "Paquete de oración", + "cards": "Tarjetas de oración", + "spreadsheet": "Hoja de cálculo", + "example": "Ejemplo", + "expandPages": "Ver todas las páginas ({n})", + "collapsePages": "Ver solo la primera página", + "expandDeck": "Ver todas las tarjetas ({n})", + "collapseDeck": "Apilar las tarjetas", + "moreRows": "Más filas en la hoja de cálculo completa: {n}", + "openFull": "Abrir a tamaño completo", + "pointerOff": "No volver a señalar este botón", + "tab": { + "upg-100": { + "lead": "La lista UPG-100 en un solo mapa: pueblos no alcanzados, agrupados en zonas que usted puede adoptar en oración.", + "takeaway": "para cada zona, un póster para la pared, un paquete de oración para repartir y un mazo de tarjetas de oración. El ejemplo de abajo es la zona con más personas en pueblos donde todavía nadie está plantando iglesias." + } + } +} diff --git a/library/i18n/locales/fr/mapInfo.json b/library/i18n/locales/fr/mapInfo.json new file mode 100644 index 000000000..87dcf6962 --- /dev/null +++ b/library/i18n/locales/fr/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "Que peut faire cette carte pour vous ?", + "title": "Que peut faire cette carte pour vous ?", + "pointer": "Que fait cette carte ?", + "close": "Fermer", + "takeaway": "Ce que vous emportez :", + "poster": "Affiche", + "packet": "Livret de prière", + "cards": "Cartes de prière", + "spreadsheet": "Tableur", + "example": "Exemple", + "expandPages": "Afficher toutes les pages ({n})", + "collapsePages": "N'afficher que la première page", + "expandDeck": "Afficher toutes les cartes ({n})", + "collapseDeck": "Empiler les cartes", + "moreRows": "Lignes supplémentaires dans le tableur complet : {n}", + "openFull": "Ouvrir en taille réelle", + "pointerOff": "Ne plus signaler ce bouton", + "tab": { + "upg-100": { + "lead": "La liste UPG-100 sur une seule carte : les peuples non atteints, regroupés en zones que vous pouvez adopter dans la prière.", + "takeaway": "pour chaque zone, une affiche murale, un livret de prière à distribuer et un jeu de cartes de prière. L'exemple ci-dessous est la zone qui compte le plus de personnes dans des peuples où personne n'implante encore d'Églises." + } + } +} diff --git a/library/i18n/locales/hi/mapInfo.json b/library/i18n/locales/hi/mapInfo.json new file mode 100644 index 000000000..a352ed1b6 --- /dev/null +++ b/library/i18n/locales/hi/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "यह नक्शा आपके लिए क्या कर सकता है?", + "title": "यह नक्शा आपके लिए क्या कर सकता है?", + "pointer": "यह नक्शा क्या करता है?", + "close": "बंद करें", + "takeaway": "आपको क्या मिलता है:", + "poster": "पोस्टर", + "packet": "प्रार्थना पुस्तिका", + "cards": "प्रार्थना कार्ड", + "spreadsheet": "स्प्रेडशीट", + "example": "उदाहरण", + "expandPages": "सभी पृष्ठ दिखाएँ ({n})", + "collapsePages": "केवल पहला पृष्ठ दिखाएँ", + "expandDeck": "सभी कार्ड दिखाएँ ({n})", + "collapseDeck": "कार्ड एक साथ रखें", + "moreRows": "पूरी स्प्रेडशीट में और पंक्तियाँ: {n}", + "openFull": "पूरे आकार में खोलें", + "pointerOff": "इस बटन की ओर फिर से इशारा न करें", + "tab": { + "upg-100": { + "lead": "UPG-100 सूची एक ही नक्शे पर: अपहुँचे जन-समूह, क्षेत्रों में बाँटे गए, जिन्हें आप प्रार्थना में अपना सकते हैं।", + "takeaway": "हर क्षेत्र के लिए दीवार का एक पोस्टर, बाँटने के लिए एक प्रार्थना पुस्तिका और प्रार्थना कार्डों का एक सेट। नीचे का उदाहरण वह क्षेत्र है जहाँ ऐसे जन-समूहों में सबसे अधिक लोग हैं जिनके बीच अभी कोई कलीसिया स्थापित नहीं कर रहा है।" + } + } +} diff --git a/library/i18n/locales/it/mapInfo.json b/library/i18n/locales/it/mapInfo.json new file mode 100644 index 000000000..4cd81db8d --- /dev/null +++ b/library/i18n/locales/it/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "Che cosa può fare questa mappa per te?", + "title": "Che cosa può fare questa mappa per te?", + "pointer": "Che cosa fa questa mappa?", + "close": "Chiudi", + "takeaway": "Che cosa ottieni:", + "poster": "Poster", + "packet": "Libretto di preghiera", + "cards": "Carte di preghiera", + "spreadsheet": "Foglio di calcolo", + "example": "Esempio", + "expandPages": "Mostra tutte le pagine ({n})", + "collapsePages": "Mostra solo la prima pagina", + "expandDeck": "Mostra tutte le carte ({n})", + "collapseDeck": "Impila le carte", + "moreRows": "Altre righe nel foglio di calcolo completo: {n}", + "openFull": "Apri a grandezza intera", + "pointerOff": "Non indicare più questo pulsante", + "tab": { + "upg-100": { + "lead": "La lista UPG-100 su un'unica mappa: popoli non raggiunti, raggruppati in zone che puoi adottare nella preghiera.", + "takeaway": "per ogni zona, un poster da parete, un libretto di preghiera da distribuire e un mazzo di carte di preghiera. L'esempio qui sotto è la zona con più persone in popoli dove nessuno sta ancora fondando chiese." + } + } +} diff --git a/library/i18n/locales/pt/mapInfo.json b/library/i18n/locales/pt/mapInfo.json new file mode 100644 index 000000000..197cc24e0 --- /dev/null +++ b/library/i18n/locales/pt/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "O que este mapa pode fazer por você?", + "title": "O que este mapa pode fazer por você?", + "pointer": "O que este mapa faz?", + "close": "Fechar", + "takeaway": "O que você leva:", + "poster": "Pôster", + "packet": "Pacote de oração", + "cards": "Cartões de oração", + "spreadsheet": "Planilha", + "example": "Exemplo", + "expandPages": "Mostrar todas as páginas ({n})", + "collapsePages": "Mostrar só a primeira página", + "expandDeck": "Mostrar todos os cartões ({n})", + "collapseDeck": "Empilhar os cartões", + "moreRows": "Mais linhas na planilha completa: {n}", + "openFull": "Abrir em tamanho real", + "pointerOff": "Não apontar mais para este botão", + "tab": { + "upg-100": { + "lead": "A lista UPG-100 em um só mapa: povos não alcançados, agrupados em zonas que você pode adotar em oração.", + "takeaway": "para cada zona, um pôster de parede, um pacote de oração para distribuir e um baralho de cartões de oração. O exemplo abaixo é a zona com mais pessoas em povos onde ninguém ainda está plantando igrejas." + } + } +} diff --git a/library/i18n/locales/ro/mapInfo.json b/library/i18n/locales/ro/mapInfo.json new file mode 100644 index 000000000..ca55f4311 --- /dev/null +++ b/library/i18n/locales/ro/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "Ce poate face această hartă pentru tine?", + "title": "Ce poate face această hartă pentru tine?", + "pointer": "Ce face această hartă?", + "close": "Închide", + "takeaway": "Ce primești:", + "poster": "Poster", + "packet": "Pachet de rugăciune", + "cards": "Cartonașe de rugăciune", + "spreadsheet": "Foaie de calcul", + "example": "Exemplu", + "expandPages": "Arată toate paginile ({n})", + "collapsePages": "Arată doar prima pagină", + "expandDeck": "Arată toate cartonașele ({n})", + "collapseDeck": "Strânge cartonașele", + "moreRows": "Rânduri suplimentare în foaia de calcul completă: {n}", + "openFull": "Deschide la dimensiune completă", + "pointerOff": "Nu mai indica acest buton", + "tab": { + "upg-100": { + "lead": "Lista UPG-100 pe o singură hartă: popoare neatinse, grupate în zone pe care le poți adopta în rugăciune.", + "takeaway": "pentru fiecare zonă, un poster de perete, un pachet de rugăciune de împărțit și un set de cartonașe de rugăciune. Exemplul de mai jos este zona cu cei mai mulți oameni din popoare în care nimeni nu plantează încă biserici." + } + } +} diff --git a/library/i18n/locales/ru/mapInfo.json b/library/i18n/locales/ru/mapInfo.json new file mode 100644 index 000000000..477c6c7c6 --- /dev/null +++ b/library/i18n/locales/ru/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "Чем эта карта может быть вам полезна?", + "title": "Чем эта карта может быть вам полезна?", + "pointer": "Что умеет эта карта?", + "close": "Закрыть", + "takeaway": "Что вы получаете:", + "poster": "Плакат", + "packet": "Молитвенный буклет", + "cards": "Молитвенные карточки", + "spreadsheet": "Таблица", + "example": "Пример", + "expandPages": "Показать все страницы ({n})", + "collapsePages": "Показать только первую страницу", + "expandDeck": "Показать все карточки ({n})", + "collapseDeck": "Сложить карточки в стопку", + "moreRows": "Ещё строк в полной таблице: {n}", + "openFull": "Открыть в полном размере", + "pointerOff": "Больше не указывать на эту кнопку", + "tab": { + "upg-100": { + "lead": "Список UPG-100 на одной карте: недостигнутые народы, объединённые в зоны, которые вы можете взять на молитвенное попечение.", + "takeaway": "для каждой зоны — настенный плакат, молитвенный буклет для раздачи и набор молитвенных карточек. Ниже показана зона, где больше всего людей в народах, среди которых пока никто не основывает церкви." + } + } +} diff --git a/library/i18n/locales/zh/mapInfo.json b/library/i18n/locales/zh/mapInfo.json new file mode 100644 index 000000000..d125a0a52 --- /dev/null +++ b/library/i18n/locales/zh/mapInfo.json @@ -0,0 +1,25 @@ +{ + "open": "这张地图能为你做什么?", + "title": "这张地图能为你做什么?", + "pointer": "这张地图能做什么?", + "close": "关闭", + "takeaway": "你能带走的:", + "poster": "海报", + "packet": "祷告手册", + "cards": "祷告卡", + "spreadsheet": "电子表格", + "example": "示例", + "expandPages": "显示全部页面({n})", + "collapsePages": "只显示第一页", + "expandDeck": "显示全部卡片({n})", + "collapseDeck": "把卡片叠起来", + "moreRows": "完整电子表格中的更多行:{n}", + "openFull": "以完整尺寸打开", + "pointerOff": "不再指向这个按钮", + "tab": { + "upg-100": { + "lead": "UPG-100 名单尽在一张地图上:未得之民按区域分组,你可以在祷告中认领一个区域。", + "takeaway": "每个区域都有一张墙面海报、一本可分发的祷告手册和一套祷告卡。下面的示例是这样一个区域:在尚无人植堂的族群中,这里的人数最多。" + } + } +} From 74d2d67f199c4e20dce4f8f12f88d05aa24ecaa2 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 19:17:14 +0000 Subject: [PATCH 6/8] Every map's "what can this do for you?" text, in one catalogue area Adds the lead and takeaway for six more maps to mapInfo, keyed by the gallery's tab ids (cities-internet, gospel-resources, dashboard-plus-grid, research-map-plus-grid, prayer-map, regions-dashboard), plus the Regions note, in all eleven locales. Each map's owner wrote and checked its own text; this commit only gathers it, because the gallery ships one area and one lane editing its eleven files cannot collide with another. Checked mechanically before writing: every locale present, keys free of dots (the gallery resolves keys by splitting on them), no numerals, every locale different from English, and every string in its own locale's script, since a stray character from another script passes every other catalogue gate. --- library/i18n/locales/ar/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/de/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/en/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/es/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/fr/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/hi/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/it/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/pt/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/ro/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/ru/mapInfo.json | 25 +++++++++++++++++++++++++ library/i18n/locales/zh/mapInfo.json | 25 +++++++++++++++++++++++++ 11 files changed, 275 insertions(+) diff --git a/library/i18n/locales/ar/mapInfo.json b/library/i18n/locales/ar/mapInfo.json index 4cc7f6f31..0a083a211 100644 --- a/library/i18n/locales/ar/mapInfo.json +++ b/library/i18n/locales/ar/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "قائمة UPG-100 على خريطة واحدة: الشعوب غير المُبشَّرة، مجمّعة في مناطق يمكنك أن تتبنّاها بالصلاة.", "takeaway": "لكل منطقة: ملصق للحائط، وحزمة صلاة للتوزيع، ومجموعة من بطاقات الصلاة. المثال أدناه هو المنطقة التي تضم أكبر عدد من الناس في شعوب لا يعمل أحد بعد على غرس كنائس بينها." + }, + "cities-internet": { + "lead": "هل يمكن الوصول إلى الأشخاص الذين تريد الوصول إليهم عبر الإنترنت؟", + "takeaway": "كل بلد يعيش فيه شعب غير مبلَّغ، مصنَّف حسب استخدام الإنترنت والهاتف المحمول المقاس — لتمييز الأرض التي تصلح للوصول الرقمي عن الأماكن التي لن تجد فيها الشاشة أحدًا. الأرقام وطنية وتحمل سنة رصدها؛ «غير معروف» يعني غير مقاس، لا مفترضًا." + }, + "gospel-resources": { + "lead": "ماذا يملك الشعب بالفعل بلغته الخاصة؟", + "takeaway": "الكتاب المقدس، والتسجيلات الصوتية، والأفلام، وفيديو الكتاب المقدس، والتدريب — وما الذي ما زال ناقصًا. انقر على بلد لعرض شعوبه، أو على شعب لفتح صفحته مع روابط عاملة لكل مورد وُجد. «لم يُعثر على شيء» تعني غير موجود في المجموعات التي فحصها هذا الإصدار، وليست دليلًا على عدم وجوده." + }, + "dashboard-plus-grid": { + "lead": "كل الشعوب في عرض واحد. صفِّ حسب الصلاة أو الشعب أو المنطقة أو الدولة أو اللغة، فتضيق الخريطة والجدول والإجماليات معًا.", + "takeaway": "خذ معك الصفوف التي صفّيتها في جدول بيانات." + }, + "research-map-plus-grid": { + "lead": "الخريطة إلى جانب القائمة. اختر شعبًا على الخريطة فتتبعه القائمة، وضيِّق القائمة فتتبعها الخريطة.", + "takeaway": "خذ معك ملصقًا للخريطة كما تراها، جاهزًا للطباعة، وحزمة صلاة لتوزّعها." + }, + "prayer-map": { + "lead": "كل الشعوب غير المُبشَّرة على خريطة واحدة، ملوّنة بحسب ما إذا كان أحد يصلّي من أجلها بعد، وما إذا كانت مخدومة، وما إذا كانت مُتبنّاة.", + "takeaway": "شعب لا يصلّي أحد من أجله بعد، ورابط لمشاركته." + }, + "regions-dashboard": { + "lead": "ابحث عن المجموعات الشعبية غير المبلَّغة حسب المنطقة والدولة.", + "takeaway": "افتح دولة لرؤية مجموعاتها، ثم أنشئ ملصقًا وحزمة صلاة ومجموعة بطاقات للطباعة أو المشاركة.", + "note": "تُنشأ الملصقات والحزم والبطاقات في متصفحك لكل دولة ما عدا الهند والصين (قريبًا)." } } } diff --git a/library/i18n/locales/de/mapInfo.json b/library/i18n/locales/de/mapInfo.json index 0771ff873..02f44726d 100644 --- a/library/i18n/locales/de/mapInfo.json +++ b/library/i18n/locales/de/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "Die UPG-100-Liste auf einer Karte: unerreichte Volksgruppen, zusammengefasst in Zonen, die Sie im Gebet übernehmen können.", "takeaway": "für jede Zone ein Wandposter, ein Gebetsheft zum Weitergeben und ein Satz Gebetskarten. Das Beispiel unten ist die Zone mit den meisten Menschen in Volksgruppen, unter denen noch niemand Gemeinden gründet." + }, + "cities-internet": { + "lead": "Sind die Menschen, die Sie erreichen wollen, online erreichbar?", + "takeaway": "Jedes Land, in dem eine unerreichte Volksgruppe lebt, gestaffelt nach gemessener Internet- und Mobilfunknutzung — damit Sie digital erreichbares Gebiet von Orten unterscheiden können, an denen ein Bildschirm niemanden findet. Die Zahlen sind national und tragen ihr Erhebungsjahr; unbekannt heißt ungemessen, nie angenommen." + }, + "gospel-resources": { + "lead": "Was hat eine Volksgruppe bereits in ihrer eigenen Sprache?", + "takeaway": "Bibeltext, Audio, Film, Bibelvideo, Schulung — und was noch fehlt. Klicken Sie auf ein Land, um seine Gruppen zu sehen, oder auf eine Gruppe für ihr eigenes Blatt mit funktionierenden Links zu jeder gefundenen Ressource. „Nichts gefunden“ heißt: nicht in den von diesem Build geprüften Quellen enthalten — nie ein Beweis, dass nichts existiert." + }, + "dashboard-plus-grid": { + "lead": "Alle Völker in einer Ansicht. Filtern Sie nach Gebet, Volk, Region, Land oder Sprache – Karte, Tabelle und Summen werden gemeinsam eingegrenzt.", + "takeaway": "Nehmen Sie die gefilterten Zeilen als Tabelle mit." + }, + "research-map-plus-grid": { + "lead": "Die Karte neben der Liste. Wählen Sie ein Volk auf der Karte, und die Liste folgt; grenzen Sie die Liste ein, und die Karte folgt.", + "takeaway": "Nehmen Sie ein Poster der Karte, wie Sie sie sehen, druckfertig, und ein Gebetspaket zum Verteilen mit." + }, + "prayer-map": { + "lead": "Alle unerreichten Volksgruppen auf einer Karte, eingefärbt danach, ob schon jemand für sie betet, ob sie erreicht werden und ob sie adoptiert sind.", + "takeaway": "Eine Volksgruppe, für die noch niemand betet, und ein Link zum Teilen." + }, + "regions-dashboard": { + "lead": "Finde unerreichte Volksgruppen nach Region und Land.", + "takeaway": "Öffnen Sie ein Land, um seine Volksgruppen zu sehen, und erzeugen Sie dann ein Poster, ein Gebetspaket und ein Kartenset zum Drucken oder Teilen.", + "note": "Poster, Pakete und Karten entstehen in Ihrem Browser für jedes Land außer Indien und China (in Kürze)." } } } diff --git a/library/i18n/locales/en/mapInfo.json b/library/i18n/locales/en/mapInfo.json index f407683b1..ed7db3671 100644 --- a/library/i18n/locales/en/mapInfo.json +++ b/library/i18n/locales/en/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "The UPG-100 list on one map: unreached people groups, gathered into zones you can adopt in prayer.", "takeaway": "for any zone, a wall poster, a prayer packet to hand out and a deck of prayer cards. The example below is the zone with the most people in groups where no one is planting churches yet." + }, + "cities-internet": { + "lead": "Can the people you want to reach be reached online?", + "takeaway": "Every country where an unengaged people group lives, banded by measured internet and mobile use — so you can tell digital-first ground from places where a screen will not find anyone. Figures are national and carry their observation year; unknown means unmeasured, never assumed." + }, + "gospel-resources": { + "lead": "What does a people group already have in its own language?", + "takeaway": "Scripture, audio, film, Bible video, training — and what is still missing. Click a country to list its groups, or a group for its own sheet with working links to every resource found. “None found” means not present in the pools this build checked, never proof that nothing exists." + }, + "dashboard-plus-grid": { + "lead": "Every people group in one view. Filter by prayer, people, region, country or language, and the map, the table and the totals all narrow together.", + "takeaway": "Take away the rows you filtered to, as a spreadsheet." + }, + "research-map-plus-grid": { + "lead": "The map beside the list. Pick a people group on the map and the list follows it; narrow the list and the map follows back.", + "takeaway": "Take away a poster of the map as you see it, ready to print, and a prayer packet to hand out." + }, + "prayer-map": { + "lead": "Every unreached people group on one map, coloured by whether anyone is praying for it yet, whether it is engaged, and whether it is adopted.", + "takeaway": "A people group that no one is praying for yet, and a link to share it." + }, + "regions-dashboard": { + "lead": "Find unreached people groups by region and country.", + "takeaway": "Open a country to see its groups, then generate a poster, a prayer packet and a card deck to print or share.", + "note": "Posters, packets and cards generate in your browser for each country except India and China (coming soon)." } } } diff --git a/library/i18n/locales/es/mapInfo.json b/library/i18n/locales/es/mapInfo.json index 448ba65ad..67732ab8f 100644 --- a/library/i18n/locales/es/mapInfo.json +++ b/library/i18n/locales/es/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "La lista UPG-100 en un solo mapa: pueblos no alcanzados, agrupados en zonas que usted puede adoptar en oración.", "takeaway": "para cada zona, un póster para la pared, un paquete de oración para repartir y un mazo de tarjetas de oración. El ejemplo de abajo es la zona con más personas en pueblos donde todavía nadie está plantando iglesias." + }, + "cities-internet": { + "lead": "¿Se puede llegar en línea a las personas que quiere alcanzar?", + "takeaway": "Cada país donde vive un pueblo no alcanzado, agrupado por uso medido de internet y móvil, para distinguir el terreno digital de los lugares donde una pantalla no encontrará a nadie. Las cifras son nacionales y llevan su año de observación; desconocido significa no medido, nunca supuesto." + }, + "gospel-resources": { + "lead": "¿Qué tiene ya un pueblo en su propio idioma?", + "takeaway": "Escritura, audio, película, video bíblico, formación — y qué falta todavía. Haga clic en un país para ver sus pueblos, o en un pueblo para su ficha con enlaces activos a cada recurso encontrado. «No encontrado» significa que no está en los repositorios que esta versión consultó, nunca prueba de que no exista." + }, + "dashboard-plus-grid": { + "lead": "Todos los pueblos en una sola vista. Filtre por oración, pueblo, región, país o idioma: el mapa, la tabla y los totales se reducen a la vez.", + "takeaway": "Llévese las filas que filtró, en una hoja de cálculo." + }, + "research-map-plus-grid": { + "lead": "El mapa junto a la lista. Elija un pueblo en el mapa y la lista lo sigue; reduzca la lista y el mapa la sigue.", + "takeaway": "Llévese un póster del mapa tal como lo ve, listo para imprimir, y un paquete de oración para repartir." + }, + "prayer-map": { + "lead": "Todos los grupos étnicos no alcanzados en un solo mapa, coloreados según si alguien ya ora por ellos, si están siendo alcanzados y si han sido adoptados.", + "takeaway": "Un grupo étnico por el que nadie ora todavía, y un enlace para compartirlo." + }, + "regions-dashboard": { + "lead": "Encuentra grupos étnicos no alcanzados por región y país.", + "takeaway": "Abre un país para ver sus grupos y genera un póster, un paquete de oración y una baraja de tarjetas para imprimir o compartir.", + "note": "Los pósteres, paquetes y tarjetas se generan en tu navegador para cada país excepto India y China (próximamente)." } } } diff --git a/library/i18n/locales/fr/mapInfo.json b/library/i18n/locales/fr/mapInfo.json index 87dcf6962..1f9fecddc 100644 --- a/library/i18n/locales/fr/mapInfo.json +++ b/library/i18n/locales/fr/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "La liste UPG-100 sur une seule carte : les peuples non atteints, regroupés en zones que vous pouvez adopter dans la prière.", "takeaway": "pour chaque zone, une affiche murale, un livret de prière à distribuer et un jeu de cartes de prière. L'exemple ci-dessous est la zone qui compte le plus de personnes dans des peuples où personne n'implante encore d'Églises." + }, + "cities-internet": { + "lead": "Les personnes que vous voulez atteindre sont-elles joignables en ligne ?", + "takeaway": "Chaque pays où vit un peuple non atteint, classé selon l'usage mesuré d'internet et du mobile — pour distinguer le terrain numérique des lieux où un écran ne trouvera personne. Les chiffres sont nationaux et portent leur année d'observation ; inconnu signifie non mesuré, jamais supposé." + }, + "gospel-resources": { + "lead": "Que possède déjà un peuple dans sa propre langue ?", + "takeaway": "Écriture, audio, film, vidéo biblique, formation — et ce qui manque encore. Cliquez sur un pays pour lister ses peuples, ou sur un peuple pour sa fiche avec des liens actifs vers chaque ressource trouvée. « Rien trouvé » signifie absent des fonds vérifiés par cette version, jamais une preuve que rien n'existe." + }, + "dashboard-plus-grid": { + "lead": "Tous les peuples dans une seule vue. Filtrez par prière, peuple, région, pays ou langue : la carte, le tableau et les totaux se réduisent ensemble.", + "takeaway": "Emportez les lignes filtrées sous forme de tableur." + }, + "research-map-plus-grid": { + "lead": "La carte à côté de la liste. Choisissez un peuple sur la carte et la liste le suit ; réduisez la liste et la carte suit.", + "takeaway": "Emportez une affiche de la carte telle que vous la voyez, prête à imprimer, et un dossier de prière à distribuer." + }, + "prayer-map": { + "lead": "Tous les peuples non atteints sur une seule carte, colorés selon que quelqu'un prie déjà pour eux, qu'ils sont engagés et qu'ils sont adoptés.", + "takeaway": "Un peuple pour lequel personne ne prie encore, et un lien pour le partager." + }, + "regions-dashboard": { + "lead": "Trouvez des peuples non atteints par région et par pays.", + "takeaway": "Ouvrez un pays pour voir ses groupes, puis générez une affiche, un dossier de prière et un jeu de cartes à imprimer ou à partager.", + "note": "Affiches, dossiers et cartes sont générés dans votre navigateur pour chaque pays sauf l'Inde et la Chine (bientôt disponible)." } } } diff --git a/library/i18n/locales/hi/mapInfo.json b/library/i18n/locales/hi/mapInfo.json index a352ed1b6..83501befb 100644 --- a/library/i18n/locales/hi/mapInfo.json +++ b/library/i18n/locales/hi/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "UPG-100 सूची एक ही नक्शे पर: अपहुँचे जन-समूह, क्षेत्रों में बाँटे गए, जिन्हें आप प्रार्थना में अपना सकते हैं।", "takeaway": "हर क्षेत्र के लिए दीवार का एक पोस्टर, बाँटने के लिए एक प्रार्थना पुस्तिका और प्रार्थना कार्डों का एक सेट। नीचे का उदाहरण वह क्षेत्र है जहाँ ऐसे जन-समूहों में सबसे अधिक लोग हैं जिनके बीच अभी कोई कलीसिया स्थापित नहीं कर रहा है।" + }, + "cities-internet": { + "lead": "जिन लोगों तक आप पहुँचना चाहते हैं, क्या उन तक ऑनलाइन पहुँचा जा सकता है?", + "takeaway": "हर वह देश जहाँ कोई अनपहुँचा जनसमूह रहता है, मापी गई इंटरनेट और मोबाइल उपयोग के अनुसार वर्गीकृत — ताकि आप डिजिटल रूप से पहुँच योग्य क्षेत्र को उन स्थानों से अलग कर सकें जहाँ स्क्रीन किसी को नहीं मिलेगी। आँकड़े राष्ट्रीय हैं और अपने अवलोकन वर्ष के साथ आते हैं; अज्ञात का अर्थ है बिना मापा, कभी अनुमानित नहीं।" + }, + "gospel-resources": { + "lead": "किसी जनसमूह के पास उसकी अपनी भाषा में पहले से क्या है?", + "takeaway": "पवित्रशास्त्र, ऑडियो, फ़िल्म, बाइबल वीडियो, प्रशिक्षण — और क्या अब भी नहीं है। किसी देश पर क्लिक करके उसके जनसमूह देखें, या किसी जनसमूह पर क्लिक करके उसकी अपनी शीट खोलें, जिसमें मिले हर संसाधन के काम करने वाले लिंक हैं। “कुछ नहीं मिला” का अर्थ है इस बिल्ड द्वारा जाँचे गए स्रोतों में उपस्थित नहीं — यह प्रमाण नहीं कि कुछ मौजूद ही नहीं।" + }, + "dashboard-plus-grid": { + "lead": "सभी जनसमूह एक ही दृश्य में। प्रार्थना, जनसमूह, क्षेत्र, देश या भाषा से छाँटें — नक्शा, तालिका और कुल एक साथ सीमित होते हैं।", + "takeaway": "छाँटी गई पंक्तियाँ स्प्रेडशीट के रूप में साथ ले जाएँ।" + }, + "research-map-plus-grid": { + "lead": "सूची के साथ नक्शा। नक्शे पर एक जनसमूह चुनें और सूची उसका अनुसरण करती है; सूची सीमित करें और नक्शा अनुसरण करता है।", + "takeaway": "नक्शे का पोस्टर जैसा आप देखते हैं, छपाई के लिए तैयार, और बाँटने के लिए प्रार्थना पैकेट साथ ले जाएँ।" + }, + "prayer-map": { + "lead": "सभी अपहुँचे जन-समूह एक ही नक्शे पर, इस आधार पर रंगे हुए कि क्या कोई उनके लिए अभी प्रार्थना कर रहा है, क्या उनके बीच काम हो रहा है, और क्या उन्हें गोद लिया गया है।", + "takeaway": "एक जन-समूह जिसके लिए अभी कोई प्रार्थना नहीं कर रहा, और उसे साझा करने का लिंक।" + }, + "regions-dashboard": { + "lead": "क्षेत्र और देश के अनुसार अगम्य लोगों के समूह खोजें।", + "takeaway": "किसी देश को खोलकर उसके जनसमूह देखें, फिर छापने या साझा करने के लिए पोस्टर, प्रार्थना पैकेट और कार्ड सेट बनाएँ।", + "note": "पोस्टर, पैकेट और कार्ड आपके ब्राउज़र में भारत और चीन को छोड़कर हर देश के लिए बनते हैं (शीघ्र आ रहा है)।" } } } diff --git a/library/i18n/locales/it/mapInfo.json b/library/i18n/locales/it/mapInfo.json index 4cd81db8d..06dbd7ad3 100644 --- a/library/i18n/locales/it/mapInfo.json +++ b/library/i18n/locales/it/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "La lista UPG-100 su un'unica mappa: popoli non raggiunti, raggruppati in zone che puoi adottare nella preghiera.", "takeaway": "per ogni zona, un poster da parete, un libretto di preghiera da distribuire e un mazzo di carte di preghiera. L'esempio qui sotto è la zona con più persone in popoli dove nessuno sta ancora fondando chiese." + }, + "cities-internet": { + "lead": "Le persone che vuoi raggiungere sono raggiungibili online?", + "takeaway": "Ogni paese in cui vive un popolo non raggiunto, suddiviso per uso misurato di internet e mobile — per distinguere il terreno digitale dai luoghi in cui uno schermo non troverà nessuno. Le cifre sono nazionali e riportano l'anno di rilevazione; sconosciuto significa non misurato, mai presunto." + }, + "gospel-resources": { + "lead": "Che cosa ha già un popolo nella propria lingua?", + "takeaway": "Scrittura, audio, film, video biblico, formazione — e che cosa manca ancora. Clicca su un paese per elencarne i popoli, o su un popolo per la sua scheda con collegamenti attivi a ogni risorsa trovata. «Nessuna risorsa trovata» significa non presente negli archivi controllati da questa build, mai una prova che non esista nulla." + }, + "dashboard-plus-grid": { + "lead": "Tutti i popoli in un'unica vista. Filtra per preghiera, popolo, regione, paese o lingua: mappa, tabella e totali si restringono insieme.", + "takeaway": "Porta con te le righe filtrate, come foglio di calcolo." + }, + "research-map-plus-grid": { + "lead": "La mappa accanto all'elenco. Scegli un popolo sulla mappa e l'elenco lo segue; restringi l'elenco e la mappa lo segue.", + "takeaway": "Porta con te un poster della mappa così come la vedi, pronto da stampare, e un pacchetto di preghiera da distribuire." + }, + "prayer-map": { + "lead": "Tutti i popoli non raggiunti su un'unica mappa, colorati secondo se qualcuno prega già per loro, se sono raggiunti e se sono adottati.", + "takeaway": "Un popolo per cui nessuno prega ancora, e un link per condividerlo." + }, + "regions-dashboard": { + "lead": "Trova i popoli non raggiunti per regione e paese.", + "takeaway": "Apri un Paese per vederne i gruppi, poi genera un poster, un pacchetto di preghiera e un mazzo di schede da stampare o condividere.", + "note": "Poster, pacchetti e schede vengono generati nel tuo browser per ogni Paese tranne India e Cina (prossimamente)." } } } diff --git a/library/i18n/locales/pt/mapInfo.json b/library/i18n/locales/pt/mapInfo.json index 197cc24e0..7dfd71f75 100644 --- a/library/i18n/locales/pt/mapInfo.json +++ b/library/i18n/locales/pt/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "A lista UPG-100 em um só mapa: povos não alcançados, agrupados em zonas que você pode adotar em oração.", "takeaway": "para cada zona, um pôster de parede, um pacote de oração para distribuir e um baralho de cartões de oração. O exemplo abaixo é a zona com mais pessoas em povos onde ninguém ainda está plantando igrejas." + }, + "cities-internet": { + "lead": "As pessoas que você quer alcançar podem ser alcançadas online?", + "takeaway": "Cada país onde vive um povo não alcançado, agrupado por uso medido de internet e telemóvel — para distinguir o terreno digital dos lugares onde um ecrã não encontrará ninguém. Os números são nacionais e trazem o ano de observação; desconhecido significa não medido, nunca presumido." + }, + "gospel-resources": { + "lead": "O que um povo já tem na sua própria língua?", + "takeaway": "Escritura, áudio, filme, vídeo bíblico, formação — e o que ainda falta. Clique num país para listar os seus povos, ou num povo para a sua ficha com ligações activas a cada recurso encontrado. «Nada encontrado» significa ausente dos acervos que esta versão consultou, nunca prova de que nada exista." + }, + "dashboard-plus-grid": { + "lead": "Todos os povos numa só vista. Filtre por oração, povo, região, país ou idioma: o mapa, a tabela e os totais reduzem-se em conjunto.", + "takeaway": "Leve as linhas que filtrou, como folha de cálculo." + }, + "research-map-plus-grid": { + "lead": "O mapa ao lado da lista. Escolha um povo no mapa e a lista segue-o; reduza a lista e o mapa segue.", + "takeaway": "Leve um pôster do mapa tal como o vê, pronto a imprimir, e um pacote de oração para distribuir." + }, + "prayer-map": { + "lead": "Todos os povos não alcançados em um só mapa, coloridos conforme alguém já ora por eles, se estão sendo alcançados e se foram adotados.", + "takeaway": "Um povo pelo qual ninguém ora ainda, e um link para compartilhá-lo." + }, + "regions-dashboard": { + "lead": "Encontre grupos étnicos não alcançados por região e país.", + "takeaway": "Abra um país para ver os seus grupos e gere um cartaz, um pacote de oração e um baralho de cartões para imprimir ou partilhar.", + "note": "Cartazes, pacotes e cartões são gerados no seu navegador para cada país exceto a Índia e a China (em breve)." } } } diff --git a/library/i18n/locales/ro/mapInfo.json b/library/i18n/locales/ro/mapInfo.json index ca55f4311..5e745eeea 100644 --- a/library/i18n/locales/ro/mapInfo.json +++ b/library/i18n/locales/ro/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "Lista UPG-100 pe o singură hartă: popoare neatinse, grupate în zone pe care le poți adopta în rugăciune.", "takeaway": "pentru fiecare zonă, un poster de perete, un pachet de rugăciune de împărțit și un set de cartonașe de rugăciune. Exemplul de mai jos este zona cu cei mai mulți oameni din popoare în care nimeni nu plantează încă biserici." + }, + "cities-internet": { + "lead": "Pot fi atinse online persoanele pe care vrei să le ajungi?", + "takeaway": "Fiecare țară în care trăiește un popor neatins, grupat după utilizarea măsurată a internetului și a telefoniei mobile — ca să deosebești terenul digital de locurile unde un ecran nu va găsi pe nimeni. Cifrele sunt naționale și poartă anul observației; necunoscut înseamnă nemăsurat, niciodată presupus." + }, + "gospel-resources": { + "lead": "Ce are deja un popor în propria sa limbă?", + "takeaway": "Scriptură, audio, film, video biblic, instruire — și ce lipsește încă. Apasă pe o țară pentru a-i afișa popoarele, sau pe un popor pentru fișa sa, cu legături active către fiecare resursă găsită. „Nimic găsit” înseamnă absent din colecțiile verificate de această versiune, niciodată o dovadă că nu există nimic." + }, + "dashboard-plus-grid": { + "lead": "Toate popoarele într-o singură vedere. Filtrează după rugăciune, popor, regiune, țară sau limbă — harta, tabelul și totalurile se restrâng împreună.", + "takeaway": "Ia cu tine rândurile filtrate, ca foaie de calcul." + }, + "research-map-plus-grid": { + "lead": "Harta lângă listă. Alege un popor pe hartă și lista îl urmează; restrânge lista și harta o urmează.", + "takeaway": "Ia cu tine un poster al hărții așa cum o vezi, gata de tipărit, și un pachet de rugăciune de împărțit." + }, + "prayer-map": { + "lead": "Toate grupurile etnice neatinse pe o singură hartă, colorate după cum cineva se roagă deja pentru ele, dacă sunt atinse și dacă sunt adoptate.", + "takeaway": "Un grup etnic pentru care nimeni nu se roagă încă, și un link pentru a-l distribui." + }, + "regions-dashboard": { + "lead": "Găsește popoarele neatinse după regiune și țară.", + "takeaway": "Deschide o țară pentru a-i vedea grupurile, apoi generează un afiș, un pachet de rugăciune și un set de cartonașe pentru tipărire sau partajare.", + "note": "Afișele, pachetele și cartonașele se generează în browserul tău pentru fiecare țară în afară de India și China (în curând)." } } } diff --git a/library/i18n/locales/ru/mapInfo.json b/library/i18n/locales/ru/mapInfo.json index 477c6c7c6..60bb2979f 100644 --- a/library/i18n/locales/ru/mapInfo.json +++ b/library/i18n/locales/ru/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "Список UPG-100 на одной карте: недостигнутые народы, объединённые в зоны, которые вы можете взять на молитвенное попечение.", "takeaway": "для каждой зоны — настенный плакат, молитвенный буклет для раздачи и набор молитвенных карточек. Ниже показана зона, где больше всего людей в народах, среди которых пока никто не основывает церкви." + }, + "cities-internet": { + "lead": "Можно ли связаться с нужными людьми через интернет?", + "takeaway": "Каждая страна, где живёт неохваченный народ, сгруппированная по измеренному использованию интернета и мобильной связи — чтобы отличить цифровую почву от мест, где экран никого не найдёт. Цифры национальные и указывают год наблюдения; «неизвестно» означает не измерено, а не предположено." + }, + "gospel-resources": { + "lead": "Что у народа уже есть на его родном языке?", + "takeaway": "Писание, аудио, фильм, библейское видео, обучение — и чего ещё не хватает. Нажмите на страну, чтобы увидеть её народы, или на народ, чтобы открыть его карточку с рабочими ссылками на каждый найденный ресурс. «Ничего не найдено» означает отсутствие в проверенных этой сборкой источниках, а не доказательство, что ничего не существует." + }, + "dashboard-plus-grid": { + "lead": "Все народы в одном представлении. Фильтруйте по молитве, народу, региону, стране или языку — карта, таблица и итоги сужаются вместе.", + "takeaway": "Заберите отфильтрованные строки в виде таблицы." + }, + "research-map-plus-grid": { + "lead": "Карта рядом со списком. Выберите народ на карте — список последует за ним; сузьте список — карта последует за ним.", + "takeaway": "Заберите плакат карты в том виде, как вы её видите, готовый к печати, и молитвенный пакет для раздачи." + }, + "prayer-map": { + "lead": "Все неохваченные народы на одной карте, окрашенные по тому, молится ли уже кто-нибудь о них, ведётся ли среди них служение и усыновлены ли они.", + "takeaway": "Народ, о котором ещё никто не молится, и ссылка, чтобы поделиться им." + }, + "regions-dashboard": { + "lead": "Найдите недостигнутые группы людей по регионам и странам.", + "takeaway": "Откройте страну, чтобы увидеть её народности, затем создайте плакат, молитвенный пакет и набор карточек для печати или отправки.", + "note": "Плакаты, пакеты и карточки создаются в вашем браузере для каждой страны, кроме Индии и Китая (скоро)." } } } diff --git a/library/i18n/locales/zh/mapInfo.json b/library/i18n/locales/zh/mapInfo.json index d125a0a52..7c3ea8039 100644 --- a/library/i18n/locales/zh/mapInfo.json +++ b/library/i18n/locales/zh/mapInfo.json @@ -20,6 +20,31 @@ "upg-100": { "lead": "UPG-100 名单尽在一张地图上:未得之民按区域分组,你可以在祷告中认领一个区域。", "takeaway": "每个区域都有一张墙面海报、一本可分发的祷告手册和一套祷告卡。下面的示例是这样一个区域:在尚无人植堂的族群中,这里的人数最多。" + }, + "cities-internet": { + "lead": "你想触及的人群能在线上被触及吗?", + "takeaway": "每一个有未得之民居住的国家,按实测的互联网和移动使用率分档——让你分辨哪些是数字可达之地,哪些地方屏幕找不到任何人。数据为全国性并标注观测年份;“未知”表示未测量,绝非假定。" + }, + "gospel-resources": { + "lead": "一个族群用自己的语言已经拥有什么?", + "takeaway": "圣经、音频、影片、圣经视频、门训——以及还缺什么。点击国家可列出其族群,点击族群可打开其专页,内含每项已找到资源的有效链接。“未找到”表示不在此版本所查的资源库中,绝不等于证明它不存在。" + }, + "dashboard-plus-grid": { + "lead": "在一个视图中查看所有民族。按祷告、民族、区域、国家或语言筛选,地图、表格和总计会一同收窄。", + "takeaway": "把筛选后的行作为电子表格带走。" + }, + "research-map-plus-grid": { + "lead": "地图与列表并排。在地图上选择一个民族,列表随之跟随;缩小列表范围,地图也随之跟随。", + "takeaway": "带走一张你所见地图的海报,可直接打印,以及一份可分发的祷告手册。" + }, + "prayer-map": { + "lead": "所有未得之民群体都在一张地图上,按是否已有人为他们祷告、是否已有人在其中事工、是否已被认领来着色。", + "takeaway": "一个还没有人为之祷告的群体,以及一个分享它的链接。" + }, + "regions-dashboard": { + "lead": "按区域和国家查找未得之民。", + "takeaway": "打开一个国家查看其族群,然后生成海报、祷告册和卡片集,可打印或分享。", + "note": "海报、祷告册和卡片在您的浏览器中生成,适用于除印度和中国以外的每个国家(即将推出)。" } } } From 19339aacbf090f74b6b23c6c5215e6fe77679969 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 19:17:46 +0000 Subject: [PATCH 7/8] Rebuild regions-dashboard after merging development The pane re-forward is compiled into this bundle, and landing-preconditions step 4 named regions-dashboard as the only consumer the library change reaches. Built with BUNDLE=regions-dashboard, then tree, then fix:sri. --- public/dx-maps/doxa-maps-spa/manifest.json | 12 +-- public/dx-maps/manifest.json | 12 +-- .../region-dashboards/index.html | 2 +- .../regions-dashboard/regions-dashboard.js | 94 +++++++++---------- .../regions-dashboard/regions-list/index.html | 2 +- .../regions-dashboard/regions-mfe/index.html | 2 +- 6 files changed, 62 insertions(+), 62 deletions(-) diff --git a/public/dx-maps/doxa-maps-spa/manifest.json b/public/dx-maps/doxa-maps-spa/manifest.json index d4364686e..9cf303d0f 100644 --- a/public/dx-maps/doxa-maps-spa/manifest.json +++ b/public/dx-maps/doxa-maps-spa/manifest.json @@ -1126,7 +1126,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-yO7462/K+x8yGefpEiZG7GWviAwgJe/N6J7WUhC3qK8mQyCLIq0SeyszkL+1FUhh", + "integrity": "sha384-YNNxkm78b9Z8oKetaufWw+ajPKAEqk89gSrY5imw8fbVMMAyVvg6hU+9E+osig8s", "elements": [ "regions-dashboard" ], @@ -1149,8 +1149,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1166,7 +1166,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1182,8 +1182,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index d4364686e..9cf303d0f 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -1126,7 +1126,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-yO7462/K+x8yGefpEiZG7GWviAwgJe/N6J7WUhC3qK8mQyCLIq0SeyszkL+1FUhh", + "integrity": "sha384-YNNxkm78b9Z8oKetaufWw+ajPKAEqk89gSrY5imw8fbVMMAyVvg6hU+9E+osig8s", "elements": [ "regions-dashboard" ], @@ -1149,8 +1149,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1166,7 +1166,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1182,8 +1182,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/regions-dashboard/region-dashboards/index.html b/public/dx-maps/regions-dashboard/region-dashboards/index.html index 21d9d9027..6afd37845 100644 --- a/public/dx-maps/regions-dashboard/region-dashboards/index.html +++ b/public/dx-maps/regions-dashboard/region-dashboards/index.html @@ -70,7 +70,7 @@ - + + - +