ICU MessageFormat — это библиотека для форматирования сообщений с поддержкой сложных правил множественного числа (pluralization). Она позволяет корректно формировать текст в зависимости от количества объектов, учитывая языковые особенности, неправильные формы и контекст. В отличие от стандартных библиотек, ICU учитывает не только числовое значение, но и грамматику языка, включая случаи, когда форма слова зависит от предшествующего или последующего текста.

ICU MessageFormat: базовые принципы работы с множественным числом и выбор формата вывода

Библиотека ICU MessageFormat работает на основе шаблонов, содержащих специальные маркеры для выбора формы слова. Основной синтаксис использует ключевое слово {variable} с указанием параметров plural и select.

Стандартный шаблон выглядит так: {count, plural, =0{нет объектов} =1{один объект} other{объектов}}. Здесь count — переменная с числом, а внутри фигурных скобок задаются условия выбора текста.

Для простых случаев достаточно стандартных библиотек, если язык имеет регулярные правила образования множественного числа (например, добавление 's' в английском). Однако для языков с сложной грамматикой или неправильными формами требуется ICU.

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

Практическая реализация: настройка правил для сложных случаев (неправильные формы, контекстная зависимость)

Настройка правил для сложных случаев начинается с определения условий выбора формы. Для неправильных форм (например, 'mouse' -> 'mice') используется ключевое слово select с указанием условия.

Пример шаблона: {count, plural, =0{нет мышей} =1{мышь} other{мыши}}. Здесь условие other применяется ко всем числам, кроме 0 и 1. Для неправильных форм необходимо явно указать их в условиях.

Контекстная зависимость реализуется через использование специальных маркеров, которые учитывают соседние слова. Например, если слово 'mouse' используется в предложении 'The mouse is…', то форма будет зависеть от артикля 'the'.

В ICU MessageFormat можно использовать переменные для хранения промежуточных результатов и их последующего использования в других частях шаблона. Это позволяет создавать сложные конструкции с минимальным количеством кода.

Критерии выбора стратегии: когда использовать ICU, а когда достаточно стандартных библиотек

Использовать ICU MessageFormat необходимо, если требуется поддержка сложных правил множественного числа, включая неправильные формы и контекстную зависимость. Стандартные библиотеки не умеют учитывать эти факторы.

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

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

Типичные ошибки при работе с множественным числом и способы их предотвращения

Одной из типичных ошибок является игнорирование контекстной зависимости. Например, в английском языке форма слова 'mouse' зависит от артикля 'the'. Если не учесть это, текст будет выглядеть некорректно.

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

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

Ограничения ICU MessageFormat: что он не умеет делать и как это обойти

ICU MessageFormat не поддерживает динамическую генерацию правил на лету. Все правила должны быть заданы заранее в виде шаблонов.

Библиотека также не умеет учитывать контекстную зависимость, если она не описана в правилах CLDR. Для таких случаев необходимо вручную добавлять дополнительные условия в шаблон.

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

Вопросы и ответы

Как проверить, поддерживает ли ICU MessageFormat неправильные формы?

ICU MessageFormat поддерживает неправильные формы через использование ключа select в шаблоне. Например, для 'mouse' -> 'mice' необходимо явно указать это условие.

Можно ли использовать ICU MessageFormat без настройки правил?

Нет, ICU MessageFormat требует предварительной настройки правил для каждого языка и случая использования. Без этого библиотека не сможет корректно формировать текст.

По теме

// Пример шаблона с неправильной формой
const message = new ICU.Message('{count, plural, =0{нет мышей} =1{мышь} other{мыши}}');
console.log(message.format(1)); // Вывод: 'мышь'
console.log(message.format(2)); // Вывод: 'мыши'