Порядковые числа в интернационализации отличаются от количественных тем, что отражают позицию элемента в последовательности: первый, второй, третий и так далее. В разных языках правила формирования порядковых числительных значительно различаются, и простое добавление суффиксов наподобие “st”, “nd”, “rd”, “th” (как в английском) не является универсальным решением.
В Globalize работа с порядковыми числительными опирается на данные CLDR (Unicode Common Locale Data Repository), где для каждой локали определены правила формирования ординалов и соответствующие языковые формы.
В основе механизма лежит концепция ordinal rules — набора правил, которые определяют форму порядкового числительного в зависимости от значения числа и языка.
Ключевой принцип:
В CLDR для каждой локали описано:
Например:
Globalize не содержит языковых данных внутри ядра. Все локализационные данные подключаются отдельно через CLDR JSON.
Минимальная подготовка включает:
Globalize.load(
require("cldr-data").all()
);
Globalize.loadMessages(
require("./messages/ru")
);
Globalize.locale("ru");
Важно учитывать: для корректной работы порядковых числительных должны
быть загружены данные numbers/ordinals для конкретной
локали.
В Globalize логика работы с ординалами строится вокруг выбора правильной языковой формы через CLDR.
Общий подход выглядит так:
Globalize предоставляет доступ к CLDR-правилам через внутренние механизмы, позволяя вычислять категорию порядкового числа.
Пример логики:
const globalize = new Globalize("en");
const ordinal = globalize.ordinal(1);
В реальных приложениях чаще используется не прямой вывод категории, а форматирование строки через заранее подготовленные шаблоны сообщений.
Практический способ работы с порядковыми числами в Globalize — использование сообщений с plural/ordinal rules.
{
"rank": "{count, ordinal, one {#st} two {#nd} few {#rd} other {#th}}"
}
const globalize = new Globalize("en");
const formatRank = globalize.messageFormatter("rank");
formatRank({ count: 1 }); // 1st
formatRank({ count: 2 }); // 2nd
formatRank({ count: 3 }); // 3rd
formatRank({ count: 4 }); // 4th
Система автоматически выбирает нужную форму на основе правил CLDR.
Порядковые числа тесно связаны с множественными формами, но имеют отдельный набор правил.
| Тип | Назначение | Пример |
|---|---|---|
| plural | количество объектов | 1 apple, 2 apples |
| ordinal | позиция | 1st place, 2nd place |
В Globalize это два разных механизма:
{ "place": "{count, ordinal, one {#st} two {#nd} few {#rd} other {#th}}" }
Результаты:
{ "place": "{count, ordinal, other {#e}}" }
Результаты:
{ "place": "{count, ordinal, other {#-й}}" }
Результаты:
CLDR определяет категории:
Каждая локаль может использовать часть этих категорий или все сразу.
Например:
Globalize использует эти категории как основу для выбора формы.
В некоторых языках ординалы зависят не только от последней цифры, но и от диапазонов значений.
Пример логики CLDR:
Globalize не требует ручного кодирования этих правил — они уже описаны в CLDR и применяются автоматически при выборе формы.
Порядковые числа часто используются в интерфейсах:
Пример:
const stepMessage = globalize.messageFormatter("step");
stepMessage({ count: 1 }); // 1st step
stepMessage({ count: 2 }); // 2nd step
Порядковые числительные часто используются вместе с другими форматами Globalize:
const dateFormatter = globalize.dateFormatter({ datetime: "medium" });
const rankFormatter = globalize.messageFormatter("rank");
const date = dateFormatter(new Date());
const rank = rankFormatter({ count: 1 });
Это позволяет строить полностью локализованные интерфейсы, где дата и порядковый номер подчиняются одной языковой модели.
Форматирование ординалов в Globalize зависит от:
Рекомендуется:
const rankFormatter = globalize.messageFormatter("rank");
// использовать многократно
for (let i = 1; i <= 10; i++) {
console.log(rankFormatter({ count: i }));
}
Globalize позволяет определять собственные правила отображения:
{
"level": "{count, ordinal, one {уровень #} other {уровень #}}"
}
Это особенно полезно, когда ординалы используются не как грамматическая конструкция, а как часть UI-логики (например, уровни доступа или прогресс).