Альфа
Compiler от Lingo.dev находится в альфа-версии. Он нестабилен, не рекомендуется для использования в production, а API могут меняться от релиза к релизу.
Compiler от Lingo.dev определяет формы множественного числа в JSX-тексте и автоматически преобразует их в ICU MessageFormat. Вместо того чтобы вручную задавать правила множественного числа для каждого языка, просто пишите естественный текст с числовыми значениями, а компилятор с помощью LLM сгенерирует корректные формы.
Как это работает#
Compiler определяет числовые паттерны
Во время анализа AST компилятор находит текстовые узлы, в которых интерполированные числа стоят рядом со словами, зависящими от количества. Например, You have {count} items содержит числовую переменную рядом со словом, форма которого меняется в зависимости от числа.
LLM классифицирует формы множественного числа
Небольшая и быстрая LLM (настраивается через pluralization.model) анализирует текст и определяет, каким словам нужна форма множественного числа. Затем она подбирает соответствующие категории множественного числа CLDR для каждой целевой локали.
Генерируется ICU MessageFormat
Компилятор создаёт строку ICU MessageFormat, которая учитывает все категории множественного числа, необходимые для целевого языка.
Пример#
Исходный JSX:
<p>You have {count} items in your cart</p>Сгенерированный результат для английского:
{count, plural, one {You have 1 item in your cart} other {You have # items in your cart}}Сгенерированный результат для русского (в котором четыре категории множественного числа):
{count, plural, one {У вас # товар в корзине} few {У вас # товара в корзине} many {У вас # товаров в корзине} other {У вас # товаров в корзине}}Категории множественного числа CLDR#
В разных языках используются разные подмножества шести категорий множественного числа CLDR. Компилятор генерирует только те категории, которые нужны для каждой целевой локали:
| Категория | Описание | Примеры языков |
|---|---|---|
zero | Нулевое количество | Арабский, латышский |
one | Единственное число | Английский, французский, немецкий, испанский |
two | Двойственное число | Арабский, иврит, словенский |
few | Несколько / малое количество | Русский, чешский, польский |
many | Большое количество | Русский, арабский, польский |
other | Общая / по умолчанию (всегда обязательна) | Все языки |
В английском используются one и other. В русском — one, few, many и other. В арабском используются все шесть категорий. Компилятор автоматически учитывает это для каждой локали.
Конфигурация#
Обработка множественного числа включена по умолчанию. Настроить её можно в параметрах компилятора:
{
pluralization: {
enabled: true,
model: "groq:llama-3.1-8b-instant",
},
}| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
pluralization.enabled | boolean | true | Включает или отключает автоматическое определение форм множественного числа. |
pluralization.model | string | "groq:llama-3.1-8b-instant" | Модель LLM для определения форм множественного числа. Достаточно небольшой модели, поскольку эта задача проще, чем перевод. |
Чтобы полностью отключить обработку множественного числа:
{
pluralization: {
enabled: false,
},
}Если отключить обработку множественного числа, компилятор будет переводить текст с числами как обычные строки. В языках со сложными правилами множественного числа итоговый перевод может быть грамматически некорректным для некоторых количественных форм.
Когда применяется обработка множественного числа#
Компилятор определяет паттерны множественного числа в следующих случаях:
- Текст с интерполированными числовыми переменными:
{count} items,{n} messages - Текст с числовыми литералами:
You have 5 items(реже встречается в динамическом UI)
Компилятор не применяет обработку множественного числа к:
- Тексту без числовой привязки:
Items in cart(нет числа, по которому можно выбрать форму) - Тексту, где число не связано напрямую со словом, зависящим от количества
Пишите естественный текст в JSX. Compiler и его LLM сами определят формы множественного числа и сгенерируют ICU-форматирование — вам не нужно изучать синтаксис ICU MessageFormat.
