Skip to content

Локализация

Как организовать локализацию как infrastructure-модуль.

Назначение

Локализация — инфраструктурная подсистема приложения. Она отвечает за текущую локаль, словари, форматирование переводов и API для компонентов.

Код локализации живёт в src/infrastructure/i18n/. Компоненты и модули не читают словари напрямую — они используют публичный API infrastructure-модуля.

Структура

text
src/infrastructure/i18n/
├── config/
│   └── i18n.config.ts
├── dictionaries/
│   ├── ru.ts
│   └── en.ts
├── hooks/
│   └── use-translation.hook.ts
├── providers/
│   └── i18n-provider.tsx
├── types/
│   └── i18n.type.ts
└── index.ts

Набор сегментов может отличаться, но публичная точка входа остаётся одна — infrastructure/i18n.

Подключение

app/ только подключает готовый провайдер локализации. Реализация провайдера, словари и конфиг остаются в infrastructure/i18n/.

tsx
// src/app/layout.tsx
import type { ReactNode } from 'react'
import { I18nProvider } from 'infrastructure/i18n'

type RootLayoutProps = {
  children: ReactNode
}

export default function RootLayout({ children }: RootLayoutProps) {
  return (
    <html lang="ru">
      <body>
        <I18nProvider locale="ru">{children}</I18nProvider>
      </body>
    </html>
  )
}

Использование

Компоненты получают переводы через готовый API модуля локализации:

tsx
import { useTranslation } from 'infrastructure/i18n'

export const ProfileTitle = () => {
  const { t } = useTranslation()

  return <h1>{t('profile.title')}</h1>
}

Правила

  • Локализация живёт в infrastructure/i18n/.
  • app/ только подключает готовый provider и передаёт locale.
  • Словари не импортируются напрямую в компоненты, screens или business-модули.
  • Ключи переводов не собираются динамически из строк, если это ломает типизацию и поиск.
  • Тексты интерфейса не хардкодятся в переиспользуемых компонентах, если они должны переводиться.
  • Форматирование дат, чисел и валют должно проходить через API локализации или отдельные утилиты infrastructure-модуля.