Интернационализация (i18n) в JavaScript (Node.js)
Интернационализация (сокращённо i18n — от английского «internationalization», где 18 означает количество букв между первой «i» и последней «n») — это процесс проектирования и разработки программного обеспечения таким образом, чтобы его можно было легко адаптировать для различных языков и регионов без внесения изменений в код. В экосистеме Node.js существует несколько мощных библиотек, которые значительно упрощают эту задачу. В данной статье мы рассмотрим две самые популярные: i18next и node-polyglot.
Зачем нужна интернационализация?
Современные веб-приложения и серверные сервисы часто работают с пользователями из разных стран. Поддержка нескольких языков повышает удобство использования (UX) и расширяет аудиторию. Без i18n разработчикам пришлось бы жёстко зашивать строки на одном языке, что делает поддержку многоязычности крайне трудоёмкой и чреватой ошибками.
Основные задачи, решаемые библиотеками i18n в Node.js:
- Поддержка файлов с переводами (обычно JSON или YAML).
- Плюрализация (правильное склонение слов в зависимости от числа: «1 кофе», «2 кофе», «5 кофе»).
- Интерполяция переменных в строки (например, «Привет, {{name}}!»).
- Поддержка вложенных ключей для организации структуры переводов.
- Автоматическое определение языка пользователя (через заголовки HTTP, cookie, поддомены).
Библиотека i18next
i18next — это, пожалуй, самая популярная и функциональная библиотека для интернационализации в мире JavaScript. Она работает как в браузере, так и на сервере Node.js. i18next предлагает богатую экосистему плагинов, включая интеграцию с React, Vue, Express и другими фреймворками.
Установка и базовая настройка
// Установка через npm
npm install i18next
Создадим файлы с переводами. Обычно их хранят в папке locales:
locales/ru/translation.json
{
"greeting": "Привет, {{name}}!",
"coffee": "Вы выпили {{count}} чашку кофе",
"coffee_plural": "Вы выпили {{count}} чашек кофе",
"menu": {
"home": "Главная",
"about": "О нас"
}
}
locales/en/translation.json
{
"greeting": "Hello, {{name}}!",
"coffee": "You drank {{count}} cup of coffee",
"coffee_plural": "You drank {{count}} cups of coffee",
"menu": {
"home": "Home",
"about": "About us"
}
}
Теперь инициализируем i18next в приложении:
const i18next = require('i18next');
const fs = require('fs');
const path = require('path');
// Загружаем переводы из файлов
function loadTranslation(lng) {
const filePath = path.join(__dirname, 'locales', lng, 'translation.json');
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
}
i18next.init({
lng: 'ru', // язык по умолчанию
fallbackLng: 'en', // резервный язык
resources: {
ru: { translation: loadTranslation('ru') },
en: { translation: loadTranslation('en') }
},
interpolation: {
escapeValue: false // для Node.js не нужно экранировать HTML
}
});
// Использование
console.log(i18next.t('greeting', { name: 'Алексей' }));
// Вывод: Привет, Алексей!
console.log(i18next.t('coffee', { count: 1 }));
// Вывод: Вы выпили 1 чашку кофе
console.log(i18next.t('coffee', { count: 5 }));
// Вывод: Вы выпили 5 чашек кофе
console.log(i18next.t('menu.home'));
// Вывод: Главная
Смена языка на лету
i18next.changeLanguage('en');
console.log(i18next.t('greeting', { name: 'Alex' }));
// Вывод: Hello, Alex!
Библиотека node-polyglot
node-polyglot — это лёгкая и простая альтернатива i18next. Она идеально подходит для небольших проектов или когда не требуется вся мощь i18next. Polyglot не поддерживает вложенные ключи и сложную плюрализацию «из коробки», но для базовых сценариев её более чем достаточно.
Установка и использование
npm install node-polyglot