Pobierz bieżący język w urządzeniu


608

Jak uzyskać wybrany język na urządzeniu z Androidem?


10
Większość odpowiedzi tutaj zawiera język aplikacji. Biorąc pod uwagę, że możesz ustawić domyślne ustawienia regionalne aplikacji w kodzie, poprawną odpowiedzią jest odpowiedź udzielona przez Sarpe - która podaje ustawienia regionalne urządzenia.
Victor Ionescu

@VictorIonescu dziękuję za komentarz. Odpowiedź Sarpe jest poprawną odpowiedzią na pobranie lokalizacji urządzenia. Proszę to polecić. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Odpowiedzi:


834

Jeśli chcesz uzyskać wybrany język urządzenia, może to pomóc:

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage () zlokalizuje język. Jeśli chcesz uzyskać kod ISO (np. Instrukcje if lub switch), użyj „Locale.getDefault (). GetISO3Language ();”
nuala

13
getISO3Language () zwraca rzeczy takie jak „deu” dla Deutschland (Niemcy) zamiast de ...
Tobias

372
Możesz użyć, Locale.getDefault().getLanguage();aby uzyskać zwykły kod języka (np. „De”, „en”).
muscardinus

35
@DeRagan, Nie zawsze daje to język dla twojego urządzenia, ale tylko dla twojej aplikacji. Na przykład, jeśli zadzwonię Locale.setDefault("ru"), a język w ustawieniach systemu zostanie ustawiony na angielski, wówczas metoda Locale.getDefault().getLanguage()zwróci „ru” , ale nie „en” . Czy istnieje inna metoda uzyskania prawdziwych ustawień regionalnych / języka SYSTEMU? Nie znalazłem tutaj udokumentowanego rozwiązania , ale czy istnieje bardziej eleganckie rozwiązanie?
Prizoff

47
Wolę, Locale.getDefault().toString()która daje ciąg, który w pełni identyfikuje ustawienia regionalne, np. „En_US”.
Tom

835

Sprawdziłem metody ustawień regionalnych na moim urządzeniu z Androidem 4.1.2 i wyniki:

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
Dzięki, miło z listą możliwości. Czy możesz dodać „Locale.getDefault (). ToString ()”, jak sugeruje komentarz w komentarzu „Tom”.
RenniePet

Jestem zmieszany. Czy skopiowałeś właśnie odpowiedź DeRagan?
dieter

1
Przepraszam za to. To prawda, że ​​dodałem go tam. Powinienem zostawić notatkę, która pochodzi stąd. Popełniłem błąd, próbując pomóc ludziom znaleźć odpowiedź, której potrzebują szybciej. Ponieważ twoja oczywiście jest lepszą odpowiedzią. Ale oczywiście twoja nigdy nie wejdzie na szczyt, ponieważ ludzie nie widzą jej tak często, jak na szczycie. Czy jest w porządku, jeśli dodamy go tam z notatką, że pochodzi z tej odpowiedzi?
Patrick Boos,

1
Witam ponownie. Nie wolę tego rozwiązania. Obecnie odpowiedź DeRagana jest wyświetlana na pierwszym miejscu, a moja na drugim. Dla badacza nie powinno być tak trudne sprawdzenie drugiej odpowiedzi na stronie pytania. Byłoby lepiej, gdyby @pinki zmieniło przyjętą odpowiedź. Ale wygląda na to, że Pinki ostatnio widział 3 miesiące temu.
trante

1
jest też to, Locale.getDefault().getDisplayLanguage()co powraca"English"
sport

105

Dla mnie zadziałało:

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

Resources.getSystem() zwraca globalny obiekt współdzielonych zasobów, który zapewnia dostęp tylko do zasobów systemowych (bez zasobów aplikacji) i nie jest skonfigurowany dla bieżącego ekranu (nie może używać jednostek wymiarów, nie zmienia się w zależności od orientacji itp.).

Ponieważ getConfiguration.localezostał już wycofany, preferowanym sposobem uzyskania podstawowych ustawień narodowych w Android Nougat jest:

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

Aby zagwarantować kompatybilność z poprzednimi wersjami Androida, możliwym rozwiązaniem byłoby proste sprawdzenie:

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

Aktualizacja

Począwszy od biblioteki wsparcia 26.1.0, nie musisz sprawdzać wersji Androida, ponieważ oferuje ona wygodną metodę kompatybilności wstecznej getLocales().

Po prostu zadzwoń:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());

6
getConfiguration (). locale jest obecnie przestarzałe, użyj getConfiguration (). getLocales (). get (0) zamiast
Eliseo Ocampos

4
To jest poprawna odpowiedź na to pytanie. inne odpowiedzi są lokalne dla aplikacji, a nie dla urządzenia.
hofs

6
Nie wiem, czy istniało to w momencie pisania odpowiedzi, ale biblioteka obsługi ma wersje kompatybilne wstecz, nie ma potrzeby, aby pisać kompatybilność wstecz samodzielnie. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

Jak wskazał @Thorbear, teraz można skorzystać z nowej metody biblioteki wsparcia getLocales. Zaktualizowałem swoją odpowiedź.
Sarpe

To właściwa odpowiedź. Inni zwracają język aplikacji nie systemowy.
Chintan Rathod

44

Możesz „wyodrębnić” język z bieżących ustawień regionalnych. Możesz wyodrębnić ustawienia narodowe za pomocą standardowego interfejsu API języka Java lub za pomocą kontekstu systemu Android. Na przykład dwie poniższe linie są równoważne:

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

10
to nie jest prawda. Oni są różni. Pierwszy może się zmienić, jeśli użytkownik zmieni ustawienia regionalne. Drugi to ten, który jest fabrycznie zainstalowany w telefonie. Nigdy się nie zmienia bez względu na to, co robi użytkownik.
gregm

16
Komentarz autorstwa gregm może być fałszywy. Zobacz odpowiedź airewyre.
Jan Groth,

4
Komentarz @ gregm jest nieprawidłowy. Po prostu wypróbuj to sam, a zobaczysz, że Locale.getDefault () zmieni się po zmianie języka w ustawieniach.
Patrick Boos,


Chociaż komentarz @ gregm jest błędny, nadal ma rację, te dwie linie nie muszą zwracać tego samego ustawienia narodowego. Po prostu zadzwoń Locale.setDefault()wcześniej w innym miejscu, a uzyskasz inne wyniki.
arekolek

35

Aby zaoszczędzić innym czas i / lub zamieszanie, chciałem się podzielić, że wypróbowałem dwie alternatywy zaproponowane przez Johana Pelgrima powyżej i na moim urządzeniu są one równoważne - niezależnie od tego, czy domyślna lokalizacja jest zmieniona.

Tak więc domyślnym ustawieniem mojego urządzenia jest angielski (United Kindom) iw tym stanie, zgodnie z oczekiwaniami, oba ciągi w odpowiedzi Johana dają ten sam wynik. Jeśli następnie zmienię ustawienia regionalne w ustawieniach telefonu (powiedz italiano (Italia)) i uruchomię ponownie, wówczas oba ciągi w odpowiedzi Johana podadzą ustawienia regionalne jako italiano (Italia).

Dlatego uważam, że oryginalny post Johana jest poprawny, a komentarz gregma jest niepoprawny.



17

Możesz tego użyć

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

gdy „xx” to dowolny kod języka, taki jak „en”, „fr”, „sp”, „ar” .... i tak dalej


3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino,

1
@ClementMartino Twoja sugestia jest OK w przypadku wstępnie zdefiniowanych lokalizacji, takich jak ANGIELSKI, ale w przypadku innych lokalizacji, takich jak arabski, musimy je przeanalizować za pomocą kodu języka
Simon K. Gerges

8

jeśli poziom API wynosi 24 lub więcej, użyj LocaleList.getDefault().get(0).getLanguage() innego użyjLocale.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();
    }
}

odniesienie: https://developer.android.com/guide/topics/resources/multilingual-support


To powinna być akceptowalna odpowiedź w 2020 roku!
Andrii Kovalchuk

6

Aby dodać do odpowiedzi Johna Pelgrima

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

są równoważne, ponieważ android.text.format.DateFormatklasa używa obu zamiennie, np

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

i

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

Możesz spróbować uzyskać ustawienia regionalne z zasobów systemowych:

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

1
To jest odpowiedź na wypadek, gdybyś zignorował jakąkolwiek część konfiguracji
Takhion


4

To rozwiązanie działało dla mnie. Spowoduje to zwrócenie języka urządzenia z Androidem (nie lokalnego języka aplikacji)

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

Zwróci to „en”, „de” lub „fr” lub cokolwiek innego, na jaki ustawiony jest język urządzenia.


3

Możesz użyć tego kodu, aby sprawdzić bieżącą klawiaturę

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

3

Istnieją dwa języki.

Domyślny język systemu operacyjnego:

Locale.getDefault().getDisplayLanguage();

Aktualny język aplikacji:

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

3
to nieprawda, jeśli zmienisz ustawienia regionalne w swojej aplikacji, nawet najpierw podasz zmienioną wartość, a nie wartość systemową
To Kra

3

Jeśli wybierzesz język, w którym nie możesz wpisać, grecki może być pomocny.

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

Teraz spróbuj z greckim

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell

3

Jeśli chcesz sprawdzić aktualny język, skorzystaj z odpowiedzi @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())

Jeśli chcesz zastosować lokalny format daty użytkownika, użyj DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind

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

2
Dodaj szczegółowe informacje o tym, dlaczego to odpowiada na pytanie - sam fragment kodu nie pomoże czytelnikom zrozumieć rozwiązania
Wand Maker

Locale.getDefault (). GetDisplayName () podaje bieżący język urządzenia. i sprawdzamy, czy językiem urządzenia jest hindi, czy nie. Jeśli bieżącym językiem urządzenia jest hindi, zrób co chcesz w bloku.
Pratibha Sarode

1

Prawidłowy sposób uzyskania języka urządzenia to:

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

Mam nadzieję, że to pomoże.


1
Locale.getDefault().getDisplayLanguage()

poda Writtennazwę języka, na przykładEnglish, Dutch, French

Locale.getDefault().getLanguage()

da ci language codena przykład:en, nl, fr

Obie metody zwracają ciąg znaków


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

Inni dali dobre odpowiedzi dla języka urządzenia,

jeśli chcesz, aby język aplikacji był najprostszym sposobem, to dodając app_langklucz do strings.xmlpliku i określ język dla każdego z języków.

W ten sposób, jeśli domyślny język aplikacji jest inny niż język urządzenia, możesz wybrać, aby wysłać go jako parametr dla swoich usług.


Nie mogę uwierzyć, że nie ma żadnej struktury zapewniającej język, którego obecnie używa AssetManager. W rzeczywistości pomocnicy formatu String w Resources.java używają domyślnych ustawień regionalnych [0], więc jeśli ciąg z AssetManager pochodzi z ustawień regionalnych, które nie są zgodne z domyślnymi ustawieniami narodowymi urządzenia (ponieważ aplikacja nie obsługuje tego, ale obsługuje np. Następny na liście), to jest błąd.
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";
}

Byłoby lepiej, gdybyś mógł dodać więcej instrukcji do odpowiedzi, niż tylko wkleić kod.
Calos

0

Moje rozwiązanie jest takie

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

i wtedy

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

pokazano ---> en


0

oto kod, aby uzyskać kraj urządzenia. Kompatybilny ze wszystkimi wersjami Androida nawet oreo.

Rozwiązanie: jeśli użytkownik nie ma karty SIM poza krajem, jest używany podczas konfiguracji telefonu lub wyboru bieżącego języka.

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

Jeśli chcesz wykonać określone zadanie dla użytkowników mieszkających w Indiach, którzy mówią po hindi, użyj poniższej opcji, jeśli warunek

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.