¿Cómo cambiar el idioma de la aplicación cuando el usuario selecciona el idioma?

Quiero que mi aplicación sea compatible con tres idiomas español, portugués e inglés. Y dar la opción de seleccionar el idioma en la aplicación. He hecho

1) 3 carpetas dibujables drawable-es, drawable-pt, dibujable.

2) 3 values ​​folder values-es, values-pt, values.Change String.xml valores según los idiomas.

Tengo imageView para seleccionar el idioma. Al hacer clic en el menú abrir, aparece la opción inglés, español, portugués.

Establecí Locale dentro de la aplicación en la selección de opciones por este código

public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.en: Locale locale = new Locale("en"); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show(); break; case R.id.pt: Locale locale2 = new Locale("pt"); Locale.setDefault(locale2); Configuration config2 = new Configuration(); config2.locale = locale2; getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics()); Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show(); break; case R.id.es: Locale locale3 = new Locale("es"); Locale.setDefault(locale3); Configuration config3 = new Configuration(); config3.locale = locale3; getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics()); Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show(); break; } return super.onOptionsItemSelected(item); } 

He declarado en Manifest- android: configChanges = “locale”

Funciona pero tiene algún problema.

Problema:-

1) Cuando se selecciona el idioma, la pantalla que consiste en la imagen de la selección del idioma no cambia, pero otras pantallas cambian.

2) Después de la orientación, cambie el idioma de restauración de la aplicación de acuerdo con la configuración regional del teléfono.

Es un extracto de la página web: http://android.programmerguru.com/android-localization-at-runtime/

Es simple cambiar el idioma de su aplicación cuando el usuario la selecciona de la lista de idiomas. Tenga a continuación un método que acepte la configuración regional como String (como ‘en’ para inglés, ‘hola’ para hindi), configure la configuración regional de su aplicación y actualice su actividad actual para reflejar el cambio de idioma. La configuración regional que aplicó no se cambiará hasta que la cambie manualmente de nuevo.

 public void setLocale(String lang) { Locale myLocale = new Locale(lang); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf, dm); Intent refresh = new Intent(this, AndroidLocalize.class); startActivity(refresh); finish(); } 

Asegúrese de importar los siguientes paquetes:

 import java.util.Locale; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.util.DisplayMetrics; 

agregar en manifiesto a la actividad android: configChanges = “locale | orientation”

Debe eliminar android:configChanges="locale" del manifiesto, lo que causará que la actividad se vuelva a cargar, o anular el método de onConfigurationChanged :

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // your code here, you can use newConfig.locale if you need to check the language // or just re-set all the labels to desired string resource } 

Las buenas soluciones se explicaron bastante bien aquí. Pero aquí hay uno más.

Cree su propia clase CustomContextWrapper extendiendo ContextWrapper y ContextWrapper para cambiar la configuración de Locale para la aplicación completa. Aquí hay un GIST con uso.

Y luego llame al CustomContextWrapper con el identificador de locale guardado, por ejemplo 'hi' para el idioma Hindi en el método del ciclo de vida de la actividad attachBaseContext . Uso aquí:

 @Override protected void attachBaseContext(Context newBase) { //fetch from shared preference also save to the same when applying. default here is en = English String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en"); super.attachBaseContext(SnapContextWrapper.wrap(newBase, language)); } 

El código de muestra de Udhay funciona bien. Excepto la cuestión de Sofiane Hassaini y Chirag SolankI, para el reingreso, no funciona. Intento llamar al código de Udhay sin reiniciar la actividad en onCreate (), antes de super.onCreate (savedInstanceState) ;. ¡Entonces está bien! Solo un pequeño problema, las cadenas de menú todavía no cambiaron a la configuración regional establecida.

  public void setLocale(String lang) { //call this in onCreate() Locale myLocale = new Locale(lang); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf, dm); //Intent refresh = new Intent(this, AndroidLocalize.class); //startActivity(refresh); //finish(); }