Commit graph

138 commits

Author SHA1 Message Date
doxa-maps
f3e4623216 Regions is a view of the Research Gallery: the /regions index redirects there (every language); menu item off; detail pages kept 2026-09-28 20:46:49 +00:00
doxa-maps
7114d0a6fd Maps default to MapLibre (keyless); Mapbox by NUXT_PUBLIC_MAP_PROVIDER=mapbox with a token 2026-09-28 17:11:58 +00:00
doxa-maps
fce82c17f8 Research page: one scrollbar. No footer, and the page does not scroll while the gallery fills the viewport below the header 2026-09-28 14:31:31 +00:00
doxa-maps
ff1e2dcbe4 Map cards keep rounded corners and phones get a taller map slot; old /js/doxa-maps links 301 to the dx-maps tree (carried from doxa-maps-build) 2026-09-28 13:51:40 +00:00
doxa-maps
c1054993c6 /embed-test: mounted plugins follow a language switch; each card records the locale it was given (data-locale) 2026-09-28 07:04:02 +00:00
doxa-maps
afb13a151b Maps and /embed-test plugins get DX-life's locale (it is in the path, which they cannot read) 2026-09-28 06:55:27 +00:00
doxa-maps
6444a05203 Subdomain: links to the Research Gallery carry the reader's language (?lang=) 2026-09-28 06:45:40 +00:00
doxa-maps
89ce341c82 /embed-test embeds every web plugin: production first, then every other; desktop-only plugins skipped by their manifest targets 2026-09-28 06:12:41 +00:00
doxa-maps
50dcf627ad Subdomain: every in-page link to /research or /regions goes to the Research Gallery subdomain 2026-09-28 05:19:12 +00:00
driver
0a0bfdf8b3 Subdomain: the menu's Research item links to the Research Gallery subdomain (from config); Research and Regions pages leave the menu 2026-09-28 05:11:10 +00:00
driver
6be3662b8a Every map loads as JavaScript from the maps CDN; public/dx-maps removed; /embed-test embeds every production plugin 2026-09-28 05:06:52 +00:00
doxa-maps
d4daff02b9 Research page: NUXT_PUBLIC_DX_MAPS_BASE loads the dx-maps tree from a maps CDN
Set, the gallery script and its tree-base come from that URL (e.g. https://maps-dev.nuxtbase.app/cdn/dx-maps).
Unset, the page uses this site's own /dx-maps/ copy exactly as before. Both modes proven on the dev
server: 0 console errors, the gallery tabs draw, and every dx-maps request goes to the chosen host.
2026-09-28 03:58:13 +00:00
doxa-maps
bdf1061a28 Research Gallery from dx-maps main 9ce04ffea, previous Research page kept switched off
public/dx-maps is replaced with the dx-maps build tree from doxa-maps main 9ce04ffea (28 bundles);
the gallery's manifest integrity matches the served doxa-maps-spa.js.

The Research page embeds the whole Research Gallery with the JS embed. Every embed URL is built at
runtime from the origin serving the page (tree-base = window.location.origin + /dx-maps), so the same
build works on a laptop, staging or production.

The previous Research page (the "By Region" link, the single research map and the UUPG list) is NOT
deleted: it is back in the page, switched off by SHOW_LEGACY_RESEARCH = false. The two old scripts
public/js/doxa-simple-map.js and doxa-research-map.js are restored too, unused, so nothing DX-life
relied on is removed.
2026-09-28 01:30:48 +00:00
doxa-maps
a61b1e810a Maps: download their three scripts together, and show a spinner until the map is ready
The home, pray and adopt maps ran Mapbox GL, the geocoder and the map bundle one after
another, so on a cold first visit the slot stayed empty while ~1.8 MB downloaded in series.
Preload hints now fetch all three in parallel (they still run in order), and the slot shows a
quiet spinner (aria-busy) until the map element is defined.
2026-09-26 02:56:34 +00:00
doxa-maps
aeb61e64f7 Serve every map from /dx-maps/
The maps' build tree is now public/dx-maps/ (doxa-maps main 09014f8a), replacing
public/doxa-maps/. The Research gallery, the home, pray and adopt maps, /embed/map/ and
/research/doxa-research-map.html all load from it; the old /js/doxa-simple-map.js and
/js/doxa-research-map.js are removed (no aliases). Mapbox GL moves to v3.24.0, the version
the bundles are built with. With no Mapbox token configured, the home, pray and adopt maps
use the keyless MapLibre engine instead of refusing to start. See DX-MAPS-GALLERY.md.
2026-09-25 21:07:46 +00:00
doxa-maps
3f5cf457b3 Research page: the Research Gallery, served from this site
The Research page now shows the Research Gallery (every research map, dashboard and list)
filling the page below the header, on desktop and phone. It replaces the single research
map, the UUPG list and the By Region link.

public/doxa-maps/ is the doxa-maps build tree (doxa-maps main 196ad168), so this site is
the gallery's CDN. The page loads one script and adds one element. It follows the site
language, and without a Mapbox token it uses the keyless MapLibre engine.
See DX-MAPS-GALLERY.md.
2026-09-25 19:00:41 +00:00
Nath
fc4d6228f8 feat: sync arabic translation 2026-09-25 11:34:14 +01:00
Nath
c65b41633c fix: store button alignment; feat: mobile app to have white bg; fix: order language list 2026-09-25 09:08:06 +01:00
Nath
d58700ddff feat: add mobile app sections to /pray and /research/___ pages 2026-09-24 15:57:00 +01:00
Nath
18e61e92c2 draft of mobile section on pray page 2026-09-24 14:39:46 +01:00
Nath
766ab697c5 fix: remove simple path section 2026-09-24 12:04:34 +01:00
Nath
8e4c9285ab feat: add prayer bundle download to general resources 2026-09-23 14:21:28 +01:00
corsacca
80cbfadb85 replace the CMS definitions page with the terminology page
- 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
2026-09-23 13:14:08 +01:00
Nath
1128823172 refactor: video languages to single source of truth 2026-09-23 12:08:03 +01:00
Nath
0098a69d7e feat: update contact-us form to use the same format as feedback forms 2026-09-23 11:47:12 +01:00
corsacca
b30f3c39f4 format homepage population figures with locale-native magnitudes
- render billions/millions via Intl compact notation so zh groups on 亿
  and hi on करोड़
- drop the {0} Billion / {0} Million strings from every locale
2026-09-23 09:55:49 +01:00
corsacca
87b835e312 remove the feedback widget
- 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
2026-09-22 10:27:08 +01:00
corsacca
0262bb4219 sync all ten site languages with the glossary
- 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
2026-09-22 09:30:34 +01:00
corsacca
2149a3874a tighten padding on the desktop language dropdown
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 21:08:22 +01:00
corsacca
516620bfa9 finish ro translation 2026-09-18 20:32:35 +01:00
corsacca
86abef3420 update hi ro and ru translations 2026-09-18 19:59:44 +01:00
corsacca
57f35d12b4 add the Chinese site, terms edition and map locale from the glossary
- 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
2026-09-18 16:16:46 +01:00
corsacca
aa2f7dee92 add the Italian site, terms edition and map locale from the glossary
- 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
2026-09-18 15:53:02 +01:00
corsacca
9d05a039f8 remove the one-shot WordPress migration scripts
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.
2026-09-18 10:09:38 +01:00
corsacca
a994baec4f read the glossary from pray.doxa.life instead of a vendored file
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
2026-09-18 10:06:13 +01:00
corsacca
10f63df2eb align the Portuguese site with the reviewed glossary
- 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
2026-09-17 15:38:35 +01:00
corsacca
743714b21a align the Spanish site with the reviewed glossary
- 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
2026-09-17 13:50:21 +01:00
corsacca
0418c1e8b7 fix the French name of the WAGF: Fraternité, not Association
- 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
2026-09-17 13:06:45 +01:00
corsacca
ab1244a230 align the German site with the reviewed glossary
- 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
2026-09-17 12:16:25 +01:00
corsacca
2994ccd541 Remove people group location field references 2026-09-17 09:32:33 +01:00
corsacca
cea9583792 guard people group cards against missing region, rop1 and country fields 2026-09-15 14:57:16 +01:00
corsacca
f9d53d5524 refresh homepage statistics on the client 2026-09-14 12:17:12 +01:00
corsacca
93128d4eff add submit updates button to people group profile 2026-09-08 12:24:32 +01:00
corsacca
7dfad0ee07 replace deepl with llm translation via openrouter
- 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
2026-09-07 16:30:48 +01:00
corsacca
050708084b switch feedback destination 2026-09-07 13:25:04 +01:00
corsacca
bbddd6c2d2 add dashboard links to region cards and move regions after resources
- 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
2026-09-07 12:11:08 +01:00
corsacca
eae6143be1
Replace country pages with region dashboards (#23)
* 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.
2026-09-07 11:49:24 +01:00
corsacca
fa819d3bda relabel the exact filter toggle to "Exact Search" in all languages
Replace the "Exact" i18n key with a translated "Exact Search" across
the 8 locales and update the component's English fallbacks.
2026-08-31 14:57:23 +01:00
corsacca
db09e654e6 fix(i18n): localize hardcoded bullseye numbers on the homepage
Format the outer rings' static figures with the active locale's
separators (e.g. "3,9" and "6.602" in pt), matching the DB-driven
center ring.
2026-08-31 14:44:38 +01:00
corsacca
bf3fa3c915 fix(search): match accented data with unaccented queries in UUPG search
Strip combining diacritics from both indexed values and the query so
e.g. "Mexico" finds "México" in localized data, including exact mode.
2026-08-31 14:42:03 +01:00