Метод select относится к экземпляру
Intl.PluralRules и предназначен для определения категории
множественного числа для конкретного числового значения с учётом правил
выбранной локали. Возвращаемое значение используется для построения
корректных языковых форм при интернационализации интерфейсов, сообщений
и динамического текста.
Экземпляр Intl.PluralRules создаётся с указанием локали
и дополнительных параметров:
const pr = new Intl.PluralRules(locale, options);
Метод select вызывается непосредственно у
экземпляра:
pr.select(number);
Метод определяет категорию множественного числа, к которой относится переданное значение. В разных языках набор категорий и правила их определения различаются. В стандартной модели ICU используются категории:
zeroonetwofewmanyotherОднако конкретная локаль может поддерживать только часть этих категорий.
Метод select не форматирует число и не возвращает строку
с текстом. Его задача — вернуть строковый ключ категории, который затем
используется для выбора правильной языковой формы.
Пример:
const ruRules = new Intl.PluralRules('ru-RU');
ruRules.select(1); // "one"
ruRules.select(2); // "few"
ruRules.select(5); // "many"
В случае английского языка:
const enRules = new Intl.PluralRules('en-US');
enRules.select(1); // "one"
enRules.select(2); // "other"
enRules.select(10); // "other"
При создании экземпляра можно указать тип правил:
const cardinal = new Intl.PluralRules('en', { type: 'cardinal' });
const ordinal = new Intl.PluralRules('en', { type: 'ordinal' });
cardinal — количественные числительные (1, 2, 3
предмета)ordinal — порядковые числительные (1st, 2nd, 3rd)Для порядковых чисел категории отличаются:
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)
Метод select учитывает дробную часть числа, что важно
для языков, где дробные значения имеют отдельные правила.
const rules = new Intl.PluralRules('en-US');
rules.select(1.0); // "one"
rules.select(1.5); // "other"
rules.select(0.5); // "other"
В некоторых локалях дробные числа могут попадать в категорию
few или many, в зависимости от
CLDR-правил.
Метод работает с отрицательными значениями так же, как с положительными по модулю правил локали:
const rules = new Intl.PluralRules('en-US');
rules.select(-1); // "one"
rules.select(-2); // "other"
Специальные значения:
NaN обычно приводит к категории
"other"Infinity обрабатывается по правилам как нецелое
значениеrules.select(NaN); // "other"
rules.select(Infinity); // "other"
Разные языки имеют разные наборы правил.
const ru = new Intl.PluralRules('ru-RU');
ru.select(1); // "one"
ru.select(2); // "few"
ru.select(5); // "many"
ru.select(21); // "one"
Особенность: учитываются последние цифры числа, а также исключения 11–14.
const en = new Intl.PluralRules('en-US');
en.select(1); // "one"
en.select(0); // "other"
en.select(2); // "other"
Минимальная система: только one и
other.
const ar = new Intl.PluralRules('ar-EG');
ar.select(0); // "zero"
ar.select(1); // "one"
ar.select(2); // "two"
ar.select(3); // "few"
ar.select(11); // "many"
Система включает расширенный набор категорий.
Метод применяется для построения динамических сообщений:
const ru = new Intl.PluralRules('ru-RU');
function formatMessage(count) {
const form = ru.select(count);
const forms = {
one: 'сообщение',
few: 'сообщения',
many: 'сообщений',
other: 'сообщения'
};
return `${count} ${forms[form]}`;
}
Результат:
1 сообщение
2 сообщения
5 сообщений
Алгоритм работы select основан на Unicode CLDR (Common
Locale Data Repository). Он выполняет следующие шаги:
Важно, что результат не зависит от форматирования числа, а только от его математического значения.
Создание Intl.PluralRules — относительно дорогая
операция. Оптимальной считается модель повторного использования
экземпляра:
const rules = new Intl.PluralRules('ru-RU');
function getForm(n) {
return rules.select(n);
}
Создание нового экземпляра внутри функции снижает производительность при массовых вызовах.
Экземпляр Intl.PluralRules является неизменяемым. После
создания:
select всегда использует одну и ту же
конфигурациюЭто позволяет безопасно использовать объект в глобальных скоупах и сервисах.
Метод select часто используется совместно с
Intl.NumberFormat, но напрямую с ним не связан:
const nf = new Intl.NumberFormat('ru-RU');
const pr = new Intl.PluralRules('ru-RU');
function format(count) {
const category = pr.select(count);
return `${nf.format(count)} ${category}`;
}
На практике категория используется не напрямую, а как ключ для словарей языковых форм.
Метод select:
Его задача ограничена классификацией числа по грамматическим правилам.
Если в метод передаётся значение, которое не может быть преобразовано в число, оно приводится к числовому виду по правилам Jav * aScript:
rules.select("2"); // интерпретируется как 2
rules.select(null); // 0
rules.select(true); // 1
Такое поведение соответствует общей модели приведения типов в ECMAScript, но требует осторожности при использовании в строгих системах локализации.