Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

Compatibilidad con internacionalización y Unicode

Android aprovecha la biblioteca de ICU y el proyecto CLDR para proporcionar compatibilidad con Unicode y otros tipos de internacionalización. La información incluida en este documento sobre la compatibilidad con Unicode y la internacionalización se divide en dos secciones: Android 6.0 (API nivel 23) y versiones anteriores, y Android 7.0 (API nivel 24) y versiones posteriores.

Compatibilidad con Unicode y la internacionalización a través de Android 6.0 (API nivel 23)

La plataforma Android usa ICU y CLDR en la implementación de varias clases para manejar ortografías latinas y no latinas exponiendo clases como Locale, Character y muchas subclases de java.text. Una app que incluye funcionalidades de internacionalización más allá de las clases expuestas y que se dirige a las versiones de la plataforma a través de Android 6.0 (API nivel 23) debe incluir la biblioteca de ICU en su APK.

Control de versiones

Los sucesivos lanzamientos de la plataforma de Android corresponden a versiones más recientes de ICU (y las versiones correspondientes de CLDR y Unicode). La tabla 1 muestra esta correspondencia mediante Android 6.0 (API nivel 23).

Tabla 1: Versiones de ICU y CLDR utilizadas en Android 6.0 (API nivel 23)

Plataforma (nivel de API) ICU CLDR Unicode
Android 1.5-2.0 (API niveles 3 a 7) 3.8 1.5 5.0
Android 2.2 (API nivel 8) 4.2 1.7 5.1
Android 2.3-3.0 (API niveles 9 a 13) 4.4 1.8 5.2
Android 4.0 (API niveles 14 y 15) 4.6 1.9 6.0
Android 4.1 (API niveles 16 y 17) 4.8 2.0 6.0
Android 4.3 (API nivel 18) 50 22.1 6.2
Android 4.4 (API niveles 19 y 20) 51 23 6.2
Android 5.0 (API niveles 21 y 22) 53 25 6.3
Android 6.0 (API nivel 23) 55.1 27.0.1 7.0

Las aplicaciones dirigidas a Android 7.0 (API nivel 24) o versiones posteriores pueden aprovechar una compatibilidad más completa con Unicode y la internacionalización que está expuesta por el marco de Android. La siguiente sección de este documento proporciona detalles sobre la compatibilidad mencionada.

Compatibilidad con Unicode y la internacionalización en Android 7.0 (API nivel 24) y versiones posteriores

A partir de Android 7.0 (API nivel 24), la plataforma de Android expone un subconjunto de las API de ICU4J para que los desarrolladores de apps usen con el paquete android.icu. ICU4J es un conjunto ampliamente utilizado de bibliotecas Java de código abierto, que proporciona compatibilidad con Unicode y la internacionalización para aplicaciones de software.

Las API de ICU4J utilizan datos de localización presentes en el dispositivo. Como resultado, puedes reducir tu huella de APK gracias a que no compilas las bibliotecas ICU4J en tu APK; en su lugar, puedes llamarlas directamente en el marco de trabajo. (En este caso, es posible que quieras proporcionar múltiples versiones de tu APK para que los usuarios que ejecutan versiones de Android anteriores a Android 7.0 (API nivel 24) puedan descargar una versión de la aplicación que contenga las bibliotecas ICU4J).

Este documento comienza suministrando información básica sobre los niveles mínimos de API de Android necesarios para admitir estas bibliotecas. Luego, se explica lo que debes saber sobre la implementación específica de ICU4J en Android. Por último, verás cómo usar las API de ICU4J en el marco de trabajo de Android.

ICU4J en Android

Android expone un subconjunto de las API de ICU4J a través del paquete android.icu, en lugar de com.ibm.icu. El marco de trabajo de Android puede elegir no exponer las API de ICU4J por distintas razones: por ejemplo, porque las API están en desuso o no se declaran estables. Dado que el equipo de ICU dejará de usar las API en el futuro, Android también las marcará como obsoletas, pero continuará incluyéndolas.

Estos son algunos puntos importantes que debes tener en cuenta:

  • Las API del marco de trabajo de ICU4J para Android no incluyen todas las API de ICU4J.
  • El NDK no es compatible con ICU4C para Android.
  • Las API del marco de trabajo de Android no reemplazan la compatibilidad de Android para localizar recursos.
  • En algunos casos, el marco de trabajo de Android es compatible con más caracteres que las bibliotecas de ICU. Un ejemplo de eso es la compatibilidad de android.text con emojis.

Cómo migrar al paquete android.icu desde com.ibm.icu

Si ya estás utilizando las API de ICU4J en tu app, y las API android.icu cumplen con tus requisitos, entonces, para migrar a las API del marco de trabajo, tendrás que cambiar tus importaciones Java de com.ibm.icu a android.icu. Luego, puedes quitar tu propia copia de los archivos de ICU4J del APK.

Nota: Las API del marco de trabajo de ICU4J usan el espacio de nombres android.icu en lugar de com.ibm.icu para evitar conflictos de espacio de nombres en los APK que contienen sus propias bibliotecas com.ibm.icu.

Cómo migrar las API de android.icu desde otras API del SDK de Android

Algunas clases en los paquetes java y android tienen equivalentes a los encontrados en ICU4J. Sin embargo, a menudo, ICU4J proporciona una mayor compatibilidad con los estándares y los idiomas.

La Tabla 2 muestra algunos ejemplos de estas equivalencias para que puedas empezar:

Tabla 2: Clases de ICU4J para Android y Java

Clase 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

Control de versiones

Los sucesivos lanzamientos de la plataforma de Android corresponden a versiones más recientes de ICU (y las versiones correspondientes de CLDR y Unicode). La tabla 3 muestra esta correspondencia a partir de Android 7.0 (API nivel 24).

Tabla 3: Versiones de ICU y CLDR utilizadas en Android 7.0 (API nivel 24) y versiones posteriores

Plataforma (nivel de API) ICU CLDR Unicode
Android 7.0-7.1 (API niveles 24 y 25) 56 28 8.0
Android 8.0 - 8.1 (API niveles 26 y 27) 58.2 30.0.3 9.0
Android 9 (API nivel 28) 60.2 32.0.1 10.0
Android 10 (API nivel 29) 63.2 34 11.0

Configuración de formato de hora 24h/12h

ICU en Android no observa la configuración de formato de hora de 24 h/12 h del usuario (obtenida de DateFormat.is24HourFormat()). Para observarla, utiliza los métodos de formato de hora DateFormat o DateUtils, o usa patrones de formato de hora de la ICU con los símbolos de patrón de hora apropiados ("h" para 12 h, "H" para 24 h) para diferentes valores que se muestran de is24HourFormat(). Por ejemplo, este código generará una string con la hora actual que observa la configuración de 12 h/24 h del usuario:

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());
    

Estabilidad del transliterador

A partir de Android 10 (API nivel 29), se proporciona Transliterator para transliterar el texto de un formato a otro. El conjunto de ID de transliteración disponibles es inestable en las versiones y dispositivos de Android. Los fabricantes de dispositivos pueden agregar ID de transliteración adicionales. Los desarrolladores deben verificar los ID disponibles (obtenidos de Transliterator.getAvailableIDs()) antes de transliterar el texto.

Licencias

ICU4J se lanzó bajo la licencia de ICU. Para obtener más información, consulta la Guía del usuario de ICU.