android - 用于更改语言的 LocaleManager 在 Marshmallow 设备中不起作用

标签 android kotlin locale

我正在尝试使用 LocaleManager 更改我的应用程序中的语言。我的代码在 Nougat 和 Oreo 上完美运行,但在 Marshmallow 上它不起作用。我有一个设置 Activity ,我在其中添加一个对话框来更改语言。这是我的代码:

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

在我需要更改语言文本的每个 Activity 中,我都添加了这个 fragment :

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

最佳答案

我认为您必须将字符串类型“gu-rIN”更改为简单的“gu”类型翻译

关于android - 用于更改语言的 LocaleManager 在 Marshmallow 设备中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52216485/

相关文章:

android - 使用 Google Service Plugin 3.2.0 的 Gradle 构建失败

列出 : Idiomatic way of filtering similar elements

python - 获取提供的区域设置的货币名称 (Python)

GWT 动态语言环境

android - 我可以在安卓手机上浏览已安装的证书吗?

android - 疑似内存泄漏

android - 更改选项卡图标android项目

kotlin - 如何使用 Dagger 2 在 Kotlin 中注入(inject)命名字段参数?

android - 在 viewpager2 中禁用动画

r - 按字母顺序排序时,字母 "y"位于 "i"之后