2016-07-08 2 views
12

я делаю так:Как получить текущую локаль (API-уровень 24)?

context.getResources().getConfiguration().locale 

Configuration.locale является устаревшим, если цель 24. Так что я сделал это изменение:

context.getResources().getConfiguration().getLocales().get(0) 

Теперь он говорит, что это только для minSdkVersion 24, поэтому я не могу использовать это потому, что моя мишень ниже.

Какой правильный метод?

ответ

33

Проверьте, какую версию вы работаете на и возврат к устаревшему решению:

Locale locale; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    locale = context.getResources().getConfiguration().getLocales().get(0); 
} else { 
    locale = context.getResources().getConfiguration().locale; 
} 
5

Вы можете использовать Locale.getDefault(), который является стандартным способом Java для получения текущего Locale.

+1

Это будет возвращать только локаль, указанную в настройках системы. Многие приложения имеют свои собственные функции выбора языка. Если это так, то ответ от @Egor является предпочтительным. –

+1

Если вы выберете язык вручную, вы должны вызвать Locale.setDefault() –

+1

Это очень важно, потому что в противном случае библиотеки Java не будут правильно выбирать правильный язык. –

0

В Configuration.java есть:

/** 
* ... 
* @deprecated Do not set or read this directly. Use {@link #getLocales()} and 
* {@link #setLocales(LocaleList)}. If only the primary locale is needed, 
* <code>getLocales().get(0)</code> is now the preferred accessor. 
*/ 
@Deprecated public Locale locale; 
... 
configOut.mLocaleList = LocaleList.forLanguageTags(localesStr); 
configOut.locale = configOut.mLocaleList.get(0); 

Так в основном с использованием locale основном возвращает первичный локали пользовательские наборы. Ответ на прием делает то же самое, что и прямое чтение locale.

Однако этот язык не обязательно используется при получении ресурсов. Это может быть вторичная локаль пользователя, если основной язык недоступен.

Вот более правильный вариант:

Resources resources = context.getResources(); 
Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N 
     ? resources.getConfiguration().getLocales() 
      .getFirstMatch(resources.getAssets().getLocales()) 
     : resources.getConfiguration().locale; 
Смежные вопросы