Como podemos selecionar o idioma atual no dispositivo Android?
Como podemos selecionar o idioma atual no dispositivo Android?
Respostas:
Se você deseja obter o idioma selecionado do seu dispositivo, isso pode ajudá-lo:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
para obter o código de idioma usual (por exemplo, "de", "en").
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?
Locale.getDefault().toString()
que fornece uma string que identifica completamente o código do idioma, por exemplo "en_US".
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
Locale.getDefault().getDisplayLanguage()
que retorna"English"
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.locale
agora 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.0
você 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());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
é o caminho a percorrer. Eu atualizei minha resposta.
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();
Locale.setDefault()
com outro local anteriormente e obter resultados diferentes.
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.
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
Conforme descrito na referência de localidade, a melhor maneira de obter o idioma é:
Locale.getDefault().getLanguage()
esse método retorna string com o ID do idioma de acordo com o padrão ISO 639-1
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
Para adicionar à resposta de Johan Pelgrim
context.getResources().getConfiguration().locale
Locale.getDefault()
são equivalentes porque a android.text.format.DateFormat
classe 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 ...
}
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();
As respostas acima não fazem distinção entre chinês simples e chinês tradicional.
Locale.getDefault().toString()
funciona que retorna "zh_CN", "zh_TW", "en_US" e etc.
Referências a: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 é ANTIGO.
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();
Existem dois idiomas.
Idioma padrão do SO:
Locale.getDefault().getDisplayLanguage();
Idioma atual da aplicação:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
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
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())
DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
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.
Locale.getDefault().getDisplayLanguage()
lhe dará um Written
nome 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
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()));
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_lang
chave 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.
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";
}
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
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;
}