Интернационализация
Типобезопасные переводы, плюрализация, форматирование дат и чисел, переключение языка с помощью Paraglide JS.
Переключатель языка
Порядок определения: префикс URL → Cookie → Базовая локаль (английский)
Переведённые сообщения
Плюрализация
ICU MessageFormat handles pluralization rules per language.
Форматирование дат и чисел
Formatting uses the browser's Intl API, decoupled from the translation locale. A German user in Switzerland gets German text but Swiss number formatting.
Content Translation (Database)
The tc() helper translates JSON fields from the database, falling back through: current locale → English → first available.
Database Schema Pattern
// EN canonical column + JSONB i18n sibling per non-base locale
name: text('name').notNull(),
nameI18n: jsonb('name_i18n')
.$type<Partial<Record<'de'|'ru', string>>>()
.notNull().default(sql`'{}'::jsonb`),
// Render: tc(row.name, row.nameI18n, locale)Error Codes
Domain code throws stable error codes; adapters resolve them to localized strings via errorMessage(code). Switching locale re-renders without re-submitting.
Типобезопасность
Все ключи сообщений проверяются на этапе компиляции с полной поддержкой IntelliSense. Отсутствующие ключи или неверные параметры вызывают ошибки сборки, а не ошибки времени выполнения.
Compile-time Guarantees
// ✅ Type-safe with autocomplete
m.greeting({ name: 'Alice' });
// ❌ Compile error — missing parameter
m.greeting();
// ❌ Compile error — unknown message key
m.unknownKey();