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('...')}, JSg.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.