Синтаксис формата сообщений ICU используется значительным количеством библиотек и решений i18n. Возможно, вы сами использовали этот формат.

Основное сообщение и сообщение во множественном числе в формате сообщения ICU

Синтаксис интуитивно понятен. Если вы хоть немного знакомы с i18n / l10n, вы, вероятно, сможете понять, что происходит, в файле перевода выше.

Хотя синтаксис сообщений ICU может быть интуитивно понятным, в формате сообщения есть несколько вещей, которые могут немного сбивать с толку. Различные библиотеки i18n реализуют разные подмножества ICU. И, конечно же, то, что на самом деле есть, часто само по себе может стать источником путаницы. В этой статье мы хотим раскрыть некоторые из этих загадок, а также рассказать о практическом использовании сообщений ICU при интернационализации и локализации наших приложений.

Что такое ОИТ в целом?

Согласно официальной документации, ICU означает Международные компоненты для Unicode: набор переносимых библиотек, предназначенных для облегчения работы с i18n для разработчиков Java и C / C ++.

🗒 Примечание » С момента создания ICU реализации библиотек расширились за пределы Java и C / C ++, и теперь их можно найти на других языках. См. Какие библиотеки i18n используют формат сообщений ICU? для получения дополнительной информации.

Библиотеки ICU охватывают гораздо больше, чем просто сообщения о переводе. Как вы, вероятно, можете заключить из названия, ICU тесно связан с международным стандартом кодировки символов Unicode. Набор библиотек ICU предоставляет утилиты для работы с Unicode в Java и C / C ++. Он также обеспечивает функциональность для i18n.

Официальные библиотеки ICU

Ниже приводится краткий обзор некоторых различных модулей, составляющих набор библиотек ICU.

  • Строки Unicode - Предоставляет макросы и утилиты для работы со строками Unicode.
  • Преобразование - обрабатывает преобразование между кодировкой символов Unicode и кодировкой, отличной от Unicode.
  • Локаль - имеет дело с концепцией локали i18n (язык вместе с необязательной страной и вариантом скрипта), а также с информацией, относящейся к этой локали, такой как календарь, валюта и т. Д. не поддерживается.
  • Ресурсы - обрабатывает пакеты ресурсов, которые фактически являются файлами сообщений перевода - например, es_MX или набор ресурсов "Испано-мексиканский" - и получение содержимого этих пакетов.
  • Службы даты / времени - обрабатывает представление часовых поясов и обеспечивает логику для работы с различными видами календарей.
  • Форматирование - имеет дело с отображением текста, особенно при интернационализации, с упором на отображение чисел, дат, времени и сообщений (переведенных строк). Этот модуль, конечно же, описывает формат сообщений ICU и представляет для нас особый интерес.

🔗 Ресурс » Мы просто представляем здесь некоторые модули ICU. Ознакомьтесь с Руководством пользователя ICU, чтобы получить исчерпывающий обзор всего, что ICU может предложить.

Формат сообщений ICU

Сам ICU представляет собой общий набор библиотек для Unicode и i18n. Одна из этих библиотек / модулей занимается форматированием текста i18n и обеспечивает синтаксис формата сообщений ICU. Формат сообщений ICU является мощным и достаточно гибким, чтобы развиться на основе Java и C / ++, и был перенесен на несколько других языков и платформ. В следующем разделе Какие библиотеки i18n используют формат сообщений ICU? Перечислены некоторые из этих перенесенных реализаций.

Мы видели синтаксис формата сообщений ICU ранее. Он позволяет использовать базовые сообщения, интерполяцию и общий выбор на основе значения. Формат также связан с функциями форматирования даты, времени и чисел данной библиотеки.

Вот пример из документации ICU, помещенный в файл YAML для некоторого реалистичного контекста:

Допустим, мы используем некоторую реализацию JavaScript для форматирования сообщений ICU, которая предоставляет функцию под названием format(). Возможно, мы сможем отобразить приведенное выше сообщение с помощью следующего вызова.

Результатом выше будет "Maria invites Tamer and one other person to her party."

Если бы мы хотели перевести приведенное выше сообщение на испанский язык, мы бы предоставили параметризованное сообщение, возможно, похожее на следующее.

Тот же вызов format() выше, учитывая сообщение о переводе на испанский, выведет "Maria invita a Tamer y a otra persona a su fiesta."

Это дает переводчикам большую гибкость при работе с сообщениями и разделяет проблемы между переводчиками и программистами. Программисту не нужно беспокоиться о нюансах языка для разработки своего программного обеспечения. Она просто помещает один вызов функции в свой код и зависит от переводчика, который обрабатывает лингвистические мелочи. Единственное, что нужно знать программисту и переводчику, - это контракт сообщения, то есть его идентификатор и параметры.

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

Какие библиотеки i18n используют формат сообщений ICU?

На разных языках программирования и платформах разные библиотеки i18n реализовали поддержку формата сообщений ICU. Ниже приводится список некоторых из этих библиотек.

✋🏽 Внимание! » Различные порты реализуют разные подмножества формата сообщений ICU. Во всех случаях, принимая порт формата сообщений ICU, обязательно внимательно прочтите документацию и знайте, какие функции ICU поддерживаются библиотекой.

C/C++

  • ICU4C, спецификация и реализация папы; это и библиотека Java - вот где начал работу ICU. Конечно, ICU4C - это полная реализация ICU.

Дротик / флаттер

  • Intl - собственный пакет Dart i18n реализует форматирование сообщений ICU.
  • Flutter i18n - основанная на Dart's intl, собственная библиотека Flutter i18n также использует форматы сообщений ICU.

Джава

  • ICU4J - основная спецификация и реализация; это и библиотека C / C ++ являются оригиналами ICU. Само собой разумеется, что ICU4J - это полная реализация ICU.

JavaScript

В JavaScript нет официального формата сообщений i18n. Но мы говорим о JavaScript, так что, конечно, у вас есть выбор сторонних библиотек для использования как для браузеров, так и для Node.

  • Globalize - продуманная реализация формата сообщений ICU.
  • Messageformat - напоминая оригинальные реализации ICU, messageformat обеспечивает компиляцию сообщений в JavaScript для повышения производительности.
  • I18next с модулем ICU - официальное расширение ICU для надежной библиотеки i18next.
  • Angular - популярный интерфейсный фреймворк Google использует выражения ICU в своем собственном решении i18n.
  • React-intl - часть семейства FormatJS, библиотека i18n для React использует синтаксис сообщений ICU.

PHP

  • Symfony - популярный веб-фреймворк, демонстрирующий поддержку сообщений ICU.

🗒 Примечание » Собственное решение для сообщений PHP i18n использует gettext .

Python

  • PyICU - Python-оболочки для библиотек ICU C ++.

🗒 Примечание » Собственное решение для сообщений Python i18n использует gettext .

🗒 Примечание » Пропустили ли мы какие-нибудь библиотеки ICU? Вы пользуетесь библиотекой ICU, которую, по вашему мнению, стоит здесь упомянуть? Дайте нам знать в комментариях ниже.

Что такое CLDR?

Если вы просматривали документацию некоторых из вышеуказанных библиотек или документацию исходного проекта ICU, возможно, вы видели ссылки на CLDR. И вы, возможно, задались вопросом, что это было. Что ж, CLDR означает Common Locale Data Repository, и это официальный набор данных l10n в кодировке Unicode. Для данного языкового стандарта CLDR может предоставить вам сценарий языкового стандарта, его предпочтительный календарь, систему счисления, форматы даты, правила множественного числа и многое другое. CLDR используется основным проектом ICU и другими библиотеками, реализующими функции ICU.

🔗 Ресурс » Для получения дополнительной информации ознакомьтесь с официальной документацией CLDR .

✋🏽 Внимание! » Мы часто используем данные CLDR, даже не задумываясь о них, поскольку они встроены в некоторые из используемых нами библиотек i18n. Однако в других случаях нам нужно вручную получить данные CLDR для языков, поддерживаемых нашими приложениями. Обязательно прочтите документацию к библиотеке i18n, которую вы используете, чтобы узнать, нужно ли вам вручную получать данные CLDR для ваших локалей.

Работа с форматом сообщений ICU

Так как же на самом деле выглядит работа с сообщениями ICU? На самом деле это довольно просто. Давайте посмотрим на возможности, которые дает нам синтаксис.

🗒 Примечание » В примерах ниже мы предполагаем, что наши сообщения перевода хранятся в файлах YAML или JSON. Мы также предполагаем, что мы используем библиотеку JavaScript i18n с поддержкой формата сообщений ICU и функцией format() для отображения наших сообщений. Это просто для демонстрации, и вы, вероятно, захотите взглянуть на то, как ваша библиотека i18n обрабатывает файлы сообщений, а также на точную функцию или метод, которые она использует для отображения сообщений. Однако представленные здесь форматы должны поддерживаться независимо от того, какую библиотеку вы используете.

🔗 Ресурс » Если вы хотите поэкспериментировать со следующими примерами или своими собственными, мы рекомендуем Online ICU Message Editor от Andy VanWagoner .

Основные сообщения

Базовое сообщение ICU - это просто текст в заданной локали.

Интерполяция

Динамический текст обозначается фигурными скобками {}.

Множественное число

Формы множественного числа могут появляться в любом месте сообщения и иметь форму {n, plural, ...forms}, где n - это счетная переменная, а forms - одна или несколько форм множественного числа для фразы.

Специальный символ # будет отображать данное количество в системе счисления активного языкового стандарта. Мы используем n для обозначения количества здесь, но это всего лишь вопрос соглашения. Мы можем использовать любое имя в качестве нашей переменной счетчика.

🗒 Примечание » Плюрализация обычно использует правила CLDR для данной локали. Например, согласно CLDR, английский язык имеет две формы множественного числа: one и other. В арабском языке шесть форм. Каждый файл локали может указывать свои собственные формы множественного числа для данного сообщения.

🗒 Примечание » Вариант other всегда требуется в plural выражениях

Кроме того, мы можем вкладывать другие интерполированные значения в наши множественные сообщения. Следующее сообщение совершенно законно.

Переопределение правил множественного числа CLDR

Мы можем настроить наши сообщения, используя спецификаторы единственного числа. Мы используем синтаксис =42 для предоставления этих настраиваемых форм, которые переопределяют такие формы локали CLDR, как one или other.

Смещения

Необязательный спецификатор offset может быть добавлен к сообщениям множественного числа ICU. Если указан offset, он не будет использоваться для выбора формы множественного числа . Простое значение n по-прежнему будет использоваться для выбора формы. Однако offset будет вычтено из данного счетчика, а разница будет использована для значения #.

✋🏽 Внимание » Поскольку смещения могут скрыть ожидаемое отображение сообщения, они могут вызвать путаницу при использовании в команде. Используйте здесь свое собственное суждение.

Переключение с помощью select

Выражение select - это условная ветвь, которая очень похожа на оператор switch во многих языках программирования. Он может быть размещен в любом месте сообщения и обозначается {arg, select, ...forms}, где arg - это переменная аргумента, которую нужно включить, а forms - одна или несколько альтернатив.

🗒 Примечание » Вариант other всегда требуется в select выражениях.

Гнездование

Формы множественного числа и выражения выбора могут быть вложены друг в друга или вложены друг в друга. Динамические строки могут быть вложены во множественное число и также могут быть выделены. Вот пример из документации ICU:

Форматирование чисел

Формат сообщения ICU поддерживает предопределенные числовые форматы: percent и currency. Мы указываем числовые форматы в наших сообщениях с помощью синтаксиса: {n, number, format}, где n - числовой аргумент, а format - это либо percent, либо currency.

Формат percent предполагает, что числовой аргумент, передаваемый сообщению, должен быть десятичным числом от 0 до 1.

🗒 Примечание » Спецификатор format является необязательным, и формат number будет отображать данное число в системе счисления активного языкового стандарта.

Пользовательские форматы номеров

Вы можете обнаружить, что перечисленные выше варианты ограничены вашими потребностями. Конечно, есть способы более детально контролировать форматирование чисел. Официальные библиотеки Java ICU, например, предлагают класс NumberFormatter, который позволяет выполнять следующие действия.

Каждая библиотека ICU реализует свое числовое форматирование немного по-разному, поэтому проверьте документацию библиотеки, которую вы используете, чтобы узнать, как вы можете лучше контролировать свои числовые форматы.

Форматирование даты / времени

ICU имеет четыре предопределенных формата даты: short, medium, long и full. Форматы даты указываются с использованием синтаксиса {myDate, date, format}, где myDate - аргумент значения даты, а format - один из предопределенных форматов.

Пользовательское форматирование даты и времени

Официальная спецификация ICU содержит поддержку шаблонных символов, называемых Символы поля даты, которые позволяют точно контролировать форматирование даты. Опять же, каждая библиотека i18n выполняет свое настраиваемое форматирование даты / времени немного по-другому, и вам может потребоваться дополнить свою библиотеку i18n другим решением для конкретных дат для ваших форматов даты. Просмотрите документацию своей библиотеки i18n, чтобы узнать, как она обеспечивает или позволяет детально контролировать форматирование даты.

Даже больше

Мы рассмотрели здесь наиболее часто используемые форматы. Однако спецификация ICU и сторонние библиотеки ICU (в разной степени) предлагают гораздо больше функциональных возможностей. Некоторые из них включают работу с порядковыми числами (например, 1st, 2nd), единицами измерения (например, km, lbs), продолжительность, относительные даты (например, вчера) и т. д. Ознакомьтесь с документацией по выбранной вами библиотеке i18n, чтобы узнать, какие расширенные форматы поддерживаются.

Заключение

Формат сообщений ICU, безусловно, является одним из де-факто стандартов перевода сообщений в i18n. Мы надеемся, что мы пролили свет на некоторые из ваших вопросов, касающихся ICU, и что вам понравилось наше небольшое руководство по ICU и формату сообщений ICU.

🗒 Примечание » Что мы упустили? Вы бы хотели, чтобы мы затронули больше тем ICU или углубились в тему, которую мы здесь затронули? Дайте нам знать в комментариях ниже.

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

Phrase - это также профессиональная полнофункциональная платформа i18n, которая помогает менеджерам по продуктам отслеживать свои успехи в работе, позволяет переводчикам работать с интуитивно понятным пользовательским интерфейсом, дает разработчикам возможность синхронизировать файлы перевода через интерфейс командной строки и многое, многое другое. Оставьте конвейер i18n компании Phrase и сосредоточьтесь на своем продукте. Ознакомьтесь со всеми функциями Phrase и подпишитесь на бесплатную 14-дневную пробную версию.

Изначально опубликовано в The Phrase Blog.