Современные проекты на JavaScript редко ограничиваются ручным ведением JSON-файлов локализации. При росте количества языков и строк интерфейса возникает необходимость централизованного управления переводами, контроля версий и синхронизации с продуктовой разработкой. В экосистеме i18next это решается через интеграцию с платформами управления локализацией и автоматизированные пайплайны выгрузки/загрузки ресурсов.
Архитектурно i18next отделяет слой получения переводов от их хранения. Ключевая роль отводится backend-плагинам и процессам синхронизации, которые позволяют подключать внешние сервисы без изменения логики приложения.
Интеграция с системами управления переводами (Translation Management System, TMS) строится на нескольких базовых принципах:
В связке с i18next чаще всего используется стратегия, при которой приложение загружает переводы динамически, а TMS выступает центральным хранилищем и интерфейсом для переводчиков.
Crowdin предоставляет API и CLI-инструменты, ориентированные на автоматическую синхронизацию файлов локализации.
Типичная структура для i18next:
locales/
en/translation.json
ru/translation.json
de/translation.json
В Crowdin проекте аналогичная структура отображается через
конфигурационный файл crowdin.yml:
project_id: your_project_id
api_token: your_api_token
files:
- source: /locales/en/translation.json
translation: /locales/%two_letters_code%/translation.json
Загрузка исходных файлов в систему:
crowdin upload sources
Скачивание переводов:
crowdin download
После загрузки переводов в проект i18next использует стандартный HTTP backend:
import i18n from 'i18next';
import HttpBackend from 'i18next-http-backend';
i18n
.use(HttpBackend)
.init({
lng: 'ru',
fallbackLng: 'en',
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
});
Основная идея заключается в том, что Crowdin отвечает за актуальность файлов, а i18next — за их потребление в runtime.
Lokalise ориентируется на API-first подход и активно используется в продуктовых командах, работающих с частыми релизами.
Основной сценарий — загрузка ключей через CLI или API:
lokalise2 file upload \
--project-id PROJECT_ID \
--token API_TOKEN \
--file "locales/en/translation.json" \
--lang-iso en
Загрузка переводов:
lokalise2 file download \
--project-id PROJECT_ID \
--token API_TOKEN \
--format json \
--directory-prefix locales
Lokalise поддерживает вложенные ключи, что совпадает с подходом i18next:
{
"auth": {
"login": "Войти",
"logout": "Выйти"
}
}
В i18next это автоматически резолвится через namespace:
i18n.t('auth.login');
Lokalise позволяет использовать ветки (branches), что удобно для синхронизации с Git-flow:
master — продакшн переводыdevelop — активная разработкаЭто позволяет синхронизировать переводы с состоянием приложения на конкретных стадиях релиза.
Phrase отличается глубокой интеграцией с CI/CD и поддержкой сложных workflow для enterprise-сценариев.
Установка и базовые команды:
phrase push
phrase pull
Конфигурация через phrase.yml:
phrase:
project_id: YOUR_PROJECT_ID
file_format: json
push:
sources:
- file: ./locales/en/translation.json
pull:
targets:
- file: ./locales/%locale_name%/translation.json
Phrase часто интегрируется в pipeline:
steps:
- name: Upload sources
run: phrase push
- name: Download translations
run: phrase pull
Phrase хорошо сочетается с архитектурой namespaces:
locales/
en/
common.json
auth.json
dashboard.json
i18next конфиг:
i18n.init({
ns: ['common', 'auth', 'dashboard'],
defaultNS: 'common',
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
});
Во всех трёх системах критической задачей является предотвращение рассинхронизации ключей между кодом и TMS.
Распространённые стратегии:
Пример использования парсера:
i18next "src/**/*.{js,jsx,ts,tsx}" \
--config i18next-parser.config.js
Независимо от выбранной TMS, конфигурация i18next остаётся унифицированной:
i18n.init({
lng: 'en',
fallbackLng: 'en',
ns: ['common'],
defaultNS: 'common',
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
},
interpolation: {
escapeValue: false
},
saveMissing: false
});
При использовании TMS ключевым становится не runtime-слой, а процесс
доставки файлов в loadPath.
Интеграция с Crowdin, Lokalise и Phrase обычно дополняется версионированием:
Практический подход:
/locales/v1/en/translation.json
/locales/v2/en/translation.json
или через query version:
loadPath: '/locales/{{lng}}/{{ns}}.json?v=42'
При больших проектах полная синхронизация становится неэффективной. Используются инкрементальные обновления:
Phrase и Lokalise предоставляют webhook-и, позволяющие автоматически триггерить сборку фронтенда после обновления переводов.
TMS-интеграции требуют строгого контроля:
Crowdin реализует granular permissions, позволяя разделять доступ к языкам и проектам.
При работе с внешними системами важно учитывать производительность:
Пример кеширования:
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
requestOptions: {
cache: 'force-cache'
}
}
Для крупных приложений это снижает нагрузку на TMS и ускоряет первый рендер интерфейса.