A partir de Android 7.0 (API nivel 24), el usuario puede establecer los idiomas preferidos en su dispositivo (fuente: API LocaleList). Mi problema es que mi aplicación no respeta esta configuración, no tiene en cuenta el segundo idioma.

En Settings -> languages he elegido mis preferencias de idioma como:

 1. Polish (preferred)
 2. French

En la aplicación de Android tengo dos idiomas compatibles (en de forma predeterminada y fr):

values/strings.xml (English as default)
values-fr/strings.xml (French)

Con esta configuración, la aplicación comienza en inglés (que es el predeterminado), mientras que en mi lista de preferencias de idioma está el francés (que es compatible con mi aplicación y debería usarse).

¿Por qué Android elige el francés en este caso? ¿Cómo arreglar eso?

Nota: el idioma francés está configurado correctamente cuando elijo el idioma FR como preferido en la configuración

Ejemplo de archivo EN strings.xml:

  <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources [<!ENTITY applicationName "app\'s name">]>
<resources>
  <string name="application_name">&applicationName;</string>
  <string name="dialog_ok">OK</string>
  ...
</resources>

Muestra de archivo FR strings.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources [<!ENTITY applicationName "french name">]>
<resources>
  <string name="application_name">&applicationName;</string>
  <string name="dialog_ok">Oui</string>
  ...
</resources>
16
Jacek Milewski 14 nov. 2017 a las 17:12

2 respuestas

La mejor respuesta

La solución es agregar resConfigs en android.defaultConfig de app/build.gradle para contener su lista de configuraciones regionales exacta (lo que tiene en su aplicación):

android {
  defaultConfig {
    resConfigs "nb", "nn", "in", "iw", "fr", ...
  }
}

Consulte las diapositivas del tutorial "Internacionalización de Android" en http://www.unicodeconference.org/presentations/ (enlace directo: http://www.unicodeconference.org/presentations/TS1T3-Nita -Pournader.pdf)

También https://gist.github.com/amake/0ac7724681ac1c178c6f95a5b09f03ce


La explicación: la recuperación a través de la lista de configuraciones regionales ocurre en el momento de inicio, no cuando se cargan las cadenas.

La mayoría de las aplicaciones en estos días utilizan algún tipo de biblioteca de soporte. Las bibliotecas de soporte de Google están localizadas en aproximadamente 80 idiomas y los recursos de las bibliotecas se combinan en su aplicación.

En el momento de la carga, el sistema busca los recursos localizados en el orden de la lista, encuentra algunos "rastros" de polaco de las bibliotecas de soporte y decide que su aplicación está traducida al polaco.

Entonces decide que, de hecho, tiene polaco, establece la configuración regional predeterminada en polaco (para que obtenga fechas, horas, etc. formateadas para polaco). Pero cuando intenta cargar las cadenas no se encuentra nada, y carga las cadenas de la carpeta predeterminada (en valores), que son en inglés.

Al usar resConfigs, le está diciendo al compilador de recursos que solo incluya las configuraciones regionales que desea en el apk. Por lo tanto, eliminará las pocas cadenas polacas de las bibliotecas de soporte. Ahora el cargador lo comprobará, no hay cadenas en polaco, pasa al francés y todo está bien.

Esto no solo resuelve su problema, sino que también da como resultado una apk (ligeramente) más pequeña.

21
Mihai Nita 28 nov. 2017 a las 07:16

Android intentará elegir su idioma preferido, luego, si su idioma predeterminado es polaco y no tiene una cadena para polaco, elegirá el idioma predeterminado de su aplicación, inglés.

Consulte la documentación: https://developer.android.com/guide/ topic / resources / multilingual-support.html

0
diegoveloper 15 nov. 2017 a las 13:17