Перейти к основному содержимому

Переключатель языка

Порядок определения: префикс URL → Cookie → Базовая локаль (английский)

Текущий язык: Русский (ru)
Formatting locale: ru-RU

Переведённые сообщения

m.greeting({ name: 'World' }) Привет, World!
m.welcome_message() Добро пожаловать в демонстрацию интернационализации
m.sample_text() Этот текст переводится в зависимости от текущей локали.

Плюрализация

ICU MessageFormat handles pluralization rules per language.

m.items_count({ count: 0 }) 0 элементов
m.items_count({ count: 1 }) 1 элементов
m.items_count({ count: 2 }) 2 элементов
m.items_count({ count: 5 }) 5 элементов
m.items_count({ count: 42 }) 42 элементов

Форматирование дат и чисел

Formatting uses the browser's Intl API, decoupled from the translation locale. A German user in Switzerland gets German text but Swiss number formatting.

Отформатированная дата 15 янв. 2025 г.
Отформатированная дата (long) среда, 15 января 2025 г.
Отформатированное число 1 234 567,89
Отформатированная валюта (EUR) 1 234,50 €
Отформатированная валюта (USD) 1 234,50 $
Отформатированный процент 85,4 %
Относительное время позавчера

Content Translation (Database)

The tc() helper translates JSON fields from the database, falling back through: current locale → English → first available.

tc(post.title, post.titleI18n, locale) Привет, мир
tc(post.description, post.descriptionI18n, locale) Это содержимое хранится в базе данных в формате JSON.

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.

errorMessage(ErrorCode.AUTH_INVALID) Неверные учётные данные.
errorMessage(ErrorCode.VALIDATION_REQUIRED) Это поле обязательно.
errorMessage(ErrorCode.RATE_LIMITED) Слишком много запросов. Пожалуйста, подождите немного.
errorMessage(ErrorCode.RESOURCE_NOT_FOUND) Мы не смогли найти то, что вы ищете.

Типобезопасность

Все ключи сообщений проверяются на этапе компиляции с полной поддержкой 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();
← Back to Showcases