¿Cómo podemos obtener el idioma actual seleccionado en el dispositivo Android?
¿Cómo podemos obtener el idioma actual seleccionado en el dispositivo Android?
Respuestas:
Si desea obtener el idioma seleccionado de su dispositivo, esto podría ayudarlo a:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
para obtener el código de idioma habitual (por ejemplo, "de", "en").
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?
Locale.getDefault().toString()
que proporcione una cadena que identifique completamente la configuración regional, por ejemplo, "en_US".
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
Locale.getDefault().getDisplayLanguage()
que vuelve"English"
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.locale
ahora 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());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
es el camino a seguir. He actualizado mi respuesta.
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();
Locale.setDefault()
con anticipación a otro lugar y obtendrá resultados diferentes.
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.
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
Como se describe en la referencia de Locale, la mejor manera de obtener el idioma es:
Locale.getDefault().getLanguage()
Este método devuelve una cadena con ID de idioma según el estándar ISO 639-1
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
Para agregar a la respuesta de Johan Pelgrim
context.getResources().getConfiguration().locale
Locale.getDefault()
son equivalentes porque la android.text.format.DateFormat
clase 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 ...
}
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();
Las respuestas anteriores no distinguen entre chino simple y chino tradicional.
Locale.getDefault().toString()
funciona que devuelve "zh_CN", "zh_TW", "en_US" y etc.
Referencias a: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 es OLD.
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.
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();
Hay dos idiomas
Idioma predeterminado del sistema operativo:
Locale.getDefault().getDisplayLanguage();
Idioma actual de aplicación:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
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
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())
DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
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.
Locale.getDefault().getDisplayLanguage()
le dará un Written
nombre 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
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()));
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_lang
clave a su strings.xml
archivo 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.
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";
}
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
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;
}