- 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
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
- 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
* 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.
add /countries index grouped by WAGF region and /countries/[country] pages
derive countries from prayer API (slug, count, map center/zoom) via config/countries-meta and /api/countries
prerender country routes for all locales via modules/country-routes
add CountryMap component: highlight focus country, brand-green in-country pins, muted border pins, popups
show bold green note above the map stating people-group count
lock UupgsList to a country and link card country names to country pages
add i18n keys for the new strings