Я написал код для изменения локали приложения:
public void setLocale(String localeName) {
if (!localeName.equals(currentLanguage)) {
currentLanguage = localeName;
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(Constant.current_language, localeName);
editor.apply();
Toast.makeText(Settings.this, "Language changed. Restarting the app.", Toast.LENGTH_SHORT).show();
myLocale = new Locale(localeName);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.setLocale(myLocale);
res.updateConfiguration(conf, dm);
createConfigurationContext(conf);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
try{
startService(new Intent(getApplicationContext(), LocationService.class));
} catch (Exception e){
e.printStackTrace();
}
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
}, 1000);
} else {
Toast.makeText(Settings.this, "Language already selected!", Toast.LENGTH_SHORT).show();
}
}
Во всех действиях у меня есть следующий код для установки локали:
@Override
protected void attachBaseContext(Context newBase) {
Locale newLocale;
SharedPreferences sharedPreferences = newBase.getSharedPreferences(
Constant.app_pref, Context.MODE_PRIVATE);
newLocale = new Locale(sharedPreferences.getString(Constant.current_language, "en"));
Context context = ContextWrapper.wrap(newBase, newLocale);
super.attachBaseContext(context);
}
Если пользователь меняет язык, приложение перезапускается. Язык изменился отлично. Однако, когда пользователь снова меняет язык, приложение перезапускается, но язык остается прежним. Если пользователь теперь закрывает приложение, удаляет его из недавнего меню приложения, перезапускает приложение, тогда автоматически применяется новый язык.