Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
120 views
in Technique[技术] by (71.8m points)

android - Kotlin - How to change the locale

I was trying the below piece of code to change the app language using Kotlin but this code is not working. Can anyone please suggest where I am doing wrong?

BaseFragment.kt

open fun setLocale(lang: String, redirectActivity: Boolean, activity: Activity?){
    if(activity != null) {
        val configuration = resources.configuration
        val locale = Locale(lang)
        configuration.setLocale(locale)
        configuration.setLayoutDirection(locale)
        activity.createConfigurationContext(configuration)

        val sharedPref: SharedPreferences =
        activity.getSharedPreferences(getString(R.string.app_name), 0)
        val editor = sharedPref.edit()
        editor.putString("lang", lang)
        editor.apply()

        activity.finish()
        startActivity(activity.intent.putExtra("redirectActivity", redirectActivity))
    }
}

LanguageFragment.kt

BaseFragment.setLocale(newLang, true, activity)
question from:https://stackoverflow.com/questions/65662126/kotlin-how-to-change-the-locale

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The default Locale needs to be set & then resources need to be updated for recreating the view. Additionally, for build version lower than Android N, you need to update the configuration of the resources too, like the following:

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

val resources = context.resources

val configuration = resources.configuration
configuration.locale = locale
configuration.setLayoutDirection(locale)

resources.updateConfiguration(configuration, resources.displayMetrics)

Here's a demo working version with one button to save the language in shared preference (as the given code snippet does) and recreate with the updated Local. Feel free to use the LocaleHelper utility class and call it like showed in its MainActivity, if it helps:

LocaleHelper().setLocale(this@MainActivity, "en")
recreate()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...