android values - Obter o idioma atual no dispositivo




locales resources (18)

Para adicionar à resposta de Johan Pelgrim

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

são equivalentes porque a classe android.text.format.DateFormat usa ambos intercambiavelmente, eg

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

Como podemos obter o idioma atual selecionado no dispositivo Android?


Para economizar tempo e / ou confusão aos outros, eu gostaria de compartilhar que tentei as duas alternativas propostas por Johan Pelgrim acima e no meu dispositivo elas são equivalentes - se a localização padrão é alterada ou não.

Assim, a configuração padrão do meu dispositivo é o Inglês (United Kindom) e, nesse estado, como esperado, as duas Strings na resposta de Johant dão o mesmo resultado. Se eu alterar a localidade nas configurações do telefone (diga para italiano (Italia)) e execute novamente as duas Strings na resposta de Johan, forneça a localidade como italiano (Italia).

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


Eu verifiquei os métodos Locale 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


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

A maneira correta de obter o idioma do seu dispositivo é a 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.


Se o nível da API for 24 ou superior, use LocaleList.getDefault().get(0).getLanguage() else use Locale.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


Você pode usar este código para descobrir a corrente do teclado

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

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

mostrada ---> en


Se você escolher um idioma que você não pode 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

Você pode tentar obter o código de idioma dos recursos do sistema:

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

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

Locale.getDefault().getDisplayLanguage();

Conforme descrito na referência local, a melhor maneira de obter a linguagem é:

Locale.getDefault().getLanguage()

este método retorna string com id de idioma de acordo com a norma ISO 639-1


Existem dois idiomas.

Idioma padrão do sistema operacional:

Locale.getDefault().getDisplayLanguage();

Língua atual da aplicação:

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

Você pode "extrair" o idioma do local atual. Você pode extrair a localidade por meio da API Java padrão ou usando o contexto Android. Por exemplo, as duas linhas abaixo são equivalentes:

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

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

O que funcionou para mim foi:

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

Resource.getSystem () retorna um objeto global de Recursos compartilhados que fornece acesso apenas aos recursos do sistema (sem recursos de 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.locale agora foi substituído, a maneira preferida de obter a localidade 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 simples verificação:

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.0 você não precisa verificar a versão do Android, pois oferece um método conveniente e compatível com versões anteriores getLocales() .

Basta ligar:

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

public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}






android localization