Obtenir la langue actuelle dans l'appareil

609

Comment obtenir la langue actuelle sélectionnée sur l'appareil Android?

Pinki
la source
10
La majorité des réponses ici obtiennent la langue de l'application. Étant donné que vous pouvez définir les paramètres régionaux par défaut de l'application dans le code, la bonne réponse est la réponse donnée par Sarpe - qui vous donne les paramètres régionaux de l'appareil.
Victor Ionescu
@VictorIonescu merci pour le commentaire. La réponse de Sarpe est la bonne réponse pour récupérer les paramètres régionaux de l'appareil. Veuillez le référer. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Réponses:

834

Si vous souhaitez obtenir la langue sélectionnée de votre appareil, cela peut vous aider:

Locale.getDefault().getDisplayLanguage();
DeRagan
la source
73
getDisplayLanguage () localisera la langue. Si vous souhaitez simplement obtenir le code ISO (par exemple pour les instructions if ou switch), utilisez 'Locale.getDefault (). GetISO3Language ();'
nuala
13
getISO3Language () renvoie des choses comme "deu" pour Deutschland (allemagne) au lieu de ...
Tobias
372
Vous pouvez utiliser Locale.getDefault().getLanguage();pour obtenir le code de langue habituel (par exemple "de", "en").
muscardinus
35
@DeRagan, Cela ne vous donnera pas toujours la langue pour votre appareil, mais uniquement pour votre application. Par exemple, si j'appelle Locale.setDefault("ru")et que la langue dans les paramètres système est définie sur l'anglais, la méthode Locale.getDefault().getLanguage()renverra "ru" , mais pas "en" . Existe-t-il une autre méthode pour obtenir les vrais paramètres régionaux / langue SYSTEM? Je n'ai pas trouvé de solution documentée ici , mais y a-t-il une solution plus élégante?
Prizoff
47
Je préfère Locale.getDefault().toString()qui donne une chaîne qui identifie complètement les paramètres régionaux, par exemple "en_US".
Tom
838

J'ai vérifié les méthodes locales sur mon appareil Android 4.1.2 et les résultats:

Locale.getDefault().getLanguage()       ---> en      
Locale.getDefault().getISO3Language()   ---> eng 
Locale.getDefault().getCountry()        ---> US 
Locale.getDefault().getISO3Country()    ---> USA 
Locale.getDefault().getDisplayCountry() ---> United States 
Locale.getDefault().getDisplayName()    ---> English (United States) 
Locale.getDefault().toString()          ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag()     ---> en-US
trante
la source
7
Merci, sympa avec une liste de possibilités. Pourriez-vous s'il vous plaît ajouter "Locale.getDefault (). ToString ()", comme suggéré dans un commentaire de "Tom".
RenniePet
Je suis confus. Vous venez de copier la réponse de DeRagan?
dieter
1
Désolé pour ça. C'est vrai que je l'ai ajouté là-dedans. J'aurais dû laisser une note qui vient d'ici. J'ai fait l'erreur d'essayer d'aider les gens à trouver plus rapidement la réponse dont ils ont besoin. Parce que la vôtre est évidemment la meilleure réponse. Mais bien sûr, le vôtre n'atteindra jamais le sommet, car les gens ne le voient pas aussi souvent que celui du haut. Est-ce que ça va si on l'ajoute là-dedans avec une note que cela vient de cette réponse?
Patrick Boos
1
Rebonjour. Je ne préfère pas cette solution. Actuellement, la réponse de DeRagan apparaît en première place et la mienne en deuxième. Pour un chercheur, il ne devrait pas être si difficile de vérifier la deuxième réponse dans la page de questions. Il serait préférable que @pinki modifie la réponse acceptée. Mais il semble que pinki ait été vu pour la dernière fois il y a 3 mois.
trante
1
il y a aussi Locale.getDefault().getDisplayLanguage()qui revient"English"
sports
106

Ce qui a fonctionné pour moi, c'est:

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() renvoie un objet Resources partagé global qui donne accès uniquement aux ressources système (pas de ressources d'application) et n'est pas configuré pour l'écran actuel (ne peut pas utiliser les unités de dimension, ne change pas en fonction de l'orientation, etc.).

Parce qu'il getConfiguration.localeest désormais obsolète, le moyen préféré d'obtenir les paramètres régionaux principaux dans Android Nougat est:

Resources.getSystem().getConfiguration().getLocales().get(0);

Pour garantir la compatibilité avec les versions précédentes d'Android, une solution possible serait une simple vérification:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
    //noinspection deprecation
    locale = Resources.getSystem().getConfiguration().locale;
}

Mise à jour

À partir de la bibliothèque de support, 26.1.0vous n'avez pas besoin de vérifier la version Android car elle offre une méthode pratique rétrocompatiblegetLocales() .

Appelez simplement:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
Sarpe
la source
6
getConfiguration (). locale est actuellement obsolète, utilisez getConfiguration (). getLocales (). get (0) à la place
Eliseo Ocampos
4
Ceci est la bonne réponse à cette question. les autres réponses deviennent locales de l'application, pas de l'appareil.
hofs
6
Je ne sais pas si cela existait lorsque la réponse a été écrite, mais la bibliothèque de support en a des versions rétro-compatibles, il n'est pas nécessaire d'écrire vous-même la rétrocompatibilité. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear
Comme l'a souligné @Thorbear, utiliser maintenant la nouvelle méthode de bibliothèque de support getLocalesest la voie à suivre. J'ai mis à jour ma réponse.
Sarpe
C'est la bonne réponse. D'autres renvoient la langue d'application et non du système.
Chintan Rathod
44

Vous pouvez «extraire» la langue des paramètres régionaux actuels. Vous pouvez extraire les paramètres régionaux via l'API Java standard ou en utilisant le contexte Android. Par exemple, les deux lignes ci-dessous sont équivalentes:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Johan Pelgrim
la source
10
ce n'est pas vrai. Ils sont différents. Le premier peut changer si l'utilisateur change les paramètres régionaux. Le second est celui qui est préinstallé sur le téléphone. Il ne change jamais quoi que fasse l'utilisateur.
gregm
16
Le commentaire de gregm peut être faux. Voir la réponse de airewyre.
jan groth
4
Le commentaire de @ gregm est faux. Essayez-le vous-même et vous verrez que Locale.getDefault () changera lorsque vous modifiez la langue dans les paramètres.
Patrick Boos
Bien que le commentaire de @ gregm soit faux, il a toujours raison, ces deux lignes n'ont pas besoin de renvoyer les mêmes paramètres régionaux. Appelez simplement Locale.setDefault()avec d'autres paramètres régionaux au préalable et vous obtenez des résultats différents.
arekolek
35

Pour économiser du temps et / ou de la confusion aux autres, je voulais partager que j'ai essayé les deux alternatives proposées par Johan Pelgrim ci-dessus et sur mon appareil, elles sont équivalentes - que l'emplacement par défaut soit modifié ou non.

Le paramètre par défaut de mon appareil est donc l'anglais (United Kindom) et dans cet état, comme prévu, les deux chaînes de la réponse de Johan donnent le même résultat. Si je change ensuite les paramètres régionaux dans les paramètres du téléphone (disons à italiano (Italia)) et que je réexécute, les deux chaînes de la réponse de Johan donnent les paramètres régionaux comme italiano (Italia).

Par conséquent, je crois que le message original de Johan est correct et que le commentaire de gregm est incorrect.

airewyre
la source
18

Vous pouvez utiliser ceci

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

quand "xx" est un code de langue comme "en", "fr", "sp", "ar" .... et ainsi de suite

Simon K. Gerges
la source
3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino
1
@ClementMartino votre suggestion est OK dans le cas de paramètres régionaux prédéfinis comme l'anglais, mais pour d'autres paramètres régionaux comme l'arabe, nous devons l'analyser en utilisant le code lang
Simon K. Gerges
17

Comme décrit dans Référence locale, la meilleure façon d'obtenir la langue est:

Locale.getDefault().getLanguage()

cette méthode renvoie une chaîne avec l'ID de langue selon la norme ISO 639-1

Opsenas
la source
8

si le niveau d'API est supérieur ou égal à 24, utilisez LocaleList.getDefault().get(0).getLanguage() sinon utilisezLocale.getDefault.getLanguage()

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

référence: https://developer.android.com/guide/topics/resources/multilingual-support

clybe
la source
Ce devrait être une réponse acceptable en 2020!
Andrii Kovalchuk
6

Pour ajouter à la réponse de Johan Pelgrim

context.getResources().getConfiguration().locale
Locale.getDefault()

sont équivalents car la android.text.format.DateFormatclasse utilise les deux de manière interchangeable, par exemple

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

et

public static boolean is24HourFormat(Context context) {
    String value = Settings.System.getString(context.getContentResolver(),
            Settings.System.TIME_12_24);

    if (value == null) {
        Locale locale = context.getResources().getConfiguration().locale;

    // ... snip the rest ...
}
armandino
la source
5

Vous pouvez essayer d'obtenir des paramètres régionaux à partir des ressources système:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
stefan.nsk
la source
1
C'est LA réponse au cas où vous auriez outrepassé une partie de la configuration
Takhion
4

Cette solution a fonctionné pour moi. Cela vous renverra la langue de l'appareil Android (pas la langue locale de l'application)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

Cela renverra "en" ou "de" ou "fr" ou quelle que soit la langue de votre appareil.

Arjun
la source
3

Vous pouvez utiliser ce code pour connaître le courant du clavier

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Ramkailash
la source
3

Il existe deux langues.

Langue par défaut du système d'exploitation:

Locale.getDefault().getDisplayLanguage();

Langue actuelle d'application:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
ayed abboushi
la source
3
ce n'est pas vrai, si vous changez les paramètres régionaux dans votre application, donnez-vous d'abord une valeur modifiée et non une valeur système
À Kra
3

Si vous choisissez une langue que vous ne pouvez pas taper ce grec peut être utile.

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

Maintenant, essayez-le avec le grec

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
user462990
la source
3

Si vous souhaitez vérifier une langue actuelle, utilisez la réponse de @Sarpe (@Thorbear):

val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())
CoolMind
la source
Si vous souhaitez appliquer le format de date local de l'utilisateur, utilisez DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind
1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Pratibha Sarode
la source
2
Veuillez ajouter quelques détails sur les raisons pour lesquelles cela répond à la question - un simple extrait de code n'aidera pas les lecteurs à comprendre la solution
Wand Maker
Locale.getDefault (). GetDisplayName () donne la langue actuelle de votre appareil. et nous vérifions si la langue de l'appareil est l'hindi ou non. Si la langue actuelle de l'appareil est l'hindi, faites ce que vous voulez dans le bloc.
Pratibha Sarode
1

La façon correcte d'obtenir la langue de votre appareil est la suivante:

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

J'espère que cela aide.

andrea.rinaldi
la source
1
Locale.getDefault().getDisplayLanguage()

vous donnera le Writtennom de la langue, par exemple,English, Dutch, French

Locale.getDefault().getLanguage()

vous donnera language code, par exemple:en, nl, fr

Les deux méthodes renvoient String

Shamsul Arefin Sajib
la source
1
public class LocalUtils {

    private static final String LANGUAGE_CODE_ENGLISH = "en";


    // returns application language eg: en || fa ...
    public static String getAppLanguage() {
        return Locale.getDefault().getLanguage();
    }

    // returns device language eg: en || fa ...
    public static String getDeviceLanguage() {
        return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
    }

    public static boolean isDeviceEnglish() {
        return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }

    public static boolean isAppEnglish() {
        return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }


}

Log.i("AppLanguage: ",     LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ",  LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ",    String.valueOf(LocalUtils.isAppEnglish()));
SR
la source
1

Les autres ont donné de bonnes réponses pour la langue de l'appareil,

si vous souhaitez que la langue de l' application soit la plus simple, ajoutez une app_langclé à votre strings.xmlfichier et spécifiez également la langue pour chacune des langues.

De cette façon, si la langue par défaut de votre application est différente de la langue de l'appareil, vous pouvez choisir de l'envoyer comme paramètre pour vos services.

htafoya
la source
Je ne peux pas croire qu'il n'y ait pas de support de framework pour vous donner la langue que AssetManager utilise actuellement. En fait, les aides au format String dans Resources.java utilisent les paramètres régionaux par défaut [0], donc si la chaîne du AssetManager provient d'un paramètre régional qui ne correspond pas aux paramètres régionaux par défaut de l'appareil (car votre application ne le prend pas en charge mais prend en charge par exemple le suivant sur la liste) puis il y a un bug.
dcow
1
public void GetDefaultLanguage( ) {
    try {
        String langue = Locale.getDefault().toString(); //        ---> en_US
        /*
        Log.i("TAG", Locale.getDefault().getLanguage() ); //       ---> en
        Log.i("TAG", Locale.getDefault().getISO3Language()  ); //  ---> eng
        Log.i("TAG", Locale.getDefault().getCountry()  ); //       ---> US
        Log.i("TAG", Locale.getDefault().getISO3Country()  ); //   ---> USA
        Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
        Log.i("TAG", Locale.getDefault().getDisplayName() ); //    ---> English (United States)
        Log.i("TAG", Locale.getDefault().toString()   ); //        ---> en_US
        Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English 
        */

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            langue = Locale.getDefault().toLanguageTag(); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }else{
            langue = langue.replace("_","-"); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }
    }catch (Exception ex) {
        Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
    }
}

public String getUrlMicrosoftLearn(String langue) {
    return "https://docs.microsoft.com/"+langue+"/learn";
}
Grafritz Design
la source
Il serait préférable que vous puissiez ajouter plus d'instructions à la réponse, plutôt que de simplement coller le code.
Calos
0

Ma solution est comme ça

@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
    return Resources.getSystem().getConfiguration().locale.getLanguage();
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
    getResources();
    return Resources.getSystem().getConfiguration().getLocales().get(0);
}

et alors

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

montré ---> en

biyoalpe
la source
0

voici le code pour obtenir le pays de l'appareil. Compatible avec toutes les versions d'Android, même Oreo.

Solution: si l'utilisateur n'a pas de carte SIM que d'obtenir le pays, il est utilisé lors de la configuration du téléphone ou de la sélection de la langue actuelle.

public static String getDeviceCountry(Context context) {
    String deviceCountryCode = null;

    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(tm != null) {
            deviceCountryCode = tm.getNetworkCountryIso();
        }

    if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
        deviceCountryCode = deviceCountryCode.toUpperCase();
    }
    else {
        deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
    }

  //  Log.d("countryCode","  : " + deviceCountryCode );
    return deviceCountryCode;
}
Abhishek Garg
la source
-3

Si vous souhaitez effectuer une tâche spécifique pour les utilisateurs résidant en Inde qui parle hindi, utilisez ci-dessous si la condition

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Divyaadz
la source