无法在Kotlin中更改语言环境

卡尔蒂卡

我有2个字符串文件“ en”和“ es”。每当我在语言环境管理器类中更改语言环境时,它都会成功保存新的语言环境,但不会反映刷新活动的更改。

MyApplication.kt

open class MyApplication : Application() {

    init {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(LocaleManagerMew.setLocale(base))
       // MultiDex.install(base)
    }

    override fun onCreate() {
        super.onCreate()

    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        LocaleManagerMew.setLocale(this)
        Log.d("app", "onConfigurationChanged: " + newConfig.locale.getLanguage())
    }
}

LocaleManagerNew.kt

object LocaleManagerMew {

    val SELECTED_LANGUAGE = "MEW_CURRENT_-- USER_LANGUAGE"
    var mSharedPreference: SharedPref? = null

    var mEnglishFlag = "en"
    var mSpanishFlag = "es"

    fun setLocale(context: Context?): Context {
        return updateResources(context!!, getCurrentLanguage(context)!!)
    }

    inline fun setNewLocale(context: Context, language: String) {

        persistLanguagePreference(context, language)
        updateResources(context, language)
    }

    inline fun getCurrentLanguage(context: Context?): String? {

        var mCurrentLanguage: String?

        if (mSharedPreference == null)
            mSharedPreference = SharedPref(context!!)

        mCurrentLanguage = mSharedPreference!!.getSavedLang()

        return mCurrentLanguage
    }

    fun persistLanguagePreference(context: Context, language: String) {
        if (mSharedPreference == null)
            mSharedPreference = SharedPref(context!!)

        mSharedPreference!!.setSavedLang(language)

    }

    fun updateResources(context: Context, language: String): Context {

        var contextFun = context

        var locale = Locale(language)
        Locale.setDefault(locale)

        var resources = context.resources
        var configuration = Configuration(resources.configuration)

        if (Build.VERSION.SDK_INT >= 17) {
            configuration.setLocale(locale)
            contextFun = context.createConfigurationContext(configuration)
        } else {
            configuration.locale = locale
            resources.updateConfiguration(configuration, resources.getDisplayMetrics())
        }
        return contextFun
    }
}

BaseActivity.kt

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

MainActivity.kt

 R.id.spanishCL ->  {
                sp.setSavedLang("es")
                var mCurrentLanguage = LocaleManagerMew.getCurrentLanguage([email protected])
                LocaleManagerMew.setNewLocale(this@MainActivity, LocaleManagerMew.mSpanishFlag)
               mContext?.recreate()

            }

这是将英语语言环境更改为西班牙语的onClick方法调用。重新创建主动性后,新的语言环境更改不会反映

卡蒂克

试试下面的代码从更新语言attachBaseContext每一个活动

    fun setLanguage(context: Context, language: String): ContextWrapper {
        var mContext = context

        val localeLang = language.split("_".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        val locale: Locale
        if (localeLang.size > 1)
            locale = Locale(localeLang[0], localeLang[1])
        else
            locale = Locale(localeLang[0])

        val res = mContext.resources
        val configuration = res.configuration

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            val localeList = LocaleList(locale)
            LocaleList.setDefault(localeList)
            configuration.locales = localeList
            mContext = mContext.createConfigurationContext(configuration)
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale)
            mContext = mContext.createConfigurationContext(configuration)
        } else {
            configuration.locale = locale
            res.updateConfiguration(configuration, res.getDisplayMetrics())
        }

        return ContextWrapper(mContext)
    }

并在Activity类的attachBaseContext中实现

//    For Language Changing
override fun attachBaseContext(newBase: Context?) {
    super.attachBaseContext(newBase?.let {
        Common.setLanguage(
            it,
            PreferenceManager.getPref<String>(Constants.LANGUAGE_PREFERENCE).toString()
        )
    })
}

这就是我从片段重新开始活动的方式

Handler().post {
            val intent = activity?.intent
            intent?.flags =
                Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or
                        Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_ANIMATION
            activity?.overridePendingTransition(0, 0)
            activity?.finish()

            activity?.overridePendingTransition(0, 0)
            startActivity(intent)
        }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法更改语言环境

来自分类Dev

无法更改瞬间语言环境

来自分类Dev

更改脚本中的语言环境

来自分类Dev

Kotlin-如何更改语言环境

来自分类Dev

LC_ALL:无法更改语言环境

来自分类Dev

在Laravel 5.2中更改Faker语言环境

来自分类Dev

更改Java中的PrintStream的语言环境

来自分类Dev

在Rails 4中更改语言环境名称

来自分类Dev

即使 Twig symfony 3 中的语言环境为“fr”,也无法将日期更改为法语

来自分类Dev

无法在Django中更改语言

来自分类常见问题

更改支持的语言环境

来自分类Dev

更改DecimalFormat语言环境

来自分类Dev

更改默认的语言环境

来自分类Dev

更改支持的语言环境

来自分类Dev

更改语言环境

来自分类Dev

Grails更改语言环境

来自分类Dev

无法永久更改16.04服务器上的语言环境

来自分类Dev

无法永久更改16.04服务器上的语言环境

来自分类Dev

警告:setlocale:LC_ALL:无法更改语言环境

来自分类Dev

无法安装语言环境

来自分类Dev

如何在Ubuntu Server中更改默认语言环境?

来自分类Dev

在模板Keystone.js中更改日期语言环境

来自分类Dev

更改语言环境已在Android 10中停止工作

来自分类Dev

如何在Ubuntu Server中更改默认语言环境?

来自分类Dev

在Android应用中更改语言环境(在印地语上)

来自分类Dev

在jQuery全球化中设置和更改语言环境

来自分类Dev

如何在GnuCash的语言环境中更改数字格式?

来自分类Dev

如何在Ubuntu Core中更改语言环境?

来自分类Dev

无法更改jTextField中的输入语言