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


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

1) 3 drawable папки drawable-es,drawable-pt,drawable.

2) 3 значения папки values-es,values-pt,values.Изменить Строку.значения xml в соответствии с языками.

у меня есть imageView, чтобы выбрать язык.При нажатии на него открывается меню, которое состоит из опции английский, испанский, португальский.

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

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

Я должен объявить в Манифесте -android: configChanges= "locale"

это работает, но есть некоторые проблемы.

проблемы:-

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

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

5 78

5 ответов:

Это отрывок для веб-страницы:http://android.programmerguru.com/android-localization-at-runtime/

это просто изменить язык вашего приложения после того, как пользователь выбирает его из списка языков. Есть метод, как показано ниже, который принимает языковой стандарт в виде строки (например, " en "для английского языка," hi " для хинди), настроить языковой стандарт для вашего приложения и обновить текущую деятельность, чтобы отразить изменение языка. Языковой стандарт, который вы применили, не будет изменен до тех пор, пока вы вручную измените его снова.

public void setLocale(String lang) { 
    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();
} 

убедитесь, что вы импортировали следующие пакеты:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

добавить в манифест к действию android: configChanges= "locale / orientation"

вы должны либо удалить android:configChanges="locale" из манифеста, что приведет к перезагрузке activity или переопределению 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
}

хорошие решения объяснил довольно хорошо здесь. Но вот еще одно.

создать свой собственный CustomContextWrapper класс, расширяющий ContextWrapper и использовать его, чтобы изменить настройки локали для полного применения. вот суть С использованием.

а потом вызовите CustomContextWrapper с сохраненным идентификатором локали, например 'hi' для языка хинди в методе жизненного цикла деятельности attachBaseContext. Использование здесь:

@Override
protected void attachBaseContext(Context newBase) {
//fetch from shared preference also save to the same when applying. default here is en = English
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
    super.attachBaseContext(SnapContextWrapper.wrap(newBase, language));
}

пример кода Udhay работает хорошо. Кроме вопроса о Софиане Хассайни и Чираге Соланки, для повторного входа это не работает. Я пытаюсь вызвать код Udhay без перезапуска активности в onCreate (), прежде чем супер.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();
} 

все выше код идеально, но только один это отсутствует мой не работал только потому, что язык не был упомянут в файле config

 defaultConfig {

    resConfigs "en", "hi", "kn"

}

после этого, все языки начали работать