cartwright
Features

Internationalization (i18n)

Ship multiple languages from day one — locales declared in brand.config, automatic hreflang, and per-entity content translation with AI auto-translate.

Locales

Supported languages live in brand.config.ts:

locales: ["da", "en"] as const,
defaultLocale: "da",

defaultLocale is the base language — the source text stored directly in DB fields. Add a language in one place:

locales: ["da", "en", "de"] as const,

i18n/routing.ts reads this, so /de/... routes and hreflang alternates appear automatically. A single-locale shop emits no hreflang (no misleading signal).

Translating content

UI strings are managed via i18nexus (messages/<locale>.json). Storefront content is translated in /admin/translations:

EntityTranslatable fields
Productname, description
Categoryname, description
Pagetitle, body
Servicetitle, shortDescription, body
Post (blog)title, excerpt, body

Each entity stores { en: { title: "…" }, de: { … } } in a translations JSON field. At render, getDynamicTranslation() returns the current locale's value, falling back to the base text. Auto-translate is built into the editor.

On this page