Pregunta ¿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 Manifiesto- 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.


75
2017-10-16 05:46


origen


Respuestas:


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"


134
2017-10-18 11:55



Usted debe eliminar android:configChanges="locale" de manifiesto, que causará actividad para recargar, o anular onConfigurationChanged método:

@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
}

5
2017-10-29 21:08



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

Crea tu propio CustomContextWrapper clase que se extiende ContextWrapper y úselo para cambiar la configuración de configuración regional para la aplicación completa. Aquí hay un GIST con uso

Y luego llama al CustomContextWrapper con el identificador de configuración regional guardado, p. '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));
}

1
2017-09-03 15:01



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();
} 

1
2017-09-28 19:58