124 votes

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

Je veux que mon application supporte trois langues : espagnol, portugais et anglais. Et donner l'option de sélectionner la langue dans l'application.

1) 3 dossiers dessinables : dessinable-es, dessinable-pt, dessinable.

2) 3 dossiers de valeurs values-es,values-pt,values.Changez les valeurs de String.xml selon les langues.

J'ai une imageView qui permet de sélectionner la langue. Lorsque l'on clique dessus, un menu s'ouvre qui comprend les options anglais, espagnol et portugais.

J'ai défini le Locale à l'intérieur de l'application sur la sélection de l'option 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éclaré à Manifest- Android:configChanges="locale"

Il fonctionne mais il y a quelques problèmes.

Problème :-

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

2) Après le changement d'orientation, l'application rétablit la langue en fonction de la localisation du téléphone.

3voto

Fisher Points 184

L'exemple de code d'Udhay fonctionne bien. Sauf la question de Sofiane Hassaini et Chirag SolankI, pour la ré-entrée, cela ne fonctionne pas. J'essaie d'appeler le code d'Udhay sans redémarrer l'activité dans onCreate() , avant super.onCreate(savedInstanceState) ;. Alors c'est OK ! Seulement un petit problème, les chaînes de menu n'ont toujours pas été modifiées en fonction du Locale défini.

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

3voto

Wahab Khan Jadon Points 145

Ceux qui obtiennent le problème de version essayez 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());
    }

0voto

Mrudul Tora Points 380
    Locale locale = new Locale(langCode);
    Locale.setDefault(locale);
    Configuration configuration = context.getResources().getConfiguration();
    configuration.locale = locale;
    configuration.setLayoutDirection(locale); // for RTL changes
    preferences.setLocalePref(langCode);
    context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());

Ici, langCode est le code de langue requis. Vous pouvez enregistrer le code de langue comme chaîne de caractères dans sharedPreferences. et vous pouvez appeler ce code super.onCreate(savedInstanceState) en onCreate .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X