O Android utiliza a biblioteca ICU e o projeto CDLR (links em inglês) para oferecer suporte a Unicode e outras formas de internacionalização. Esta página sobre suporte a Unicode e internacionalização é dividida em duas seções: Android 6.0 (nível 23 da API) e versões anteriores e Android 7.0 (nível 24 da API) e versões mais recentes.
Suporte a Unicode e internacionalização até o Android 6.0 (nível 23 da API)
A plataforma Android usa ICU e CLDR para implementar várias
classes para lidar com ortografias latinas e não latinas, expondo classes
como Locale
, Character
e muitas subclasses de
java.text
. Os apps que exigem funcionalidades de internacionalização além das
classes expostas e são direcionados ao Android 6.0
(nível 23 da API) e versões anteriores precisam incluir a biblioteca ICU.
Controle de versões
Versões seguintes da plataforma Android correspondem às versões mais recentes da ICU e às versões CLDR e Unicode correspondentes. A tabela 1 mostra essa correspondência até o Android 6.0 (nível 23 da API).
Plataforma (nível de API) | ICU | CLDR | Unicode |
---|---|---|---|
Android 1.5 a 2.0 (níveis 3 a 7 da API) | 3.8 | 1.5 | 5.0 |
Android 2.2 (nível 8 da API) | 4.2 | 1.7 | 5.1 |
Android 2.3 a 3.0 (níveis 9 a 13 da API) | 4.4 | 1.8 | 5.2 |
Android 4.0 (níveis 14 e 15 da API) | 4.6 | 1.9 | 6.0 |
Android 4.1 (níveis 16 e 17 da API) | 4.8 | 2.0 | 6.0 |
Android 4.3 (nível 18 da API) | 50 | 22.1 | 6.2 |
Android 4.4 (níveis 19 e 20 da API) | 51 | 23 | 6.2 |
Android 5.0 (níveis 21 e 22 da API) | 53 | 25 | 6.3 |
Android 6.0 (nível 23 da API) | 55.1 | 27.0.1 | 7.0 |
O framework do Android oferece suporte mais abrangente para Unicode e internacionalização para apps direcionados ao Android 7.0 (nível 24 da API) e versões mais recentes. A próxima seção desta página apresenta detalhes sobre esse suporte.
Suporte a Unicode e internacionalização no Android 7.0 (nível 24 da API) ou mais recente
No Android 7.0 (nível 24 da API) e versões mais recentes, a plataforma Android
expõe um subconjunto das APIs ICU4J para desenvolvedores de apps
usarem no pacote android.icu
.
O ICU4J é um conjunto de bibliotecas Java de código aberto amplamente utilizado que fornece suporte para Unicode
e internacionalização para aplicativos de software.
As APIs ICU4J usam dados de localização presentes no dispositivo. Como resultado, você pode não compilar as bibliotecas do ICU4J para reduzir a pegada do app. Em vez disso, basta fazer a chamada delas no framework. Se você fizer isso, convém fornecer várias versões do seu APK para que os usuários com versões anteriores ao Android 7.0 (nível 24 da API) possam fazer o download de uma versão do app que contenha as bibliotecas ICU4J.
Esta seção começa fornecendo algumas informações básicas sobre os níveis mínimos de API do Android necessários para oferecer suporte a essas bibliotecas. Em seguida, o documento explica o que você precisa saber sobre a implementação específica da ICU4J no Android. Por fim, ele informa como usar as APIs ICU4J no framework do Android.
ICU4J no Android
O Android expõe um subconjunto das APIs ICU4J pelo
pacote android.icu
, em vez do com.ibm.icu
. Algumas
APIs ICU4J descontinuadas ou que não foram declaradas estáveis
não são expostas pelo framework do Android. Conforme a equipe da ICU descontinuar as APIs no futuro,
o Android também as marcará como descontinuadas, mas ainda vão ser incluídas.
Confira alguns lembretes:
- As APIs ICU4J do framework do Android não incluem todas as APIs ICU4J.
- As APIs no framework do Android não substituem o suporte do Android para localização com recursos.
- Em alguns casos, o framework do Android oferece suporte a mais caracteres do que
as bibliotecas ICU. Isso acontece, por exemplo, no suporte da classe
android.text
para emojis.
Migrar para o pacote android.icu do com.ibm.icu
Se você já estiver usando as APIs ICU4J no seu app, e as
APIs android.icu
atenderem suas necessidades, a migração para
as APIs do framework exige que você mude suas importações em Java
de com.ibm.icu
para android.icu
. Em seguida,
remova sua própria cópia dos arquivos ICU4J do APK.
Observação: as APIs ICU4J do framework usam o namespace android.icu
em vez de com.ibm.icu
. Isso acontece para evitar conflitos
de namespace em APKs que contenham as próprias bibliotecas com.ibm.icu
.
Migrar para APIs android.icu de outras APIs do SDK do Android
Algumas classes nos pacotes java
e android
têm
equivalentes àquelas encontradas na ICU4J. A ICU4J geralmente oferece suporte mais abrangente
para padrões e idiomas.
A Tabela 2 mostra alguns exemplos dessas equivalências para que você possa começar:
Classe. | Alternativas |
---|---|
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 no Android
O Android expõe um subconjunto das APIs ICU4C pela biblioteca libicu.so
,
em vez de libicuuc.so
ou libicui18n.so
. As APIs estão disponíveis
no Android 12 (nível 31 da API) e versões mais recentes. Os cabeçalhos do NDK estão disponíveis a partir da
versão r22b do NDK.
Nenhuma API C++ é exposta pelo Android NDK. Algumas das APIs C ainda não estão disponíveis.
Controle de versões
Versões seguintes da plataforma Android correspondem às versões mais recentes da ICU
e às versões CLDR e Unicode correspondentes. A Tabela 3 mostra essa correspondência
no Android 7.0 (nível 24 da API) e versões mais recentes. Use a
API
VersionInfo.ICU_VERSION
(disponível desde o Android 7.0) para receber as informações de
versão da ICU no momento da execução.
Plataforma (nível de API) | ICU | CLDR | Unicode |
---|---|---|---|
Android 7.0 - 7.1 (níveis 24 e 25 da API) | 56 | 28 | 8.0 |
Android 8.0 - 8.1 (níveis 26 e 27 da API) | 58.2 | 30.0.3 | 9.0 |
Android 9 (nível 28 da API) | 60.2 | 32.0.1 | 10.0 |
Android 10 (nível 29 da API) | 63.2 | 34 | 11.0 |
Android 11 (nível 30 da API) | 66.1 | 36 | 13.0 |
Android 12 (nível 31 a 32 da API) | 68.2 | 38.1 | 13.0 |
Android 13 (API de nível 33) | 70.1 | 40 | 14,0 |
Android 14 (nível 34 da API) | 72.1 | 42 | 15 |
Android 15 (nível 35 da API) | 75.1 | 45 | 15.1 |
Configuração de formato de hora 24h/12h
A ICU no Android não observa a configuração de formato de 24h/12h do usuário, recebida deDateFormat.is24HourFormat()
.
Para observar essa configuração, use os métodos de formatação de hora
DateFormat
ou
DateUtils
ou use os padrões de formatação de tempo da ICU com símbolos de padrão de hora
apropriados ("h" para 12h, "H" para 24h) para diferentes valores de retorno is24HourFormat()
.
Por exemplo, o código abaixo gera uma string com o horário atual que segue a configuração de 12h/24h do usuário:
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());
Estabilidade da transliteração
No Android 10 (nível 29 da API) e versões mais recentes, oTransliterator
é fornecido para transliterar textos de um formato para o outro. O conjunto de IDs de transliteração
é instável em diferentes versões e dispositivos Android. Os fabricantes de dispositivos podem adicionar
IDs de transliteração extras. Os desenvolvedores precisam verificar os IDs disponíveis, que vêm de
Transliterator.getAvailableIDs()
,
antes de transliterar o texto.
Licenciamento
A ICU4J foi lançada sob a licença da ICU. Para mais detalhes, consulte o Guia do usuário da ICU (link em inglês).