Библиотека i18next считается одним из наиболее универсальных решений
для интернационализации JavaScript-приложений. Она применяется как в
браузере, так и на сервере, поддерживает React, Vue, Angular, Node.js,
Next.js и десятки дополнительных плагинов. Однако в экосистеме
существует множество альтернативных подходов: встроенный API
Intl, библиотеки FormatJS,
Polyglot.js, LinguiJS, vue-i18n,
react-intl и другие.
Сравнение различных решений особенно важно при проектировании крупного приложения, поскольку выбор инструмента влияет на:
JavaScript содержит встроенный объект Intl,
предназначенный для интернационализации:
const formatter = new Intl.DateTimeFormat('ru-RU');
console.log(formatter.format(new Date()));
API поддерживает:
Пример форматирования валют:
const price = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR'
});
console.log(price.format(1200));
Intl не предоставляет:
Пример, который невозможно реализовать только средствами
Intl:
t('profile.settings.notifications')
Следовательно, Intl — это низкоуровневый API
форматирования, а не полноценная система локализации.
На практике i18next часто использует Intl
внутри.
Например:
i18next.init({
interpolation: {
format(value, format, lng) {
if (format === 'currency') {
return new Intl.NumberFormat(lng, {
style: 'currency',
currency: 'USD'
}).format(value);
}
return value;
}
}
});
Такой подход объединяет:
i18next;Intl.Библиотека react-intl входит в экосистему FormatJS.
Пример использования:
<FormattedMessage
id="welcome"
defaultMessage="Welcome"
/>
Основная идея react-intl:
Поддерживаются сложные plural forms:
<FormattedMessage
id="messages"
defaultMessage="{count, plural,
=0 {No messages}
one {# message}
other {# messages}
}"
values={{ count }}
/>
Система хорошо вписывается в:
react-intl ориентирован исключительно на React.
Использование вне React-приложения неудобно.
В отличие от него, i18next работает:
В i18next namespace являются центральной частью
архитектуры:
t('auth:login')
В react-intl подобная структура реализуется менее
удобно.
Экосистема i18next содержит множество
backend-плагинов:
react-intl хорошо подходит:
i18next выигрывает:
FormatJS — это набор инструментов:
react-intl;FormatJS ориентирован на стандарты ECMA-402.
FormatJS использует ICU-сообщения:
{
"cart": "{count, plural, one {# item} other {# items}}"
}
В i18next аналог может выглядеть проще:
{
"cart_one": "{{count}} item",
"cart_other": "{{count}} items"
}
| Возможность | i18next | FormatJS |
|---|---|---|
| Простота | Высокая | Средняя |
| ICU | Через плагины | Нативно |
| Framework agnostic | Да | Частично |
| Плагины | Очень много | Ограниченно |
| Backend ecosystem | Развитая | Слабее |
| Learning curve | Ниже | Выше |
ICU мощнее для сложной грамматики:
"{gender, select,
male {He}
female {She}
other {They}
}"
Но сообщения становятся труднее для поддержки.
i18next делает акцент на:
Polyglot.js — минималистичная библиотека локализации.
Пример:
polyglot.t('hello');
Маленький размер библиотеки.
Практически отсутствует сложная конфигурация.
Библиотека не предоставляет:
Polyglot.js подходит:
i18next рассчитан на:
LinguiJS сочетает:
Сообщения компилируются заранее:
lingui compile
Это уменьшает runtime-нагрузку.
<t>Hello</t>
Строки автоматически извлекаются в каталоги.
Появляются дополнительные этапы:
По сравнению с i18next:
LinguiJS может выигрывать:
i18next выигрывает:
vue-i18n является стандартным решением для Vue.
Пример:
const i18n = createI18n({
locale: 'ru',
messages
});
Поддерживаются:
<p>{{ $t('welcome') }}</p>
Главное ограничение — привязка к Vue.
i18next можно использовать:
Angular содержит встроенную систему локализации.
Пример:
<h1 i18n>Hello</h1>
Angular использует:
Переводы внедряются на этапе сборки.
Поддерживается:
Переключение локали часто требует отдельной сборки.
Сложнее реализовать:
С помощью i18next можно:
Подход i18next:
Приложение запускается
↓
Переводы загружаются динамически
↓
Язык переключается runtime
Преимущества:
Недостатки:
Подход Angular i18n и частично LinguiJS:
Сборка
↓
Встраивание переводов
↓
Готовый locale bundle
Преимущества:
Недостатки:
Наиболее развитая среди JavaScript-решений.
Ключевые модули:
i18next-http-backendi18next-browser-languagedetectorreact-i18nextnext-i18nexti18next-fs-backendi18next-chained-backendСильна в:
Но менее универсальна.
Сосредоточена на:
{
"item_one": "товар",
"item_few": "товара",
"item_many": "товаров"
}
Поддерживаются языковые правила CLDR.
{count, plural,
one {товар}
few {товара}
many {товаров}
}
ICU:
i18next:
При базовой конфигурации:
| Библиотека | Размер |
|---|---|
| Polyglot.js | Очень маленький |
| i18next | Средний |
| FormatJS | Выше среднего |
| LinguiJS | Средний |
На производительность влияют:
ICU-парсинг обычно тяжелее обычного key lookup.
В крупных приложениях i18next показывает преимущества
благодаря:
{
"profile": {
"title": "Профиль"
}
}
Простая и понятная структура.
{count, plural, one {# file} other {# files}}
Для неподготовленных переводчиков такой формат сложнее.
i18next позволяет разделять переводы:
auth.json
dashboard.json
profile.json
Это особенно важно в enterprise-проектах.
Поддерживает:
SSR поддерживается хорошо, но экосистема менее гибкая.
SSR возможен, но архитектурно менее динамичен.
Обычно проще благодаря:
Может потребовать:
i18next особенно эффективен при:
Подходят при:
Полезен при:
Рационален для:
Эффективен в: