Obtener el idioma actual en el dispositivo

609

¿Cómo podemos obtener el idioma actual seleccionado en el dispositivo Android?

Pinki
fuente
10
La mayoría de las respuestas aquí obtienen el idioma de la aplicación. Dado que puede establecer la configuración regional predeterminada de la aplicación en código, la respuesta correcta es la respuesta dada por Sarpe, que le proporciona la configuración regional del dispositivo.
Victor Ionescu
@VictorIonescu gracias por el comentario. La respuesta de Sarpe es la respuesta correcta para buscar la configuración regional del dispositivo. Por favor refiéralo. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Respuestas:

834

Si desea obtener el idioma seleccionado de su dispositivo, esto podría ayudarlo a:

Locale.getDefault().getDisplayLanguage();
DeRagan
fuente
73
getDisplayLanguage () localizará el idioma. Si está interesado en obtener el código ISO (por ejemplo, para declaraciones if o switch) use 'Locale.getDefault (). GetISO3Language ();'
nuala
13
getISO3Language () devuelve cosas como "deu" para Deutschland (alemania) en lugar de de ...
Tobias
372
Puede utilizar Locale.getDefault().getLanguage();para obtener el código de idioma habitual (por ejemplo, "de", "en").
muscardinus
35
@DeRagan, esto no siempre le dará el idioma para su dispositivo, sino solo para su aplicación. Por ejemplo, si llamo Locale.setDefault("ru")y el idioma en la configuración del sistema está configurado en inglés, entonces el método Locale.getDefault().getLanguage()devolverá "ru" , pero no "en" . ¿Existe algún otro método para obtener el idioma / idioma del SISTEMA real? Encontré una solución no documentada aquí , pero ¿hay una solución más elegante?
Prizoff
47
Prefiero Locale.getDefault().toString()que proporcione una cadena que identifique completamente la configuración regional, por ejemplo, "en_US".
Tom
838

Verifiqué los métodos Locale en mi dispositivo Android 4.1.2 y los resultados:

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
fuente
77
Gracias, agradable con una lista de posibilidades. ¿Podría agregar "Locale.getDefault (). ToString ()", como se sugiere en un comentario de "Tom".
RenniePet
Estoy confundido. ¿Acabas de copiar la respuesta de DeRagan?
dieter
1
Lo siento por eso. Es cierto, lo agregué allí. Debería haber dejado una nota que vino de aquí. Cometí el error al tratar de ayudar a las personas a encontrar la respuesta que necesitan más rápido. Porque la tuya obviamente es la mejor respuesta. Pero, por supuesto, el tuyo nunca llegará a la cima, porque la gente no lo ve tan a menudo como el primero. ¿Está bien si lo agregamos allí con una nota de que proviene de esta respuesta?
Patrick Boos
1
Hola de nuevo. No prefiero esa solución. Actualmente, la respuesta de DeRagan se muestra en primer lugar y la mía se muestra en segundo lugar. Para un investigador, no debería ser tan difícil verificar la segunda respuesta en la página de preguntas. Sería mejor si @pinki cambiara la respuesta aceptada. Pero parece que Pinki fue visto por última vez hace 3 meses.
trante
1
también hay Locale.getDefault().getDisplayLanguage()que vuelve"English"
deportes
106

Lo que funcionó para mí fue:

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

Resources.getSystem() devuelve un objeto de recursos compartidos global que proporciona acceso solo a los recursos del sistema (sin recursos de la aplicación) y no está configurado para la pantalla actual (no puede usar unidades de dimensión, no cambia según la orientación, etc.).

Debido a que getConfiguration.localeahora ha quedado en desuso, la forma preferida de obtener la configuración regional primaria en Android Nougat es:

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

Para garantizar la compatibilidad con las versiones anteriores de Android, una posible solución sería una simple comprobación:

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

Actualizar

Comenzando con la biblioteca de soporte 26.1.0, no necesita verificar la versión de Android, ya que ofrece un método conveniente compatible con versiones anteriores getLocales().

Simplemente llame:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
Sarpe
fuente
66
getConfiguration (). locale está actualmente en desuso, use getConfiguration (). getLocales (). get (0) en su lugar
Eliseo Ocampos
44
Esta es la respuesta correcta a esta pregunta. otras respuestas se vuelven locales de la aplicación, no del dispositivo.
hofs
66
No sé si esto existía cuando se escribió la respuesta, pero la biblioteca de soporte tiene versiones compatibles de esto, no hay necesidad de escribir usted mismo. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear
Como señaló @Thorbear, ahora usar el nuevo método de biblioteca de soporte getLocaleses el camino a seguir. He actualizado mi respuesta.
Sarpe
Esta es la respuesta correcta. Otros devuelven el lenguaje de aplicación, no del sistema.
Chintan Rathod
44

Puede 'extraer' el idioma del entorno local actual. Puede extraer la configuración regional a través de la API Java estándar, o mediante el contexto de Android. Por ejemplo, las dos líneas siguientes son equivalentes:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Johan Pelgrim
fuente
10
esto no es verdad. Ellos son diferentes. El primero puede cambiar si el usuario cambia la configuración regional. El segundo es el que está preinstalado en el teléfono. Nunca cambia sin importar lo que haga el usuario.
Greg
16
El comentario de gregm podría ser falso. Ver respuesta por airewyre.
Groth
44
El comentario de @gregm es incorrecto. Simplemente pruébelo usted mismo y verá que Locale.getDefault () cambiará cuando cambie el idioma en la configuración.
Patrick Boos
Aunque el comentario de @gregm es incorrecto, todavía tiene razón en que esas dos líneas no necesitan devolver la misma configuración regional. Simplemente llame Locale.setDefault()con anticipación a otro lugar y obtendrá resultados diferentes.
arekolek
35

Para ahorrar tiempo y / o confusión a los demás, quería compartir que he probado las dos alternativas propuestas por Johan Pelgrim arriba y en mi dispositivo son equivalentes, ya sea que se cambie o no la ubicación predeterminada.

Por lo tanto, la configuración predeterminada de mi dispositivo es inglés (United Kindom) y en este estado, como se esperaba, ambas cadenas en la respuesta de Johan dan el mismo resultado. Si luego cambio la configuración regional en la configuración del teléfono (digamos a italiano (Italia)) y vuelvo a ejecutar, ambas cadenas en la respuesta de Johan dan la configuración regional como italiano (Italia).

Por lo tanto, creo que la publicación original de Johan es correcta y el comentario de gregm es incorrecto.

airewyre
fuente
18

Puedes usar esto

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

cuando "xx" es cualquier código de idioma como "en", "fr", "sp", "ar" ... y así sucesivamente

Simon K. Gerges
fuente
3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino
1
@ClementMartino su sugerencia es correcta en el caso de configuraciones regionales predefinidas como INGLÉS, pero para otras configuraciones regionales como el árabe, tenemos que analizarlo utilizando el código lang
Simon K. Gerges
8

si el nivel de API es 24 o superior, use LocaleList.getDefault().get(0).getLanguage() else useLocale.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();
    }
}

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

clybe
fuente
¡Debería ser una respuesta aceptable en 2020!
Andrii Kovalchuk
6

Para agregar a la respuesta de Johan Pelgrim

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

son equivalentes porque la android.text.format.DateFormatclase usa ambos indistintamente, por ejemplo

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

y

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
fuente
5

Puede intentar obtener la configuración regional de los recursos del sistema:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
stefan.nsk
fuente
1
Esta es LA respuesta en caso de que haya anulado alguna parte de la configuración
Takhion
4

Esta solución funcionó para mí. Esto le devolverá el idioma del dispositivo Android (no el idioma local de la aplicación)

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

Esto devolverá "en" o "de" o "fr" o el idioma de su dispositivo configurado.

Arjun
fuente
3

Puede usar este código para averiguar la corriente del teclado

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

Hay dos idiomas

Idioma predeterminado del sistema operativo:

Locale.getDefault().getDisplayLanguage();

Idioma actual de aplicación:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
ayed abboushi
fuente
3
eso no es cierto, si cambia la configuración regional en su aplicación, incluso primero le da un valor cambiado y no el valor del sistema
Para Kra
3

Si elige un idioma que no puede escribir, este griego puede ser útil.

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

Ahora pruébalo con griego

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

Si desea verificar un idioma actual, use la respuesta 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
fuente
Si desea aplicar el formato de fecha local del usuario, use DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind
1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Pratibha Sarode
fuente
2
Agregue algunos detalles sobre por qué esto responde a la pregunta: solo el fragmento de código no ayudará a los lectores a comprender la solución
Wand Maker
Locale.getDefault (). GetDisplayName () proporciona el idioma actual de su dispositivo. y estamos verificando si el idioma del dispositivo es hindi o no. Si el idioma actual del dispositivo es hindi, haga lo que quiera en el bloque.
Pratibha Sarode
1

La forma correcta de obtener el idioma de su dispositivo es la siguiente:

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

Espero eso ayude.

andrea.rinaldi
fuente
1
Locale.getDefault().getDisplayLanguage()

le dará un Writtennombre para el idioma, por ejemplo,English, Dutch, French

Locale.getDefault().getLanguage()

te dará language code, por ejemplo:en, nl, fr

Ambos métodos devuelven String

Shamsul Arefin Sajib
fuente
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
fuente
1

Los otros han dado buenas respuestas para el idioma del dispositivo,

si desea que el idioma de la aplicación sea la forma más fácil de hacerlo, agregue una app_langclave a su strings.xmlarchivo y especifique también el idioma para cada uno de ellos.

De esa manera, si el idioma predeterminado de su aplicación es diferente del idioma del dispositivo, puede elegir enviarlo como parámetro para sus servicios.

htafoya
fuente
No puedo creer que no haya soporte de marco para darle el idioma que el AssetManager está usando actualmente. De hecho, los ayudantes de formato de cadena en Resources.java usan la configuración regional predeterminada [0], por lo que si la cadena del AssetManager proviene de una configuración regional que no coincide con la configuración regional predeterminada del dispositivo (porque su aplicación no lo admite, pero admite, por ejemplo, el siguiente en la lista), entonces hay un error.
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
fuente
Sería mejor si pudiera agregar más instrucciones a la respuesta, en lugar de simplemente pegar el código.
Calos
0

Mi solucion es asi

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

y entonces

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

se muestra ---> es

biyoalp
fuente
0

Aquí hay un código para obtener el país del dispositivo. Compatible con todas las versiones de Android, incluso oreo.

Solución: si el usuario no tiene una tarjeta SIM que el país de destino, se utiliza durante la configuración del teléfono o la selección del idioma actual.

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
fuente
-3

Si desea realizar una tarea específica para los usuarios que residen en la India y que hablan hindi, use a continuación si la condición

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