Отримайте поточну мову в пристрої


608

Як ми можемо вибрати поточну мову, вибрану на пристрої Android?


10
Більшість відповідей тут отримує мову програми. Зважаючи на те, що ви можете встановити локальну локальну програму програми в коді, правильною відповіддю є відповідь, яку дає Сарпе - це дає вам локальну інформацію пристрою.
Віктор Іонеску

@VictorIonescu дякую за коментар. Відповідь Сарпа - це правильна відповідь на локальний пристрій пристрою. Будь ласка, зверніться до нього. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Відповіді:


834

Якщо ви хочете отримати вибрану мову свого пристрою, це може допомогти вам:

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage () локалізує мову. Якщо ви зацікавлені в отриманні коду ISO (наприклад, для операторів if або переключення), використовуйте "Locale.getDefault (). GetISO3Language ();"
нуала

13
getISO3Language () повертає такі речі, як "deu" для Deutschland (Німеччина) замість de ...
Tobias

372
Ви можете використовувати Locale.getDefault().getLanguage();звичайний код мови (наприклад, "de", "en").
muscardinus

35
@DeRagan, це не завжди дає вам мову для вашого пристрою, але лише для вашого додатка. Наприклад, якщо я дзвоню Locale.setDefault("ru"), а мова в системних налаштуваннях встановлена ​​на англійську, тоді метод Locale.getDefault().getLanguage()поверне "ru" , але не "en" . Чи існує інший метод отримання реальної мови / мови SYSTEM? Я не знайшов тут документально підтвердженого рішення , але чи є більш елегантне рішення?
Prizoff

47
Я віддаю перевагу, Locale.getDefault().toString()який дає рядок, який повністю ідентифікує локаль, наприклад, "en_US".
Том

835

Я перевірив методи локалізації на своєму пристрої 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

7
Дякую, приємно зі списком можливостей. Не могли б ви додати "Locale.getDefault (). ToString ()", як це запропоновано в коментарі "Тома".
RenniePet

Я збентежений. Ви щойно скопіювали відповідь від DeRagan?
дітер

1
Вибач за те. Це правда, я додав його туди. Я мав би залишити записку, вона прийшла звідси. Я помилився, намагаючись допомогти людям швидше знайти відповідь, який їм потрібен. Тому що ваша, очевидно, краща відповідь. Але, звичайно, ваш ніколи не вийде на вершину, тому що люди бачать його не так часто, як верхній. Чи добре, якщо ми додамо його туди із зауваженням, що воно вийшло з цієї відповіді?
Патрік Боос

1
Привіт знову. Я не вважаю за краще це рішення. На даний момент відповідь Дерагана показана на першому місці, а моя - у другому. Для дослідника не повинно бути так важко перевірити другу відповідь на сторінці запитання. Було б краще, якби @pinki змінив прийняту відповідь. Але схоже, що пінкі востаннє бачили 3 місяці тому.
trante

1
є і те, Locale.getDefault().getDisplayLanguage()що повертається"English"
спорт

105

Що для мене працювало:

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

6
getConfiguration (). Локальний файл getConfiguration (). наразі застарілий, скористайтеся getConfiguration (). getLocales (). get (0) замість цього
Eliseo Ocampos

4
Це правильна відповідь на це питання. інші відповіді отримують локальний додаток, а не пристрій.
хофс

6
Я не знаю, чи існувало це тоді, коли відповідь була написана, але бібліотека підтримки має зворотні сумісні версії цього, не потрібно самостійно писати зворотні сумісність. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

Як зазначав @Thorbear, тепер слід використовувати новий метод підтримки бібліотеки getLocales. Я оновив свою відповідь.
Сарпе

Це правильна відповідь. Інші повертають мову програми не системну.
Чінтан Ратод

44

Ви можете "витягнути" мову з поточної мови. Ви можете витягти локальну мову за допомогою стандартного Java API або за допомогою Android Context. Наприклад, два рядки нижче є рівнозначними:

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

10
це не правда. Вони різні. Перший може змінитися, якщо користувач переключить Локальний. Другий - той, який попередньо встановлений на телефоні. Він ніколи не змінюється незалежно від того, що робить користувач.
gregm

16
Коментар gregm може бути помилковим. Дивіться відповідь від airewyre.
Ян Грот

4
@ коментар gregm неправильний. Просто спробуйте самі, і ви побачите, що Locale.getDefault () зміниться, коли ви зміните мову в налаштуваннях.
Патрік Боос

Якщо подивитися stackoverflow.com/questions/10657747 / ...
Wernight

Хоча коментар @ gregm невірний, він все-таки має рацію, тим двом рядкам не потрібно повертати ту саму локаль. Locale.setDefault()Заздалегідь зателефонуйте з іншим місцевим місцем і отримайте різні результати.
arekolek

35

Щоб заощадити час та / або розгубленість інших людей, я хотів поділитися тим, що я спробував дві альтернативи, запропоновані Йоханом Пелгрімом вище, і на моєму пристрої вони еквівалентні - змінили місце розташування за замовчуванням чи ні.

Тож за замовчуванням на моєму пристрої встановлено англійську мову (United Kindom), і в такому стані, як очікувалося, обидві рядки у відповіді Йохана дають однаковий результат. Якщо я потім зміню локальний параметр у налаштуваннях телефону (скажімо, на italiano (Italia)) і повторно запустіть, тоді обидві рядки у відповіді Йохана дають мова як italiano (Italia).

Тому я вважаю, що оригінальний пост Йохана є правильним, а коментар gregm - невірним.



17

Ви можете використовувати це

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

коли "xx" - це будь-який код мови на зразок "en", "fr", "sp", "ar" .... і так далі


3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Климент Мартіно

1
@ClementMartino Ваша пропозиція в порядку у випадку попередньо визначених мов, таких як АНГЛІЙСЬКА, але для інших місцевостей, таких як арабська, нам доведеться розбирати її за допомогою язикового коду
Simon K. Gerges

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


Це має бути прийнятною відповіддю у 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 ...
}

5

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

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

1
Це відповідь у випадку, якщо ви
перекрили


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

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

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

Якщо ви хочете застосувати локальний формат дати користувача, використовуйте 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;
}

Сподіваюся, це допомагає.


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

1

Інші дали хороші відповіді щодо мови пристрою,

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

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


Я не можу повірити, що немає рамкової підтримки для надання вам мови, якою зараз користується AssetManager. Насправді помічники формату String в Resources.java використовують локаль за замовчуванням [0], тож якщо рядок з AssetManager походить з локальної мови, яка не відповідає локальній мові пристрою (тому що ваша програма не підтримує її, але підтримує, наприклад, наступну у списку), тоді є помилка.
dcow

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

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


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 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.