Интернационализация (i18n)
Стек
- i18next — ядро интернационализации
- react-i18next — React-интеграция (хук
useTranslation) - expo-localization — определение языка устройства
Поддерживаемые языки
| Код | Язык |
|---|---|
en | English (по умолчанию) |
uk | Українська |
ru | Русский |
de | Deutsch |
fr | Français |
it | Italiano |
es | Español |
pl | Polski |
pt | Português |
Архитектура
src/core/i18n/
├── config.ts # Конфигурация i18next
├── index.ts # Экспорт initI18n, утилит
└── locales/ # JSON-файлы переводов
├── en.json
├── uk.json
├── ru.json
└── ...Инициализация
initI18n() вызывается в root layout до рендеринга приложения:
- Загрузка сохранённого языка из AsyncStorage (ключ
user-language) - Если нет — определение языка устройства через
expo-localization - Если не поддерживается — fallback на English (
en)
typescript
// app/_layout.tsx
await initI18n();Использование
В компонентах
typescript
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
return <Text>{t('settings.title')}</Text>;
}Смена языка
typescript
import { changeLanguage } from '../core/i18n';
// Сменить язык и сохранить в AsyncStorage
await changeLanguage('uk');Получить текущий язык
typescript
import { getCurrentLanguage } from '../core/i18n';
const lang = getCurrentLanguage(); // 'en', 'uk', ...Формат файлов переводов
JSON с вложенной структурой:
json
{
"common": {
"save": "Сохранить",
"cancel": "Отмена",
"delete": "Удалить"
},
"auth": {
"login": "Войти",
"register": "Зарегистрироваться"
},
"chats": {
"title": "Чаты",
"empty": "Нет чатов"
}
}Конфигурация i18next
| Параметр | Значение |
|---|---|
fallbackLng | en |
interpolation.escapeValue | false (React уже экранирует) |
react.useSuspense | false (предотвращает мерцание) |