В i18next выбор формы слова при изменении числительного опирается на правила CLDR (Unicode Common Locale Data Repository), которые описывают, сколько форм множественного числа существует в каждом языке и при каких условиях они используются. Библиотека не ограничивается простым «one / other», а поддерживает сложные системы с несколькими категориями, такими как few, many, zero, two и другими, в зависимости от локали.
В основе лежит значение переменной count, которое
передаётся в перевод:
i18next.t('cart.items', { count: 1 });
Ресурс описывается набором ключей:
{
"cart": {
"items_one": "товар",
"items_few": "товара",
"items_many": "товаров",
"items_other": "товара"
}
}
i18next автоматически выбирает нужный ключ, добавляя суффикс в зависимости от языка.
Ключевой момент: основной механизм — это сопоставление count → plural category → suffix key.
i18next опирается на следующие стандартные категории:
Однако не каждый язык использует все категории. В большинстве случаев применяется подмножество.
Английский — один из самых простых случаев:
{
"item_one": "item",
"item_other": "items"
}
Правило:
Русский язык имеет сложную систему из трёх форм:
{
"item_one": "товар",
"item_few": "товара",
"item_many": "товаров",
"item_other": "товара"
}
Фактически other обычно не используется, но остаётся как
fallback.
Правила:
Польский имеет ещё более сложную систему:
{
"car_one": "samochód",
"car_few": "samochody",
"car_many": "samochodów"
}
Особенность: числовые окончания 12–14 всегда идут в many.
Арабский — один из самых сложных случаев, с шестью формами:
{
"apple_zero": "لا تفاح",
"apple_one": "تفاحة واحدة",
"apple_two": "تفاحتان",
"apple_few": "تفاحات",
"apple_many": "تفاحة",
"apple_other": "تفاحة"
}
Правила зависят от диапазонов и грамматической роли числа, а не только от точного значения.
В японском (ja) и китайском (zh) множественное число отсутствует как грамматическая категория.
Используется только other:
{
"item_other": "アイテム"
}
или
{
"item_other": "项目"
}
i18next всегда выбирает other, независимо от
count.
Во многих скандинавских языках:
{
"book_one": "bok",
"book_other": "bøker"
}
counti18next строго требует передачи count, иначе plural
logic не активируется:
i18next.t('item', { count: 3 });
Если count отсутствует:
i18next.t('item');
будет возвращён ключ без выбора формы множественного числа.
Часто count используется внутри перевода:
{
"cart": {
"items_one": "{{count}} товар",
"items_few": "{{count}} товара",
"items_many": "{{count}} товаров"
}
}
Результат:
i18next.t('cart.items', { count: 5 });
// 5 товаров
i18next поддерживает ICU-синтаксис через
i18next-icu:
{
"item": "{count, plural, one {item} other {items}}"
}
Более сложный пример:
{
"car": "{count, plural, one {# car} other {# cars}}"
}
ICU позволяет:
Suffix-подход i18next:
{
"item_one": "...",
"item_other": "..."
}
Преимущества:
Недостатки:
ICU-подход:
{
"item": "{count, plural, one {...} other {...}}"
}
Преимущества:
Недостатки:
i18next использует fallback в следующем порядке:
Пример:
{
"item_other": "items"
}
Если язык требует few, но его нет — будет использован
other.
lngОпределяет язык и его plural rules:
i18next.init({
lng: 'ru'
});
fallbackLngЕсли язык не поддерживает сложную форму:
fallbackLng: 'en'
compatibilityJSONСтарые версии JSON могли использовать другие правила обработки suffix.
i18next позволяет комбинировать plural с context:
{
"friend_male_one": "1 друг",
"friend_male_other": "{{count}} друзей",
"friend_female_one": "1 подруга",
"friend_female_other": "{{count}} подруг"
}
Использование:
i18next.t('friend', { count: 3, context: 'female' });
count → всегда возвращается base keyНекоторые языки различают дробные значения:
i18next.t('item', { count: 1.5 });
В английском и русском дробные числа обычно попадают в
other.
Один и тот же count даёт разные результаты:
Это ключевая особенность i18next: логика полностью локализована, а не универсальна.