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


Я делал так:

context.getResources().getConfiguration().locale

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

context.getResources().getConfiguration().getLocales().get(0)
Теперь он говорит, что это только для minSdkVersion 24, поэтому я не могу использовать его, потому что моя минимальная цель ниже.

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

3 16

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;