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 Framework обеспечивает более полную поддержку 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 по таким причинам, как устаревшие API или не объявленные стабильными. Поскольку команда 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). Используйте API VersionInfo.ICU_VERSION
(доступно с Android 7.0) для получения информации о версии ICU во время выполнения.
Таблица 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' для 12h, 'H' для 24h) для различных возвращаемых значений is24HourFormat()
. Например, этот код генерирует строку с текущим временем, которая соблюдает настройку 12h/24h пользователя: Котлин
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 .