Commit graph

150 commits

Author SHA1 Message Date
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
55b21dcd80 Enable all languages 2026-09-18 15:50:26 +01:00
corsacca
ce33af390f render CMS navigation in the requested locale
- 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
2026-09-18 14:31:45 +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
873c0c9cea fix lint style errors in the language config 2026-09-17 12:20:33 +01:00
corsacca
5651aac6fd show German in the public language switcher 2026-09-17 12:19:42 +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
ca2addcfac
add embeddable map page for iframes (#24)
- 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
2026-09-15 15:28:54 +01:00
corsacca
cea9583792 guard people group cards against missing region, rop1 and country fields 2026-09-15 14:57:16 +01:00
corsacca
4dfee08d13 replace mailgun with sendgrid for transactional email
- 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
2026-09-15 11:16:44 +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
b94df99297 restore source edge whitespace on translated fragments
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.
2026-09-07 16:56:39 +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
ahillbilly
f96b04ea12 Update prayer and resources CTAs 2026-07-10 16:49:49 +01:00
corsacca
df88cc5b60 perf(maps): stop cache-busting the people-groups API request
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
2026-06-29 13:06:23 +01:00
squigglybob
a0316c7fd2
Merge pull request #18 from discipletoolsbot/weblate-doxa-doxa-marketing
Translations update from Weblate
2026-06-25 12:29:07 +01:00
Sarah McNaughton
6bc82858d8 Translated using Weblate (French)
Currently translated at 100.0% (288 of 288 strings)

Translation: DOXA/Doxa Marketing
Translate-URL: https://translate.disciple.tools/projects/doxa/doxa-marketing/fr/
2026-06-24 20:13:24 +00:00
corsacca
e7333d6299 Merge branch 'master' of github.com:doxa-life/doxa-life 2026-06-24 16:13:40 +01:00
corsacca
31f555a2d4 hide adoption UI and add country links to pray cards
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
2026-06-24 16:13:34 +01:00
squigglybob
626e976ae1
Merge pull request #16 from discipletoolsbot/weblate-doxa-doxa-marketing
Translations update from Weblate
2026-06-24 11:47:15 +01:00
Sarah McNaughton
37a1b2de2d Translated using Weblate (Spanish)
Currently translated at 100.0% (288 of 288 strings)

Translation: DOXA/Doxa Marketing
Translate-URL: https://translate.disciple.tools/projects/doxa/doxa-marketing/es/
2026-06-23 23:05:24 +00:00
corsacca
64b8d31c1d link research page to countries index
add a "By Country" link under the research heading → /countries
add the "By Country" i18n key in all 8 locales
2026-06-19 17:14:27 +01:00
corsacca
94102174be show people group details in country map pin popup
- enrich pin popup with photo, country, people group, population,
  religion, description, and pray / full-profile links
- fetch the extra fields for pins; reuse existing translated labels
- render photos as a centred portrait (4:5) thumbnail, never landscape
2026-06-18 16:46:25 +01:00
corsacca
39494fba65 update prayer goal copy from 144 to 100 across pray and adopt pages
reframe "24-hour prayer coverage" and "10 minutes a day" as daily / 100+ people praying
swap the affected t() keys in pray.vue and the two adopt pages
update the matching keys in all 8 locale common.json files
2026-06-17 15:49:18 +01:00
ahillbilly
b65c764d86
Update prayer coverage threshold and status display (#15)
* Update daily prayer coverage threshold

* Show segmented prayer coverage status

* update prayer progress map legend wording

relabel map legend tiers to "No One Praying", "1+ People Praying", and "100+ People Praying" across all 11 locale legend files
update LABELS constant and tier comments in prayer-progress strategy
rebuild doxa-simple-map and doxa-research-map bundles

---------

Co-authored-by: corsacca <corsacca@gmail.com>
2026-06-17 05:04:19 -05:00
ahillbilly
3ab77a7af9
Hide adopt CTA and update prayer coverage copy (#14)
* Add partial prayer coverage status icon

* Update engaged profile status indicators

* Hide adopt CTA and update prayer copy
2026-06-17 04:30:17 -05:00
corsacca
14d3cee61c update translations. 2026-06-15 12:15:41 +01:00
corsacca
ea5406c0e9 add per-country pages with dedicated highlight map
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
2026-06-15 12:09:44 +01:00
corsacca
4237524a38 Add a terms page in en and fr 2026-06-11 10:17:29 +01:00
corsacca
08ba819d57 fix documents sidebar links to use full page paths 2026-06-10 16:32:16 +01:00
corsacca
06a78771d3 Update French translations. 2026-06-10 16:07:27 +01:00
ahillbilly
f2edcdd518
Update engaged profile status indicators (#12)
* Add partial prayer coverage status icon

* Update engaged profile status indicators

* fix engagement strings

---------

Co-authored-by: corsacca <corsacca@gmail.com>
2026-06-10 07:36:16 -05:00
discipletoolsbot
53d0ea606e
Translated using Weblate (Portuguese) (#13)
Currently translated at 100.0% (274 of 274 strings)

Translation: DOXA/Doxa Marketing
Translate-URL: https://translate.disciple.tools/projects/doxa/doxa-marketing/pt/

Co-authored-by: AH <translator@disciple.tools>
2026-06-10 07:30:12 -05:00
ahillbilly
243e2fd1a1
Add partial prayer coverage status icon (#11) 2026-06-04 09:34:48 -05:00
ahillbilly
fdbb94e748
Fix WAGF header capitalization (#10) 2026-06-04 09:33:38 -05:00
squigglybob
62a8a077a1
Merge pull request #9 from discipletoolsbot/weblate-doxa-doxa-marketing
Translations update from Weblate
2026-06-03 17:10:36 +01:00
Sarah McNaughton
e868cfbdd7 Translated using Weblate (Portuguese)
Currently translated at 100.0% (274 of 274 strings)

Translation: DOXA/Doxa Marketing
Translate-URL: https://translate.disciple.tools/projects/doxa/doxa-marketing/pt/
2026-06-03 16:08:46 +00:00
corsacca
9772f18750 fix mcp crash loop from node-mock-http mock socket missing destroy() 2026-06-03 14:46:15 +01:00