如何在Kotlin中更改语言(区域设置)

8

我有两个字符串文件 "en" 和 "tr"。当我更改我的电话语言时,字符串文件会自动更改(我没有为此结果编写额外的代码,也不知道这是如何发生的)。 我想通过程序更改字符串文件。 我使用了这段代码。我得到了 Toast 消息,但语言没有改变。为什么?我之前用过这些代码,用 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())
    }

1
首先,您可以使用以下代码获取设备语言: Locale.getDefault().getDisplayLanguage(); - Mayur
1
尝试使用此链接更改语言。https://stackoverflow.com/questions/56057127/language-not-changing-in-app-android-studio/56057774#56057774 - Mayur
我尝试了这个链接,但它对我没有用。也许是我不知道怎么做。 - Hacettepe Hesabı
1
这回答解决了您的问题吗? [在Android中以编程方式更改应用程序语言](https://dev59.com/nHE85IYBdhLWcg3wMAfc) - Heitor Paceli
文档:https://developer.android.com/guide/playcore/feature-delivery/on-demand#lang_resources如果您正在使用应用捆绑包,则应用程序将仅使用必要的资源运行,因此除默认语言之外的语言资源将仅在用户手机设置中存在时才会被下载。要在使用应用捆绑包的同时启用其他语言,您应该实现Play功能交付库。请按照文档中的步骤来实现这一点! - Saiful Sazib
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8

即使在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
    }
}

您还需要在清单文件中设置App类,如下所示:

<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以确保所有活动使用相同的语言。

谢谢。这个答案有效。但我如何在程序中动态添加我的语言环境?如果我添加private val dLocale:Locale?= Locale(“tr”) 这将起作用。但是,我该如何添加多种语言? - Hacettepe Hesabı
如果我使用以下代码 var change = "" val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(wrapper) val language = sharedPreferences.getString("language", "bak") if (language == "Turkish") { change="tr" } else{ } val dLocale: Locale? = Locale(change) 由于 PreferenceManager.getDefaultSharedPreferences(wrapper),会出现空指针异常错误。 - Hacettepe Hesabı
1
我已经更新了我的答案。如果您仍然有任何问题,请告诉我。 - ahsanali274
非常感谢。您的答案真的很有帮助并且有效。我在App类中编辑了您的代码 ...if (language=="Turkish") {change="tr"} else if(language=="English") {change="en"} else{ change = "" }...,以及在BaseActivity类中 ...if(dLocale==Locale(""))...。dLocale不能为null,因为我在App类中定义了它。 - Hacettepe Hesabı
我可以再问一个问题吗?我现在还有两个问题。第一个是,当我更改语言时,活动标签不会更改,而我在清单文件中定义为android:label="@string/settings"。第二个问题是:当我更改语言时,必须重新启动我的应用程序。如果我不重新启动,语言就不会更改。我该如何解决这些问题? - Hacettepe Hesabı
1
您可以在活动的onCreate中使用setTitle(getString(R.string.settings))来更新标签。至于您的第二个问题,您可以从任何地方设置dLocale,但是您需要重新启动当前活动和所有其他在后退栈中的活动以更新它们的语言。因此,为了保持一致性,更好的选择是重新启动您的应用程序。 - ahsanali274

0
还要确保您的res文件夹中不包含多个-。例如values-km,而不是values-km-rKH。找到并修复这个问题花费了很长时间。

这并没有回答问题。一旦你有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审查 - Bö macht Blau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,