Для поддержки Unicode и других средств интернационализации в Android используются библиотека ICU и проект CLDR. В этом разделе информация о поддержке Unicode и интернационализации разделена на две части: для Android 6.0 (уровень API 23) и более ранних версий, а также для Android 7.0 (уровень API 24) и более поздних версий.
Поддержка Unicode и интернационализации в Android 6.0 (уровень API 23).
Платформа Android использует ICU и CLDR для реализации различных классов, которые обрабатывают латинскую и нелатинскую орфографию, предоставляя такие классы, как Locale, Character и многие под��лассы java.text. Если приложению требуются функции интернационализации, не поддерживаемые доступными классами, и оно предназначено для версий платформы до Android 6.0 (уровень API 23), в него необходимо включить библиотеку ICU.
Управление версиями
Последующие выпуски платформы Android соответствуют более новым версиям ICU и соответствующим версиям CLDR и Unicode. В таблице 1 показано соответствие версий Android и уровней API до Android 6.0 (уровень API 23).
Таблица 1. Версии ICU и CLDR, используемые в Android 6.0 (уровень API 23).
| Платформа (уровень API) | ОРИТ : реанимация [informal] | CLDR | Unicode |
|---|---|---|---|
| Android 1.5–2.0 (уровни API 3–7) | 3.8 | 1,5 | 5,0 |
| Android 2.2 (уровень API 8) | 4.2 | 1.7 | 5.1 |
| Android 2.3–3.0 (уровни API 9–13) | 4.4 | 1,8 | 5.2 |
| Android 4.0 (уровни API 14–15) | 4,6 | 1.9 | 6.0 |
| Android 4.1 (уровни API 16–17) | 4.8 | 2.0 | 6.0 |
| Android 4.3 (уровень API 18) | 50 | 22.1 | 6.2 |
| Android 4.4 (уровни API 19–20) | 51 | 23 | 6.2 |
| Android 5.0 (уровни API 21–22) | 53 | 25 | 6.3 |
| Android 6.0 (уровень API 23) | 55,1 | 27.0.1 | 7.0 |
Фреймворк Android обеспечивает более полную поддержку Unicode и интернационализации для приложений, предназначенных для Android 7.0 (уровень API 24) и более поздних версий. Подробная информация об этом приведена в следующем разделе.
Поддержка Юникода и интернационализации в Android 7.0 (уровень API 24) и более поздних версиях.
Для Android 7.0 (уровень API 24) и более поздних версий платформа Android предоставляет разработчикам приложений подмножество API ICU4J в пакете android.icu.
ICU4J – это широко используемый набор библиотек Java с открытым исходным кодом, который обеспечивает поддержку Юникода и интернационализации для программных приложений.
API ICU4J используют данные локализации, хранящиеся на устройстве. В результате вы можете уменьшить размер приложения, не компилируя библиотеки ICU4J в приложение. Вместо этого вы можете вызывать их в платформе. В этом случае вы можете предоставить несколько версий APK-файла, чтобы пользователи устройств с Android ниже 7.0 (уровень API 24) могли скачать версию приложения, содержащую библиотеки ICU4J.
В этом разделе приведена основная информация о минимальных уровнях Android API, необходимых для поддержки этих библиотек. Затем в ней объясняется, что вам нужно знать о реализации ICU4J для Android. Наконец, в ней рассказывается, как использовать API ICU4J в платформе Android.
ICU4J на Android
Android предоставляет подмножество API ICU4J через пакет android.icu, а не com.ibm.icu. Некоторые API-интерфейсы ICU4J не предоставляются платформой Android, поскольку они устарели или не объявлены стабильными. Когда команда ICU прекращает поддержку API, Android также помечает их как устаревшие, но продолжает включать в состав.
Вот несколько важных моментов:
- Фреймворк Android ICU4J содержит не все API ICU4J.
- API в платформе Android не заменяют поддержку локализации с помощью ресурсов.
- В некоторых случаях фреймворк Android поддерживает больше символов, чем библиотеки ICU. Например, класс
android.textподдерживает эмодзи.
Переход с пакета com.ibm.icu на android.icu
Если вы уже используете API ICU4J в своем приложении и API android.icu соответствуют вашим требованиям, то для перехода на API фреймворка вам необходимо изменить импорт Java с com.ibm.icu на android.icu. После этого вы сможете удалить из приложения собственную копию файлов ICU4J.
Примечание. API фреймворка ICU4J используют пространство имен android.icu вместо com.ibm.icu. Это позволяет избежать конфликтов пространств имен в приложениях, содержащих собственные библиотеки com.ibm.icu.
Переход на android.icu API с других Android SDK API
Некоторые классы в пакетах java и android имеют эквиваленты в ICU4J. Однако ICU4J часто обеспечивает более широкую поддержку стандартов и языков.
В таблице 2 приведены примеры таких эквивалентов.
Таблица 2. Классы ICU4J в Android и Java
| Класс | Альтернативы |
|---|---|
java.lang.Character |
android.icu.lang.UCharacter |
java.text.BreakIterator |
android.icu.text.BreakIterator |
java.text.DecimalFormat |
android.icu.text.DecimalFormat |
java.util.Calendar |
android.icu.util.Calendar |
android.text.BidiFormatter
|
android.icu.text.Bidi
|
android.text.format.DateFormat
|
android.icu.text.DateFormat
|
android.text.format.DateUtils |
android.icu.text.DateFormat
android.icu.text.RelativeDateTimeFormatter
|
ICU4C на Android
Android предоставляет подмножество API ICU4C через библиотеку libicu.so, а не libicuuc.so или libicui18n.so. API доступны начиная с Android 12 (уровень API 31). Заголовки NDK доступны начиная с версии NDK r22b.
C++ API не предоставляется через Android NDK. Некоторые API C недоступны.
Управление версиями
Последующие выпуски платформы Android соответствуют более новым версиям ICU и соответствующим версиям CLDR и Unicode. В таблице 3 показано это соответствие, начиная с Android 7.0 (уровень API 24). Чтобы получить информацию о версии ICU во время выполнения, используйте API
VersionInfo.ICU_VERSION (доступен начиная с Android 7.0).
Таблица 3. Версии ICU и CLDR, используемые в версиях Android от Android 7.0 (уровень API 24) до Android 15 (уровень API 35).
| Платформа (уровень API) | ОРИТ : реанимация [informal] | CLDR | Unicode |
|---|---|---|---|
| Android 7.0–7.1 (уровни API 24–25) | 56 | 28 | 8.0 |
| Android 8.0–8.1 (уровни API 26–27) | 58,2 | 30.0.3 | 9.0 |
| Android 9 (API уровня 28) | 60,2 | 32.0.1 | 10,0 |
| Android 10 (API уровня 29) | 63,2 | 34 | 11.0 |
| Android 11 (API уровня 30) | 66,1 | 36 | 13.0 |
| Android 12 (уровень API 31–32) | 68,2 | 38,1 | 13.0 |
| Android 13 (API уровня 33) | 70,1 | 40 | 14,0 |
| Android 14 (уровень API 34) | 72,1 | 42 | 15,0 |
| Android 15 (уровень API 35) | 75,1 | 45 | 15.1 |
Настройка формата времени (12- или 24-часовой)
ICU на Android не учитывает настройки 24- или 12-часового формата времени, полученные изDateFormat.is24HourFormat().
Чтобы соблюдать эту настройку, используйте методы форматирования времени DateFormat или DateUtils либо шаблоны форматирования времени ICU с подходящими символами шаблона часов ("h" для 12-часового формата, "H" для 24-часового) для разных возвращаемых значений is24HourFormat().
Например, этот код генерирует строку с текущим временем, которая учитывает настройки пользователя 12h/24h:
Kotlin
val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm" val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton( skeleton, Locale.getDefault()).format(Date() )
Java
String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm"; String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());
Стабильность транслитератора
Начиная с Android 10 (уровень API 29) для транслитерации текста из одного формата в другой используетсяTransliterator. Набор доступных идентификаторов транслитерации может меняться в зависимости от версии Android и устройства. Производители устройств могут добавлять дополнительные идентификаторы транслитерации. Прежде чем транслитерировать текст, разработчики должны проверить доступные идентификаторы, полученные из
Transliterator.getAvailableIDs().
Лицензирование
ICU4J распространяется по лицензии ICU. Подробную информацию можно найти в руководстве пользователя ICU.