i18n

Translated pages — t() everywhere, language-aware formats

Live strings — switch the language from the topbar

This sentence is written once, in the base language.

The rules

  • User-facing strings are written ONCE, in the BASE language (English), wrapped where they live: Latte {t('...')}, JS g.translate('...'), API/DB texts translate via the envelope helpers — you never write per-language files.
  • Missing translations NEVER break a page — the base string renders and (in dev) registers for the translation pass automatically.
  • Dates and numbers are NOT translated strings — they come from g.format, which follows the install/user formats.
  • Dynamic values interpolate through the t params — never concatenate translated fragments.
  • The law (DB source of truth, the AI pass, content translations): genus-php/docs/i18n.md; the harness: /tests/i18n.