[android] Как изменить язык приложения, когда пользователь выбирает язык?


Answers

Вы должны либо удалить android:configChanges="locale" из манифеста, который приведет к перезагрузке активности или переопределит метод onConfigurationChanged :

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
    // your code here, you can use newConfig.locale if you need to check the language
    // or just re-set all the labels to desired string resource
}
Question

Я хочу, чтобы мое приложение поддерживало три языка: испанский, португальский и английский. И дать возможность выбрать язык в приложении. Я сделал

1) 3 выдвижных папок для выдвижных папок, drawable-pt, drawable.

2) 3 значения значений папки-es, values-pt, values.Change String.xml значения в соответствии с языками.

У меня есть ImageView, чтобы выбрать язык. Когда откроется меню, это будет вариант английского, испанского, португальского.

Я установил Locale внутри приложения при выборе опции по этому коду

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.en:
             Locale locale = new Locale("en"); 
             Locale.setDefault(locale);
             Configuration config = new Configuration();
             config.locale = locale;
             getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
             Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
             break;

        case R.id.pt:
             Locale locale2 = new Locale("pt"); 
             Locale.setDefault(locale2);
             Configuration config2 = new Configuration();
             config2.locale = locale2;
             getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
             break;

        case R.id.es:
             Locale locale3 = new Locale("es"); 
             Locale.setDefault(locale3);
             Configuration config3 = new Configuration();
             config3.locale = locale3;
             getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
             break;


    }
         return super.onOptionsItemSelected(item);
}

Я объявляю в Manifest- android: configChanges = "locale"

Он работает, но у него есть проблема.

Проблема: -

1) Когда выбран язык, экран, который содержит изображение выбора языка, не изменяется, а другие экраны меняются.

2) После того, как приложение для изменения ориентации изменит язык в соответствии с языком телефона.




Образец кода Udhay работает хорошо. Кроме вопроса о Софьяне Хасаини и Чираге Соланке, для повторного входа это не работает. Я пытаюсь вызвать код Udhay без перезапуска активности в onCreate (), прежде чем super.onCreate (savedInstanceState) ;. Тогда все в порядке! Только небольшая проблема, строки меню все еще не изменились на установленный язык.

    public void setLocale(String lang) { //call this in onCreate()
     Locale myLocale = new Locale(lang); 
     Resources res = getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     res.updateConfiguration(conf, dm); 
     //Intent refresh = new Intent(this, AndroidLocalize.class); 
     //startActivity(refresh); 
     //finish();
} 



Links