如何在Kotlin中更改语言(locale)

6jygbczu  于 2023-08-07  发布在  Kotlin
关注(0)|答案(2)|浏览(189)

我有两个字符串文件“en”和“tr”。当我改变我的电话的语言字符串文件自动改变(我没有写额外的代码,这个结果,我不知道这是怎么发生的)。我想改变字符串文件与编程。我用了这个代码。我收到吐司消息,但语言没有改变。为什么?我以前在另一个应用程序中使用过这些代码,我用java而不是Kotlin编写,这些代码工作得很好。请不要说重复,因为我读了很多问题。我尝试了很多事情,直到现在4小时。

override fun onResume() {

        buttonDate()
        changeLanguage()
    super.onResume()
    }
fun changeLanguage(){
        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext)
        val language = sharedPreferences.getString("language","bak")
        Toast.makeText(applicationContext,language,Toast.LENGTH_SHORT).show()
        if(language=="English"){
            Toast.makeText(applicationContext,"English",Toast.LENGTH_SHORT).show()
            language("")
        }else if(language=="Turkish"){
            Toast.makeText(applicationContext,"Turkish",Toast.LENGTH_SHORT).show()
            language("tr")
        }
    }

    fun language(language: String){
        val locale = Locale(language)
        Locale.setDefault(locale)
        val resources = getResources()
        val configuration = resources.getConfiguration()
        configuration.locale = locale
        resources.updateConfiguration(configuration, resources.getDisplayMetrics())
    }

字符串

irtuqstp

irtuqstp1#

您甚至需要在调用onCreate之前更新配置。为此,创建一个BaseActivity类,如下所示

open class BaseActivity : AppCompatActivity() {

    companion object {
        public var dLocale: Locale? = null
    }

    init {
        updateConfig(this)
    }

    fun updateConfig(wrapper: ContextThemeWrapper) {
        if(dLocale==Locale("") ) // Do nothing if dLocale is null
            return

        Locale.setDefault(dLocale)
        val configuration = Configuration()
        configuration.setLocale(dLocale)
        wrapper.applyOverrideConfiguration(configuration)
    }
}

字符串
扩展你的课堂活动。
在App类中设置dLocale,如下所示:

class App : Application() {

    override fun onCreate() {
        super.onCreate()

        var change = ""
        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        val language = sharedPreferences.getString("language", "bak")
        if (language == "Turkish") {
            change="tr" 
        } else if (language=="English" ) {
            change = "en"
        }else {
            change ="" 
        } 

        BaseActivity.dLocale = Locale(change) //set any locale you want here
    }
}


您还需要在manifest文件中设置App class,如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    //..

    <application
        android:name=".App"
        //..>

    </application>
</manifest>


注意:我们应该只在ApponCreate中设置dLocale,以确保所有Activity都具有相同的语言。

kknvjkwl

kknvjkwl2#

另外,请确保res文件夹中不应包含多个-。例如values-km。不应该是values-km-rKH。花了很长时间才找到并修复它。

相关问题