Как изменить язык приложения, когда пользователь выбирает язык?
Я хочу,чтобы мое приложение поддерживало три языка: испанский, португальский и английский. И дайте возможность выбрать язык в приложении.Я сделал
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 ответов:
Это отрывок для веб-страницы: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(); }