Android использует библиотеку ICU и проект CLDR для поддержки Unicode и других языков интернационализации. Обсуждение 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 6.0 (уровень API 23).
Таблица 1. Версии ICU и CLDR, используемые в Android 6.0 (уровень API 23).
Платформа (уровень API) | отделение интенсивной терапии | КЛДР | Юникод |
---|---|---|---|
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) и выше. Подробнее об этой поддержке см. в следующем разделе этой страницы.
Поддержка Unicode и интернационализации в Android 7.0 (уровень API 24) и выше
Для Android 7.0 (уровень API 24) и выше платформа Android предоставляет разработчикам приложений подмножество API ICU4J в пакете android.icu
. ICU4J — это широко используемый набор библиотек Java с открытым исходным кодом, обеспечивающий поддержку Unicode и интернационализации для приложений.
API ICU4J используют данные локализации, имеющиеся на устройстве. Таким образом, вы можете уменьшить размер своего приложения, отказавшись от компиляции библиотек ICU4J. Вместо этого вы можете обращаться к ним через фреймворк. В этом случае может потребоваться предоставить несколько версий APK , чтобы пользователи Android ниже Android 7.0 (уровень API 24) могли загрузить версию приложения, содержащую библиотеки ICU4J.
Этот раздел начинается с предоставления базовой информации о минимальных уровнях API Android, необходимых для поддержки этих библиотек. Затем объясняется, что нужно знать о реализации ICU4J для Android. Наконец, рассказывается, как использовать API ICU4J в фреймворке Android.
ICU4J на Android
Android предоставляет подмножество API ICU4J через пакет android.icu
, а не com.ibm.icu
. Некоторые API ICU4J не доступны в фреймворке Android по таким причинам, как устаревшие или не объявленные стабильными. Поскольку команда ICU в будущем будет прекращать поддержку API, Android также помечает их как устаревшие, но продолжает их включать.
Вот несколько напоминаний:
- API-интерфейсы Android-фреймворка ICU4J не включают в себя все API-интерфейсы ICU4J.
- API в фреймворке Android не заменяют поддержку локализации с помощью ресурсов в Android.
- В некоторых случаях фреймворк Android поддерживает больше символов, чем библиотеки ICU. Например, это касается поддержки эмодзи в классе
android.text
.
Переход на пакет android.icu из com.ibm.icu
Если вы уже используете API ICU4J в своём приложении и API android.icu
соответствует вашим требованиям, то для перехода на API фреймворка потребуется изменить импорт Java с com.ibm.icu
на android.icu
. После этого вы сможете удалить свою копию файлов ICU4J из приложения.
Примечание : API фреймворка ICU4J используют пространство имён android.icu
вместо com.ibm.icu
. Это позволяет избежать конфликтов пространств имён в приложениях, содержащих собственные библиотеки com.ibm.icu
.
Переход на API android.icu из других API Android SDK
Некоторые классы в пакетах java
и android
имеют эквиваленты классов в ICU4J. Однако ICU4J часто обеспечивает более широкую поддержку стандартов и языков.
В таблице 2 приведены некоторые примеры таких эквивалентностей, с которых можно начать:
Таблица 2. Классы Android и Java ICU4J
Сорт | Альтернативы |
---|---|
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. API C++ в 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) | отделение интенсивной терапии | КЛДР | Юникод |
---|---|---|---|
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 |
Настройка формата времени 24/12 ч
ICU на Android не учитывает заданный пользователем формат времени (24/12-часовой), полученный с помощьюDateFormat.is24HourFormat()
. Чтобы использовать этот формат, используйте методы форматирования времени DateFormat
или DateUtils
, либо шаблоны форматирования времени ICU с соответствующими символами часового формата ('h' для 12-часового формата, 'H' для 24-часового формата) для различных возвращаемых значений is24HourFormat()
. Например, этот код генерирует строку с текущим временем, учитывающую заданный пользователем формат времени (12/24): Котлин
val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm" val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton( skeleton, Locale.getDefault()).format(Date() )
Ява
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 .