Obter o idioma atual no dispositivo

609

Como podemos selecionar o idioma atual no dispositivo Android?

Pinki
fonte
10
A maioria das respostas aqui obtém o idioma do aplicativo. Como você pode definir o código de idioma padrão do aplicativo no código, a resposta correta é a resposta dada por Sarpe - que fornece o código de idioma do dispositivo.
21315 Victor Ionescu
@VictorIonescu obrigado pelo comentário. A resposta de Sarpe é a resposta correta para buscar a localidade do dispositivo. Por favor, consulte-o. stackoverflow.com/a/28498119/3762067
Varad Mondkar 04/04

Respostas:

834

Se você deseja obter o idioma selecionado do seu dispositivo, isso pode ajudá-lo:

Locale.getDefault().getDisplayLanguage();
DeRagan
fonte
73
getDisplayLanguage () localizará o idioma. Se você estiver interessado em obter apenas o código ISO (por exemplo, para instruções if ou switch), use 'Locale.getDefault (). GetISO3Language ();'
nuala
13
getISO3Language () retorna coisas como "deu" para a Deutschland (alemanha) em vez de ...
Tobias
372
Você pode usar Locale.getDefault().getLanguage();para obter o código de idioma usual (por exemplo, "de", "en").
Muscardinus
35
@DeRagan, isso nem sempre fornece o idioma para o seu dispositivo, mas apenas para o seu aplicativo. Por exemplo, se eu ligar Locale.setDefault("ru"), e o idioma nas configurações do sistema estiver definido como inglês, o método Locale.getDefault().getLanguage()retornará "ru" , mas não "en" . Existe outro método para obter a localidade / idioma do SYSTEM real? Encontrei uma solução não documentada aqui , mas existe uma solução mais elegante?
Prizoff
47
Eu prefiro o Locale.getDefault().toString()que fornece uma string que identifica completamente o código do idioma, por exemplo "en_US".
Tom
837

Verifiquei os métodos de localidade no meu dispositivo Android 4.1.2 e os 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
fonte
7
Obrigado, legal com uma lista de possibilidades. Você poderia adicionar "Locale.getDefault (). ToString ()", conforme sugerido em um comentário por "Tom".
RenniePet
Estou confuso. Você acabou de copiar a resposta de DeRagan?
dieter
1
Me desculpe por isso. É verdade que eu adicionei lá. Eu deveria ter deixado uma nota que veio daqui. Cometi o erro de tentar ajudar as pessoas a encontrar a resposta de que precisam mais rapidamente. Porque a sua obviamente é a melhor resposta. Mas é claro que o seu nunca chegará ao topo, porque as pessoas não o veem tão frequentemente quanto o primeiro. Tudo bem se o adicionarmos com uma nota de que veio dessa resposta?
Patrick Boos
1
Olá de novo. Eu não prefiro essa solução. Atualmente, a resposta de DeRagan é mostrada em primeiro lugar e a minha é mostrada em segundo. Para um pesquisador, não deve ser tão difícil verificar a segunda resposta na página de perguntas. Seria melhor se o @pinki mudasse a resposta aceita. Mas parece que o pinki foi visto pela última vez há 3 meses.
trante
1
há também Locale.getDefault().getDisplayLanguage()que retorna"English"
sports
106

O que funcionou para mim foi:

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

Resources.getSystem() retorna um objeto Global compartilhado de Recursos que fornece acesso apenas aos recursos do sistema (sem recursos do aplicativo) e não está configurado para a tela atual (não pode usar unidades de dimensão, não muda com base na orientação, etc.).

Como getConfiguration.localeagora foi descontinuado, a maneira preferida de obter o local principal no Android Nougat é:

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

Para garantir a compatibilidade com as versões anteriores do Android, uma solução possível seria uma verificação simples:

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

Atualizar

Começando com a biblioteca de suporte, 26.1.0você não precisa verificar a versão do Android, pois oferece um método conveniente compatível com versões anteriores getLocales().

Basta ligar para:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
Sarpe
fonte
6
O local do getConfiguration (). está atualmente obsoleto, use getConfiguration (). getLocales (). get (0) em vez disso
Eliseo Ocampos
4
Esta é a resposta correta para esta pergunta. outras respostas são localizadas no aplicativo, não no dispositivo.
hofs 26/08/17
6
Não sei se isso existia quando a resposta foi escrita, mas a biblioteca de suporte possui versões compatíveis com versões anteriores, não há necessidade de escrever a compatibilidade com versões anteriores. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear
Como o @Thorbear apontou, agora o novo método de biblioteca de suporte getLocalesé o caminho a percorrer. Eu atualizei minha resposta.
Sarpe
Esta é a resposta certa. Outros retornam o idioma da aplicação e não do sistema.
Chintan Rathod
44

Você pode 'extrair' o idioma da localidade atual. Você pode extrair o código do idioma por meio da API Java padrão ou usando o Contexto do Android. Por exemplo, as duas linhas abaixo são equivalentes:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Johan Pelgrim
fonte
10
isso não é verdade. Eles são diferentes. O primeiro pode mudar se o usuário alternar o Local. O segundo é o pré-instalado no telefone. Ele nunca muda, não importa o que o usuário faça.
#
16
O comentário de gregm pode ser falso. Ver resposta por airewyre.
Jan Groth
4
O comentário de @ gregm está errado. Experimente você mesmo e verá que Locale.getDefault () será alterado quando você alterar o idioma nas configurações.
Patrick Boos
Embora o comentário de @ gregm esteja errado, ele ainda está certo, essas duas linhas não precisam retornar o mesmo local. Basta ligar Locale.setDefault()com outro local anteriormente e obter resultados diferentes.
121319 arekolek
35

Para economizar tempo e / ou confusão para outras pessoas, eu gostaria de compartilhar que tentei as duas alternativas propostas por Johan Pelgrim acima e, no meu dispositivo, elas são equivalentes - independentemente de o local padrão ser alterado ou não.

Portanto, a configuração padrão do meu dispositivo é inglês (United Kindom) e, nesse estado, como esperado, as duas seqüências de caracteres na resposta de Johan fornecem o mesmo resultado. Se eu mudar o código de idioma nas configurações do telefone (digamos para italiano (Italia)) e executar novamente, as duas Strings na resposta de Johan fornecerão o código de idioma como italiano (Italia).

Portanto, acredito que o post original de Johan esteja correto e o comentário de gregm incorreto.

airewyre
fonte
18

Você pode usar isso

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

quando "xx" é qualquer código de idioma como "en", "fr", "sp", "ar" .... e assim por diante

Simon K. Gerges
fonte
3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino
1
@ClementMartino sua sugestão é OK no caso de localidades pré-definidas, como o inglês, mas para outros locais como o árabe, temos que analisá-lo usando o código lang
Simon K. Gerges
8

se o nível da API for 24 ou 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();
    }
}

referência: https://developer.android.com/guide/topics/resources/multilingual-support

clybe
fonte
Deve ser uma resposta aceitável em 2020!
Andrii Kovalchuk 15/01
6

Para adicionar à resposta de Johan Pelgrim

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

são equivalentes porque a android.text.format.DateFormatclasse usa ambos de forma intercambiável, por exemplo

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 ...
}
armandino
fonte
5

Você pode tentar obter a localidade dos recursos do sistema:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
stefan.nsk
fonte
1
Esta é a resposta no caso de você ter substituído qualquer parte da configuração
Takhion
4

Esta solução funcionou para mim. Isso retornará o idioma do dispositivo Android (não o idioma local do aplicativo)

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

Isso retornará "en" ou "de" ou "fr" ou o idioma do seu dispositivo.

Arjun
fonte
3

Você pode usar esse código para descobrir a atualidade do teclado

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

Existem dois idiomas.

Idioma padrão do SO:

Locale.getDefault().getDisplayLanguage();

Idioma atual da aplicação:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
ayed abboushi
fonte
3
isso não é verdade, se você mudar de localidade em seu aplicativo, mesmo primeiro dar-lhe mudado valor e não o valor do sistema
Para Kra
3

Se você escolher um idioma, não poderá digitar este grego, pode ser útil.

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

Agora tente com grego

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

Se você deseja verificar um idioma atual, use a resposta 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
fonte
Se você deseja aplicar o formato de data local do usuário, use DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind 21/05/19
1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Pratibha Sarode
fonte
2
Por favor, adicione alguns detalhes sobre por que isso responde à pergunta - apenas trecho de código não vai leitores de ajuda para compreender a solução
Wand Criador
Locale.getDefault (). GetDisplayName () fornece o idioma atual do seu dispositivo. e estamos verificando se o idioma do dispositivo é hindi ou não. Se o idioma atual do dispositivo for hindi, faça o que deseja no bloco.
Pratibha Sarode
1

A maneira correta de obter o idioma do seu dispositivo é o seguinte:

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

Espero que ajude.

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

lhe dará um Writtennome para o idioma, por exemplo,English, Dutch, French

Locale.getDefault().getLanguage()

lhe dará language code, por exemplo:en, nl, fr

Ambos os métodos retornam String

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

Os outros deram boas respostas para o idioma do dispositivo,

se você deseja que o idioma do aplicativo seja a maneira mais fácil, adicione uma app_langchave ao seustrings.xml arquivo e especifique o idioma para cada um deles.

Dessa forma, se o idioma padrão do seu aplicativo for diferente do idioma do dispositivo, você poderá enviá-lo como parâmetro para seus serviços.

htafoya
fonte
Não acredito que não haja suporte de estrutura para fornecer o idioma que o AssetManager está usando no momento. De fato, os auxiliares de formato String em Resources.java usam o código de idioma padrão [0], portanto, se a string do AssetManager vier de um código de idioma que não corresponde ao código de idioma padrão do dispositivo (porque seu aplicativo não o suporta, mas suporta, por exemplo, o próximo na lista), então há um erro.
Dcow 02/08/19
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
fonte
Seria melhor se você pudesse adicionar mais instruções à resposta, em vez de apenas colar o código.
Calos
0

Minha solução é assim

@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 depois

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

mostrado ---> pt

biyoalp
fonte
0

aqui está o código para obter o país do dispositivo. Compatível com todas as versões do Android mesmo oreo.

Solução: se o usuário não tiver um cartão SIM, obtenha o país em que ele é usado durante a configuração do telefone ou a seleção de idioma atual.

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

Se você deseja executar tarefas específicas para os usuários que residem na Índia que falam hindi, use abaixo se a condição

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