LocaleManager для изменения языка не работает в устройстве Зефир - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь изменить язык в своем приложении, используя LocaleManager. Мой код отлично работает на Nougat и Oreo, но на Marshmallow он не работает. У меня есть действие настройки, где я добавляю одно диалоговое окно, чтобы изменить язык. Вот мой код:

LocaleManager.kt:

class LocaleManager {

    companion object {

        val LANGUAGE_ENGLISH = "en"
        private val LANGUAGE_KEY = "display_lang"

        fun setNewLocale(c: Context, language: String): Context {
            persistLanguage(c, language)
            return updateResources(c, language)
        }

        private fun persistLanguage(c: Context, language: String) {
            val prefs = PreferenceManager.getDefaultSharedPreferences(c)
            prefs.edit().putString(LANGUAGE_KEY, language).apply()
        }

        private fun updateResources(context: Context, language: String): Context {
            val locale = Locale(language)
            Locale.setDefault(locale)
            val config = Configuration(context.resources.configuration)
            config.setLocale(locale)
            return context.createConfigurationContext(config)
        }

        fun setLocale(c: Context): Context {
            return updateResources(c, getLanguage(c))
        }

        fun getLanguage(c: Context): String {
            val prefs = PreferenceManager.getDefaultSharedPreferences(c)
            return prefs.getString(LANGUAGE_KEY, LANGUAGE_ENGLISH)
        }
    }
}

Это мой Настройка Activity.kt для пользовательского диалога:

fun showChangeLangDialog() {
    val factory = LayoutInflater.from(this)
    val langDialog = factory.inflate(R.layout.select_lang_dialog, null)
    val langList = resources.getStringArray(R.array.languages)
    langList.forEach {
        val obj = JSONObject(it)
        val rdbtnLang = RadioButton(this)
        rdbtnLang.id = obj.getInt("id")
        rdbtnLang.text = obj.getString("lang")
        Log.e("Lan", LocaleManager.getLanguage(this))
        if (LocaleManager.getLanguage(this) == obj.getString("code")) {
            rdbtnLang.isChecked = true
        }
        rdbtnLang.textSize = 20f
        rdbtnLang.setPadding(20, 30, 30, 30)
        langDialog.selectLangList.addView(rdbtnLang)
    }

    AlertDialog.Builder(this)
            .setTitle(R.string.selectLang)
            .setPositiveButton(R.string.ok) { dialog, i ->
                langList.forEach {
                    val obj = JSONObject(it)
                    if (langDialog.selectLangList.checkedRadioButtonId == obj.getInt("id")) {
                        setNewLocale(obj.getString("code"))
                    }
                }
                dialog.dismiss()
            }
            .setNegativeButton(R.string.cancel) { dialog, whichButton ->
                dialog.dismiss()
            }
            .setView(langDialog)
            .create()
            .show()
}

В каждом упражнении, где мне нужно изменить язык текста, я добавляю этот фрагмент:

override fun attachBaseContext(base: Context) {
    super.attachBaseContext(LocaleManager.setLocale(base))
}

1 Ответ

0 голосов
/ 10 сентября 2018

Я думаю, вам нужно изменить тип строки "gu-rIN" на простой перевод типа "gu"

...