Метод select

Метод select относится к экземпляру Intl.PluralRules и предназначен для определения категории множественного числа для конкретного числового значения с учётом правил выбранной локали. Возвращаемое значение используется для построения корректных языковых форм при интернационализации интерфейсов, сообщений и динамического текста.

Синтаксис и структура вызова

Экземпляр Intl.PluralRules создаётся с указанием локали и дополнительных параметров:

const pr = new Intl.PluralRules(locale, options);

Метод select вызывается непосредственно у экземпляра:

pr.select(number);

Назначение метода

Метод определяет категорию множественного числа, к которой относится переданное значение. В разных языках набор категорий и правила их определения различаются. В стандартной модели ICU используются категории:

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

Однако конкретная локаль может поддерживать только часть этих категорий.

Логика работы select

Метод 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"

Типы правил: cardinal и ordinal

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

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"

Система включает расширенный набор категорий.

Использование select в шаблонах сообщений

Метод применяется для построения динамических сообщений:

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). Он выполняет следующие шаги:

  1. Нормализация числа
  2. Извлечение целой и дробной частей
  3. Применение правил локали
  4. Определение категории

Важно, что результат не зависит от форматирования числа, а только от его математического значения.

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

Создание 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, но требует осторожности при использовании в строгих системах локализации.