--- title: Локализация description: Как организовать локализацию как infrastructure-модуль. --- # Локализация Как организовать локализацию как 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 ( {children} ) } ``` ## Использование Компоненты получают переводы через готовый API модуля локализации: ```tsx import { useTranslation } from 'infrastructure/i18n' export const ProfileTitle = () => { const { t } = useTranslation() return

{t('profile.title')}

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