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. Este documento sobre suporte a Unicode e internacionalização é dividido 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 sucessivas 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).
Tabela 1. Versões da ICU e CLDR usadas 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 |
Os apps destinado ao Android 7.0 (nível 24 da API) ou versões mais recente podem aproveitar um suporte mais abrangente para Unicode e internacionalização que é exposto pelo framework do Android. A próxima seção deste documento 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, é possível reduzir a pegada do app ao não compilar as bibliotecas do ICU4J. Em vez disso, basta fazer a chamada delas no framework. Nesse caso, convém fornecer várias versões do seu APK para que os usuários que estiverem usando versões anteriores ao Android 7.0 (nível 24 da API) podem fazer o download da versão do app que contém as bibliotecas ICU4J.
Este documento 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
. O
framework do Android pode não
expor as APIs ICU4J por vários motivos, por exemplo, por que as APIs foram descontinuadas
ou não foram declaradas estáveis. Conforme a equipe da ICU descontinuar as APIs no futuro,
elas também vão ser marcadas como descontinuadas no Android, mas vão continuar sendo incluídas.
Confira abaixo algumas observações importantes:
- 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 vai ocorrer, por exemplo, ao oferecer suporte à classe
android.text
de emojis.
Como 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
.
Como migrar de 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:
Tabela 2. Classes ICU4J do Android e do Java.
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 sucessivas 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.
Tabela 3. Versões da ICU e CLDR usadas no Android 7.0 (nível 24 da API) ou mais recente.
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 da API) | 68.2 | 38.1 | 13.0 |
Configuração de formato de hora 24h/12h
No Android, a ICU não segue a configuração de formato de hora 24h/12h do usuário (que vem deDateFormat.is24HourFormat()
).
Para observar a configuração, use os métodos de formatação
DateFormat
ou
DateUtils
ou padrões de formatação de hora da ICU com símbolos de padrão de hora apropriados
('h' para 12h, 'H' para 24h) para diferentes valores de retorno de is24HourFormat()
.
Por exemplo, este código 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 é lançada na licença da ICU. Para mais detalhes, consulte o Guia do usuário da ICU (em inglês).