Android 如何在kotlin(语言环境)中更改语言

Android 如何在kotlin(语言环境)中更改语言,android,kotlin,locale,Android,Kotlin,Locale,我有两个字符串文件“en”和“tr”。当我更改电话的语言时,字符串文件会自动更改(我没有为此结果编写额外的代码,我不知道这是如何发生的)。我希望以编程方式更改字符串文件。 我用了这个密码。我收到祝酒词,但语言不变。为什么?我以前在另一个应用程序中使用了这些代码,我用java而不是Kotlin编写,这些代码工作得很好。请不要说重复,因为我读了很多问题。我尝试了很多东西直到现在4个小时 override fun onResume() { buttonDate() c

我有两个字符串文件“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())
    }

您甚至需要在调用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)
    }
}
扩展本课程中的活动

在应用程序类中设置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 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    //..

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

    </application>
</manifest>    
您还需要在清单文件中设置应用程序类,如下所示:

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 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    //..

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

    </application>
</manifest>    

//..

注意:我们应该仅在
App
onCreate
中设置dLocale,以确保所有活动都具有相同的语言。

首先,您可以使用此代码区域设置获取设备语言。getDefault().getDisplayLanguage();请尝试此链接以更改语言。我尝试了这个链接,但它对我不起作用。也许我不能我不知道谢谢你。这个答案就是工作。但是我如何通过编程方式添加我的区域设置呢。如果我添加
private val-dLocale:Locale?=语言环境(“tr”)
这项工作。但是如何添加多个语言呢?如果我使用这个
var change=”“val SharedReferences=PreferenceManager.getDefaultSharedReferences(包装器)val language=SharedReferences.getString(“语言”,“bak”)如果(语言==“土耳其语”){change=“tr”}else{}val dLocale:Locale?=区域设置(更改)
get null point异常错误,因为
PreferenceManager.getdefaultsharedreferences(wrapper)
我已更新了答案。如果你还有什么问题,请告诉我。非常感谢。你的回答真的很有用,很有用。我在类App
…if(language==“turnic”){change=“tr”}else if(language==“English”){change=“en”}else{change=”“}中编辑您的代码
和类内BaseActivity
…如果(dLocale==Locale(“”)…
。dLocale不能为null,因为我在App Class中定义了它。您可以在活动的
onCreate
中使用
setTitle(getString(R.string.settings))
来更新标签。至于第二个问题,您可以从任意位置设置
dLocale
,但需要重新启动当前活动和后台堆栈中的所有其他活动,以更新其语言。因此,更好的选择是重新启动应用程序以保持一致性。