Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

Idioma y configuración regional

A partir de la versión 7.0 (nivel de API 24), Android brinda compatibilidad mejorada para usuarios de diferentes idiomas y les permite seleccionar varias configuraciones regionales en la configuración. Android brinda esta capacidad expandiendo ampliamente la cantidad de configuraciones regionales compatibles y cambiando la forma en que el sistema resuelve los recursos.

Este documento comienza con una explicación de la estrategia de resolución de recursos en versiones de Android anteriores a la 7.0 (nivel de API 24). Luego, se describe la estrategia de resolución de recursos mejorada en Android 7.0. Por último, encontrarás una explicación sobre cómo aprovechar la cantidad expandida de configuraciones regionales para permitir acceso a más usuarios de diferentes idiomas.

Desafíos para la resolución de recursos de idioma

Antes de la versión 7.0, Android no siempre podía hacer coincidir correctamente las configuraciones regionales de la app y del sistema.

Imagina, por ejemplo, la siguiente situación:

  • El idioma predeterminado de la app es en_US (inglés de EE. UU.), y también tiene strings en español localizadas en archivos de recursos es_ES.
  • Se fija un dispositivo en el valor es_MX.
  • Cuando en tu código Java se hace referencia a strings, el sistema carga strings del archivo de recursos (en_US) predeterminado, incluso si la app tiene recursos en español localizados en es_ES. Esto se debe a que, cuando no puede encontrar una coincidencia exacta, el sistema continúa buscando recursos y se quita el código del país de la configuración regional. Finalmente, si no se encuentra una coincidencia, el sistema regresa a la configuración predeterminada, que es en_US.

    El sistema también usaba en_US como valor predeterminado si el usuario elegía un idioma que no fuera compatible con la app, como el francés. Por ejemplo:

    Tabla 1: Resolución de recursos sin coincidencia de configuración regional exacta.

    Configuración del usuario Recursos de la app Resolución de recursos
    fr_CH Predeterminado (en)
    de_DE
    es_ES
    fr_FR
    it_IT
    Intentar con fr_CH => Error
    Intentar con fr => Error
    Usar predeterminado (en)

    En este ejemplo, el sistema muestra las strings en inglés sin determinar si el usuario comprende este idioma. Este comportamiento es muy común actualmente.

    Mejoras de la estrategia de resolución de recursos

    Android 7.0 (nivel de API 24) brinda una resolución de recursos más sólida y encuentra mejores reservas de forma automática. Sin embargo, para acelerar la resolución y mejorar la facilidad de mantenimiento, debes almacenar los recursos en el dialecto primario más común. Por ejemplo, si antes almacenabas los recursos en español en el directorio es-US, pásalos al directorio es-419, que contiene la variante de Latinoamérica. De forma similar, si tienes strings de recursos en una carpeta llamada en-GB, cámbiale el nombre a en-001 (inglés internacional), ya que el dialecto primario más común para las strings en en-GB es en-001. En los siguientes ejemplos se explica la razón por la cual estas prácticas mejoran el rendimiento y la confiabilidad de la resolución de recursos.

    Ejemplos de resolución de recursos

    Con versiones de Android posteriores a la 7.0, el caso descrito en la Tabla 1 se resuelve de manera diferente:

    Tabla 2: Estrategia de resolución mejorada para los casos en que no hay una coincidencia de configuración regional exacta.

    Configuración del usuario Recursos de la app Resolución de recursos
    1. fr_CH
    Predeterminado (en)
    de_DE
    es_ES
    fr_FR
    it_IT
    Intentar con fr_CH => Error
    Intentar con fr => Error
    Intentar con campo secundario de fr => fr_FR
    Usar fr_FR

    Así, los recursos se muestran en francés en lugar de inglés. En este ejemplo también se muestra la razón por la cual debes almacenar las strings en francés en fr en lugar de fr_FR para Android 7.0 o versiones posteriores. Aquí, el procedimiento se basa en hacer coincidir el dialecto primario más cercano, lo cual hace que la resolución sea más rápida y predecible.

    Además de esta lógica de resolución mejorada, Android ahora ofrece más idiomas de usuario de entre los cuales puedes elegir. Volvamos a ver el ejemplo anterior con el idioma italiano especificado como un idioma de usuario adicional, pero sin compatibilidad de la app con el idioma francés.

    Tabla 3: Resolución de recursos cuando la app solo hace coincidir la configuración regional de segunda preferencia del usuario.

    Configuración del usuario Recursos de la app Resolución de recursos
    1. fr_CH
    2. it_CH
    Predeterminado (en)
    de_DE
    es_ES
    it_IT
    Intentar con fr_CH => Error
    Intentar con fr => Error
    Intentar con campo secundario de fr => Error
    Intentar con it_CH => Error
    Intentar con it => Error
    Intentar con campo secundario de it => it_IT
    Usar it_IT

    El usuario recibe la información en un idioma que comprende, si bien la app no es compatible con el idioma francés.

    Diseño de la app para permitir configuraciones regionales adicionales

    LocaleList API

    A partir de la versión 7.0 (nivel de API 24), Android expone la LocaleList.getDefault() API, la cual permite que las apps consulten directamente la lista de idiomas especificados por el usuario. También te permite crear un comportamiento de app más sofisticado y una presentación de contenido más optimizada. Por ejemplo, las búsquedas pueden mostrar resultados en varios idiomas según la configuración del usuario. Las apps de navegadores pueden evitar ofrecer la traducción de páginas que estén en un idioma que el usuario comprenda, y las apps de teclado pueden habilitar automáticamente todos los diseños correctos.

    Formateadores

    Hasta la versión 6.0 (nivel de API 23), Android solo permitía una o dos configuraciones regionales para muchos idiomas comunes (en, es, ar, fr, ru). Debido a que había solo unas pocas variantes para cada idioma, las apps podían almacenar números y fechas como strings codificadas en los archivos de recursos. Sin embargo, con el conjunto ampliado de configuraciones regionales compatibles de Android, puede haber diferencias importantes en los formatos de fecha, hora, moneda e información similar, incluso dentro de una sola configuración regional. La codificación de los formatos puede generar una experiencia confusa para los usuarios finales. Por lo tanto, cuando realices desarrollos para Android 7.0 o versiones posteriores, asegúrate de usar formateadores en lugar de codificar strings de números y fechas.

    Por ejemplo, Android 7.0 y las versiones posteriores incluyen compatibilidad con 27 configuraciones regionales árabes. Estas configuraciones regionales pueden compartir la mayoría de los recursos, pero algunas priorizan dígitos ASCII, mientras que otras priorizan dígitos nativos. Por ejemplo, cuando desees crear una oración con una variable de dígito, como “Elige un PIN de 4 dígitos”, usa formateadores como se muestra a continuación:

     format(locale, "Choose a %d-digit PIN", 4)