Получить текущий язык в устройстве

609

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

Pinki
источник
10
Большинство ответов здесь получают язык приложения. Учитывая, что вы можете установить стандартную локализацию приложения в коде, правильный ответ - это ответ Sarpe, который дает вам локали устройства.
Виктор Ионеску
@VictorIonescu спасибо за комментарий. Ответ Сарпа - это правильный ответ для выбора локали устройства. Пожалуйста, отошлите это. stackoverflow.com/a/28498119/3762067
Варад Мондкар

Ответы:

834

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

Locale.getDefault().getDisplayLanguage();
DeRagan
источник
73
getDisplayLanguage () локализует язык. Если вы хотите просто получить код ISO (например, для операторов if или switch), используйте 'Locale.getDefault (). GetISO3Language ();'
Нуала
13
getISO3Language () возвращает такие вещи, как «deu» для Deutschland (германия) вместо de ...
Тобиас
372
Вы можете использовать, Locale.getDefault().getLanguage();чтобы получить обычный код языка (например, "de", "en").
muscardinus
35
@DeRagan, это не всегда дает вам язык для вашего устройства, но только для вашего приложения. Например, если я звоню Locale.setDefault("ru"), а язык в системных настройках установлен на английский, метод Locale.getDefault().getLanguage()вернет «ru» , но не «en» . Есть ли другой способ получить реальный язык / язык SYSTEM? Я нашел недокументированное решение здесь , но есть ли более элегантное решение?
Призофф
47
Я предпочитаю, Locale.getDefault().toString()который дает строку, которая полностью идентифицирует локаль, например, "en_US".
Том
838

Я проверил методы 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
Locale.getDefault().toLanguageTag()     ---> en-US
trante
источник
7
Спасибо, приятно с перечнем возможностей. Не могли бы вы добавить «Locale.getDefault (). ToString ()», как это предлагается в комментарии «Том».
RenniePet
Я смущен. Вы только что скопировали ответ от ДеРагана?
Дитер
1
Прости за это. Это правда, я добавил это там. Я должен был оставить записку, она пришла отсюда. Я сделал ошибку, пытаясь помочь людям быстрее найти нужный ответ. Потому что ваш, очевидно, лучший ответ. Но, конечно, ваш никогда не достигнет вершины, потому что люди не видят это так часто, как верхний. Это нормально, если мы добавим его с пометкой, что оно пришло из этого ответа?
Патрик Боос
1
И снова здравствуйте. Я не предпочитаю это решение. В настоящее время ответ ДеРагана показан на первом месте, а мой - на втором. Для исследователя не должно быть так сложно проверить второй ответ на странице вопроса. Было бы лучше, если бы @pinki изменил принятый ответ. Но похоже, что Пинки в последний раз видели 3 месяца назад.
Трант
1
есть также, Locale.getDefault().getDisplayLanguage()который возвращается"English"
спорт
106

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

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

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

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

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());
Sarpe
источник
6
getConfiguration (). locale в настоящее время устарела, вместо этого используйте getConfiguration (). getLocales (). get (0)
Eliseo Ocampos
4
Это правильный ответ на этот вопрос. другие ответы становятся локальными для приложения, а не для устройства.
Hofs
6
Я не знаю, существовало ли это, когда был написан ответ, но в библиотеке поддержки есть версии с обратной совместимостью, поэтому нет необходимости писать обратную совместимость самостоятельно. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear
Как отметил @Thorbear, теперь использование нового метода библиотеки поддержки getLocales- это путь. Я обновил свой ответ.
Сарп
Это правильный ответ. Другие возвращают язык приложения, а не системы.
Чинтан Ратод
44

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

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Йохан Пелгрим
источник
10
это неправда. Они разные. Первый может измениться, если пользователь переключает Locale. Второй - тот, который предварительно установлен на телефоне. Он никогда не меняется независимо от того, что делает пользователь.
Грегм
16
Комментарий от gregm может быть ложным. Смотрите ответ от airewyre.
Ян Грот
4
Комментарий @ gregm неверен. Просто попробуйте сами, и вы увидите, что Locale.getDefault () изменится, когда вы измените язык в настройках.
Патрик Боос
Должен увидеть stackoverflow.com/questions/10657747/…
Wernight
Хотя комментарий @ gregm неверен, он все же прав, эти две строки не должны возвращать одну и ту же локаль. Просто позвоните в Locale.setDefault()другой регион заранее, и вы получите другие результаты.
ареколек
35

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

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

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

airewyre
источник
18

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

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

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

Саймон К. Герджес
источник
3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Клемент Мартино
1
@ClementMartino Ваше предложение в порядке в случае предопределенных локалей, таких как АНГЛИЙСКИЙ, но для других локалей, таких как арабский, мы должны проанализировать его, используя код lang
Simon K. Gerges
17

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

Locale.getDefault().getLanguage()

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

Opsenas
источник
8

если уровень API 24 или выше, используйте LocaleList.getDefault().get(0).getLanguage() другое использованиеLocale.getDefault.getLanguage()

private fun getSystemLocale(): String {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return LocaleList.getDefault().get(0).getLanguage();
    } else {
        return Locale.getDefault.getLanguage();
    }
}

ссылка: https://developer.android.com/guide/topics/resources/multilingual-support

clybe
источник
Это должен быть приемлемый ответ в 2020 году!
Андрей Ковальчук
6

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

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 ...
}
armandino
источник
5

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

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
stefan.nsk
источник
1
Это ответ на тот случай, если вы переопределили какую-либо часть конфигурации
Takhion
4

Это решение сработало для меня. Это вернет вам язык устройства Android (не местный язык приложения)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

Это вернет «en» или «de» или «fr» или любой другой язык вашего устройства.

Арджун
источник
3

Вы можете использовать этот код, чтобы узнать ток клавиатуры

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Ramkailash
источник
3

Есть два языка.

Язык ОС по умолчанию:

Locale.getDefault().getDisplayLanguage();

Текущий язык приложения:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
айед аббуши
источник
3
Это не правда, если вы измените локаль в своем приложении, даже сначала дайте вам измененное значение, а не системное значение
до
3

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

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

Теперь попробуйте это с греческим

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
user462990
источник
3

Если вы хотите проверить текущий язык, используйте ответ @Sarpe (@Thorbear):

val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())
CoolMind
источник
Если вы хотите применить локальный формат даты пользователя, используйте DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind
1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Пратибха Сароде
источник
2
Пожалуйста, добавьте некоторые детали о том, почему это отвечает на вопрос - просто фрагмент кода не поможет читателям понять решение
Wand Maker
Locale.getDefault (). GetDisplayName () отображает текущий язык вашего устройства. и мы проверяем, является ли язык устройства хинди или нет. Если текущий язык устройства хинди, то делайте что хотите в блоке.
Пратибха Сароде
1

Правильный способ получить язык вашего устройства заключается в следующем:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return context.getResources().getConfiguration().getLocales().get(0);
} else {
    return context.getResources().getConfiguration().locale;
}

Надеюсь, поможет.

andrea.rinaldi
источник
1
Locale.getDefault().getDisplayLanguage()

даст вам Writtenимя для языка, например,English, Dutch, French

Locale.getDefault().getLanguage()

даст вам language code, например:en, nl, fr

Оба метода возвращают строку

Шамсул Арефин Саджиб
источник
1
public class LocalUtils {

    private static final String LANGUAGE_CODE_ENGLISH = "en";


    // returns application language eg: en || fa ...
    public static String getAppLanguage() {
        return Locale.getDefault().getLanguage();
    }

    // returns device language eg: en || fa ...
    public static String getDeviceLanguage() {
        return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
    }

    public static boolean isDeviceEnglish() {
        return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }

    public static boolean isAppEnglish() {
        return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }


}

Log.i("AppLanguage: ",     LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ",  LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ",    String.valueOf(LocalUtils.isAppEnglish()));
SR
источник
1

Другие дали хорошие ответы на язык устройства,

если вы хотите, чтобы язык приложения был самым простым способом сделать это, добавив app_langключ к вашему strings.xmlфайлу, а также укажите lang для каждого из langs.

Таким образом, если язык вашего приложения по умолчанию отличается от языка устройства, вы можете отправить его в качестве параметра для своих служб.

htafoya
источник
Я не могу поверить, что нет фреймворковой поддержки для предоставления вам языка, который в настоящее время использует AssetManager. Фактически, помощники формата String в Resources.java используют локаль по умолчанию [0], поэтому, если строка из AssetManager происходит из локали, которая не соответствует локали по умолчанию для устройства (потому что ваше приложение не поддерживает ее, но поддерживает, например, следующую в списке) тогда есть ошибка.
19
1
public void GetDefaultLanguage( ) {
    try {
        String langue = Locale.getDefault().toString(); //        ---> en_US
        /*
        Log.i("TAG", Locale.getDefault().getLanguage() ); //       ---> en
        Log.i("TAG", Locale.getDefault().getISO3Language()  ); //  ---> eng
        Log.i("TAG", Locale.getDefault().getCountry()  ); //       ---> US
        Log.i("TAG", Locale.getDefault().getISO3Country()  ); //   ---> USA
        Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
        Log.i("TAG", Locale.getDefault().getDisplayName() ); //    ---> English (United States)
        Log.i("TAG", Locale.getDefault().toString()   ); //        ---> en_US
        Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English 
        */

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            langue = Locale.getDefault().toLanguageTag(); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }else{
            langue = langue.replace("_","-"); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }
    }catch (Exception ex) {
        Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
    }
}

public String getUrlMicrosoftLearn(String langue) {
    return "https://docs.microsoft.com/"+langue+"/learn";
}
Графитц Дизайн
источник
Было бы лучше, если бы вы могли добавить больше инструкций к ответу, чем просто вставлять код.
Калос
0

Мое решение таково

@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
    return Resources.getSystem().getConfiguration().locale.getLanguage();
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
    getResources();
    return Resources.getSystem().getConfiguration().getLocales().get(0);
}

а потом

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

показано ---> ru

biyoalp
источник
0

Вот код для получения страны устройства. Совместим со всеми версиями Android, даже Oreo.

Решение: если у пользователя нет сим-карты, чем получить страну, он используется во время настройки телефона или выбора текущего языка.

public static String getDeviceCountry(Context context) {
    String deviceCountryCode = null;

    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(tm != null) {
            deviceCountryCode = tm.getNetworkCountryIso();
        }

    if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
        deviceCountryCode = deviceCountryCode.toUpperCase();
    }
    else {
        deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
    }

  //  Log.d("countryCode","  : " + deviceCountryCode );
    return deviceCountryCode;
}
Абхишек Гарг
источник
-3

Если вы хотите выполнить определенное задание для пользователей, проживающих в Индии, которые говорят на хинди, используйте нижеприведенное условие

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Divyaadz
источник