Автоматическое определение форм множественного числа

@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 корректно обрабатывает все варианты.

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

  1. Компилятор находит интерполяции с числовыми значениями
  2. Отправляет текст в LLM для определения форм множественного числа
  3. LLM возвращает шаблон ICU MessageFormat, если обнаружена множественная форма
  4. Компилятор внедряет перевод с поддержкой множественного числа

Всё происходит автоматически — менять код не нужно.

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

{
  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, который определил компилятор.

Дальше