Автоматическая обработка множественного числа

Обновлено: 2 квартала назад · 3 мин чтения

Альфа

Compiler от Lingo.dev находится в альфа-версии. Он нестабилен, не рекомендуется для использования в production, а API могут меняться от релиза к релизу.

Compiler от Lingo.dev определяет формы множественного числа в JSX-тексте и автоматически преобразует их в ICU MessageFormat. Вместо того чтобы вручную задавать правила множественного числа для каждого языка, просто пишите естественный текст с числовыми значениями, а компилятор с помощью LLM сгенерирует корректные формы.

Как это работает#

1

Compiler определяет числовые паттерны

Во время анализа AST компилятор находит текстовые узлы, в которых интерполированные числа стоят рядом со словами, зависящими от количества. Например, You have {count} items содержит числовую переменную рядом со словом, форма которого меняется в зависимости от числа.

2

LLM классифицирует формы множественного числа

Небольшая и быстрая LLM (настраивается через pluralization.model) анализирует текст и определяет, каким словам нужна форма множественного числа. Затем она подбирает соответствующие категории множественного числа CLDR для каждой целевой локали.

3

Генерируется ICU MessageFormat

Компилятор создаёт строку ICU MessageFormat, которая учитывает все категории множественного числа, необходимые для целевого языка.

Пример#

Исходный JSX:

tsx
<p>You have {count} items in your cart</p>

Сгенерированный результат для английского:

text
{count, plural, one {You have 1 item in your cart} other {You have # items in your cart}}

Сгенерированный результат для русского (в котором четыре категории множественного числа):

text
{count, plural, one {У вас # товар в корзине} few {У вас # товара в корзине} many {У вас # товаров в корзине} other {У вас # товаров в корзине}}

Категории множественного числа CLDR#

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

КатегорияОписаниеПримеры языков
zeroНулевое количествоАрабский, латышский
oneЕдинственное числоАнглийский, французский, немецкий, испанский
twoДвойственное числоАрабский, иврит, словенский
fewНесколько / малое количествоРусский, чешский, польский
manyБольшое количествоРусский, арабский, польский
otherОбщая / по умолчанию (всегда обязательна)Все языки

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

Конфигурация#

Обработка множественного числа включена по умолчанию. Настроить её можно в параметрах компилятора:

ts
{
  pluralization: {
    enabled: true,
    model: "groq:llama-3.1-8b-instant",
  },
}
ПараметрТипПо умолчаниюОписание
pluralization.enabledbooleantrueВключает или отключает автоматическое определение форм множественного числа.
pluralization.modelstring"groq:llama-3.1-8b-instant"Модель LLM для определения форм множественного числа. Достаточно небольшой модели, поскольку эта задача проще, чем перевод.

Чтобы полностью отключить обработку множественного числа:

ts
{
  pluralization: {
    enabled: false,
  },
}

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

Когда применяется обработка множественного числа#

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

  • Текст с интерполированными числовыми переменными: {count} items, {n} messages
  • Текст с числовыми литералами: You have 5 items (реже встречается в динамическом UI)

Компилятор не применяет обработку множественного числа к:

  • Тексту без числовой привязки: Items in cart (нет числа, по которому можно выбрать форму)
  • Тексту, где число не связано напрямую со словом, зависящим от количества

Пишите естественный текст в JSX. Compiler и его LLM сами определят формы множественного числа и сгенерируют ICU-форматирование — вам не нужно изучать синтаксис ICU MessageFormat.

Что дальше#