API Intl.PluralRules предоставляет механизм определения
грамматической формы числа в зависимости от локали. Это ключевой
инструмент для корректной интернационализации интерфейсов, где требуется
согласование существительных с числительными.
Множественные формы зависят от языка: в английском обычно две формы (one / other), в русском — несколько (one, few, many, other), в арабском их количество ещё больше. Встроенные правила учитывают лингвистические особенности без ручной реализации логики.
Базовая инициализация выполняется через конструктор с указанием локали и опциональных параметров:
const pr = new Intl.PluralRules('ru');
Локаль определяет набор правил, применяемых при вычислении категории.
Возможна настройка поведения через второй аргумент:
const pr = new Intl.PluralRules('ru', {
type: 'cardinal'
});
Параметр type принимает два значения:
cardinal — количественные числительные (1, 2, 5
книг)ordinal — порядковые числительные (1-й, 2-й, 5-й)Метод классифицирует число в одну из категорий CLDR:
zeroonetwofewmanyotherНабор используемых категорий зависит от локали. Например, в
английском языке активны только one и
other.
const en = new Intl.PluralRules('en');
en.select(1); // "one"
en.select(2); // "other"
Основной метод 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.
На практике 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 в зависимости от локалиЧасто 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 не выполняет:
Он работает исключительно на уровне числовой категории, предоставляя базовый строительный блок для интернационализации.