2013-09-24 18 views
6

Jak zaimplementować przełączanie języków bez konieczności ręcznego ustawiania lokalizacji w aplikacji na Androida? Wiem, że aplikacja ładuje plik strings.xml zgodnie z ustawieniami regionalnymi podczas uruchamiania, ale nie chcę, aby ten wybór był dokonywany w oparciu o ustawienia regionalne systemu, ale zamiast tego powinien być określony przez użytkownika w Ustawieniach.Przełączanie języków wewnątrz aplikacji Android

Czy ręcznie ustawiasz ustawienia regionalne?

+0

można być bardziej jasne, proszę? Czy chcesz zmienić język w zależności od ustawień aplikacji, a nie ustawień regionalnych urządzenia? –

+0

Tak, chcę zmienić język aplikacji na podstawie ustawień aplikacji. –

Odpowiedz

18

Możesz rozszerzyć klasę aplikacji (musisz zadeklarować ją również w manifeście) i umieścić w niej coś podobnego.

Ilekroć chcesz zmienić język można następnie wywołać

((App)getApplicationContext()).changeLang(lang); 

z poziomu aktywności. R.string.locale_lang jest tylko klucz, który jest przechowywany w strings.xml dla współdzielonych preferencji

public class App extends Application { 

    private Locale locale = null; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(newConfig); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

Dzięki. Mam pomysł. Ale jak mam to zgłosić w manifeście? nie jako działalność, jak sądzę. –

+1

no nie jako działanie, ale masz tag aplikacji, który otacza znaczniki aktywności. Jako atrybut aplikacji musisz dodać android: name = ". App" – kjurkovic

Powiązane problemy