Ординальные формы (ordinal numbers) используются для обозначения порядка элементов в последовательности: 1-й, 2-й, 3-й, 4-й и так далее. В отличие от количественных числительных (one, two, three), ординальные формы зависят от языковых правил и могут существенно отличаться между локалями.
В системах интернационализации ординальность рассматривается как отдельный тип множественного числа, поскольку правила построения форм не совпадают с классическим pluralization.
В i18next ординальные формы интегрированы через механизм plural rules, основанный на стандарте CLDR (Common Locale Data Repository).
Ординальные числительные в разных языках формируются по разным принципам:
В английском:
В русском:
В немецком:
В французском:
С точки зрения локализации, важно не только добавление суффикса, но и выбор грамматической формы слова, сопровождающего число.
В CLDR ординальные формы описываются через набор категорий:
Однако конкретный набор зависит от языка. Например:
Фактически английский использует упрощённую систему, где логика сводится к последним цифрам числа.
Система значительно сложнее:
В i18next ординальные формы реализуются через расширение pluralization logic. Библиотека использует правила CLDR и позволяет задавать переводы отдельно для ordinal-режима.
Основная идея: ординальность рассматривается как отдельный контекст множественного числа.
В ресурсах переводов используются специальные суффиксы:
{
"item_ordinal_one": "{{count}}st item",
"item_ordinal_two": "{{count}}nd item",
"item_ordinal_few": "{{count}}rd item",
"item_ordinal_other": "{{count}}th item"
}
Однако чаще применяется более универсальный формат:
{
"item_ordinal_one": "{{count}}st",
"item_ordinal_two": "{{count}}nd",
"item_ordinal_few": "{{count}}rd",
"item_ordinal_other": "{{count}}th"
}
i18next позволяет использовать ординальные формы через параметр
ordinal: true при запросе перевода.
Пример:
import i18next from "i18next";
i18next.init({
lng: "en",
resources: {
en: {
translation: {
position_one: "{{count}}st",
position_two: "{{count}}nd",
position_few: "{{count}}rd",
position_other: "{{count}}th"
}
}
}
});
Использование:
i18next.t("position", { count: 1, ordinal: true });
i18next.t("position", { count: 2, ordinal: true });
i18next.t("position", { count: 3, ordinal: true });
i18next.t("position", { count: 4, ordinal: true });
Ключевым моментом является различие между:
В i18next эти два режима используют одну и ту же систему plural rules, но различаются контекстом вычисления.
Пример cardinal:
t("apple", { count: 2 });
Пример ordinal:
t("place", { count: 2, ordinal: true });
Корректная организация переводов требует разделения ключей.
{
"place_one": "{{count}}st place",
"place_two": "{{count}}nd place",
"place_few": "{{count}}rd place",
"place_other": "{{count}}th place"
}
{
"ranking": {
"place_one": "{{count}}st",
"place_two": "{{count}}nd",
"place_few": "{{count}}rd",
"place_other": "{{count}}th"
}
}
t("ranking:place", { count: 21, ordinal: true });
Используется правило последних цифр:
Эти исключения обрабатываются внутри plural rules CLDR.
Ординальные формы часто совпадают с родовыми формами числительных, но могут влиять на:
В i18next это требует более детализированных ключей.
Часто используется минимальное изменение:
i18next активно использует интерполяцию значений:
t("rank", {
count: 1,
ordinal: true,
postProcess: "interval",
value: 1
});
Пример строки:
{{value}}{{suffix}} place
Хотя i18next использует CLDR, возможна настройка через кастомные plural rules.
Пример расширения:
i18next.services.pluralResolver.addRule("xx", {
numbers: [1, 2, 3, 4],
plurals: function (n) {
return n === 1 ? 0 : n === 2 ? 1 : 2;
}
});
Это позволяет внедрять нестандартные ординальные системы, например для игровых приложений или доменных языков.
Часто ординальные формы реализуются не через отдельные ключи, а через суффиксы:
const getSuffix = (n) => {
const mod10 = n % 10;
const mod100 = n % 100;
if (mod100 >= 11 && mod100 <= 13) return "th";
if (mod10 === 1) return "st";
if (mod10 === 2) return "nd";
if (mod10 === 3) return "rd";
return "th";
};
Использование:
const value = 22;
t("rank", { value, suffix: getSuffix(value) });
Ординальные формы часто применяются в интерфейсах:
В i18next важно учитывать, что ordinal влияет не только на слово, но и на структуру предложения.
Неправильно:
t("items", { count: 1, ordinal: true });
если “items” не содержит ordinal-правил.
Особенно критично для английского (11th, 12th, 13th).
Если ordinal ключи не определены, i18next может вернуться к “other”, что приведёт к грамматически неверным результатам.
При росте проекта ординальные формы обычно структурируются следующим образом:
Такая структура уменьшает дублирование и упрощает поддержку многоязычных интерфейсов.