Skip to content
Docs

Command palette

Jump to a page or view, or find a todo by name.

Changelog

Internationalization

English, German and French UI with request-scoped SSR translation.

Markdown

Catalog ownership

Web catalogs live in apps/web/src/locales/{en,de,fr}.ts. MessageKey derives from English; the other catalogs must retain key and interpolation parity. Shared error translations come from packages/errors/locales. Mobile maintains its own app catalogs with the same supported languages.

Use useTranslation in components and hooks. Format dates and numbers with Intl. Do not concatenate translated fragments when the sentence needs different word order.

Server rendering

getSSRLanguage checks a validated ?lang= first, then the locale cookie, then the fallback. getRequestI18n clones the i18next instance for that request while sharing loaded catalogs. Mutating one global language during SSR would make concurrent requests affect each other.

The client keeps its shared instance and updates the document language after a switch. Public localized pages advertise locale alternates. Developer articles are English only: their article region has lang="en", their chrome is translated, and their sitemap entries have no hreflang alternates.

Extend

Add a message to English, German and French together. Preserve placeholder names and run the locale parity tests. A new language also needs the supported-language definition, formatters, SEO mappings and native catalogs updated. Translate the domain consistently: a Todo's translated label can differ from its code identifier.

Key files

Edit on GitHubDocumentation is in English.