Как получить текущий язык (API-уровень 24)?
Я делал так:
context.getResources().getConfiguration().locale
Configuration.locale
устарел, если цель равна 24. Так что я сделал это изменение:
context.getResources().getConfiguration().getLocales().get(0)
Теперь он говорит, что это только для minSdkVersion
24, поэтому я не могу использовать его, потому что моя минимальная цель ниже.
Какой правильный метод?
Ответы
Ответ 1
Проверьте версию, в которой вы работаете, и откажитесь от устаревшего решения:
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = context.getResources().getConfiguration().getLocales().get(0);
} else {
locale = context.getResources().getConfiguration().locale;
}
Ответ 2
Вы можете использовать Locale.getDefault()
, который является стандартным способом Java для получения текущего Locale
.
Ответ 3
В 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;