2013-09-24 2 views
6

Как реализовать языковое переключение без необходимости вручную устанавливать локаль внутри приложения для Android? Я знаю, что приложение будет загружать strings.xml по языку во время запуска, но я не хочу, чтобы этот выбор выполнялся на основе языкового стандарта системы, но вместо этого был указан в настройках.Переключение языка внутри приложения android

Или, вручную устанавливаете локаль?

+0

Можете ли вы быть более ясным, пожалуйста? Вы хотите, чтобы язык изменялся в зависимости от настроек приложения, а не от настроек локали устройства? –

+0

Да, я хочу изменить язык приложения на основе настроек приложения. –

ответ

18

Вы можете расширить класс Application (вы должны также объявить его в манифесте) и поместить в него что-то вроде этого.

Всякий раз, когда вы хотите изменить язык, можно затем вызвать

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

изнутри вашей деятельности. R.string.locale_lang просто ключ, который хранится в strings.xml для общих предпочтений

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

Спасибо. Я понимаю. Но как я объявляю это в манифесте? не как активность, я думаю. –

+1

нет не как активность, но у вас есть тег приложения, который включает теги активности. В качестве атрибута для приложения вам нужно добавить android: name = ". App" – kjurkovic

Смежные вопросы