2016-07-08 41 views

Odpowiedz

33

Sprawdź, której wersji używasz na i awaryjne do nieaktualnych rozwiązanie:

Locale locale; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    locale = context.getResources().getConfiguration().getLocales().get(0); 
} else { 
    locale = context.getResources().getConfiguration().locale; 
} 
5

Można użyć Locale.getDefault(), który jest standardowym sposobem Java uzyskanie aktualnego Locale.

+1

ta zwróci jedynie locale określone w ustawieniach systemowych. Wiele aplikacji ma własną funkcję selektora języka. W takim przypadku preferowana jest odpowiedź z @Egor. –

+1

Jeśli ręcznie wybierzesz ustawienia regionalne, powinieneś zadzwonić do Locale.setDefault() –

+1

Jest to bardzo ważne, ponieważ w przeciwnym razie biblioteki Java nie będą poprawnie pobierać poprawnych ustawień regionalnych. –

0

W Configuration.java istnieje:

/** 
* ... 
* @deprecated Do not set or read this directly. Use {@link #getLocales()} and 
* {@link #setLocales(LocaleList)}. If only the primary locale is needed, 
* <code>getLocales().get(0)</code> is now the preferred accessor. 
*/ 
@Deprecated public Locale locale; 
... 
configOut.mLocaleList = LocaleList.forLanguageTags(localesStr); 
configOut.locale = configOut.mLocaleList.get(0); 

Więc w zasadzie za pomocą locale zasadzie powraca Locale podstawowym zestawów użytkowników. Odpowiedź akceptacji działa dokładnie tak samo, jak bezpośrednio po przeczytaniu locale.

Jednak to ustawienie regionalne niekoniecznie jest używane podczas pobierania zasobów. Może to być lokalny język użytkownika, jeśli podstawowe ustawienia regionalne nie są dostępne.

Oto bardziej poprawna wersja:

Resources resources = context.getResources(); 
Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N 
     ? resources.getConfiguration().getLocales() 
      .getFirstMatch(resources.getAssets().getLocales()) 
     : resources.getConfiguration().locale;