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