Ottieni la lingua corrente nel dispositivo


609

Come possiamo selezionare la lingua corrente selezionata nel dispositivo Android?


10
La maggior parte delle risposte qui ottiene la lingua dell'applicazione. Dato che è possibile impostare le impostazioni internazionali predefinite dell'applicazione nel codice, la risposta corretta è la risposta fornita da Sarpe, che fornisce le impostazioni locali del dispositivo.
Victor Ionescu,

@VictorIonescu grazie per il commento. La risposta di Sarpe è la risposta corretta per recuperare le impostazioni internazionali del dispositivo. Per favore riferiscilo. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Risposte:


834

Se vuoi ottenere la lingua selezionata del tuo dispositivo, questo potrebbe aiutarti:

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage () localizzerà la lingua. Se sei interessato a ottenere solo il codice ISO (ad esempio per if o switch switch) usa 'Locale.getDefault (). GetISO3Language ();'
nuala,

13
getISO3Language () restituisce cose come "deu" per Deutschland (germania) invece di de ...
Tobias,

372
È possibile utilizzare Locale.getDefault().getLanguage();per ottenere il solito codice lingua (ad esempio "de", "en").
muscardinus,

35
@DeRagan, questo non ti darà sempre la lingua per il tuo dispositivo, ma solo per la tua app. Ad esempio, se chiamo Locale.setDefault("ru")e la lingua nelle impostazioni di sistema è impostata su inglese, il metodo Locale.getDefault().getLanguage()restituirà "ru" , ma non "en" . Esiste un altro metodo per ottenere impostazioni / lingua locali per il SISTEMA? Ho trovato una soluzione non documentata qui , ma esiste una soluzione più elegante?
Prizoff,

47
Preferisco Locale.getDefault().toString()che dia una stringa che identifica completamente la locale, ad esempio "en_US".
Tom,

838

Ho controllato i metodi Locale sul mio dispositivo Android 4.1.2 e i risultati:

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

7
Grazie, bello con un elenco di possibilità. Potresti aggiungere "Locale.getDefault (). ToString ()", come suggerito in un commento di "Tom".
RenniePet,

Non ho capito bene. Hai appena copiato la risposta di DeRagan?
Dieter,

1
Mi dispiace per quello. È vero, l'ho aggiunto lì. Avrei dovuto lasciare un messaggio che veniva da qui. Ho commesso l'errore cercando di aiutare le persone a trovare più rapidamente la risposta di cui hanno bisogno. Perché la tua ovviamente è la risposta migliore. Ma ovviamente il tuo non verrà mai in cima, perché le persone non lo vedono spesso come quello in alto. Va bene se lo aggiungiamo lì con una nota che proviene da questa risposta?
Patrick Boos,

1
Ciao di nuovo. Non preferisco quella soluzione. Attualmente la risposta di DeRagan è mostrata al primo posto e la mia è mostrata come seconda. Per un ricercatore, non dovrebbe essere così difficile controllare la seconda risposta nella pagina delle domande. Sarebbe meglio se @pinki cambiasse la risposta accettata. Ma sembra che il Pinki sia stato visto l'ultima volta 3 mesi fa.
trante,

1
c'è anche quello Locale.getDefault().getDisplayLanguage()che ritorna"English"
sport

106

Ciò che ha funzionato per me è stato:

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

Resources.getSystem() restituisce un oggetto Risorse condivise globale che fornisce l'accesso solo alle risorse di sistema (nessuna risorsa dell'applicazione) e non è configurato per la schermata corrente (non può utilizzare le unità di dimensione, non cambia in base all'orientamento, ecc.).

Poiché getConfiguration.localeora è stato deprecato, il modo preferito per ottenere la locale principale in Android Nougat è:

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

Per garantire la compatibilità con le precedenti versioni di Android una possibile soluzione sarebbe un semplice controllo:

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;
}

Aggiornare

A partire dalla libreria di supporto 26.1.0non è necessario controllare la versione di Android in quanto offre un metodo conveniente compatibile con le versioni precedentigetLocales() .

Chiama semplicemente:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());

6
getConfiguration (). locale è attualmente deprecato, utilizzare getConfiguration (). getLocales (). get (0) invece
Eliseo Ocampos

4
Questa è la risposta corretta a questa domanda. altre risposte diventano locali dell'app, non del dispositivo.
hofs,

6
Non so se questo esistesse quando la risposta è stata scritta, ma la libreria di supporto ha versioni compatibili con le versioni precedenti, non è necessario scrivere tu stesso la compatibilità con le versioni precedenti. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear,

Come ha sottolineato @Thorbear, ora utilizzare il nuovo metodo della libreria di supporto getLocalesè la strada da percorrere. Ho aggiornato la mia risposta.
Sarpe,

Questa è la risposta giusta Altri restituiscono la lingua dell'applicazione non del sistema.
Chintan Rathod,

44

Puoi "estrarre" la lingua dalla locale corrente. È possibile estrarre le impostazioni internazionali tramite l'API Java standard o utilizzando il contesto Android. Ad esempio, le due righe seguenti sono equivalenti:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

10
questo non è vero. Sono diversi. Il primo può cambiare se l'utente cambia le impostazioni internazionali. Il secondo è quello preinstallato sul telefono. Non cambia mai, qualunque cosa faccia l'utente.
Greg

16
Il commento di gregm potrebbe essere falso. Vedi la risposta di airewyre.
Jan Groth,

4
Il commento di @ gregm è sbagliato. Provalo tu stesso e vedrai che Locale.getDefault () cambierà quando cambi la lingua nelle impostazioni.
Patrick Boos,


Sebbene il commento di @gregm sia sbagliato, ha sempre ragione nel dire che quelle due righe non devono restituire la stessa locale. Basta chiamare in Locale.setDefault()anticipo con altre impostazioni locali e otterrai risultati diversi.
Arekolek,

35

Per risparmiare tempo e / o confusione, volevo condividere che ho provato le due alternative proposte da Johan Pelgrim sopra e sul mio dispositivo sono equivalenti, indipendentemente dal fatto che la posizione predefinita sia cambiata o meno.

Quindi l'impostazione predefinita del mio dispositivo è l'inglese (United Kindom) e in questo stato, come previsto, entrambe le stringhe nella risposta di Johan danno lo stesso risultato. Se poi modifico il locale nelle impostazioni del telefono (diciamo a italiano (Italia)) e rieseguo, entrambe le stringhe nella risposta di Johan danno il locale come italiano (Italia).

Pertanto, ritengo che il post originale di Johan sia corretto e il commento di Gregreg sia errato.


18

Puoi usare questo

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

quando "xx" è un codice di lingua come "en", "fr", "sp", "ar" .... e così via


3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clemente Martino,

1
@ClementMartino il tuo suggerimento è OK in caso di locali predefiniti come l'INGLESE, ma per altri locali come l'arabo, dobbiamo analizzarlo usando il codice lang
Simon K. Gerges,


8

se il livello API è 24 o superiore, utilizzare LocaleList.getDefault().get(0).getLanguage() altro usoLocale.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();
    }
}

riferimento: https://developer.android.com/guide/topics/resources/multilingual-support


Dovrebbe essere una risposta accettabile nel 2020!
Andrii Kovalchuk, il

6

Da aggiungere alla risposta di Johan Pelgrim

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

sono equivalenti perché la android.text.format.DateFormatclasse usa entrambi in modo intercambiabile, ad es

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

e

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 ...
}

5

Puoi provare a ottenere le impostazioni internazionali dalle risorse di sistema:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

1
Questa è LA risposta nel caso in cui tu abbia ignorato qualsiasi parte della configurazione
Takhion,


4

Questa soluzione ha funzionato per me. Questo ti restituirà la lingua del dispositivo Android (non la lingua locale dell'app)

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

Ciò restituirà "en" o "de" o "fr" o qualunque sia la lingua del dispositivo impostata.


3

Puoi usare questo codice per scoprire la corrente della tastiera

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

3

Ci sono due lingue

Lingua predefinita del sistema operativo:

Locale.getDefault().getDisplayLanguage();

Lingua corrente di applicazione:

getResources().getConfiguration().locale.getDisplayLanguage();//return string

3
questo non è vero, se cambi impostazioni locali nella tua app anche prima ti danno un valore modificato e non un valore di sistema
A Kra

3

Se scegli una lingua che non puoi digitare questo greco può essere utile.

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

Ora provalo con il greco

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

3

Se vuoi controllare una lingua corrente, usa la risposta di @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())

Se si desidera applicare il formato data locale dell'utente, utilizzare DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind

1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}

2
Si prega di aggiungere alcuni dettagli sul perché questo risponde alla domanda - solo lo snippet di codice non aiuterà i lettori a capire la soluzione
Wand Maker

Locale.getDefault (). GetDisplayName () fornisce la lingua corrente del dispositivo. e stiamo verificando se la lingua del dispositivo è l'hindi o no .. Se la lingua del dispositivo corrente è l'hindi, fai quello che vuoi nel blocco.
Pratibha Sarode

1

Il modo corretto di ottenere la lingua del tuo dispositivo è il seguente:

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

Spero che sia d'aiuto.


1
Locale.getDefault().getDisplayLanguage()

ti darà il Writtennome per la lingua, ad esempio,English, Dutch, French

Locale.getDefault().getLanguage()

ti darà language code, ad esempio:en, nl, fr

Entrambi i metodi restituiscono String


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()));

1

Gli altri hanno dato buone risposte per la lingua del dispositivo,

se desideri che la lingua dell'app sia il modo più semplice per farlo è aggiungere una app_langchiave al tuo strings.xmlfile e specificare anche il lang per ciascuno dei lang.

In questo modo, se la lingua predefinita dell'app è diversa dalla lingua del dispositivo, puoi scegliere di inviarlo come parametro per i tuoi servizi.


Non riesco a credere che non vi sia alcun supporto di framework per darti la lingua che AssetManager sta attualmente utilizzando. In effetti, gli helper del formato String in Resources.java utilizzano la locale predefinita [0], quindi se la stringa da AssetManager proviene da una locale che non corrisponde alla locale predefinita del dispositivo (perché la tua app non la supporta ma supporta ad esempio la prossima nell'elenco) quindi c'è un bug.
dc

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";
}

Sarebbe meglio se potessi aggiungere più istruzioni alla risposta, piuttosto che incollare semplicemente il codice.
Calos,

0

La mia soluzione è così

@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);
}

e poi

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

mostrato ---> en


0

ecco il codice per ottenere il paese del dispositivo. Compatibile con tutte le versioni di Android anche oreo.

Soluzione: se l'utente non ha una scheda SIM diversa da quella del proprio Paese, viene utilizzato durante l'impostazione del telefono o la selezione della lingua corrente.

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;
}

-3

Se si desidera eseguire attività specifiche per gli utenti residenti in India che parlano hindi, utilizzare di seguito se condizione

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.