Compatibilidade com Unicode e internacionalização

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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 de DateFormat.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, o Transliterator é 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).