ПРИМЕЧАНИЕ. Если ваш минимальный API 17+, переходите сразу к нижней части этого ответа. В противном случае читайте дальше ...
ПРИМЕЧАНИЕ. Если вы используете App Bundle, убедитесь, что вы отключили разделение языков или установили другой язык динамически. См. 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; // whatever you want here
res.updateConfiguration(conf, null); // second arg null means don't change
// retrieve resources from desired locale
String str = res.getString(id);
// restore original locale
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
, возвращенного этим методом. После получения ресурсов ничего сбрасывать не нужно.
person
Ted Hopp
schedule
28.02.2012
ResourceBundle
должны относиться к активам ?? или они могут получить доступ к нашей папке res? - person Rakeeb Rajbhandari   schedule 08.01.2014getString(R.strings.text)
вы получите строку на языке пользователя (или по умолчанию, если язык пользователя не имеет папки) - person Lucas Queiroz Ribeiro   schedule 09.12.2016