ПРИМІТКА Якщо ваш мінімальний API становить 17+, перейдіть до кінця цієї відповіді. В іншому випадку читайте далі ...
ПРИМІТКА Якщо ви використовуєте набори програм, вам потрібно переконатися, що ви вимкнули розділення мови або динамічно встановили іншу мову. Див. Https://stackoverflow.com/a/51054393 для цього. Якщо ви цього не зробите, він завжди використовуватиме запасний варіант.
Якщо у вас є різні папки res для різних мов, ви можете зробити щось подібне:
Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
String str = resources.getString(id);
Крім того, ви можете просто перезапустити свою діяльність, використовуючи метод, на який вказав @jyotiprakash.
ПРИМІТКАResources Такий виклик конструктора щось внутрішньо змінює в Android. Вам доведеться викликати конструктор із початковою мовою, щоб повернути речі такими, якими вони були.
РЕДАКТУВАТИ Дещо інший (і дещо чистіший) рецепт отримання ресурсів із певної локалі:
Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale savedLocale = conf.locale;
conf.locale = desiredLocale;
res.updateConfiguration(conf, null);
String str = res.getString(id);
conf.locale = savedLocale;
res.updateConfiguration(conf, null);
Що стосується рівня API 17, вам слід використовувати conf.setLocale()замість прямого налаштування conf.locale. Це правильно оновить напрямок макета конфігурації, якщо трапляється, що ви перемикаєтеся між локалями справа наліво та зліва направо. (Напрямок макета було введено в 17).
Немає сенсу створювати новий Configurationоб’єкт (як пропонує @Nulano у коментарі), оскільки виклик updateConfigurationзмінить початкову конфігурацію, отриману за допомогою виклику res.getConfiguration().
Я б вагався згрупувати це в getString(int id, String locale)метод, якщо ви збираєтесь завантажувати кілька рядкових ресурсів для мовної мови. Зміна локалей (за допомогою будь-якого рецепта) вимагає, щоб фреймворк зробив багато роботи з перев’язуванням усіх ресурсів. Набагато краще оновити локалі один раз, отримати все необхідне, а потім встановити локаль назад.
РЕДАГУВАТИ (Дякую @Mygod):
Якщо ваш мінімальний рівень API 17+, існує набагато кращий підхід, як показано в цій відповіді в іншому потоці. Наприклад, ви можете створити декілька Resourceоб’єктів, по одному для кожної потрібної мови, за допомогою:
@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) {
Configuration conf = context.getResources().getConfiguration();
conf = new Configuration(conf);
conf.setLocale(desiredLocale);
Context localizedContext = context.createConfigurationContext(conf);
return localizedContext.getResources();
}
Потім просто отримайте потрібні вам ресурси з локалізованого Resourceоб’єкта, поверненого цим методом. Не потрібно нічого скидати після того, як ви отримали ресурси.