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

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

32 ответа

Решение

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

Locale.getDefault().getDisplayLanguage();

Я проверил методы 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

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

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

Resource.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());

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

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

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

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

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

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

Locale.getDefault().getLanguage()

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

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

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

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

Если уровень 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()[0].language
    } else {
        return Locale.getDefault().language
    }
}

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

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

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

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

Если вы хотите проверить текущий язык, используйте ответ @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())
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";
}

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

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

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

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 ...
}

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

Чтобы получить фактические языки устройства (да, если у пользователя есть несколько языков, добавленных в настройках, он вернет все!)

Котлин:

      // Will return something like ["en_US", "de_DE"]
val deviceLanguages: LocaleListCompat = ConfigurationCompat.getLocales(Resources.getSystem().configuration)
// Will return the actual language in use, like "en" or "de". The first language in the above code will be the default language
val currentActiveDeviceLanguage = languages.get(0).language 

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

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

Locale.getDefault().getDisplayLanguage();

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

getResources().getConfiguration().locale.getDisplayLanguage();//return string

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

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

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

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

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

Основной ответ Котлина :

      Locale.getDefault().language

Locale.getDefault().getLanguage() — это язык виртуальной машины.

      Locale.getDefault().getLanguage()

Это язык текущего экземпляра виртуальной машины, на котором выполняется ваше приложение. Он используется классами Java, такими как DateFormat и т. д. Вам может потребоваться изменить это при изменении языкового стандарта приложения, если вы используете определенные классы Java. Если вы изменили это во время изменения языкового стандарта приложения, это не то же самое, что язык Android.

context.getConfiguration().locale.getLanguage() — это язык действий.

      context.getConfiguration().locale.getLanguage()

Это язык, установленный в вашей деятельности. В последних версиях SDK предпочтительнее следующее

      context.getConfiguration().getLocales().get(0).getLanguage()

Resources.getSystem().getConfiguration().getLocales() предоставляет все локали, добавленные пользователем на системном уровне.

Это даст вам первую локаль, которую пользователь установил на системном уровне.

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

Большое количество пользователей говорят на нескольких языках, поэтому вы можете зациклиться на Locales.

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()));

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

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();

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

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
Locale.getDefault().getDisplayLanguage()

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

Locale.getDefault().getLanguage()

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

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

Код ниже вернет вам код страны, например США.

      Locale.getDefault().getCountry()

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

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

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

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}

Вот код для получения страны устройства. Совместим со всеми версиями 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;
}

Обновленный ответ на создание Jetpack изнутри@Composable

      val locale = Locale.current
// locale.language

вы можете использовать .setLanguage(Locale.forLanguageTag(Locale.getDefault().getLanguage())); это хорошо

Если вы используете реактивный ранец

В стороне составного функционала

      Context.applicationContext.resources.configuration.locales.get(0).language 
Другие вопросы по тегам