Android erhält das aktuelle Gebietsschema, nicht die Standardeinstellung

300

Wie erhalte ich das aktuelle Gebietsschema des Benutzers in Android?

Ich kann die Standardeinstellung erhalten, aber diese ist möglicherweise nicht die richtige?

Grundsätzlich möchte ich den aus zwei Buchstaben bestehenden Sprachcode aus dem aktuellen Gebietsschema. Nicht die Standardeinstellung. Es gibt keinLocale.current()

CQM
quelle
default()ist eine ziemlich sichere Wette, verwenden Sie sie nur nicht für die Verarbeitung (wie in den Dokumenten angegeben).
A - C
@ A - C für die Verarbeitung verwenden?
CQM
Ja, sehen Sie, was die Dokumente sagen: Einige Gebietsschemas verwenden ',' als Dezimalpunkt und '.' zur Zifferngruppierung. Sachen wie parseInt () können also fehlschlagen. Beachten Sie, dass sie weiterhin die Verwendung empfehlen default(), jedoch nicht für Dinge, die Code beschädigen können.
A - C

Antworten:

487

Die Standardeinstellung Localewird zur Laufzeit für Ihren Anwendungsprozess statisch aus den Einstellungen der Systemeigenschaften erstellt, sodass sie die Localeauf diesem Gerät beim Starten der Anwendung ausgewählten Werte darstellt . Normalerweise ist dies in Ordnung, aber es bedeutet, dass Localeder Wert von getDefaultLocale()wahrscheinlich nicht sofort aktualisiert wird , wenn der Benutzer seine Einstellungen nach dem Ausführen Ihres Anwendungsprozesses ändert .

Wenn Sie Ereignisse wie dieses aus irgendeinem Grund in Ihrer Anwendung abfangen müssen, können Sie stattdessen versuchen, die Localeverfügbaren Informationen aus dem Ressourcenobjekt Configurationabzurufen, d. H.

Locale current = getResources().getConfiguration().locale;

Möglicherweise wird dieser Wert nach einer Änderung der Einstellungen schneller aktualisiert, wenn dies für Ihre Anwendung erforderlich ist.

Devunwired
quelle
1
Hat jemand überprüft, ob das Standardgebietsschema in der App nicht geändert wurde, als Sie es im System geändert haben? Ich denke, es ist eine dieser "Konfigurationsänderungen", die Aktivitäten zerstören und neu erstellen
Michał K
11
Ich habe es getestet und beides ausgegeben, während ich das Gebietsschema geändert habe. Das Ergebnis ist, dass die Ausgabe dieselbe ist. Locale.getDefault () kann also sicher verwendet werden, da es sofort aktualisiert wird. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio
58
Dies ist in der Konfigurationsklasse veraltet, siehe die neuesten Dokumente für diesen Rat:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth
7
Warum fügen sie nicht einfach eine getFirstLocale () -Methode hinzu, um diese seltsame getLocales (). get (0) zu vermeiden?
user3290180
1
Was ist, wenn Sie ältere und neuere Versionen von API unterstützen möchten?
Ivan
179

Update für Android N (API Level 24) (keine Warnungen):

   Locale getCurrentLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }
Makalele
quelle
6
Gibt es etwas in der Support-Bibliothek, um das Wenn-Sonst zu vermeiden?
Federico Ponzi
8
@ TargetApi (Build.VERSION_CODES.N) wird nicht in Ihrem Code benötigt, wenn Sie den
Patrick Favre
@FedericoPonzi no ResourceCompat scheint keine Methode für das Gebietsschema ab 25.0.1 zu haben
Patrick Favre
2
Dies funktioniert möglicherweise nicht, wenn auf dem Benutzer mehrere Sprachen installiert sind. Sie sollten verwenden, LocaleList.getDefault().get(0);da dies die nach der bevorzugten Sprache sortierten Gebietsschemas zurückgibt.
Curly
21
@FedericoPonzi @ for3st Ich fand dies in ConfigurationCompat, asConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval
63

Wenn Sie die Android-Supportbibliothek verwenden, können Sie ConfigurationCompatanstelle der Methode von @ Makalele Verfallswarnungen entfernen:

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

oder in Kotlin:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
ElegyD
quelle
8
Wenn Sie keinen Kontext haben, können Sie auch tunConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.
@ QuentinG. Ja, aber in diesem Fall ist es besser, den Anwendungskontext zu verwenden .
McMath
Um klar zu sein, wird dadurch nicht das Standardgebietsschema zurückgegeben, sondern das vom Benutzer bevorzugte Gebietsschema?
Csaba Toth
12

Aus getDefaultder Dokumentation:

Gibt das bevorzugte Gebietsschema des Benutzers zurück. Dies wurde möglicherweise für diesen Prozess mit setDefault (Locale) überschrieben.

Auch aus den LocaleDokumenten:

Das Standardgebietsschema eignet sich für Aufgaben, bei denen dem Benutzer Daten präsentiert werden.

Scheint, als sollten Sie es einfach benutzen.

Kabuko
quelle
7
Diese Antwort ist falsch, hat ein Standardgebietsschema, aber wenn der Benutzer es im laufenden Betrieb geändert hat, wird es falsch angezeigt. Die nächste Antwort ist richtig
user170317
vereinbart, falsche Antwort. In meinem Fall suchte ich nach einer Möglichkeit, getResources () nicht verwenden zu müssen, was bedeutet, dass ich einen Kontext benötige. Mein Problem war eine Hilfsklasse, die keinen Kontext hatte, aber ich denke, ich muss ihn weitergeben. Wenn Sie eine App haben, mit der Benutzer ihr Gebietsschema ändern und die Zeichenfolgen, Zahlenformate usw. der Ansichten ändern können, dann Sie müssen Devunwired Antwort verwenden
1mike12
Arbeite für mich. Wenn ich einen Haltepunkt auf setze Locale.setDefault(), wird er aufgerufen, wenn ich die Gerätesprache zumindest wieder auf Android 5.0
ändere
6

Alle Antworten oben - funktionieren nicht. Also werde ich hier eine Funktion setzen, die auf 4 und 9 Android funktioniert

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}
Александр Остапюк
quelle
Eine der wenigen Antworten, die die bevorzugte Sprachrichtung des Benutzers auf Geräteebene zurückgibt. Sie können auch verwenden, LocaleListCompat.getDefault()wenn Sie AndroidX verwenden.
Sam
1

Ich habe das benutzt:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}
fvaldivia
quelle
0

Gemäß der offiziellen Dokumentation ist ConfigurationCompat in Support-Bibliotheken veraltet

Sie können in Betracht ziehen, zu verwenden

LocaleListCompat.getDefault()[0].toLanguageTag() Die 0. Position ist das vom Benutzer bevorzugte Gebietsschema

Das Standardgebietsschema an der 0. Position zu erhalten, wäre LocaleListCompat.getAdjustedDefault()

Rakshit Soni
quelle
Ja, aber es wurde nicht durch die androidx ConfigurationCompat-Version ersetzt, siehe developer.android.com/reference/androidx/core/os/…
DragonLord
Richtig, vielleicht wird es nur wegen der Androidx-Migration erwähnt
Rakshit Soni