В системе интернационализации Globalize обработка кардинальных чисел опирается на правила множественности (plural rules), определяемые стандартом CLDR. Кардинальные числа используются для обозначения количества предметов: 1 элемент, 2 элемента, 5 элементов и так далее. В разных языках набор форм множественного числа отличается, и именно эта вариативность становится центральной задачей при форматировании сообщений.
Основой работы служит модуль plural, который определяет категорию числа: one, few, many, other и другие, в зависимости от локали. Эти категории не являются универсальными — их состав и логика полностью зависят от языковых правил, описанных в CLDR. Например, в английском языке различаются только two формы (one и other), тогда как в славянских языках используется более сложная система.
CLDR (Unicode Common Locale Data Repository) определяет правила, по которым числовое значение преобразуется в категорию множественности. Globalize использует эти данные без упрощений, обеспечивая корректную локализацию.
Каждая локаль содержит функцию выбора формы:
Результат вычисляется на основе числового значения и правил конкретного языка, а не фиксированного диапазона.
В Globalize категория кардинального числа вычисляется через механизм plural:
Globalize.locale("ru");
const pluralForm = Globalize.plural(2);
// few
Функция анализирует число и возвращает строковый идентификатор категории. Этот идентификатор затем используется для выбора правильной языковой формы в сообщениях.
Внутренний процесс включает:
Кардинальные числа редко используются изолированно. Основное применение связано с динамическими сообщениями, где требуется подстановка корректной формы слова.
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 });
Таким образом, система разделяет:
Разные языки демонстрируют принципиально разные правила кардинальных чисел.
В английской локали:
В русской локали:
Globalize не использует упрощённые диапазоны, а строго следует CLDR, что делает поведение предсказуемым для каждой локали.
Процесс определения формы можно описать последовательностью шагов:
Этот механизм отделяет бизнес-логику от языковой специфики, позволяя изменять локаль без переписывания кода.
Кардинальные числа в 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, а не строка
Это разделение предотвращает ошибки при локализации сложных числовых форм.
Система кардинальных чисел является связующим звеном между числовыми данными и языковой моделью. Она обеспечивает:
Механизм построен таким образом, чтобы расширение на новые языки не требовало изменения логики приложения, ограничиваясь добавлением CLDR-данных и шаблонов сообщений.