Правила множественного числа

API Intl.PluralRules предоставляет механизм определения грамматической формы числа в зависимости от локали. Это ключевой инструмент для корректной интернационализации интерфейсов, где требуется согласование существительных с числительными.

Множественные формы зависят от языка: в английском обычно две формы (one / other), в русском — несколько (one, few, many, other), в арабском их количество ещё больше. Встроенные правила учитывают лингвистические особенности без ручной реализации логики.


Создание экземпляра PluralRules

Базовая инициализация выполняется через конструктор с указанием локали и опциональных параметров:

const pr = new Intl.PluralRules('ru');

Локаль определяет набор правил, применяемых при вычислении категории.

Возможна настройка поведения через второй аргумент:

const pr = new Intl.PluralRules('ru', {
  type: 'cardinal'
});

Параметр type принимает два значения:

  • cardinal — количественные числительные (1, 2, 5 книг)
  • ordinal — порядковые числительные (1-й, 2-й, 5-й)

Категории множественного числа

Метод классифицирует число в одну из категорий CLDR:

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

Набор используемых категорий зависит от локали. Например, в английском языке активны только one и other.

const en = new Intl.PluralRules('en');

en.select(1); // "one"
en.select(2); // "other"

Метод select

Основной метод select возвращает строковый идентификатор категории для переданного числа.

const ru = new Intl.PluralRules('ru');

ru.select(1); // "one"
ru.select(2); // "few"
ru.select(5); // "many"
ru.select(0); // "many"

Результат используется как ключ для выбора корректной строки интерфейса.

Типичный шаблон интеграции:

const messages = {
  ru: {
    one: 'товар',
    few: 'товара',
    many: 'товаров',
    other: 'товара'
  }
};

const n = 3;
const form = ru.select(n);

console.log(`${n} ${messages.ru[form]}`);

Кардинальные и порядковые формы

Кардинальные числа описывают количество объектов, тогда как порядковые — позицию в последовательности.

Кардинальные числа

const pr = new Intl.PluralRules('en', { type: 'cardinal' });

pr.select(1); // "one"
pr.select(2); // "other"

Порядковые числа

const ord = new Intl.PluralRules('en', { type: 'ordinal' });

ord.select(1); // "one"   -> 1st
ord.select(2); // "two"   -> 2nd
ord.select(3); // "few"   -> 3rd
ord.select(4); // "other" -> 4th

Формирование строк порядковых чисел обычно комбинируется с дополнительной логикой форматирования.


Особенности русской локали

Русский язык использует сложную систему согласования:

  • one — 1, 21, 31…
  • few — 2–4, 22–24…
  • many — 0, 5–20, 25–30…
  • other — используется для дробных значений
const ru = new Intl.PluralRules('ru');

ru.select(1);   // "one"
ru.select(2);   // "few"
ru.select(5);   // "many"
ru.select(21);  // "one"
ru.select(11);  // "many"

Дробные числа обрабатываются отдельно:

ru.select(1.5); // "many"

Это связано с тем, что дробные значения в большинстве языков не попадают в категории countable forms.


Использование с форматированием UI

На практике PluralRules применяется вместе с словарями форм:

const ru = new Intl.PluralRules('ru');

const forms = {
  one: 'сообщение',
  few: 'сообщения',
  many: 'сообщений',
  other: 'сообщения'
};

function formatMessages(n) {
  return `${n} ${forms[ru.select(n)]}`;
}

formatMessages(1);  // "1 сообщение"
formatMessages(3);  // "3 сообщения"
formatMessages(10); // "10 сообщений"

Такой подход устраняет необходимость писать условные конструкции с ручной логикой языка.


Локали и наследование правил

Intl.PluralRules опирается на CLDR (Common Locale Data Repository), где каждая локаль наследует набор правил.

Если локаль не указана явно, используется системная:

const pr = new Intl.PluralRules();

Поведение будет зависеть от окружения выполнения (браузер или Node.js).


Проверка поддерживаемых опций

Экземпляр предоставляет методы для анализа конфигурации:

const pr = new Intl.PluralRules('ru', { type: 'cardinal' });

pr.resolvedOptions();

Результат:

{
  locale: "ru",
  type: "cardinal",
  minimumIntegerDigits: 1,
  minimumFractionDigits: 0,
  maximumFractionDigits: 3,
  pluralCategories: ["one", "few", "many", "other"]
}

Поле pluralCategories отражает полный набор возможных форм для текущей локали.


Влияние числового формата

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

  • целые числа обрабатываются по одной схеме
  • дробные числа автоматически попадают в категорию other или many в зависимости от локали
  • большие числа не меняют принцип классификации

Интеграция с Intl.NumberFormat

Часто PluralRules используется совместно с форматированием чисел:

const nf = new Intl.NumberFormat('ru');
const pr = new Intl.PluralRules('ru');

function format(n) {
  return `${nf.format(n)} ${pr.select(n)}`;
}

В реальных приложениях PluralRules отвечает только за грамматическую форму, а NumberFormat — за визуальное представление числа.


Производительность и переиспользование экземпляров

Создание экземпляра Intl.PluralRules относительно дорого, поэтому типичная практика — повторное использование:

const ruPlural = new Intl.PluralRules('ru');

function getForm(n) {
  return ruPlural.select(n);
}

Это особенно важно в циклических рендерах интерфейсов и при обработке больших списков данных.


Поведение с отрицательными значениями

Отрицательные числа обрабатываются так же, как положительные:

const pr = new Intl.PluralRules('en');

pr.select(-1); // "one"
pr.select(-2); // "other"

Знак числа не влияет на категорию, учитывается только абсолютное значение.


Расширенные сценарии локализации

В сложных системах словари формируются динамически:

const dict = {
  ru: {
    one: (n) => `${n} файл`,
    few: (n) => `${n} файла`,
    many: (n) => `${n} файлов`,
    other: (n) => `${n} файла`
  }
};

const ru = new Intl.PluralRules('ru');

function format(n) {
  const form = ru.select(n);
  return dict.ru[form](n);
}

Такой подход позволяет учитывать контекст, например разные существительные или падежи.


Ограничения модели правил

Механизм PluralRules не выполняет:

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

Он работает исключительно на уровне числовой категории, предоставляя базовый строительный блок для интернационализации.