Descripción general del idioma y la 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 automáticamente. 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 values-es-rUS, pásalos a values-b+es+419, que contiene la variante de Latinoamérica. De forma similar, si tienes strings de recursos en un directorio llamado values-en-rGB, cámbiale el nombre a values-b+en+001 (inglés internacional), ya que el elemento superior 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 se puede 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.

Cómo debes diseñar tu app para permitir configuraciones regionales adicionales

Android proporciona herramientas que facilitan la localización del contenido de la app y la participación de los usuarios en sus idiomas preferidos. Te recomendamos que uses las siguientes técnicas para configurar tu app a fin de que pueda adaptarse a diferentes lenguajes y convenciones de formato de manera escalable.

Especifica los idiomas que admite tu app

Para asegurarte de que se resuelvan correctamente los idiomas, especifica los idiomas compatibles con tu app mediante la propiedad resConfigs en el archivo build.gradle de nivel de módulo.

En la siguiente muestra de código, se indica cómo usar resConfigs para indicar los idiomas compatibles. En este ejemplo, la app admite inglés y español.

Groovy

android {
    defaultConfig {
        ...
        resConfigs "en", "es"
    }
}

Kotlin

android {
    defaultConfig {
        ...
        resConfigs("en", "es")
    }
}
Debido a la forma en que el sistema de compilación combina recursos de tu app y sus dependencias, debes especificar los idiomas compatibles de esta manera para garantizar que la configuración de idioma del usuario se reciba correctamente.

API de LocaleList

A partir de la versión 7.0 (nivel de API 24), Android expone la API de LocaleList.getDefault(), 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 cadenas 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)