Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Полноценное изменение языка в приложении android

#java #android #localization


У меня в приложении на android нужно сделать полноценное изменение локали. Будет
менюшка, в которой будет список языков. При нажатии на элемент меню с языком, нужно
менять язык runtime что значит на лету. Дальше после изменения языка, нужно его сохранить
в настройках и дальше менять язык на следующих активити при их создании. Так же нужно
сделать так, чтобы выбранный язык сетился и после перезагрузки приложения.
    


Ответы

Ответ 1



После долгих и постоянных попыток, я все-таки смог решить свою проблему. У меня есть менюшка со списком языков: @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); final Intent intent = new Intent(this, CountrycodeActivity.class); switch (id) { case R.id.lang: startActivityForResult(intent, 1); return true; case R.id.support: Intent error = new Intent(this, Problem.class); startActivity(error); } return super.onOptionsItemSelected(item); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == Activity.RESULT_OK) { String countryCode = data.getStringExtra(CountrycodeActivity.RESULT_CONTRYCODE); String lang = "en"; sp = getSharedPreferences("language", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); switch (countryCode) { case "English": lang = "en"; editor.putString("language", lang); break; case "Русский": lang = "ru"; editor.putString("language", lang); break; case "Українська": lang = "uk"; editor.putString("language", lang); break; } editor.apply(); changeLang(lang); } } дальше у меня есть методы для изменения и сохранения языка: private void changeLang(String lang) { if (lang.equalsIgnoreCase("")) return; Locale myLocale = new Locale(lang); Locale.setDefault(myLocale); android.content.res.Configuration config = new android.content.res.Configuration(); config.locale = myLocale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); saveLocale(lang); Intent intent = new Intent(this, LoginActivity.class); startActivity(intent); finish(); overridePendingTransition(0, 0); } private void saveLocale(String lang) { String langPref = "Language"; SharedPreferences prefs = getSharedPreferences("def_loc", 0); SharedPreferences.Editor editor = prefs.edit(); editor.putString(langPref, lang); editor.apply(); } вообще на этом этапе в приложении язык меняется runtime, но дальше нужно как-то при создании активити получать сохраненный язык и создавать активити уже с нужным языком. Вот в методе onCreate() я вставил такой кусок кода: super.onCreate(savedInstanceState); sp = getSharedPreferences("language", 0); String lang = sp.getString("language", "ru"); Locale locale = new Locale(lang); Locale.setDefault(locale); // Create a new configuration object Configuration config = new Configuration(); // Set the locale of the new configuration config.locale = locale; // Update the configuration of the Accplication context getResources().updateConfiguration( config, getResources().getDisplayMetrics() ); setContentView(activity_login); вроде у меня все работает, но возможно кто-то посоветует как-то улучшить мой способ. В любом случае надеюсь что это кому-то кроме меня поможет. P.S. Вот только вспомнил, для того чтобы все нормально прижилось в приложении нужно сделать несколько файлов с переводом на нужный вам язык. Я делал не через встроенный editor студии, а создавал новый файлы. Это так на всякий случай, может это на что-то повлияет.

Комментариев нет:

Отправить комментарий