Механизм plural-форм в i18next не является отдельной абстракцией — он
встроен в систему ключей переводов и активируется через передачу
числового параметра count. Именно count
определяет, какая форма перевода будет выбрана: единственное,
множественное или одна из языковых вариаций (zero, one, few, many,
other).
i18next.t('cart.items', { count: 1 });
i18next.t('cart.items', { count: 5 });
При наличии корректно определённых ключей библиотека автоматически выбирает нужный вариант без дополнительных условий в коде.
Самая распространённая схема — суффиксы _one и
_other. Она используется в языках с простой системой
множественного числа (например, английский, русский в базовой
конфигурации через CLDR-правила).
{
"cart": {
"items_one": "{{count}} товар",
"items_other": "{{count}} товаров"
}
}
i18next.t('cart.items', { count: 1 }); // 1 товар
i18next.t('cart.items', { count: 5 }); // 5 товаров
Ключевой принцип: базовый ключ (items) служит префиксом,
а библиотека автоматически добавляет суффикс в зависимости от языка и
правила pluralization.
В языках с богатой морфологией используется расширенный набор форм:
zeroonetwofewmanyotherПример структуры:
{
"apples_zero": "нет яблок",
"apples_one": "{{count}} яблоко",
"apples_few": "{{count}} яблока",
"apples_many": "{{count}} яблок",
"apples_other": "{{count}} яблока"
}
Выбор формы зависит от языковых правил CLDR, встроенных в i18next
через pluralResolver.
count в выборе формыcount не просто подставляется в строку — он участвует в
вычислении ключа перевода.
i18next.t('apples', { count: 21 });
Логика работы:
appleslng)apples_few,
apples_many и т.д.{{count}}countПеременная count доступна в шаблоне перевода
автоматически:
{
"messages_one": "{{count}} сообщение",
"messages_other": "{{count}} сообщений"
}
i18next.t('messages', { count: 3 });
Внутри строки допускается использование дополнительных интерполяций:
{
"files_one": "Файл {{name}} ({{count}} элемент)",
"files_other": "Файлы {{name}} ({{count}} элементов)"
}
_oneЕсли определён только базовый ключ и _other, библиотека
использует его как fallback:
{
"comments_other": "{{count}} комментариев"
}
i18next.t('comments', { count: 10 });
При count = 1 возможен fallback на other,
если one отсутствует, что приводит к грамматически неточной
форме. Это поведение критично учитывать при проектировании словарей.
i18next опирается на CLDR plural rules, где каждый язык имеет собственную функцию выбора формы.
Пример различий:
one / otherone / few / many / otherotherЭта логика инкапсулирована, но влияет на структуру ключей.
В i18next контекст (context) и plural могут
комбинироваться, создавая составные ключи:
{
"car_male_one": "Он купил {{count}} машину",
"car_female_one": "Она купила {{count}} машину",
"car_male_other": "Он купил {{count}} машин",
"car_female_other": "Она купила {{count}} машин"
}
i18next.t('car', {
count: 2,
context: 'female'
});
Порядок обработки:
female)other)car_female_otherОтдельный механизм — интервал-переводы, когда форма зависит не от точного числа, а от диапазона.
{
"items_interval_1": "1 элемент",
"items_interval_2-4": "{{count}} элемента",
"items_interval_5-10": "{{count}} элементов"
}
Используется редко, но полезен для UI-метрик и статистик.
Возможна настройка кастомной логики через
pluralResolver:
i18next.init({
pluralResolver: {
addRule: (lng, fn) => {
// кастомное правило
}
}
});
Это применяется при нестандартных языках или бизнес-логике, где CLDR недостаточен.
Если отсутствует нужная форма:
otherfallbackLng)Пример:
{
"book_other": "{{count}} книг"
}
При count = 1 будет использована форма
other, если one не определён.
Plural-ключи могут находиться внутри вложенных объектов:
{
"profile": {
"notifications_one": "1 уведомление",
"notifications_other": "{{count}} уведомлений"
}
}
i18next.t('profile.notifications', { count: 7 });
Порядок выполнения критичен:
Это означает, что:
{
"test_one": "{{count}} item",
"test_other": "{{count}} items"
}
count используется одновременно для выбора ключа и для
подстановки значения.
Часто встречаются структурные проблемы словарей:
one формы при языках, где она
обязательнаcount без передачи параметра в
tcountПример ошибочного подхода:
i18next.t(count > 1 ? 'items_plural' : 'items_single');
Такой код игнорирует встроенный механизм CLDR и приводит к дублированию логики.
Plural-значение может комбинироваться с форматированием:
{
"price_one": "{{count}} товар за {{price, currency}}",
"price_other": "{{count}} товаров за {{price, currency}}"
}
i18next.t('price', {
count: 3,
price: 1200
});
Форматтеры выполняются после выбора формы.
count = 0 обрабатывается согласно языковым правилам:
othermany или other, зависит
от конфигурацииzero{
"messages_zero": "нет сообщений",
"messages_one": "{{count}} сообщение",
"messages_other": "{{count}} сообщений"
}
Алгоритм выбора:
key_context_pluralkey_pluralkey_contextkey_otherkeyЭтот порядок обеспечивает максимальную специфичность перевода при сохранении fallback-устойчивости.