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