Holen Sie sich die aktuelle Sprache im Gerät

608

Wie können wir die aktuelle Sprache auf dem Android-Gerät auswählen lassen?

Pinki
quelle
10
Die meisten Antworten hier beziehen sich auf die Sprache der Anwendung. Da Sie das Standardgebietsschema der Anwendung im Code festlegen können, ist die richtige Antwort die Antwort von Sarpe - das gibt Ihnen das Gebietsschema des Geräts.
Victor Ionescu
@ VictorIonescu danke für den Kommentar. Sarpes Antwort ist die richtige Antwort auf das Gebietsschema des Abrufgeräts. Bitte beziehen Sie sich darauf. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Antworten:

834

Wenn Sie die ausgewählte Sprache Ihres Geräts erhalten möchten, kann dies Ihnen helfen:

Locale.getDefault().getDisplayLanguage();
DeRagan
quelle
73
getDisplayLanguage () lokalisiert die Sprache. Wenn Sie nur den ISO-Code erhalten möchten (z. B. für if- oder switch-Anweisungen), verwenden Sie 'Locale.getDefault (). GetISO3Language ();'
Nuala
13
getISO3Language () gibt Dinge wie "deu" für Deutschland (Deutschland) zurück, anstatt de ...
Tobias
372
Sie können verwenden Locale.getDefault().getLanguage();, um den üblichen Sprachcode abzurufen (z. B. "de", "en").
Muscardinus
35
@DeRagan, Dies gibt Ihnen nicht immer die Sprache für Ihr Gerät, sondern nur für Ihre App. Zum Beispiel, wenn ich Anruf Locale.setDefault("ru")wird auf Englisch, und die Sprache in den Systemeinstellungen festgelegt, dann Methode Locale.getDefault().getLanguage()zurückkehren „ru“ , aber nicht „en“ . Gibt es eine andere Methode, um ein echtes SYSTEM-Gebietsschema / eine echte SYSTEM-Sprache zu erhalten? Ich habe hier keine dokumentierte Lösung gefunden , aber gibt es eine elegantere Lösung?
Prizoff
47
Ich bevorzuge Locale.getDefault().toString()eine Zeichenfolge, die das Gebietsschema vollständig identifiziert, z. B. "en_US".
Tom
835

Ich habe die Locale-Methoden auf meinem Android 4.1.2-Gerät und die Ergebnisse überprüft:

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
quelle
7
Danke, schön mit einer Liste von Möglichkeiten. Könnten Sie bitte "Locale.getDefault (). ToString ()" hinzufügen, wie in einem Kommentar von "Tom" vorgeschlagen.
RenniePet
Ich bin verwirrt. Haben Sie gerade die Antwort von DeRagan kopiert?
Dieter
1
Das tut mir leid. Es ist wahr, ich habe es dort hinzugefügt. Ich hätte eine Notiz hinterlassen sollen, die von hier kam. Ich habe den Fehler gemacht, den Leuten zu helfen, schneller die Antwort zu finden, die sie brauchen. Weil deine offensichtlich die bessere Antwort ist. Aber natürlich wird deine niemals an die Spitze kommen, weil die Leute sie nicht so oft sehen wie die oberste. Ist es in Ordnung, wenn wir es dort mit dem Hinweis hinzufügen, dass es aus dieser Antwort stammt?
Patrick Boos
1
Hallo wieder. Ich bevorzuge diese Lösung nicht. Derzeit wird die Antwort von DeRagan an erster Stelle und meine an zweiter Stelle angezeigt. Für einen Forscher sollte es nicht so schwierig sein, die zweite Antwort auf der Fragenseite zu überprüfen. Es wäre besser, wenn @pinki die akzeptierte Antwort ändern würde. Aber es scheint, als ob Pinki zuletzt vor 3 Monaten gesehen wurde.
Trante
1
Es gibt auch Locale.getDefault().getDisplayLanguage()welche Rückkehr"English"
Sport
106

Was für mich funktioniert hat war:

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

Resources.getSystem() Gibt ein globales freigegebenes Ressourcenobjekt zurück, das nur Zugriff auf Systemressourcen (keine Anwendungsressourcen) bietet und nicht für den aktuellen Bildschirm konfiguriert ist (kann keine Dimensionseinheiten verwenden, ändert sich nicht basierend auf der Ausrichtung usw.).

Da dies getConfiguration.localejetzt veraltet ist, ist der bevorzugte Weg, um das primäre Gebietsschema in Android Nougat zu erhalten ,:

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

Um die Kompatibilität mit den vorherigen Android-Versionen zu gewährleisten, wäre eine mögliche Lösung eine einfache Überprüfung:

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

Aktualisieren

Beginnend mit der Support-Bibliothek müssen 26.1.0Sie die Android-Version nicht überprüfen, da sie eine bequeme Methode bietet, die abwärtskompatibel ist getLocales().

Rufen Sie einfach an:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
Sarpe
quelle
6
getConfiguration (). locale ist derzeit veraltet, verwenden Sie getConfiguration (). getLocales (). get (0) stattdessen
Eliseo Ocampos
4
Dies ist die richtige Antwort auf diese Frage. Andere Antworten werden lokal von der App abgerufen, nicht vom Gerät.
Hofs
6
Ich weiß nicht, ob dies existierte, als die Antwort geschrieben wurde, aber die Support-Bibliothek verfügt über abwärtskompatible Versionen davon. Es ist nicht erforderlich, die Abwärtskompatibilität selbst zu schreiben. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear
Wie @Thorbear hervorhob, ist die Verwendung der neuen Support-Bibliotheksmethode der richtige getLocalesWeg. Ich habe meine Antwort aktualisiert.
Sarpe
Das ist die richtige Antwort. Andere geben die Sprache der Anwendung und nicht des Systems zurück.
Chintan Rathod
44

Sie können die Sprache aus dem aktuellen Gebietsschema "extrahieren". Sie können das Gebietsschema über die Standard-Java-API oder über den Android-Kontext extrahieren. Zum Beispiel sind die beiden folgenden Zeilen äquivalent:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Johan Pelgrim
quelle
10
das ist nicht wahr. Sie sind anders. Die erste kann sich ändern, wenn der Benutzer das Gebietsschema wechselt. Der zweite ist derjenige, der auf dem Telefon vorinstalliert ist. Es ändert sich nie, egal was der Benutzer tut.
Gregm
16
Kommentar von Gregm könnte falsch sein. Siehe Antwort von airewyre.
Jan Groth
4
@ Gregms Kommentar ist falsch. Probieren Sie es einfach selbst aus und Sie werden sehen, dass sich Locale.getDefault () ändert, wenn Sie die Sprache in den Einstellungen ändern.
Patrick Boos
Obwohl @ gregms Kommentar falsch ist, hat er immer noch Recht, dass diese beiden Zeilen nicht dasselbe Gebietsschema zurückgeben müssen. Rufen Sie einfach Locale.setDefault()vorher mit einem anderen Gebietsschema an und Sie erhalten andere Ergebnisse.
Arekolek
35

Um anderen Zeit und / oder Verwirrung zu ersparen, wollte ich mitteilen, dass ich die beiden oben von Johan Pelgrim vorgeschlagenen Alternativen ausprobiert habe und sie auf meinem Gerät gleichwertig sind - unabhängig davon, ob der Standardspeicherort geändert wurde oder nicht.

Die Standardeinstellung meines Geräts ist also Englisch (United Kindom). In diesem Zustand liefern erwartungsgemäß beide Zeichenfolgen in Johans Antwort das gleiche Ergebnis. Wenn ich dann das Gebietsschema in den Telefoneinstellungen ändere (z. B. italiano (Italia)) und erneut ausführe, geben beide Zeichenfolgen in Johans Antwort das Gebietsschema als italiano (Italia) an.

Daher halte ich Johans ursprünglichen Beitrag für richtig und Gregms Kommentar für falsch.

Airewyre
quelle
17

Sie können dies verwenden

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

wenn "xx" ein beliebiger Sprachcode wie "en", "fr", "sp", "ar" ist ... und so weiter

Simon K. Gerges
quelle
3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino
1
@ClementMartino Ihr Vorschlag ist in Ordnung für vordefinierte Gebietsschemas wie ENGLISCH, aber für andere Gebietsschemas wie Arabisch müssen wir ihn mit dem Lang-Code analysieren
Simon K. Gerges
8

Wenn die API-Ebene 24 oder höher ist, verwenden Sie LocaleList.getDefault().get(0).getLanguage() else useLocale.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();
    }
}

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

Clybe
quelle
Es sollte eine akzeptable Antwort im Jahr 2020 sein!
Andrii Kovalchuk
6

Zur Antwort von Johan Pelgrim hinzufügen

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

sind äquivalent, weil die android.text.format.DateFormatKlasse beide austauschbar verwendet, z

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

und

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
quelle
5

Sie können versuchen, das Gebietsschema aus den Systemressourcen abzurufen:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
stefan.nsk
quelle
1
Dies ist DIE Antwort für den Fall, dass Sie einen Teil der Konfiguration
überschrieben haben
4

Diese Lösung hat bei mir funktioniert. Dadurch erhalten Sie die Sprache des Android-Geräts (nicht die Landessprache der App).

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

Dies gibt "en" oder "de" oder "fr" oder was auch immer Ihre Gerätesprache eingestellt ist zurück.

Arjun
quelle
3

Mit diesem Code können Sie den aktuellen Tastaturstatus ermitteln

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

Es gibt zwei Sprachen.

Standardsprache des Betriebssystems:

Locale.getDefault().getDisplayLanguage();

Aktuelle Anwendungssprache:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
Ayed Abboushi
quelle
3
Das ist nicht wahr, wenn Sie das Gebietsschema in Ihrer App ändern, geben Sie zuerst den geänderten Wert und nicht den Systemwert
An Kra
3

Wenn Sie eine Sprache wählen, die Sie nicht eingeben können, kann dieses Griechisch hilfreich sein.

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

Versuchen Sie es jetzt mit Griechisch

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

Wenn Sie eine aktuelle Sprache überprüfen möchten, verwenden Sie die Antwort von @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
quelle
Wenn Sie das lokale Datumsformat des Benutzers anwenden möchten, verwenden Sie DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind
1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Pratibha Sarode
quelle
2
Bitte fügen Sie einige Details hinzu, warum dies die Frage beantwortet - nur ein Code-Snippet hilft den Lesern nicht, die Lösung zu verstehen
Wand Maker
Locale.getDefault (). GetDisplayName () gibt die aktuelle Sprache Ihres Geräts an. und wir prüfen, ob die Gerätesprache Hindi ist oder nicht. Wenn die aktuelle Gerätesprache Hindi ist, tun Sie, was Sie im Block wollen.
Pratibha Sarode
1

Der richtige Weg, um die Sprache Ihres Geräts zu erhalten, ist der folgende:

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

Ich hoffe es hilft.

andrea.rinaldi
quelle
1
Locale.getDefault().getDisplayLanguage()

Sie erhalten beispielsweise einen WrittenNamen für die Sprache, z.English, Dutch, French

Locale.getDefault().getLanguage()

wird Ihnen language codezum Beispiel geben:en, nl, fr

Beide Methoden geben String zurück

Shamsul Arefin Sajib
quelle
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
quelle
1

Die anderen haben gute Antworten für die Gerätesprache gegeben,

Wenn Sie möchten, dass die App- Sprache am einfachsten funktioniert, fügen Sie app_langIhrer strings.xmlDatei einen Schlüssel hinzu und geben Sie die Sprache für jede der langs an.

Wenn sich die Standardsprache Ihrer App von der Gerätesprache unterscheidet, können Sie diese auf diese Weise als Parameter für Ihre Dienste senden.

htafoya
quelle
Ich kann nicht glauben, dass es keine Framework-Unterstützung gibt, um Ihnen die Sprache zu geben, die der AssetManager derzeit verwendet. Tatsächlich verwenden die Helfer im Zeichenfolgenformat in Resources.java das Standardgebietsschema [0]. Wenn die Zeichenfolge aus dem AssetManager aus einem Gebietsschema stammt, das nicht mit dem Standardgebietsschema des Geräts übereinstimmt (da Ihre App dies nicht unterstützt, z. B. das nächste unterstützt) auf der Liste) dann gibt es einen Fehler.
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";
}
Grafritz Design
quelle
Es wäre besser, wenn Sie der Antwort mehr Anweisungen hinzufügen könnten, als nur den Code einzufügen.
Calos
0

Meine Lösung ist so

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

und dann

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

gezeigt ---> en

Biyoalp
quelle
0

Hier ist der Code, um das Geräteland zu erhalten. Kompatibel mit allen Versionen von Android sogar Oreo.

Lösung: Wenn der Benutzer keine SIM-Karte als Land hat, wird er während der Telefoneinrichtung oder der aktuellen Sprachauswahl verwendet.

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
quelle
-3

Wenn Sie eine bestimmte Aufgabe für Benutzer mit Wohnsitz in Indien ausführen möchten, die Hindi sprechen, verwenden Sie die folgende Bedingung

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