Web / Customization
Locales and copy
Use the en/de/es/fr dictionary scaffold for marketing chrome, settings IA, mail, and notification events.
Setup and configuration
Locales live in @starterkit/i18n with SUPPORTED_LOCALES, LOCALE_COOKIE, resolveLocale, getDictionary, and localePath. Proxy sets x-starterkit-locale and handles canonical English redirects; LanguageSwitcher updates the cookie and preserves active sub-paths. Key app routes (/dashboard, /settings, /billing, /chat) work directly under /[locale] prefixes alongside the soft /{locale} marketing home.
Dictionaries cover marketing nav, settings section labels, organization settings chrome, transactional mail (invite/OTP/magic-link/AI/billing), notification preference labels, and in-app notification event copy.
import { getDictionary, resolveLocale, LOCALE_COOKIE } from "@starterkit/i18n";
const locale = resolveLocale([
cookieStore.get(LOCALE_COOKIE)?.value,
headers.get("x-starterkit-locale"),
headers.get("accept-language"),
]);
const copy = getDictionary(locale);Implementation workflow
Pass locale into server-rendered settings/org pages and into notificationCopyForEvent / auth mail delivery options when available. Keep English as DEFAULT_LOCALE and avoid inventing marketing claims outside dictionary keys.
Transactional mail stays separate from outreach. Expand dictionaries before nesting every marketing route under [locale].
Verification and troubleshooting
Run packages/i18n Vitest, proxy tests, and locale-app-routes tests. Spot-check LanguageSwitcher on / and localized Settings/org/dashboard/billing/chat headings when the locale prefix is de/es/fr.