Android pobiera bieżące ustawienia regionalne, nie domyślne

300

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()

CQM
źródło
default()jest dość bezpiecznym zakładem, po prostu nie używaj go do przetwarzania (jak mówią doktorzy).
A - C
@ A - C użyć go do przetwarzania?
CQM,
Tak, zobacz, co mówią doktorzy : niektóre lokalizacje używają „,” jako przecinka dziesiętnego i „.” do grupowania cyfr. więc rzeczy takie jak parseInt () mogą zawieść. Pamiętaj, że nadal zalecają używanie default(), ale nie do rzeczy, które mogą uszkodzić kod.
A - C

Odpowiedzi:

487

Wartość domyślna Localejest budowana statycznie w czasie wykonywania procesu aplikacji na podstawie ustawień właściwości systemowych, więc będzie reprezentować Localewybrane na tym urządzeniu podczas uruchamiania aplikacji . Zazwyczaj jest to w porządku, ale oznacza to, że jeśli użytkownik zmieni swoje Localeustawienia 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ć Localedostępne z Configurationobiektu 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.

Devunwired
źródło
1
Czy ktoś sprawdził, że domyślne ustawienia regionalne nie zostały zmienione w aplikacji podczas zmiany w systemie? Myślę, że to jedna z tych „zmian konfiguracji”, które powodują, że działania są niszczone i odtwarzane
Michał K
11
Przetestowałem to, generując oba, zmieniając ustawienia regionalne; wynik jest taki, że wynik jest taki sam. Dlatego Locale.getDefault () może być bezpiecznie używany, ponieważ jest natychmiast aktualizowany. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio
58
Zostało to uznane za przestarzałe w klasie Konfiguracja, zobacz najnowsze dokumenty dotyczące tej porady: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
dlaczego po prostu nie dodają metody getFirstLocale (), aby uniknąć tego dziwnego getLocales (). get (0)?
user3290180,
1
Co jeśli chcesz obsługiwać starsze i nowsze wersje interfejsu API?
Ivan
179

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;
        }
    }
Makalele
źródło
6
Czy w bibliotece pomocy jest coś, czego można uniknąć w przypadku if-else?
Federico Ponzi
8
@TargetApi (Build.VERSION_CODES.N) nie jest potrzebny w kodzie, jeśli podasz kod „if” i „fallback”
Patrick Favre,
@FedericoPonzi no ResourceCompat nie wydaje się mieć metody dla ustawień regionalnych od 25.0.1
Patrick Favre
2
Może to nie działać, jeśli użytkownik ma zainstalowanych wiele języków. Powinieneś użyć, LocaleList.getDefault().get(0);ponieważ spowoduje to zwrócenie ustawień regionalnych posortowanych według preferowanego języka.
Curly
21
@FedericoPonzi @ for3st Znalazłem to ConfigurationCompat, jakoConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval
63

Jeśli korzystasz z Biblioteki pomocy technicznej Androida, możesz ConfigurationCompatpozbyć 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]
ElegyD
źródło
8
Jeśli nie masz żadnego kontekstu, możesz to zrobićConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.,
@QuentinG. Tak, ale w takim przypadku lepiej użyć kontekstu aplikacji .
McMath,
Żeby było jasne, nie zwróci domyślnych ustawień narodowych, ale ustawienia preferowane przez użytkownika?
Csaba Toth
12

Z getDefaultdokumentacji:

Zwraca preferowane ustawienia narodowe użytkownika. Mogło to zostać zastąpione w tym procesie za pomocą setDefault (ustawienia regionalne).

Również z Localedokumentów:

Domyślne ustawienia regionalne są odpowiednie dla zadań obejmujących prezentowanie danych użytkownikowi.

Wydaje się, że powinieneś go po prostu użyć.

kabuko
źródło
7
ta odpowiedź jest nieprawidłowa, domyślna lokalizacja, ale jeśli użytkownik zmienił ją w locie, pokaże to źle. następna odpowiedź jest poprawna
użytkownik170317,
zgodził się, zła odpowiedź. W moim przypadku szukałem sposobu, aby nie musiałem używać getResources (), co oznacza, że ​​potrzebuję kontekstu. Moim problemem była klasa pomocnicza, która nie miała kontekstu, ale zgaduję, że muszę ją przekazać. Jeśli masz aplikację, która pozwala ludziom zmieniać ich ustawienia regionalne i ciągi widoków, formaty liczb itp., To wtedy musisz użyć odpowiedzi
Devunwired
Pracuj dla mnie. Jeśli ustawię punkt przerwania na Locale.setDefault(), zostanie on wywołany, gdy zmienię język urządzenia przynajmniej z powrotem na Androida 5.0 (o ile testowałem)
przebiegły
6

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();
   }
}
Александр Остапюк
źródło
Jedna z niewielu odpowiedzi, która zwraca preferowany przez użytkownika kierunek języka na poziomie urządzenia. Możesz także użyć, LocaleListCompat.getDefault()jeśli używasz AndroidaX.
Sam
1

Użyłem tego:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}
fvaldivia
źródło
0

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()

Rakshit Soni
źródło
Tak, ale czy nie został zastąpiony wersją ConfigurationCompat systemu Android, patrz developer.android.com/reference/androidx/core/os/…
DragonLord
Zgadza się, może wspomina się to tylko z powodu migracji systemu Androidx
Rakshit Soni