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