ПРИМІТКА Якщо ваш мінімальний 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
об’єкта, поверненого цим методом. Не потрібно нічого скидати після того, як ви отримали ресурси.