Skip to content

Интернационализация (i18n)

Стек

  • i18next — ядро интернационализации
  • react-i18next — React-интеграция (хук useTranslation)
  • expo-localization — определение языка устройства

Поддерживаемые языки

КодЯзык
enEnglish (по умолчанию)
ukУкраїнська
ruРусский
deDeutsch
frFrançais
itItaliano
esEspañol
plPolski
ptPortuguês

Архитектура

src/core/i18n/
├── config.ts           # Конфигурация i18next
├── index.ts            # Экспорт initI18n, утилит
└── locales/            # JSON-файлы переводов
    ├── en.json
    ├── uk.json
    ├── ru.json
    └── ...

Инициализация

initI18n() вызывается в root layout до рендеринга приложения:

  1. Загрузка сохранённого языка из AsyncStorage (ключ user-language)
  2. Если нет — определение языка устройства через expo-localization
  3. Если не поддерживается — 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

ПараметрЗначение
fallbackLngen
interpolation.escapeValuefalse (React уже экранирует)
react.useSuspensefalse (предотвращает мерцание)