2011-12-31 11 views
22

¿Cómo conocer el idioma (configuración regional) que actualmente usa la aplicación de Android para mostrar textos al usuario?¿Cómo obtener el idioma (configuración regional) que muestra actualmente la aplicación de Android?

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


necesito para determinar el idioma (configuración regional) mostrado por la aplicación, por lo que la aplicación puede pasar lenguaje para el servidor, por lo que puede localizar resultados devueltos.

Respuesta

41

Mi propia solución es agregar strings.xml par de clave-valor locale=<locale code>, por lo que context.getResources().getString(R.string.locale) devolverá el código de configuración regional específico para la configuración regional utilizada.

+0

Supongo que se suponía que esta solución era la parte de su pregunta. –

+1

@YaqubAhmad Llegué a esta solución más tarde. Pero todavía estoy esperando una mejor solución posible. –

+1

Me gusta esta solución porque entonces estoy seguro de obtener el código de configuración regional solo si mis recursos de traducción están siendo utilizados. Y ese es el único momento en que lo quiero. De lo contrario, podría obtener las fechas en un idioma y otros recursos de cadena en otro idioma si cometí algún error al obtener la configuración regional. – Suragch

32

Es la configuración de su aplicación, por lo que se puede conseguir con:

getResources().getConfiguration().locale 

esto es diferente de

Locale.getDefault() 

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

puede ser diferente debido a que el desarrollador puede cambiarlo mediante la actualización de la configuración de aplicaciones, cheque: Resources.updateConfiguration

+0

Los documentos de la primera lista de fn indican "Preferencia de usuario actual para la configuración regional, correspondiente al calificador de recursos de la configuración regional". Si esto es 'preferencia de usuario actual', ¿cómo es diferente de la 2da fn. De cualquier forma, ¿qué función de la clase Locale hace una llamada para obtener el código de configuración regional Cadena (equivalente a la extensión de recursos) que se puede pasar de vuelta al servidor (como en la pregunta original)? – Tom

+0

Esta respuesta menciona la forma correcta de obtener 'Locale' (primera línea de código). Pero está mal que exista una diferencia: 'Locale.getDefault()' es equivalente al primer ejemplo. Si desea obtener el código de idioma, debe llamar a 'getLanguage()'. – caw

+6

Desafortunadamente, esto no funciona como lo necesito. Si configura el idioma del sistema, por ejemplo, para Dansk (danés), 'getResources(). GetConfiguration(). Locale' devuelve da_DK, mientras visualiza cadenas en inglés (desde' values ​​/ strings.xml'). –

0

Puede utilizar el código de abajo. Por ejemplo, las funciones que se presentan a continuación pueden ubicarse dentro de la clase extendida de la clase de Aplicación.

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 a continuación, en cualquier parte del 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, que, en breve, puede usar getAppLanguage() y después comprobar la variable pública APP_LANG para obtener el idioma que se utiliza actualmente .

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

3

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 superior, el código debería verse como el bloque de código a continuación; sin embargo, solo lo hago para M y debajo como en el bloque de código anterior y también es compatible para N y superior.

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

que tiene lo siguiente en los idiomas nacionales 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 le dan 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();

Cuestiones relacionadas