Получить текущий язык в устройстве - PullRequest
560 голосов
/ 18 ноября 2010

Как мы можем получить текущий язык, выбранный на устройстве Android?

Ответы [ 24 ]

791 голосов
/ 18 ноября 2010

Если вы хотите получить выбранный язык вашего устройства, это может помочь вам:

Locale.getDefault().getDisplayLanguage();
730 голосов
/ 19 апреля 2014

Я проверил методы Locale на моем устройстве Android 4.1.2 и результаты:

Locale.getDefault().getLanguage()       ---> en      
Locale.getDefault().getISO3Language()   ---> eng 
Locale.getDefault().getCountry()        ---> US 
Locale.getDefault().getISO3Country()    ---> USA 
Locale.getDefault().getDisplayCountry() ---> United States 
Locale.getDefault().getDisplayName()    ---> English (United States) 
Locale.getDefault().toString()          ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
82 голосов
/ 13 февраля 2015

Что сработало для меня:

Resources.getSystem().getConfiguration().locale;

Resource.getSystem () возвращает глобальный объект общих ресурсов, который предоставляет доступ только к системным ресурсам (без ресурсов приложения) и не настроен для текущего экрана.(нельзя использовать единицы измерения, не изменяется в зависимости от ориентации и т. д.).

Поскольку getConfiguration.locale устарело, предпочтительным способом получения основного языкового стандарта в нуге Android является:

Resources.getSystem().getConfiguration().getLocales().get(0);

Чтобы гарантировать совместимость с предыдущими версиями Android, возможным решением будет простая проверка:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
    //noinspection deprecation
    locale = Resources.getSystem().getConfiguration().locale;
}

Обновление

Начиная с библиотеки поддержки 26.1.0 вам не нужно проверять версию Android, поскольку она предлагает удобный метод обратной совместимости getLocales().

Просто позвоните:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
44 голосов
/ 18 ноября 2010

Вы можете «извлечь» язык из текущей локали.Вы можете извлечь языковой стандарт с помощью стандартного API Java или с помощью контекста Android.Например, две строки ниже эквивалентны:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
34 голосов
/ 19 ноября 2011

Чтобы сэкономить время и / или путаницу, я хотел бы поделиться с вами тем, что я попробовал две альтернативы, предложенные Йоханом Пелгримом выше, и на моем устройстве они эквивалентны - независимо от того, было ли изменено расположение по умолчанию.

Таким образом, по умолчанию на моем устройстве установлено английское (United Kindom), и в этом состоянии, как и ожидалось, обе строки в ответе Йохана дают одинаковый результат. Если я затем изменю язык в настройках телефона (скажем, italiano (Италия)) и перезапущу, то обе строки в ответе Йохана дают язык как italiano (Италия).

Поэтому я считаю, что первоначальный пост Йохана был правильным, а комментарий Грегма - неправильным.

17 голосов
/ 12 июля 2013

Как описано в Справочник по языку , лучший способ получить язык:

Locale.getDefault().getLanguage()

этот метод возвращает строку с идентификатором языка в соответствии с Стандарт ISO 639-1

14 голосов
/ 15 сентября 2013

Вы можете использовать это

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

, когда "xx" - это любой код языка, например "en", "fr", "sp", "ar" .... и т. Д.

6 голосов
/ 07 декабря 2012

Добавить к ответ Йохана Пелгрима

context.getResources().getConfiguration().locale
Locale.getDefault()

эквивалентны, потому что android.text.format.DateFormat класс использует оба взаимозаменяемо, например,

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

и

public static boolean is24HourFormat(Context context) {
    String value = Settings.System.getString(context.getContentResolver(),
            Settings.System.TIME_12_24);

    if (value == null) {
        Locale locale = context.getResources().getConfiguration().locale;

    // ... snip the rest ...
}
5 голосов
/ 20 августа 2014

Вы можете попытаться получить локаль из системных ресурсов:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
3 голосов
/ 04 сентября 2015

Ответы выше не различают простой китайский и традиционный китайский.Locale.getDefault().toString() работает, который возвращает "zh_CN", "zh_TW", "en_US" и т. Д.

Ссылки на: https://developer.android.com/reference/java/util/Locale.html, ISO 639-1 - СТАРЫЙ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...