2011-12-31 3 views
22

Come conoscere la lingua (locale) attualmente utilizzata dall'app Android per visualizzare i testi per l'utente?Come ottenere la lingua (locale) attualmente visualizzata l'app per Android?

So che posso usare Locale.getDefault() per ottenere le impostazioni internazionali del sistema operativo predefinito. Ma potrebbe differire dalle impostazioni locali utilizzate dall'app per visualizzare testo e altre risorse, se questa locale non è supportata dall'app.


ho bisogno per determinare la lingua (locale) visualizzata dal app, in tal modo l'applicazione può passare la lingua al server, in modo che possa localizzare risultati restituiti.

risposta

41

La mia soluzione è quella di aggiungere alla coppia chiave-valore strings.xmllocale=<locale code>, pertanto context.getResources().getString(R.string.locale) restituirà il codice locale specifico per le impostazioni locali utilizzate.

+0

Immagino che questa soluzione avrebbe dovuto essere la parte della tua domanda. –

+1

@YaqubAhmad Sono arrivato a questa soluzione più tardi. Ma sto ancora aspettando una possibile soluzione migliore. –

+1

Mi piace questa soluzione perché in questo modo sono garantito il codice locale solo se vengono utilizzate le risorse di traduzione. E questa è l'unica volta che lo voglio. Altrimenti, potrei ottenere le date in una lingua e altre risorse di stringa in un'altra lingua se ho commesso un errore nell'ottenere le impostazioni internazionali. – Suragch

32

E 'della configurazione dell'app, in modo da poter ottenere con:

getResources().getConfiguration().locale 

questo è diverso da

Locale.getDefault() 

e mostra il Locale che l'applicazione utilizza che può essere diverso.

Può essere diverso perché lo sviluppatore può cambiare aggiornando la configurazione di applicazione, controllo: Resources.updateConfiguration

+0

I documenti per la prima lista fn tu dicono "La preferenza utente corrente per la locale, corrispondente al qualificatore di risorsa locale". Se questa è "preferenza utente corrente", allora come è diversa dalla 2a fn. In entrambi i casi, quale funzione della classe Locale fa una chiamata per ottenere il codice locale String (equivalente all'estensione della risorsa) che può essere passato al server (come nella domanda originale)? – Tom

+0

Questa risposta indica il modo corretto di ottenere il 'Locale' (prima riga di codice). Ma è sbagliato che ci sia una differenza: 'Locale.getDefault()' è equivalente al primo esempio. Se vuoi ottenere il codice della lingua, devi chiamare 'getLanguage()'. – caw

+6

Sfortunatamente, questo non funziona come ho bisogno. Se si imposta System language, ad es. Per Dansk (danese), 'getResources(). GetConfiguration(). Locale' restituisce da_DK, mentre visualizza le stringhe inglesi (da' values ​​/ strings.xml'). –

0

È possibile utilizzare il codice qui sotto. Ad esempio, le funzioni presentate di seguito possono essere collocate all'interno della classe estesa della classe 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(); 
    } 
} 

E poi ovunque nel codice principale si può scrivere:

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

Nel tuo caso, è, in breve, può utilizzare getAppLanguage() e quindi controllare la variabile pubblica APP_LANG per ottenere ciò che la lingua è attualmente utilizzato .

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; 

    } 

Utilizzare questo metodo.

3

Il seguente codice funziona per me:

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

Nota: C'è un piccolo cambiamento su come si dovrebbe ottenere locale su Build.VERSION_CODES.N. Per N e sopra, il codice dovrebbe apparire come il blocco di codice sottostante; tuttavia, lo faccio solo per M e sotto come nel precedente blocco di codice ed è compatibile anche per N e sopra.

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

ho ottenuto il seguente sulle lingue nazionali sostengo:

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

C'è una lista di metodi che danno la stessa informazione locale in diversi formati:

locale.getDefault() .getCountry();
locale.getDefault(). GetISO3Language();
locale.getDefault().getISO3Country();
locale.getDefault(). GetDisplayCountry();
locale.getDefault(). GetDisplayName();
locale.getDefault(). GetDisplayLanguage();
locale.getDefault(). GetLanguage();
locale.getDefault(). ToString();