346 votes

Android récupère la localité actuelle et non celle par défaut

Comment obtenir le Locale actuel de l'utilisateur dans Android ?

Je peux obtenir celui par défaut, mais il se peut qu'il ne soit pas le plus récent, n'est-ce pas ?

En fait, je veux le code de langue à deux lettres de la locale actuelle. Pas le code par défaut. Il n'y a pas de Locale.current()

1 votes

default() est une valeur sûre, mais ne l'utilisez pas pour le traitement (comme le dit la documentation).

1 votes

@A--C l'utiliser pour le traitement ?

0 votes

Ouais, voir ce que le docs dites : Certaines régions utilisent ',' comme point décimal et '.' pour le regroupement des chiffres. donc des trucs comme parseInt() peuvent échouer. Notez qu'ils recommandent toujours d'utiliser default() mais pas pour les choses qui peuvent casser le code.

540voto

Devunwired Points 27023

La valeur par défaut Locale est construit statiquement au moment de l'exécution pour votre processus d'application à partir des paramètres de propriété du système, il représentera donc l'élément Locale sélectionné sur cet appareil quand l'application a été lancée . En règle générale, c'est très bien, mais cela signifie que si l'utilisateur modifie son adresse de courrier électronique, il n'y a pas de problème. Locale dans les paramètres après l'exécution de votre processus d'application, la valeur de l'option getDefaultLocale() ne sera probablement pas mis à jour immédiatement.

Si, pour une raison quelconque, vous avez besoin de piéger des événements de ce type dans votre application, vous pourriez plutôt essayer d'obtenir l'adresse de l'utilisateur. Locale disponible auprès de la ressource Configuration objet, c'est-à-dire

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

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

0 votes

Si je souhaite l'enregistrer et le restaurer en utilisant sharedPreferences, comment dois-je procéder ? Ce que je récupère serait-il comparable à ce que j'ai ?

1 votes

Quelqu'un a-t-il vérifié que le Locale par défaut n'est pas modifié dans l'application lorsque vous le modifiez dans le système ? Je pense que c'est un de ces "changements de configuration" qui font que les activités sont détruites et recréées

11 votes

Je l'ai testé, en affichant les deux alors que je continuais à changer de locale ; le résultat est le même. Donc 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());

209voto

Makalele Points 3689

Mise à jour d'Android N (niveau Api 24) (aucun 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;
        }
    }

86voto

ElegyD Points 1357

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

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

ou en Kotlin :

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

12voto

kabuko Points 23166

De getDefault de la documentation :

Renvoie la locale préférée de l'utilisateur. Ceci peut avoir été surchargé pour ce processus avec setDefault(Locale).

Toujours selon le Locale docs :

La locale par défaut est appropriée pour les tâches qui impliquent la présentation de données à l'utilisateur.

Il semble que vous devriez l'utiliser.

8 votes

Cette réponse est fausse, il y a une locale par défaut mais si l'utilisateur la change à la volée, elle s'affiche mal. la réponse suivante est correcte.

0 votes

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 le faire entrer. Si vous avez une application qui permet aux gens de changer de locale et que les chaînes de caractères des vues, les formats des nombres, etc. changent, alors vous devez utiliser la réponse de Devunwired.

0 votes

Travailler pour moi. Si je place un point d'arrêt à Locale.setDefault() il est appelé lorsque je change la langue de l'appareil, au moins jusqu'à Android 5.0 (c'est ce que j'ai testé).

8voto

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

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X