2016-07-08 31 views
12

stavo facendo in questo modo:Come ottenere la locale corrente (livello API 24)?

context.getResources().getConfiguration().locale 

Configuration.locale è deprecato se il target è 24. Così ho fatto questo cambiamento:

context.getResources().getConfiguration().getLocales().get(0) 

Ora si dice che è solo per minSdkVersion 24, quindi non posso usare perché il mio obiettivo minimo è inferiore.

Qual è il metodo giusto?

risposta

33

Controllo della versione si sta eseguendo su e fallback alla soluzione deprecato:

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

Si potrebbe utilizzare Locale.getDefault(), che è il modo standard Java di ottenere la corrente Locale.

+1

Ciò restituirà solo il locale specificato nelle impostazioni di sistema. Molte app hanno la propria funzionalità di selezione della lingua. Se questo è il caso, allora la risposta di @Egor è preferita. –

+1

Se si seleziona manualmente la locale, è necessario chiamare Locale.setDefault() –

+1

Ciò è molto importante, poiché altrimenti le librerie Java non rilevano correttamente la corretta Locale. –

0

In Configuration.java, c'è:

/** 
* ... 
* @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); 

Quindi, in pratica utilizzando locale restituisce sostanzialmente l'impostazione internazionale primario l'utente imposta. La risposta di accettazione fa esattamente la stessa cosa che legge direttamente locale.

Tuttavia, questo locale non è necessariamente quello utilizzato quando si ricevono le risorse. Potrebbe essere la locale secondaria dell'utente se la locale principale non è disponibile.

Ecco una versione più corretta:

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