Как получить текущий язык (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;