Wie können wir die aktuelle Sprache auf dem Android-Gerät auswählen lassen?
Wie können wir die aktuelle Sprache auf dem Android-Gerät auswählen lassen?
Antworten:
Wenn Sie die ausgewählte Sprache Ihres Geräts erhalten möchten, kann dies Ihnen helfen:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
, um den üblichen Sprachcode abzurufen (z. B. "de", "en").
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?
Locale.getDefault().toString()
eine Zeichenfolge, die das Gebietsschema vollständig identifiziert, z. B. "en_US".
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
Locale.getDefault().getDisplayLanguage()
welche Rückkehr"English"
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.locale
jetzt 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.0
Sie 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());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
Weg. Ich habe meine Antwort aktualisiert.
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();
Locale.setDefault()
vorher mit einem anderen Gebietsschema an und Sie erhalten andere Ergebnisse.
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.
Wie in der Gebietsschema-Referenz beschrieben, ist der beste Weg, um Sprache zu erhalten ,:
Locale.getDefault().getLanguage()
Diese Methode gibt einen String mit einer Sprach-ID gemäß ISO 639-1 zurück
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
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
Zur Antwort von Johan Pelgrim hinzufügen
context.getResources().getConfiguration().locale
Locale.getDefault()
sind äquivalent, weil die android.text.format.DateFormat
Klasse 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 ...
}
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();
Die obigen Antworten unterscheiden nicht zwischen einfachem Chinesisch und traditionellem Chinesisch.
Locale.getDefault().toString()
funktioniert, die "zh_CN", "zh_TW", "en_US" usw. zurückgibt.
Verweise auf: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 ist ALT.
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.
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();
Es gibt zwei Sprachen.
Standardsprache des Betriebssystems:
Locale.getDefault().getDisplayLanguage();
Aktuelle Anwendungssprache:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
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
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())
DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
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.
Locale.getDefault().getDisplayLanguage()
Sie erhalten beispielsweise einen Written
Namen für die Sprache, z.English, Dutch, French
Locale.getDefault().getLanguage()
wird Ihnen language code
zum Beispiel geben:en, nl, fr
Beide Methoden geben String zurück
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()));
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_lang
Ihrer strings.xml
Datei 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.
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";
}
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
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;
}