Android obtenir les paramètres régionaux actuels, pas par défaut

300

Comment obtenir les paramètres régionaux actuels de l'utilisateur dans Android?

Je peux obtenir celui par défaut, mais ce n'est peut-être pas celui actuel correct?

Fondamentalement, je veux le code de langue à deux lettres des paramètres régionaux actuels. Pas celui par défaut. Il n'y a pasLocale.current()

CQM
la source
default()est une valeur sûre, ne l'utilisez pas pour le traitement (comme le disent les docs).
A - C
@ A - C l'utiliser pour le traitement?
CQM
Oui, voyez ce que disent les documents : certains paramètres régionaux utiliseront "," comme point décimal et "." pour le regroupement des chiffres. donc des choses comme parseInt () peuvent échouer. Notez qu'ils recommandent toujours d'utiliser default(), mais pas pour les choses qui peuvent casser le code.
A - C

Réponses:

487

La valeur par défaut Localeest construite de manière statique au moment de l'exécution pour votre processus d'application à partir des paramètres de propriété système, elle représentera donc les éléments Localesélectionnés sur ce périphérique lors du lancement de l'application . En règle générale, cela est correct, mais cela signifie que si l'utilisateur modifie ses Localeparamètres dans après l'exécution de votre processus de demande, la valeur de getDefaultLocale()ne sera probablement pas immédiatement mise à jour.

Si vous avez besoin d'intercepter des événements comme celui-ci pour une raison quelconque dans votre application, vous pouvez plutôt essayer d'obtenir le Localedisponible à partir de l' Configurationobjet ressource , c'est-à-dire

Locale current = getResources().getConfiguration().locale;

Vous pouvez constater que cette valeur est mise à jour plus rapidement après une modification des paramètres si cela est nécessaire pour votre application.

Devunwired
la source
1
Quelqu'un at-il vérifié que les paramètres régionaux par défaut ne sont pas modifiés dans l'application lorsque vous les modifiez dans le système? Je pense que c'est l'un de ces "changements de configuration" qui font que les activités sont détruites et recréées
Michał K
11
Je l'ai testé, générant les deux pendant que je continuais à changer de locale; résultat est, la sortie est la même. Ainsi, Locale.getDefault () peut être utilisé en toute sécurité car il est immédiatement mis à jour. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio
58
Ceci est déconseillé dans la classe Configuration, consultez les derniers documents pour ce conseil: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
pourquoi ne pas simplement ajouter une méthode getFirstLocale () pour éviter cette bizarre getLocales (). get (0)?
user3290180
1
Que faire si vous souhaitez prendre en charge des versions plus anciennes et plus récentes de l'API?
Ivan
179

Mise à jour Android N (Api niveau 24) (sans avertissement):

   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
la source
6
Y a-t-il quelque chose dans la bibliothèque de support pour éviter le if-else?
Federico Ponzi du
8
@TargetApi (Build.VERSION_CODES.N) n'est pas nécessaire dans votre code si vous incluez le code if et fallback
Patrick Favre
@FedericoPonzi no ResourceCompat ne semble pas avoir de méthode pour les paramètres régionaux au 25.0.1
Patrick Favre
2
Cela peut ne pas fonctionner si l'utilisateur a plusieurs langues installées. Vous devez utiliser LocaleList.getDefault().get(0);car cela retournera les paramètres régionaux triés par la langue préférée.
Curly
21
@FedericoPonzi @ for3st J'ai trouvé cela dans ConfigurationCompat, commeConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval
63

Si vous utilisez la bibliothèque de support Android, vous pouvez utiliser à la ConfigurationCompatplace de la méthode de @ Makalele pour vous débarrasser des avertissements de dépréciation:

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

ou à Kotlin:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
ElegyD
la source
8
Si vous n'avez pas de contexte, vous pouvez également le faireConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.
@QuentinG. Oui, mais il vaut mieux utiliser le contexte d' application dans ce cas.
McMath
Donc, pour être clair, cela ne retournera pas les paramètres régionaux par défaut, mais les paramètres régionaux préférés de l'utilisateur?
Csaba Toth
12

De getDefaultla documentation de:

Renvoie les paramètres régionaux préférés de l'utilisateur. Cela peut avoir été remplacé pour ce processus avec setDefault (Locale).

Également à partir des Localedocuments:

Les paramètres régionaux par défaut conviennent aux tâches qui impliquent la présentation de données à l'utilisateur.

On dirait que vous devez simplement l'utiliser.

Kabuko
la source
7
cette réponse est fausse, a obtenu un paramètre régional par défaut, mais si l'utilisateur l'a modifié à la volée, il est incorrect. la prochaine réponse est correcte
user170317
d'accord, mauvaise réponse. Dans mon cas, je cherchais un moyen de ne pas avoir à utiliser getResources (), ce qui signifie que j'ai besoin d'un contexte. Mon problème était une classe d'aide qui n'avait pas de contexte, mais je suppose que je vais devoir la transmettre. Si vous avez une application qui permet aux gens de changer leurs paramètres régionaux et de faire changer les chaînes des vues, les formats des nombres, etc., alors vous devez utiliser la réponse de
Devunwired
Travaille pour moi. Si je mets un point d' arrêt à Locale.setDefault(), il se l'appelle quand je change la langue de l' appareil au moins revenir à Android 5.0 (que les est aussi loin que je l' ai testé)
cambunctious
6

Toutes les réponses ci-dessus - ne fonctionnent pas. Je vais donc mettre ici une fonction qui fonctionne sur Android 4 et 9

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}
Александр Остапюк
la source
L'une des rares réponses qui renvoie la direction linguistique préférée de l'utilisateur au niveau de l'appareil. Vous pouvez également utiliser LocaleListCompat.getDefault()si vous utilisez AndroidX.
Sam
1

J'ai utilisé ceci:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}
fvaldivia
la source
0

Selon la documentation officielle , ConfigurationCompat est déconseillé dans les bibliothèques de support

Vous pouvez envisager d'utiliser

LocaleListCompat.getDefault()[0].toLanguageTag() La 0ème position sera les paramètres régionaux préférés de l'utilisateur

Pour obtenir les paramètres régionaux par défaut à la position 0 serait LocaleListCompat.getAdjustedDefault()

Rakshit Soni
la source
Oui, mais il n'a pas été remplacé par la version androidx ConfigurationCompat, voir developer.android.com/reference/androidx/core/os/…
DragonLord
Exact, c'est peut-être seulement mentionné à cause de la migration
androidx