Приведенный ниже код на 100% работает для меня на каждой Android версии:
Язык сохранения:
public void setLocal(String lang) {
Resources res = getContext().getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.setLocale(new Locale(lang));
res.updateConfiguration(conf, dm);
getActivity().recreate(); // to change app language runtime, e.g. in Settings
SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE).edit();
editor.putString(MY_LANG, lang);
editor.apply();
}
Язык загрузки:
public void loadLanguage(String lang) {
SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, Activity.MODE_PRIVATE);
String lang = prefs.getString(MY_LANG, "");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.setLocale(new Locale(lang));
res.updateConfiguration(conf, dm);
}
Вы должны вызывать метод loadLanguage () в каждом действии.
Лучшее решение - расширить все ваши действия из базового действия и реализовать loadLanguage () метод там. Обязательно вызывайте его как в onCreate, так и в onResume (и, возможно, в onConfigurationChanged тоже).
К сожалению, названия действий могут изменяться в зависимости от выбранного языка, поэтому включите следующую строку в метод onCreate каждого действия:
setTitle(R.string.activity_title);