web-dev-qa-db-fra.com

Comment changer le langage par programme?

Je veux changer le langage par programme.

J'ai donc construit deux fichiers XML.

values-it
-->string.xml

values-en
-->string.xml

C'est le code dans MainActivity pour changer la langue de toute l'application:

//ITALIEN

Resources res = getApplicationContext().getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale("it");
res.updateConfiguration(conf, dm);

//ANGLAIS

Resources res2 = getApplicationContext().getResources();
DisplayMetrics dm2 = res2.getDisplayMetrics();
Android.content.res.Configuration conf2 = res2.getConfiguration();
conf2.locale = new Locale("en");
res2.updateConfiguration(conf2, dm2);

Maintenant, si je règle la langue anglaise (par exemple), le code est exécuté sans erreur, mais le libellé ne change pas son texte.
Si je change l'orientation de mon appareil, l'étiquette modifie correctement son texte.

Maintenant, comment puis-je modifier mon code pour actualiser automatiquement l'étiquette?

5
bircastri
 AlertDialog.Builder builder = new AlertDialog.Builder(DashboardActivity.this);
            builder.setTitle(R.string.languages);
            // Add the buttons
            builder.setPositiveButton(R.string.english, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    String languageToLoad = "en"; // your language
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config,
                            getBaseContext().getResources().getDisplayMetrics());
                    dialog.dismiss();
                    rEditor.putString("language", languageToLoad);
                    rEditor.commit();



                    Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class);
                    startActivity(refresh);
                    finish();

                }
            });
            builder.setNegativeButton(R.string.gujarati, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog

                    String languageToLoad = "gu"; // your language
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config,
                            getBaseContext().getResources().getDisplayMetrics());
                    dialog.dismiss();
                    rEditor.putString("language", languageToLoad);
                    rEditor.commit();


                    Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class);
                    startActivity(refresh);
                    finish();

                }
            });

            builder.create().show();

vous devez recharger l'activité pour afficher la nouvelle langue, le texte signifie redémarrer.

7
Ramchandra Singh

vous devez actualiser votre activité pour charger des ressources, ce qui ne changera pas l'orientation. essaye ça 

private void restartActivity() { 
 Intent intent = getIntent(); 
 finish(); 
 startActivity(intent);
}
4
Yasir Ali

Le meilleur moyen serait de mettre tout TextView.setText() dans une méthode. Appelez cette méthode dans votre onResume(); pour la définir pour la première fois. Rappelez ensuite cette méthode lorsque vous avez réinitialisé la langue. (l'activité passe par la onStart()onResume() etc. lorsque vous changez d'orientation)

2
Flummox

Si vous n'avez pas encore résolu votre problème, vous pouvez essayer ceci. Cela fonctionne pour moi, j'espère que cela vous aidera. Vous pouvez le référer à l'avenir

mSwitch = (Switch) findViewById(R.id.language_switch);

    mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (isChecked){
                    mSwitch.setTextColor(Color.GRAY);
                    String languageToLoad = "es";
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration configuration = new Configuration();
                    configuration.setLocale(locale);
                    Toast.makeText(getApplicationContext(), "spanish is set", Toast.LENGTH_SHORT).show();
                    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());
                } else {
                    String languageToLoad = "en";
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration configuration = new Configuration();
                    configuration.setLocale(locale);
                    Toast.makeText(getApplicationContext(), "english is set", Toast.LENGTH_SHORT).show();
                    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());
                }
        }
    });
1
fazeel zama