Ordinal формы

Ординальные формы (ordinal numbers) используются для обозначения порядка элементов в последовательности: 1-й, 2-й, 3-й, 4-й и так далее. В отличие от количественных числительных (one, two, three), ординальные формы зависят от языковых правил и могут существенно отличаться между локалями.

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

В i18next ординальные формы интегрированы через механизм plural rules, основанный на стандарте CLDR (Common Locale Data Repository).


Лингвистическая природа ординальных форм

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

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

    • 1st, 2nd, 3rd, 4th
  • В русском:

    • 1-й, 2-й, 3-й, 4-й
  • В немецком:

    • 1., 2., 3., 4.
  • В французском:

    • 1er, 2e, 3e

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


CLDR-правила и категории ordinal

В CLDR ординальные формы описываются через набор категорий:

  • one
  • two
  • few
  • many
  • other

Однако конкретный набор зависит от языка. Например:

Английский (en)

  • one → 1st
  • two → 2nd
  • few → 3rd
  • other → 4th, 5th, 6th…

Фактически английский использует упрощённую систему, где логика сводится к последним цифрам числа.

Польский (pl)

Система значительно сложнее:

  • one → 1.
  • few → 2–4
  • many → 5–21
  • other → остаток

Ординальные формы в i18next

В 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"
}

Включение ordinal в plural resolver

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 });

Разделение cardinal и ordinal форм

Ключевым моментом является различие между:

  • cardinal (количественные формы) — сколько предметов
  • ordinal (порядковые формы) — какой по счёту

В i18next эти два режима используют одну и ту же систему plural rules, но различаются контекстом вычисления.

Пример cardinal:

t("apple", { count: 2 });

Пример ordinal:

t("place", { count: 2, ordinal: true });

Структура ресурсов для ordinal форм

Корректная организация переводов требует разделения ключей.

Пример для английского языка

{
  "place_one": "{{count}}st place",
  "place_two": "{{count}}nd place",
  "place_few": "{{count}}rd place",
  "place_other": "{{count}}th place"
}

Использование namespace подхода

{
  "ranking": {
    "place_one": "{{count}}st",
    "place_two": "{{count}}nd",
    "place_few": "{{count}}rd",
    "place_other": "{{count}}th"
  }
}
t("ranking:place", { count: 21, ordinal: true });

Особенности языковых различий

Английский язык

Используется правило последних цифр:

  • 1 → st
  • 2 → nd
  • 3 → rd
  • 11–13 → th (исключение)

Эти исключения обрабатываются внутри plural rules CLDR.


Славянские языки

Ординальные формы часто совпадают с родовыми формами числительных, но могут влиять на:

  • падеж
  • род существительного
  • структуру фразы

В i18next это требует более детализированных ключей.


Романские языки

Часто используется минимальное изменение:

  • добавление суффикса “e” (2e, 3e)
  • или точка (1., 2.)

Форматирование через интерполяцию

i18next активно использует интерполяцию значений:

t("rank", {
  count: 1,
  ordinal: true,
  postProcess: "interval",
  value: 1
});

Пример строки:

{{value}}{{suffix}} place

Кастомизация ordinal логики

Хотя 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;
  }
});

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


Обработка чисел с suffix logic

Часто ординальные формы реализуются не через отдельные ключи, а через суффиксы:

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) });

Интеграция ordinal форм в UI-структуры

Ординальные формы часто применяются в интерфейсах:

  • рейтинги (1st place)
  • списки лидеров
  • шаги инструкций
  • нумерация страниц
  • onboarding-процессы

В i18next важно учитывать, что ordinal влияет не только на слово, но и на структуру предложения.


Ошибки при работе с ordinal формами

Смешивание cardinal и ordinal ключей

Неправильно:

t("items", { count: 1, ordinal: true });

если “items” не содержит ordinal-правил.


Игнорирование исключений языка

Особенно критично для английского (11th, 12th, 13th).


Отсутствие fallback-форм

Если ordinal ключи не определены, i18next может вернуться к “other”, что приведёт к грамматически неверным результатам.


Стратегии масштабирования переводов

При росте проекта ординальные формы обычно структурируются следующим образом:

  • отдельные ключи для ordinal-логики
  • разделение по namespace (ui, ranking, onboarding)
  • централизованные suffix-форматтеры
  • использование CLDR через встроенный pluralResolver i18next

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