Forzar locale para Android con resConfig

Estoy intentando utilizar resConfig y resConfigs del sistema de compilación de Android.

  • Android Studio versión 1.2.2
  • Gradle build versión 1.2.3
  • OSX 10.10.3

Estaba teniendo problema con estas 2 opciones con mi proyecto así que empecé un nuevo proyecto en blanco con el estudio de androide. Adjunto mi build.gradle donde sólo agregué resConfigs "en", "fr" bajo

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

Y define 2 sabores básicos

 productFlavors { fr { resConfig "fr" } en { resConfig "en" } } 

A continuación, creé un 2 strings.xml archivos y tradujo la etiqueta por defecto hello_world

/src/main/res/values/strings.xml (predeterminado)
/src/main/res/values-en/strings.xml
/src/main/res/values-fr/strings.xml

Con esto, esperaría ver sólo 3 carpetas de valores en MyApplication / app / builds / intermedios / res / en / debug desde que definí en el resConfigs para usar sólo "en" y "fr" y filtrar cualquier otra cosa

/valores/
/ Valores-es /
/ Valores-fr /

Aunque, todos los idiomas la carpeta de valores están todavía allí por lo que el resConfigs no está filtrando nada aparentemente.

También espero ver la etiqueta hello_world de valores-en cuando se ejecuta enDebug variante de sabor, ya que especificó que el sabor en utilizaría resConfig "en", aunque cuando ejecuto la aplicación de prueba veo la etiqueta de / values-fr / strings. Xml en lugar de /values-en/strings.xml ya que el idioma de la tableta está configurado como francés Canadá

¿Estoy entendiendo mal el propósito detrás de resConfig? Si es así, ¿cómo se supone que debo forzar un sabor a ejecutar sólo en lenguaje y no ser dependiente de la configuración regional del sistema operativo? Esta solución debe ser compatible con flavorDimensions también ya que los uso en la aplicación real que estoy intentando configurar.

NOTA : También presenté un error ya que creo que realmente hay un problema con este comportamiento resConfig https://code.google.com/p/android/issues/detail?id=180694

Gracias

Bueno, después de muchas horas, aquí está la solución a mi problema para aquellos que terminan con el mismo problema.

Responde que resConfig no es para lo que pienso. La forma correcta y única que encontré para forzar la localidad para un sabor específico es así:

En primer lugar, asegúrese de que todas sus actividades extiende una actividad común que será responsable de forzar la configuración regional. ( Tuve que crear 2 ya que tengo algunas actividades que se extienden FragmentActivity y algunas actividades que se extienden.También realmente no me gusta hacerlo en el constructor de Actividades, pero ya que tengo que llamar a applyOverrideConfiguration antes de cualquier llamada se hace en getResources, tengo que llamar Antes de la actividad onStart ).

 public class LocaleMainActivity extends Activity { public LocaleMainActivity() { ActivityUtils.forceLocale(this); } } public class LocaleMainFragmentActivity extends FragmentActivity { public LocaleMainFragmentActivity() { ActivityUtils.forceLocale(this); } } //Method from ActivityUtils public static void forceLocale(ContextThemeWrapper contextThemeWrapper) { Configuration configuration = new Configuration(); Locale defaultLocale = new Locale(BuildConfig.LOCALE); configuration.locale = defaultLocale; contextThemeWrapper.applyOverrideConfiguration(configuration); } 

A continuación, debe definir el entorno local en los estilos de build.gradle

 productFlavors { myFrenchFlavor { buildConfigField "String", "LOCALE", "\"fr\"" } myEnglishFlavor { buildConfigField "String", "LOCALE", "\"en\"" } } 

He probado la solución en la API 19+. Funciona cuando cambia de idioma mientras está en la aplicación.

Solución alternativa ( no funcionará en Android M + ver informe de fallos de android ) Esta solución está ampliamente extendida en stackOverflow, pero me enfrenté a una pared mientras implementa esto en Android M, así que tenga esto en cuenta.

En el onCreate () de su AndroidApplication puede llamar a updateConfiguration con la configuración regional.

 Locale myLocale = new Locale(BuildConfig.LOCALE); Resources res = getResources(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf, res.getDisplayMetrics()); 

También tendrá que restablecerlo si ha definido onConfigurationChanged ()

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Configuration config = new Configuration(newConfig); config.locale = new Locale(BuildConfig.LOCALE); getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); } 

EDIT: Tenga en cuenta que este applyOverrideConfiguration tiene actualmente un efecto secundario que se explica aquí Chromium webview no parece funcionar con Android applyOverrideConfiguration . ¡El equipo de Chromium está trabajando en ello!

Gracias.

  • ¿Cómo recibir notificaciones cuando cambia la configuración del sistema en Android?
  • Visualización de fechas en formato localizado en Android
  • Android: cómo obtener el día actual de la semana (lunes, etc ...) en el idioma del usuario?
  • Android Traduce al árabe
  • Aplicaciones en varios idiomas en Android Market: ¿capturas de pantalla para más de un idioma?
  • Evento OnKeyUp en el navegador de Android para idiomas no latinos
  • Direcciones de manejo de la web móvil desde la ubicación actual
  • ¿Cómo puedo detectar si se utiliza una aplicación de Android en Corea?
  • Cómo localizar una aplicación de Android en idioma indonesio
  • Cómo analizar la fecha en formato de fecha simple en localidad árabe?
  • La aplicación de Android no funciona en China
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.