Правила плюрализации для разных языков

В 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

i18next опирается на следующие стандартные категории:

  • zero
  • one
  • two
  • few
  • many
  • other

Однако не каждый язык использует все категории. В большинстве случаев применяется подмножество.


Английский язык (en)

Английский — один из самых простых случаев:

  • one (1)
  • other (все остальные числа)
{
  "item_one": "item",
  "item_other": "items"
}

Правило:

  • 1 → one
  • 0, 2, 5, 100 → other

Русский язык (ru)

Русский язык имеет сложную систему из трёх форм:

  • one (1, 21, 31…)
  • few (2–4, 22–24…)
  • many (0, 5–20, 25–30…)
{
  "item_one": "товар",
  "item_few": "товара",
  "item_many": "товаров",
  "item_other": "товара"
}

Фактически other обычно не используется, но остаётся как fallback.

Правила:

  • 1, 21, 31 → one
  • 2–4, 22–24 → few
  • 0, 5–20, 25–30 → many

Польский язык (pl)

Польский имеет ещё более сложную систему:

  • one (1)
  • few (2–4, кроме 12–14)
  • many (0, 5–21, 25–…)
{
  "car_one": "samochód",
  "car_few": "samochody",
  "car_many": "samochodów"
}

Особенность: числовые окончания 12–14 всегда идут в many.


Арабский язык (ar)

Арабский — один из самых сложных случаев, с шестью формами:

  • zero
  • one
  • two
  • few
  • many
  • other
{
  "apple_zero": "لا تفاح",
  "apple_one": "تفاحة واحدة",
  "apple_two": "تفاحتان",
  "apple_few": "تفاحات",
  "apple_many": "تفاحة",
  "apple_other": "تفاحة"
}

Правила зависят от диапазонов и грамматической роли числа, а не только от точного значения.


Японский и китайский языки

В японском (ja) и китайском (zh) множественное число отсутствует как грамматическая категория.

Используется только other:

{
  "item_other": "アイテム"
}

или

{
  "item_other": "项目"
}

i18next всегда выбирает other, независимо от count.


Шведский и норвежский (scandinavian simplified plural)

Во многих скандинавских языках:

  • one
  • other
{
  "book_one": "bok",
  "book_other": "bøker"
}

Важность параметра count

i18next строго требует передачи count, иначе plural logic не активируется:

i18next.t('item', { count: 3 });

Если count отсутствует:

i18next.t('item');

будет возвращён ключ без выбора формы множественного числа.


Интерполяция count в строках

Часто count используется внутри перевода:

{
  "cart": {
    "items_one": "{{count}} товар",
    "items_few": "{{count}} товара",
    "items_many": "{{count}} товаров"
  }
}

Результат:

i18next.t('cart.items', { count: 5 });
// 5 товаров

ICU Message Format как альтернатива

i18next поддерживает ICU-синтаксис через i18next-icu:

{
  "item": "{count, plural, one {item} other {items}}"
}

Более сложный пример:

{
  "car": "{count, plural, one {# car} other {# cars}}"
}

ICU позволяет:

  • описывать правила в одном выражении
  • поддерживать сложные языки без множества ключей
  • использовать вложенные конструкции

Различие между suffix-подходом и ICU

Suffix-подход i18next:

{
  "item_one": "...",
  "item_other": "..."
}

Преимущества:

  • простота
  • читаемость
  • удобство перевода

Недостатки:

  • рост количества ключей
  • сложность при 5–6 формах

ICU-подход:

{
  "item": "{count, plural, one {...} other {...}}"
}

Преимущества:

  • компактность
  • единая структура

Недостатки:

  • сложнее для переводчиков без технического опыта

Особенности fallback-логики

i18next использует fallback в следующем порядке:

  1. exact plural form (one, few, many…)
  2. other
  3. базовый ключ без suffix

Пример:

{
  "item_other": "items"
}

Если язык требует few, но его нет — будет использован other.


Конфигурационные параметры, влияющие на pluralization

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
  • неполный набор форм (например, только one без other)
  • попытка вручную выбирать форму вместо использования механизма i18next
  • игнорирование особенностей языков с multiple plural forms (ru, pl, ar)

Поведение при дробных числах

Некоторые языки различают дробные значения:

i18next.t('item', { count: 1.5 });

В английском и русском дробные числа обычно попадают в other.


Влияние локали на выбор формы

Один и тот же count даёт разные результаты:

  • en: 2 → other
  • ru: 2 → few
  • ar: 2 → two
  • ja: 2 → other (единственная форма)

Это ключевая особенность i18next: логика полностью локализована, а не универсальна.