¿Cómo obtener el idioma (configuración regional) que muestra actualmente la aplicación para Android?

¿Cómo llegar a conocer el idioma (locale) actualmente la aplicación de Android utiliza para mostrar textos al usuario?

Sé que puedo usar Locale.getDefault() para obtener la configuración predeterminada de OS. Pero puede diferir de la configuración regional utilizada por la aplicación para mostrar texto y otros recursos, si esta configuración regional no es compatible con la aplicación.


Tengo que determinar el idioma (locale) que muestra la aplicación, por lo que la aplicación puede pasar el idioma al servidor, por lo que puede localizar los resultados devueltos.

Mi propia solución es añadir a strings.xml key-value par locale=<locale code> , así context.getResources().getString(R.string.locale) devolverá el código de configuración regional específico para la configuración regional utilizada.

Está en la configuración de tu aplicación, para que puedas obtenerla con:

 getResources().getConfiguration().locale 

Esto es diferente de

 Locale.getDefault() 

Y muestra la configuración regional que utiliza la aplicación y que puede ser diferente.

Puede ser diferente porque el desarrollador puede cambiarlo actualizando la configuración de la aplicación, compruebe: Resources.updateConfiguration

El siguiente código funciona para mí:

 @TargetApi(Build.VERSION_CODES.M) private String getCurrentDefaultLocaleStr(Context context) { Locale locale = context.getResources().getConfiguration().locale; return locale.getDefault().toString(); } 

Nota: hay un ligero cambio en la forma en que debe obtener la configuración regional en Build.VERSION_CODES.N. Para N y encima, el código debe verse como el bloque de código a continuación; Sin embargo, sólo lo hago por M y por debajo como en el bloque de código anterior y es compatible para N y arriba también.

  // Build.VERSION_CODES.N Locale locale = context.getResources().getConfiguration().getLocales().get(0); 

Tengo lo siguiente en los idiomas nacionales que apoyo:

 English: en Traditional Chinese: zh_TW_#Hant Simplified Chinese: zh_CN_#Hans Spanish: es_ES French: fr_FR Japanese: ja_JP German: de_DE 

Hay una lista de métodos que proporcionan la misma información de configuración regional en diferentes formatos:

Locale.getDefault (). GetCountry ();
Locale.getDefault (). GetISO3Language ();
Locale.getDefault (). GetISO3Country ();
Locale.getDefault (). GetDisplayCountry ();
Locale.getDefault (). GetDisplayName ();
Locale.getDefault (). GetDisplayLanguage ();
Locale.getDefault (). GetLanguage ();
Locale.getDefault (). ToString ();

Puede utilizar el código de abajo. Por ejemplo, las funciones presentadas a continuación pueden colocarse dentro de la clase extendida de la clase Application.

 public class MyApplication extends Application { ... public static String APP_LANG; private Context ctx = getBaseContext(); private Resources res = ctx.getResources(); public SharedPreferences settingPrefs; ... public void restoreAppLanguage(){ /** *Use this method to store the app language with other preferences. *This makes it possible to use the language set before, at any time, whenever *the app will started. */ settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE); String lang = settingPrefs.getString("AppLanguage", ""); if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){ Locale myLocale; myLocale = new Locale(lang); Locale.setDefault(myLocale); Configuration config = new Configuration(); config.locale = myLocale; res.updateConfiguration( config, res.getDisplayMetrics() ); } } public void storeAppLanguage(int lang) { /** *Store app language on demand */ settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE); Editor ed = settingPrefs.edit(); Locale myLocale; myLocale = new Locale(lang); Locale.setDefault(myLocale); Configuration config = new Configuration(); config.locale = myLocale; res.updateConfiguration( config, res.getDisplayMetrics() ); ed.putString("AppLanguage", lang); ed.commit(); } public void setAppLanguage(String lang){ /** *Use this method together with getAppLanguage() to set and then restore *language, whereever you need, for example, the specifically localized *resources. */ Locale myLocale; myLocale = new Locale(lang); Locale.setDefault(myLocale); Configuration config = new Configuration(); config.locale = myLocale; res.updateConfiguration( config, res.getDisplayMetrics() ); } public void getAppLanguage(){ /** *Use this method to obtain the current app language name */ settingPrefs = getSharedPreferences("ConfigData",MODE_PRIVATE); String lang = settingPrefs.getString("AppLanguage", ""); if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){ APP_LANG = lang; } else APP_LANG = Locale.getDefault().getLanguage(); } } 

Y entonces dondequiera que en el código principal podemos escribir:

 public class MainActivity extends ActionBarActivity { ... MyApplication app; ... @Override protected void onCreate(Bundle savedInstanceState) { ... app = (MyApplication)getApplicationContext(); ... if(settingPrefs.getAll().isEmpty()){ //Create language preference if it is not app.storeAppLanguage(Locale.getDefault().getLanguage()); } //Restore previously used language app.restoreAppLanguage(); ... } ... void SomethingToDo(){ String lang = "en"; //"fr", "de", "es", "it", "ru" etc. ... app.getAppLanguage(); app.setAppLanguage(lang); ... //do anything ... app.setAppLanguage(app.APP_LANG); } ... } 

En su caso, usted, en breve, puede utilizar getAppLanguage() y luego comprobar la variable pública APP_LANG para obtener qué idioma se utiliza actualmente.

  public boolean CheckLocale(Context context, String app_language) { Locale myLocale = new Locale(app_language); Resources res = context.getResources(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; if(res.getConfiguration().locale==myLocale) return true; else return false; } 

Utilice este método.

  • ¿Permitiendo al usuario seleccionar el idioma / la configuración de la aplicación?
  • ¿Cómo obtendría una cadena de fecha corta basada en la configuración regional para Android?
  • Lengua ucraniana de Android
  • Cambio de locale: ¿Forzar la actividad a recargar recursos?
  • ¿Cómo evitar la dirección automática de texto de derecha a izquierda para el hebreo y el árabe?
  • CyanogenMod: traducir un proyecto
  • Formato de moneda en Android utilizando separador decimal incorrecto
  • Localización y travesaños
  • ¿Es posible localizar CalendarView o DatePicker?
  • Android: elegir entre dos idiomas sin "locale"
  • Símbolo de moneda regional
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.