Translate the last three English literals in components the clone renders

A dropdown every localised surface renders had no t() at all. Its two visible
strings — the clear button and the empty state — were English literals, and one
of them, "No options found", was ALREADY catalogued in eleven locales elsewhere
in this repo: the translation existed and the component was ignoring it. The
poster wall's export modal had the same shape, reassuring the reader that
nothing is uploaded in English only.

Three keys in buttons.json across eleven locales, and the literals replaced.
Both bundles that render these components — regions and country-posters,
whose cards are routed to me — are rebuilt. check:i18n-parity passes with no
locale regressed.

AND A BUILD HAZARD IN MY OWN COMMAND SHAPE, worth writing down because it is
exactly the failure the brief warns about. I ran

    BUNDLE=x bun x vite build 2>&1 | tail -2 && bun run tree && bun run fix:sri

The vite build FAILED on a syntax error — I had put a const inside
defineProps — and tree and fix:sri ran anyway, because the exit status of a
pipeline is the LAST command's, and `tail` succeeded. So the chain regenerated
the tree and re-hashed against a bundle that had not been rebuilt: the "tree
alone ships a stale .js" trap, opened by the pipe I added to keep the output
short. Caught because the next build's byte count moved, not because the chain
complained. Any agent using `| tail` after a build needs pipefail or a separate
status check.
This commit is contained in:
doxa-maps-88655c70 2026-09-24 21:26:49 +00:00
parent c4c60a4fd1
commit db36397b93
23 changed files with 199 additions and 159 deletions

View file

@ -709,7 +709,7 @@ useShadowStyles(
<div class="bar"><div class="bar-fill" :style="{ width: exportState.pct + '%' }"></div></div>
<div class="modal-phase">{{ exportState.message }}</div>
<div class="modal-hint">
Rendering a print-quality image in your browser — nothing is uploaded.
{{ t('buttons.renderingLocal') }}
</div>
</template>
</div>

View file

@ -24,6 +24,7 @@
* filter-clear { name } — the selection was cleared.
*/
import { ref, computed, nextTick, onBeforeUnmount } from 'vue'
import { useI18n } from 'vue-i18n'
const props = defineProps({
label: { type: String, required: true },
@ -33,6 +34,12 @@ const props = defineProps({
placeholder: { type: String, default: 'Type to search...' },
})
// ★ THIS COMPONENT HAD NO t() AT ALL, on a dropdown that every localised surface renders. Its
// two visible strings — the clear button and the empty state — were English literals, and one of
// them ('No options found') was ALREADY catalogued in eleven locales elsewhere in this repo, so
// the translation existed and this component was ignoring it.
const { t } = useI18n()
const emit = defineEmits(['filter-change', 'filter-clear'])
const isOpen = ref(false)
@ -317,10 +324,10 @@ onBeforeUnmount(() => {
@input="onSearchInput"
@keydown="onKeydown"
>
<button v-if="value" class="filter-dropdown__clear" type="button" @click="clear">Clear selection</button>
<button v-if="value" class="filter-dropdown__clear" type="button" @click="clear">{{ t('buttons.clearSelection') }}</button>
<div class="filter-dropdown__options">
<template v-if="filteredOptions.length === 0">
<div class="filter-dropdown__no-options">No options found</div>
<div class="filter-dropdown__no-options">{{ t('buttons.noOptions') }}</div>
</template>
<template v-else>
<div

View file

@ -38,5 +38,8 @@
"علّمهم أن يضعوها أيضًا",
"علّمهم أن يعلّموا غيرهم وضعها",
"لنكثر الخرائط في كل مكان ليسوع!"
]
],
"clearSelection": "إلغاء التحديد",
"noOptions": "لا توجد نتائج",
"renderingLocal": "يتم إنشاء صورة بجودة الطباعة في متصفحك — لا يتم تحميل أي شيء."
}

View file

@ -38,5 +38,8 @@
"Zeige ihnen, wie sie sie ebenfalls einbinden",
"Zeige ihnen, wie sie es anderen beibringen",
"Lasst uns Karten überall vermehren – für Jesus!"
]
],
"clearSelection": "Auswahl aufheben",
"noOptions": "Keine Optionen gefunden",
"renderingLocal": "Ein druckfähiges Bild wird in deinem Browser erzeugt — es wird nichts hochgeladen."
}

View file

@ -38,5 +38,8 @@
"close": "Close",
"showOnMapAria": "Show {label} on the map",
"cardStockAria": "Prayer card size",
"previewPrintPoster": "Preview & print the {label} poster"
"previewPrintPoster": "Preview & print the {label} poster",
"clearSelection": "Clear selection",
"noOptions": "No options found",
"renderingLocal": "Rendering a print-quality image in your browser — nothing is uploaded."
}

View file

@ -38,5 +38,8 @@
"Enséñales a insertarlo también",
"Enséñales a enseñar a otros a insertarlo",
"¡Multiplica los mapas por todas partes para Jesús!"
]
],
"clearSelection": "Borrar la selección",
"noOptions": "No se encontraron opciones",
"renderingLocal": "Se está generando una imagen con calidad de impresión en tu navegador: no se sube nada."
}

View file

@ -38,5 +38,8 @@
"Apprenez-leur à l’intégrer aussi",
"Apprenez-leur à former d’autres personnes à l’intégrer",
"Multiplions les cartes partout pour Jésus !"
]
],
"clearSelection": "Effacer la sélection",
"noOptions": "Aucune option trouvée",
"renderingLocal": "Une image de qualité impression est générée dans votre navigateur — rien n’est envoyé."
}

View file

@ -38,5 +38,8 @@
"उन्हें भी इसे लगाना सिखाएँ",
"उन्हें सिखाएँ कि वे औरों को लगाना सिखाएँ",
"यीशु के लिए हर जगह मानचित्र बढ़ाएँ!"
]
],
"clearSelection": "चयन हटाएँ",
"noOptions": "कोई विकल्प नहीं मिला",
"renderingLocal": "आपके ब्राउज़र में प्रिंट-गुणवत्ता वाली छवि बन रही है — कुछ भी अपलोड नहीं किया जाता।"
}

View file

@ -38,5 +38,8 @@
"Insegna loro a incorporarla a loro volta",
"Insegna loro a formare altri a incorporarla",
"Moltiplichiamo le mappe ovunque per Gesù!"
]
],
"clearSelection": "Cancella la selezione",
"noOptions": "Nessuna opzione trovata",
"renderingLocal": "Un’immagine con qualità di stampa viene generata nel tuo browser: nulla viene caricato."
}

View file

@ -38,5 +38,8 @@
"Ensine-os a incorporá-lo também",
"Ensine-os a ensinar outros a incorporá-lo",
"Multipliquemos mapas por toda a parte para Jesus!"
]
],
"clearSelection": "Limpar a seleção",
"noOptions": "Nenhuma opção encontrada",
"renderingLocal": "Uma imagem com qualidade de impressão está a ser gerada no seu navegador — nada é enviado."
}

View file

@ -38,5 +38,8 @@
"Învață-i să o încorporeze și ei",
"Învață-i să îi formeze pe alții să o încorporeze",
"Să multiplicăm hărți pretutindeni pentru Isus!"
]
],
"clearSelection": "Șterge selecția",
"noOptions": "Nicio opțiune găsită",
"renderingLocal": "O imagine de calitate pentru tipar este generată în browserul tău — nimic nu este încărcat."
}

View file

@ -38,5 +38,8 @@
"Научите их тоже размещать её",
"Научите их учить других размещать её",
"Умножим карты повсюду для Иисуса!"
]
],
"clearSelection": "Снять выделение",
"noOptions": "Ничего не найдено",
"renderingLocal": "Изображение типографского качества создаётся в вашем браузере — ничего не загружается на сервер."
}

View file

@ -38,5 +38,8 @@
"教他們也嵌入這張地圖",
"教他們去教別人嵌入",
"為耶穌讓地圖遍地繁增!"
]
],
"clearSelection": "清除选择",
"noOptions": "未找到选项",
"renderingLocal": "正在您的浏览器中生成可打印质量的图片——不会上传任何内容。"
}

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7" 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 <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7" 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 <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -158,7 +158,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "doxa-maps/country-posters/country-posters.js",
"integrity": "sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH",
"integrity": "sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7",
"elements": [
"country-posters-map"
],
@ -178,7 +178,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/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=\"./country-posters/country-posters.js\" integrity=\"sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
},
{
@ -192,7 +192,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/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=\"./country-posters/country-posters.js\" integrity=\"sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
},
{
@ -206,7 +206,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/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=\"./country-posters/country-posters.js\" integrity=\"sha384-zA/pbofsasr4aEgMczbqePae9kmb2Xh2wp3V4UIp0T8ZRgAH3CSUx6dA/8IfwkFH\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-urEju/yDTxk2w6K/Q47C3j1Br2UfZSats0Nw7WT+GTQjgQDYmr11XCCZNDaDMfn7\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
}
]
@ -879,7 +879,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2",
"integrity": "sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY",
"elements": [
"regions-dashboard"
],
@ -899,7 +899,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/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=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -913,7 +913,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-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=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -927,7 +927,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/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=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
}
]

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY" 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

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY" 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 <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-XG46qT7xD/y8M4550zPkaAWJv14HqHmTI/BcVLZ0Uxs19ByuNcxNX8svr6AaYSD2" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-s3AcTJ/l3nqLOee2cxAVz2t+CxUG+5HmuLqZLf+Zxh4qF7bUNge8I7x73rMuy+oY" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: