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

В системе интернационализации Globalize обработка кардинальных чисел опирается на правила множественности (plural rules), определяемые стандартом CLDR. Кардинальные числа используются для обозначения количества предметов: 1 элемент, 2 элемента, 5 элементов и так далее. В разных языках набор форм множественного числа отличается, и именно эта вариативность становится центральной задачей при форматировании сообщений.

Основой работы служит модуль plural, который определяет категорию числа: one, few, many, other и другие, в зависимости от локали. Эти категории не являются универсальными — их состав и логика полностью зависят от языковых правил, описанных в CLDR. Например, в английском языке различаются только two формы (one и other), тогда как в славянских языках используется более сложная система.

CLDR (Unicode Common Locale Data Repository) определяет правила, по которым числовое значение преобразуется в категорию множественности. Globalize использует эти данные без упрощений, обеспечивая корректную локализацию.

Каждая локаль содержит функцию выбора формы:

  • one — для единственного числа
  • few — для малого количества (характерно для некоторых языков)
  • many — для больших чисел или особых случаев
  • other — форма по умолчанию

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

Определение категории числа

В Globalize категория кардинального числа вычисляется через механизм plural:

Globalize.locale("ru");

const pluralForm = Globalize.plural(2);
// few

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

Внутренний процесс включает:

  • разбор числа
  • применение правил CLDR для текущей локали
  • возврат категории множественности

Связь кардинальных чисел с форматированием сообщений

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

Globalize предоставляет механизм сообщений через форматтер, который учитывает plural rules.

const messages = {
  item: {
    one: "{count} элемент",
    few: "{count} элемента",
    many: "{count} элементов",
    other: "{count} элемента"
  }
};

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

Globalize.locale("ru");

const messageFormatter = Globalize.messageFormatter(messages);

messageFormatter("item", { count: 1 });
messageFormatter("item", { count: 2 });
messageFormatter("item", { count: 5 });

Каждый вызов приводит к выбору соответствующей формы в зависимости от результата plural-алгоритма.

Интеграция с числовым форматированием

Кардинальные числа часто используются совместно с форматированием чисел через numberFormatter. Это позволяет согласовать визуальное представление числа и его грамматическую форму.

const numberFormatter = Globalize.numberFormatter();

const count = 21;
const formattedNumber = numberFormatter(count);

Далее значение может быть встроено в сообщение, где plural определяет форму слова:

messageFormatter("item", { count });

Таким образом, система разделяет:

  • форматирование числа
  • грамматическую интерпретацию числа

Локализационные различия

Разные языки демонстрируют принципиально разные правила кардинальных чисел.

В английской локали:

  • 1 → one
  • 2, 3, 10 → other

В русской локали:

  • 1 → one
  • 2–4 → few
  • 5–20 → many
  • 21 → one (по модулю 10)
  • 11–14 → many (исключение)

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

Алгоритм выбора формы

Процесс определения формы можно описать последовательностью шагов:

  1. Получение числового значения
  2. Определение текущей локали
  3. Загрузка правил plural для локали
  4. Применение правил к числу
  5. Возврат категории
  6. Использование категории в message formatter

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

Использование в структурах сообщений

Кардинальные числа в Globalize поддерживаются через объектные структуры сообщений, где каждая форма задаётся отдельно.

{
  notification: {
    one: "{count} уведомление",
    few: "{count} уведомления",
    many: "{count} уведомлений",
    other: "{count} уведомления"
  }
}

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

Поведение при отсутствии формы

Если для конкретной категории не определено правило в сообщении, Globalize использует fallback на other. Это гарантирует стабильность работы даже при неполной локализации.

Пример:

{
  item: {
    other: "{count} items"
  }
}

В этом случае независимо от результата plural всегда будет использована форма other.

Особенности работы с дробными числами

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

Globalize.plural(1.5);

Результат зависит от локали и правил CLDR, а не от фиксированного поведения библиотеки.

Взаимодействие с форматированными числами

Важно различать сырой числовой ввод и отформатированное представление. Globalize использует исходное числовое значение для plural, даже если отображаемое значение изменено форматтером.

const count = 1000;
numberFormatter(count); // "1,000"
plural(count); // используется 1000, а не строка

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

Роль кардинальных чисел в архитектуре Globalize

Система кардинальных чисел является связующим звеном между числовыми данными и языковой моделью. Она обеспечивает:

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

Механизм построен таким образом, чтобы расширение на новые языки не требовало изменения логики приложения, ограничиваясь добавлением CLDR-данных и шаблонов сообщений.