Jak uzyskać bieżące ustawienia regionalne użytkownika w systemie Android?
Mogę uzyskać domyślny, ale może nie być bieżący, prawda?
Zasadniczo chcę dwuliterowy kod języka z bieżących ustawień regionalnych. Nie domyślny. Nie maLocale.current()
Jak uzyskać bieżące ustawienia regionalne użytkownika w systemie Android?
Mogę uzyskać domyślny, ale może nie być bieżący, prawda?
Zasadniczo chcę dwuliterowy kod języka z bieżących ustawień regionalnych. Nie domyślny. Nie maLocale.current()
Odpowiedzi:
Wartość domyślna Locale
jest budowana statycznie w czasie wykonywania procesu aplikacji na podstawie ustawień właściwości systemowych, więc będzie reprezentować Locale
wybrane na tym urządzeniu podczas uruchamiania aplikacji . Zazwyczaj jest to w porządku, ale oznacza to, że jeśli użytkownik zmieni swoje Locale
ustawienia po uruchomieniu procesu aplikacji, wartość parametru getDefaultLocale()
prawdopodobnie nie zostanie natychmiast zaktualizowana.
Jeśli z jakiegoś powodu potrzebujesz pułapkować takie zdarzenia w swojej aplikacji, możesz zamiast tego spróbować uzyskać Locale
dostępne z Configuration
obiektu zasobu , tj
Locale current = getResources().getConfiguration().locale;
Może się okazać, że ta wartość jest aktualizowana szybciej po zmianie ustawień, jeśli jest to konieczne dla Twojej aplikacji.
Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
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.
Aktualizacja Androida N (poziom interfejsu API 24) (bez ostrzeżeń):
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;
}
}
LocaleList.getDefault().get(0);
ponieważ spowoduje to zwrócenie ustawień regionalnych posortowanych według preferowanego języka.
ConfigurationCompat
, jakoConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
Jeśli korzystasz z Biblioteki pomocy technicznej Androida, możesz ConfigurationCompat
pozbyć się ostrzeżeń o rezygnacji z metody @ Makalele:
Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
lub w Kotlin:
val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Z getDefault
dokumentacji:
Zwraca preferowane ustawienia narodowe użytkownika. Mogło to zostać zastąpione w tym procesie za pomocą setDefault (ustawienia regionalne).
Również z Locale
dokumentów:
Domyślne ustawienia regionalne są odpowiednie dla zadań obejmujących prezentowanie danych użytkownikowi.
Wydaje się, że powinieneś go po prostu użyć.
Locale.setDefault()
, zostanie on wywołany, gdy zmienię język urządzenia przynajmniej z powrotem na Androida 5.0 (o ile testowałem)
Wszystkie odpowiedzi powyżej - nie działają. Dlatego dodam tutaj funkcję, która działa na Androidzie 4 i 9
private String getCurrentLanguage(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
return LocaleList.getDefault().get(0).getLanguage();
} else{
return Locale.getDefault().getLanguage();
}
}
LocaleListCompat.getDefault()
jeśli używasz AndroidaX.
Zgodnie z oficjalną dokumentacją ConfigurationCompat jest przestarzały w bibliotekach pomocniczych
Możesz rozważyć użycie
LocaleListCompat.getDefault()[0].toLanguageTag()
Pozycja 0 będzie preferowanym miejscem użytkownika
Aby uzyskać Domyślne ustawienia regionalne na 0 pozycji byłoby
LocaleListCompat.getAdjustedDefault()
default()
jest dość bezpiecznym zakładem, po prostu nie używaj go do przetwarzania (jak mówią doktorzy).