ПРИМЕЧАНИЕ Если ваш минимальный API - 17+, перейдите прямо к нижней части этого ответа.В противном случае читайте дальше ...
Если у вас есть разные папки 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.Вам нужно будет вызвать конструктор с вашей первоначальной локалью, чтобы вернуть вещи такими, какими они были.
EDIT Немного другой (и несколько более чистый) рецепт для извлечения ресурсов из определенной локали::
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
, возвращенного этим методом.Не нужно ничего сбрасывать после того, как вы получили ресурсы.