Je faisais comme ça:
context.getResources().getConfiguration().locale
Configuration.locale
est obsolète si la cible est égale à 24. J'ai donc apporté cette modification:
context.getResources().getConfiguration().getLocales().get(0)
Maintenant, il est dit que c'est seulement pour minSdkVersion
24, donc je ne peux pas l'utiliser parce que ma cible minimale est plus basse.
Quelle est la bonne méthode?
Vérifiez la version que vous utilisez et utilisez la solution obsolète:
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = context.getResources().getConfiguration().getLocales().get(0);
} else {
locale = context.getResources().getConfiguration().locale;
}
Vous pouvez utiliser Locale.getDefault()
, qui est le moyen standard de Java d’obtenir le Locale
actuel.
Dans Configuration.Java
, il y a:
/**
* ...
* @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);
Donc, fondamentalement, utiliser locale
renvoie fondamentalement le primary locale que l'utilisateur définit. La réponse d'acceptation fait exactement la même chose que de lire locale
directement.
Cependant, ces paramètres régionaux ne sont pas nécessairement ceux utilisés lors de l'obtention de ressources. Il peut s'agir des paramètres régionaux secondaires de l'utilisateur si les paramètres régionaux principaux ne sont pas disponibles.
Voici une version plus correcte:
Resources resources = context.getResources();
Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
? resources.getConfiguration().getLocales()
.getFirstMatch(resources.getAssets().getLocales())
: resources.getConfiguration().locale;