web-dev-qa-db-fra.com

Comment changer la langue de l'application lorsque l'utilisateur sélectionne la langue?

Je veux que mon application prenne en charge trois langues: espagnol, portugais et anglais. Et donner la possibilité de choisir la langue dans app.J'ai fait

1) 3 dossiers dessinables drawable-es, drawable-pt, drawable.

2) 3 valeurs du dossier values-es, values-pt, values.Change les valeurs String.xml en fonction des langues.

J'ai imageView pour sélectionner la langue.Lorsque vous cliquez dessus, le menu ouvre est constitué de l'option Anglais, Espagnol, Portugais.

Je mets Locale dans l'application sur la sélection des options par ce code

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

J'ai déclarer dans Manifest- Android: configChanges = "locale"

Ça marche mais ça pose un problème.

Problème:-

1) Lorsque la langue est sélectionnée, l’écran constitué de l’image de sélection de la langue ne change pas, mais les autres écrans changent.

2) Après l'orientation, changez la langue de restauration de l'application en fonction des paramètres régionaux du téléphone.

91
mukesh

C'est extrait pour la page Web: http://Android.programmerguru.com/Android-localization-at-runtime/

Il est simple de changer la langue de votre application lorsque l'utilisateur la sélectionne dans une liste de langues. Utilisez une méthode comme ci-dessous qui accepte les paramètres régionaux sous forme de chaîne (comme 'en' pour l'anglais, 'hi' pour l'hindi), configurez les paramètres régionaux de votre application et actualisez votre activité actuelle pour refléter le changement de langue. Les paramètres régionaux que vous avez appliqués ne seront pas modifiés tant que vous ne les modifierez plus manuellement.

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

Assurez-vous que vous avez importé les packages suivants:

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; 

ajouter le manifeste à l'activité Android: configChanges = "locale | orientation"

155
Udhay

Vous devez soit supprimer Android:configChanges="locale" du manifeste, ce qui provoquera le rechargement de l'activité, soit remplacer la méthode 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
}
6
Frane Poljak

Les bonnes solutions sont assez bien expliquées ici. Mais voici un de plus.

Créez votre propre classe CustomContextWrapper prolongeant la classe ContextWrapper et utilisez-la pour modifier le paramètre de paramètres régionaux de l'application complète. Voici un Gist avec l'usage.

Ensuite, appelez le CustomContextWrapper avec l'identificateur de paramètres régionaux enregistré, par exemple. 'hi' pour l'hindi dans la méthode de cycle de vie d'une activité attachBaseContext. Utilisation ici:

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

tout le code ci-dessus est parfait, mais un seul qui manque, le mien ne fonctionnait pas simplement parce que la langue n'était pas mentionnée dans le fichier de configuration

 defaultConfig {

    resConfigs "en", "hi", "kn"

}

après cela, toutes les langues ont commencé à fonctionner

4
Lokesh Tiwari

Le code exemple d'Udhay fonctionne bien. Sauf la question de Sofiane Hassaini et de Chirag Solanki, pour la rentrée, ça ne marche pas. J'essaie d'appeler le code d'Udhay sans redémarrer l'activité dans onCreate (), avant super.onCreate (savedInstanceState) ;. Alors c'est bon! Seul petit problème, les chaînes de menus ne sont toujours pas modifiées selon les paramètres régionaux définis.

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

Ceux qui ont le problème de version essaient ce code.

public static void switchLocal(Context context, String lcode, Activity activity) {
        if (lcode.equalsIgnoreCase(""))
            return;
        Resources resources = context.getResources();
        Locale locale = new Locale(lcode);
        Locale.setDefault(locale);
        Android.content.res.Configuration config = new 
        Android.content.res.Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        //restart base activity 
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
2
Wahab Khan Jadon