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

608

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

Pinki
źródło
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();
DeRagan
źródło
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
trante
źródło
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());
Sarpe
źródło
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();
Johan Pelgrim
źródło
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,
Powinny zobaczyć stackoverflow.com/questions/10657747/…
Wernight
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.

airewyre
źródło
17

Zgodnie z opisem w dokumentacji ustawień regionalnych najlepszym sposobem na uzyskanie języka jest:

Locale.getDefault().getLanguage()

ta metoda zwraca ciąg znaków o identyfikatorze języka zgodnie ze standardem ISO 639-1

Opsenas
źródło
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

Simon K. Gerges
źródło
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

clybe
źródło
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 ...
}
armandino
źródło
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();
stefan.nsk
źródło
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.

Arjun
źródło
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();
Ramkailash
źródło
3

Istnieją dwa języki.

Domyślny język systemu operacyjnego:

Locale.getDefault().getDisplayLanguage();

Aktualny język aplikacji:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
ayed abboushi
źródło
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
użytkownik462990
źródło
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())
CoolMind
źródło
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
}
Pratibha Sarode
źródło
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.

andrea.rinaldi
źródło
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

Shamsul Arefin Sajib
źródło
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
źródło
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.

htafoya
źródło
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";
}
Projekt Grafritz
źródło
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

biyoalp
źródło
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;
}
Abhishek Garg
źródło
-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 
}
Divyaadz
źródło