Jak uzyskać wybrany język na urządzeniu z Androidem?
Jak uzyskać wybrany język na urządzeniu z Androidem?
Odpowiedzi:
Jeśli chcesz uzyskać wybrany język urządzenia, może to pomóc:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
aby uzyskać zwykły kod języka (np. „De”, „en”).
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?
Locale.getDefault().toString()
która daje ciąg, który w pełni identyfikuje ustawienia regionalne, np. „En_US”.
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
Locale.getDefault().getDisplayLanguage()
co powraca"English"
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.locale
został 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());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
. Zaktualizowałem swoją odpowiedź.
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();
Locale.setDefault()
wcześniej w innym miejscu, a uzyskasz inne wyniki.
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.
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
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
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
Aby dodać do odpowiedzi Johna Pelgrima
context.getResources().getConfiguration().locale
Locale.getDefault()
są równoważne, ponieważ android.text.format.DateFormat
klasa 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 ...
}
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();
W powyższych odpowiedziach nie rozróżnia się prostego chińskiego od tradycyjnego chińskiego.
Locale.getDefault().toString()
działa, które zwraca „zh_CN”, „zh_TW”, „en_US” itp.
Odniesienia do: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 jest STARY.
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.
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();
Istnieją dwa języki.
Domyślny język systemu operacyjnego:
Locale.getDefault().getDisplayLanguage();
Aktualny język aplikacji:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
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
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())
DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
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.
Locale.getDefault().getDisplayLanguage()
poda Written
nazwę języka, na przykładEnglish, Dutch, French
Locale.getDefault().getLanguage()
da ci language code
na przykład:en, nl, fr
Obie metody zwracają ciąg znaków
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()));
Inni dali dobre odpowiedzi dla języka urządzenia,
jeśli chcesz, aby język aplikacji był najprostszym sposobem, to dodając app_lang
klucz do strings.xml
pliku 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.
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";
}
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
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;
}