- serve the per-language terminology editions at /about/definitions
with the About sidebar; /terms redirects there
- title every edition "Definitions" to match the sidebar label
- drop the self-referencing link to the Definitions page
- add an Arabic edition built from the Arabic glossary
- point the add-language and sync-language skills at the new route
- delete the bundle loader composable and the unused slot component
- strip the site-wide embed from app.vue, leaving the layout shell
- drop the runtime config keys, custom element tag and env entries
- remove the login opt-in and the preconnect to the feedback host
- site strings, map widget locales and /terms editions for ar, de, es,
fr, hi, it, pt, ro, ru and zh
- patch the standalone map bundle in place (it has no build profile) and
rebuild the two profiled bundles from the updated source locales
- fix defects the sweep surfaced: the ru vision headline read "all
unmarried people will be married by 2033", ro used popor (nation) as
the people-group label including the homepage h1, and ar inverted
"moves from unengaged to engaged"
- correct en.ts, which claimed UUPG and WAGF stay unchanged in every
edition; es ships GENANC/FMAD, pt PNANE and de UVG/VUVG
- render the filter dropdown's empty-state through i18n, so the
no_options translation it already computed reaches the component
- a term with an acronym now yields the acronym as its own pair, so a
bare UUPG in source text takes this language's acronym instead of
whatever the model invents
- sync-language says the wording never carries the acronym, and names
the strings that hold a bare one
- 300-key zh/common.json, built on 族群 / 未接触 / 已接触 / 认领 and the
和合本 (CUNPS) wording for Revelation 5:9 and 7:9
- terms/zh.ts with all 20 entries, recording the alternatives rejected and
why 接触 was kept where the other five languages chose an active-work word
- map locale: 民族群体 → 族群, 参与 → 接触, 亲缘板块 → 亲缘集团, and the
legend's missing header.default; bundles rebuilt and the profile-less
pplr-data-maps literals patched to match
- nativeName 简体中文, from the glossary record
- Romanian back to enabled: false — it was switched on with no locale file,
and the missing common.json crashed the Nuxt build for every language
- i18n/locales/it/common.json at key parity with English
- app/utils/terms/it.ts, the same 20 entries in the en.ts order, citing
the Nuova Riveduta 2006 wherever the choice is Scripture-driven
- map legend and search follow the glossary; both bundles rebuilt and the
Italian block of the build-less pplr-data-maps.iife.js patched in place
- translate the German step-card titles, nav home link and signup heading
- build the sidebar tree and category cards from the requested locale
instead of the body's resolved one, so a category landing with no
translated page of its own no longer drops the whole menu to English
The importer and menu-order sync wrote pages.parent_slug, dropped in
migration 010; the scraper fed the importer and read the site being
replaced; po-to-json rebuilt the locale JSON from the WP theme's .po
files, which the glossary now owns. Content lives in the database and
is edited through the doxa-cms MCP server.
config/glossaries.ts was generated from the retired translation repo's DeepL
TSVs, so it had no source left and only the German, Spanish and Portuguese
rows had been hand-patched. Both it and its build script are gone.
- fetch GET /api/glossary/{lang} at runtime, cached ten minutes, serving the
last good answer when the request fails and an empty one when it never
succeeded. A reviewer's correction now reaches auto-translate without a
deploy here
- carry the glossary's notes as well as its terms: register, acronym policy
and number format, placed after the term list so a rule about inflection
governs the pairs above it
- glossary_used on the MCP translate tool now means the locale's terminology
was available, and reads false for a language whose glossary has not been
started
- add /add-language and /sync-language skills for the site strings, the map
widget locales and bundles, the /terms edition, and the CMS pages
- site locale: glossary terms plus the DeepL defects the reviewer never saw
- map legend locales and the three bundles: Não engajado/Engajado, Grupo étnico, PNANEs
- MT glossary pt rows regenerated; Portuguese /terms edition added
- glossary terms only, on top of the human-reviewed Spanish: unengaged is
"no comprometido", UUPG "GENANC", under-engaged "poco comprometido",
frontier "grupo fronterizo", cross-cultural workers "obreros
transculturales", gospel access "acceso al evangelio", champion "defensor"
- fix DeepL leftovers the reviewer never saw: "personas solteras" for
unengaged, "Reza por ellos", "Alianza Global para los No Comprometidos",
"DOXA Vida", "Aprobado" for adopted, "iglesia de acogida", "Si"
- add the Spanish /terms edition and register it
- update the Spanish map legend and rebuild the two active bundles; the
legacy research bundle has no build profile, so its literals are patched
- regenerate the Spanish rows of the machine-translation glossary
- the /terms French edition now lists "Fraternité Mondiale des Assemblées
de Dieu (WAGF)" and demotes "Association mondiale…" to a rejected
alternative, with the rationale that "fraternité" renders "fellowship"
- same row in the French machine-translation glossary so auto-translated
content uses the right name; the source TSV in the translation repo
still needs the matching edit before the glossary is next regenerated
- the three live French CMS pages that name the WAGF (about, statement of
faith, vision) were corrected through the CMS and are not in git
- glossary terms only, on top of the human-reviewed German: unengaged is
"unberührt", UUPG "völlig unerreichte Volksgruppe (VUVG)", under-engaged
"am wenigsten erreicht", engagement "missionarische Arbeit vor Ort",
intercessors "Fürbitter/innen", people group "Volksgruppe" everywhere
- fix leftovers that were never translation choices: "Über Zúme", "DOXA
Leben", "unverheiratet" for unengaged, "Gebetsberichterstattung"
- add the German /terms edition and replace the retired 24-hour prayer
coverage entry with daily prayer in the English and French editions
- update the German map legend and rebuild the two active bundles; the
legacy research bundle has no build profile, so its literals are patched
- regenerate the German rows of the machine-translation glossary
- serves at /embed/map with tab, lang, map and utm_source query params
- fetches the mapbox token at load and points the bundle at the prayer api
- strips the bundle's source tag from prayer links and applies utm_source
- send through the sendgrid v3 json api via direct fetch with a
manually cleared abort timeout; mailhog stays for development
- drop nodemailer-mailgun-transport and its types
- swap MAILGUN_* runtime config and env example for SENDGRID_API_KEY
and optional SENDGRID_HOST
Formatting splits a sentence across text nodes mid-phrase, and no model
reliably reproduces a fragment's leading or trailing whitespace — a dropped
edge space glues two words together once the fragments are concatenated
back into the document. The source fragment now decides the edges.
- translateText/translateTexts call OpenRouter chat-completions; glossary
terms are prompt-injected from config/glossaries.ts, generated from the
translation repo's TSVs by scripts/build-glossaries.ts
- model resolution: per-language override in config/languages.ts →
translation.model site setting (new admin field) → TRANSLATION_MODEL env
→ anthropic/claude-opus-5, at low reasoning effort
- blank fragments are held back from the model, which drops them and breaks
the one-translation-per-fragment count the caller maps results back on
- OpenRouter failures map to a typed error with a human-readable message;
an unrecoverable one (no credits, bad key, rejected model) stops the run
instead of repeating the same call for every remaining locale
- machine translations record source 'auto-translate'; 'deepl' stays
readable for snapshots written before the switch
- end each region card with a "See <region> dashboard" link, translated
in all eight locales
- stack the people-group and country count on its own line under the
region title in the card header
- move the Regions entry in the hamburger menu to after Resources
* replace country pages with region dashboards
- move /countries to /regions, with 301 redirects from the old URLs in
every locale
- add a region dashboard: a map of the region's countries with pins
coloured by prayer coverage, headline figures, and prayer, adoption and
engagement progress against the DOXA goals, plus a per-country table
- roll up progress stats per country and region in the shared summary
and serve them from /api/regions
- frame region maps with antimeridian-aware bounds
- add Regions to the hamburger menu and translate the new strings in all
eight locales
* put each region on the regions index in a card with a header band
The region name links to its dashboard with the site's chevron icon, and
the people-group and country counts sit centred beside it on a brand-green
header; the country list is the padded white card body.
drop the _=${Date.now()} query param and cache: 'no-store' so the request URL is stable and cacheable by browser + CDN edge
rebuild doxa-research-map and doxa-simple-map IIFE bundles
lets the Cloudflare 5-min edge rule on /api/people-groups/list* take effect
remove "Not Adopted" badge from research page cards
hide Adoption tab on research map and rebuild bundle
remove Adopt and Engage tiles from landing page
drop step number from lone Pray tile on landing page
add clickable country link to pray page cards