Я хочу, чтобы мое приложение поддерживало три языка: испанский, португальский и английский. И дайте возможность выбрать язык в приложении. Я сделал
1) 3 папки с возможностью рисования, drawable-es, drawable-pt, drawable.
2) 3 значения папки values-es, values-pt, values. Измените значения String.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) После смены ориентации приложение восстанавливает язык в соответствии с локалью телефона.
источник
android:configChanges="locale"
для своей деятельности в AndroidManifest.xmlОтветы:
Это отрывок для веб-страницы: http://android.programmerguru.com/android-localization-at-runtime/
Изменить язык вашего приложения просто, когда пользователь выберет его из списка языков. Имейте метод, подобный приведенному ниже, который принимает языковой стандарт как String (например, «en» для английского языка, «привет» для хинди), настройте языковой стандарт для своего приложения и обновите текущую активность, чтобы отразить изменение языка. Примененный языковой стандарт не будет изменен, пока вы снова не измените его вручную.
Убедитесь, что вы импортировали следующие пакеты:
добавить в манифест активности android: configChanges = "locale | Ориентация"
источник
finish()
нужно позвонить раньшеstartActivity(refresh)
. В противном случае приложение может выйти вместо перезапуска действия.Хорошие решения здесь довольно хорошо объяснены. Но вот еще одно.
Создайте свой собственный
CustomContextWrapper
класс-расширениеContextWrapper
и используйте его, чтобы изменить настройку Locale для всего приложения. Вот GIST с использованием.А затем вызовите
CustomContextWrapper
с сохраненным идентификатором локали, например,'hi'
для языка хинди в методе жизненного цикла активностиattachBaseContext
. Использование здесь:источник
MyContextWrapper.warp
вonAttach
только одного фрагмента моего приложения , но язык был изменен для всего приложения, но названия активности не изменились, я думаю , что это потому что заголовки манифеста имеют приоритет, но если я вызываю тот же метод вonAttachBaseContex
своем подклассе приложения, заголовки действий также меняются на выбранный язык, но тогда изменения применяются только к фрагменту, который я вызвал в методе деформации, почему это ?warp
метод воonAttach
фрагменте, ранее я сказал, что мне просто нужно было сделать это с фрагментом mainactivity, и язык был изменен в все приложение это правда, но для всех других фрагментов язык меняется на английский при изменении конфигурации, поэтому мне нужно вставитьonattach
все фрагменты, и вместо манифеста я установил заголовки панели действий в коде, теперь приложение работает, как ожидалось. спасибоattachBaseContext
функции. И это касается всех экранов. Вы создали «BaseActivity» для всех действий в своем приложении?wrap()
код должен выполняться при каждом изменении конфигурации, поэтому я поместил его в Абстрактная деятельность, из которой простираются все остальные виды деятельности, теперь она работаетВы должны либо удалить
android:configChanges="locale"
из манифеста, что приведет к перезагрузке активности, либо переопределитьonConfigurationChanged
метод:источник
весь вышеперечисленный код @Uday идеален, но отсутствует только одна вещь (конфигурация по умолчанию в build.gradle)
}
Мой не работал только потому, что языки не были упомянуты в файле конфигурации (build.gradle)
после этого все языки начали работать
источник
Те, у кого проблема с версией, пробуют этот код ..
источник
Пример кода Udhay работает хорошо. За исключением вопроса Софиан Хассаини и Чирага Соланки, для повторного входа это не работает. Я пытаюсь вызвать код Udhay без перезапуска активности в onCreate () перед super.onCreate (savedInstanceState) ;. Тогда нормально! Только небольшая проблема, строки меню все еще не изменены на установленную локаль.
источник
Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);
?