- Добавлена документация SLM-архитектуры, базовых правил и прикладных разделов - Добавлены разделы: стили, SVG-спрайты, шаблоны генерации, PostCSS, REST, Realtime - Удалены устаревшие файлы (спрайты, скрипты, стили из app/)
82 lines
3.0 KiB
Markdown
82 lines
3.0 KiB
Markdown
---
|
||
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 (
|
||
<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-модуля.
|