Автоматическое определение форм множественного числа
@lingo.dev/compiler автоматически определяет формы множественного числа в вашем тексте и преобразует их в ICU MessageFormat для корректного отображения во всех языках.
Что делает
Компилятор с помощью ИИ определяет, когда в тексте есть формы множественного числа (например, «1 элемент» и «5 элементов»), и преобразует их в синтаксис ICU MessageFormat.
До (ваш код):
<p>You have {count} items</p>
После (скомпилировано):
<p>{count, plural, one {You have 1 item} other {You have # items}}</p>
В разных языках разные правила для множественного числа. В арабском — 6 форм, в русском — 4, в английском — 2. ICU MessageFormat корректно обрабатывает все варианты.
Как это работает
- Компилятор находит интерполяции с числовыми значениями
- Отправляет текст в LLM для определения форм множественного числа
- LLM возвращает шаблон ICU MessageFormat, если обнаружена множественная форма
- Компилятор внедряет перевод с поддержкой множественного числа
Всё происходит автоматически — менять код не нужно.
Конфигурация
{
pluralization: {
enabled: true, // Default: true
model: "groq:llama-3.1-8b-instant", // Fast model for plural detection
}
}
Модель: Использует отдельную (быструю) модель для определения форм множественного числа, чтобы снизить расходы. По умолчанию используется самая быстрая модель Groq.
Примеры
Простые формы множественного числа
<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}
}
Форма для нуля
<p>You have {unreadCount} unread messages</p>
Преобразуется в:
{unreadCount, plural,
=0 {You have no unread messages}
one {You have 1 unread message}
other {You have # unread messages}
}
Сложные формы множественного числа
<p>{days} days and {hours} hours remaining</p>
Становится:
{days, plural,
one {1 day}
other {# days}
} and {hours, plural,
one {1 hour}
other {# hours}
} remaining
Языковые особенности
ICU MessageFormat автоматически обрабатывает сложные правила множественного числа:
Английский (2 формы):
- one: 1 item
- other: 0 items, 2 items, 100 items
Русский (4 формы):
- one: 1, 21, 31, 41... (оди́н элеме́нт)
- few: 2-4, 22-24... (два элеме́нта)
- many: 0, 5-20, 25-30... (пять элеме́нтов)
- other: 1.5, 2.5... (1.5 элеме́нта)
Арабский (6 форм):
- zero: 0
- one: 1
- two: 2
- few: 3-10
- many: 11-99
- other: 100+
Компилятор генерирует правильные формы для каждой целевой локали.
Отключение множественного числа
Если в вашем приложении не используются формы множественного числа или вы хотите обрабатывать их вручную:
{
pluralization: {
enabled: false,
}
}
Это полностью пропускает определение множественного числа, уменьшая количество обращений к LLM.
Ручные формы множественного числа
Вы можете писать ICU MessageFormat прямо в коде:
<p>
{formatMessage(
{ id: "items", defaultMessage: "{count, plural, one {# item} other {# items}}" },
{ count }
)}
</p>
Компилятор не будет пытаться определить формы — будет использоваться ваш формат.
Производительность
Определение форм множественного числа добавляет небольшую нагрузку:
- Один дополнительный вызов LLM на каждый уникальный текст с числовыми вставками
- Используется быстрый модель (по умолчанию: Groq llama-3.1-8b-instant)
- Результаты кэшируются — при следующих сборках используются уже найденные формы
Стоимость: Незначительная. Быстрые модели стоят доли цента за запрос.
Часто задаваемые вопросы
Работает ли это для всех языков? Да. ICU MessageFormat поддерживает 200+ языков с правильными правилами множественного числа.
Что если ИИ ошибётся?
Используйте data-lingo-override, чтобы указать точные переводы с правильными формами:
<p data-lingo-override={{
es: "{count, plural, one {1 artículo} other {# artículos}}"
}}>
{count} items
</p>
Можно ли настроить модель для определения форм?
Да. Установите pluralization.model на любую поддерживаемую LLM. По умолчанию используется оптимизированная для скорости и стоимости.
Это увеличивает размер бандла? Немного. Шаблоны ICU MessageFormat чуть больше обычных строк. Влияние минимальное.
А как насчёт вложенных форм множественного числа? Поддерживается. Компилятор обрабатывает несколько переменных во множественном числе в одной строке.
Нужно ли отмечать формы множественного числа?
Нет. Компилятор определяет их автоматически, когда pluralization.enabled: true.
Отладка
Чтобы увидеть найденные формы множественного числа, проверьте .lingo/metadata.json:
{
"translations": {
"abc123": {
"source": "You have {count} items",
"pattern": "{count, plural, one {You have 1 item} other {You have # items}}",
"locales": {
"es": "{count, plural, one {Tienes 1 artículo} other {Tienes # artículos}}"
}
}
}
}
Поле pattern показывает ICU MessageFormat, который определил компилятор.
Дальше
- Ручная настройка — вручную задайте формы множественного числа
- Справочник по настройке — параметры множественного числа
- Руководство по ICU MessageFormat — изучите синтаксис ICU