【问题标题】:Changing the App Language not working correctly (Kotlin)更改应用程序语言无法正常工作 (Kotlin)
【发布时间】:2021-07-12 08:09:24
【问题描述】:

我的 kotlin 应用程序中有一个启动画面,我可以在其中执行一些操作,例如加载数据。目前它只有德语,我想添加英语作为附加语言。 我已经创建了字符串资源等等。 现在我在 Splash-Screen 中添加了一些代码,它会检查用户是否已经设置了偏好语言(保存在 sharedPreferences 中)。

当没有保存任何内容时,会弹出一个简单的警报对话框,询问用户的偏好并相应地设置所有内容。 然后重新加载启动画面。当我在我的设备上选择英语(系统语言为德语)时,启动屏幕会获取正确的字符串资源(英语)。

但是当它更改为 MainActivity 时,它又是德语了。只有重新启动应用程序后,一切都是英文的。

以下是我如何更改初始屏幕上的语言:

    private lateinit var mainIntent : Intent

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        var localeToSet: String? = prefs.getString("language", "")

        if(localeToSet == null || localeToSet.equals("")){
            val languages = arrayOf("Deutsch", "English")

            val langSelectorBuilder = AlertDialog.Builder(this)
            langSelectorBuilder.setTitle(R.string.selectLanguageText)
            langSelectorBuilder.setCancelable(false)
            langSelectorBuilder.setSingleChoiceItems(languages, -1) { dialog, selection ->
                when(selection) {
                    0 -> {
                        localeToSet = "de"
                        setLocale("de")
                    }
                    1 -> {
                        localeToSet = "en"
                        setLocale("en")
                    }
                }
                    recreate()
                    dialog.dismiss()
            }.setOnDismissListener {
                Handler().postDelayed({

                    startActivity(mainIntent)
                    finish()

                }, SPLASH_TIME_OUT)
            }
            langSelectorBuilder.create().show()
        }
        else{

                setLocale(localeToSet!!)

                Handler().postDelayed({

                    startActivity(mainIntent)
                    finish()

                }, SPLASH_TIME_OUT)

        }

        setContentView(R.layout.activity_splash_screen)


    }

    private fun createIntent(localeToSet: String){

        mainIntent = Intent(this@SplashScreenActivity, MainActivity::class.java).apply {

            //Do stuff and pass data to mainactivity
    }

    private fun setLocale(localeToSet: String) {
        createIntent(localeToSet)

        val config = resources.configuration
        val locale = Locale(localeToSet)
        Locale.setDefault(locale)
        config.locale = locale
        resources.updateConfiguration(config, resources.displayMetrics)
        val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        val editor: SharedPreferences.Editor = prefs.edit()

        editor.putString("language", localeToSet)
        editor.apply()

    }

【问题讨论】:

  • 请原谅我在英语国家生活的无知,但我很好奇。在人们试图在他们的应用程序中放置语言设置之前,我在这里看到过一些问题。这在 Google Play 上的应用程序中是否常见?为什么不依赖语言的系统设置?如果系统设置为德语并且您的应用程序具有德语资源,那么它将自动以德语显示您的应用程序。用户必须在每个单独的应用程序中手动设置语言,这会不会很烦人?
  • 问题是,当某人住在德国,但例如他的手机设置为匈牙利语时,Android 管理它的方式就好像它不是德语一样,因此该用户将获得英语(如果英语设置为默认值),即使该用户更喜欢使用德语作为语言。不是每个人都能流利地说或读英语:)
  • 哦,我没有意识到 Android 不允许您按优先顺序设置语言队列。看起来它应该有一个明显的功能。

标签: android kotlin


【解决方案1】:

没关系,找到问题了:

val langSelectorBuilder = AlertDialog.Builder(this)
            langSelectorBuilder.setTitle(R.string.selectLanguageText)
            langSelectorBuilder.setCancelable(false)
            langSelectorBuilder.setSingleChoiceItems(languages, -1) { dialog, selection ->
                when(selection) {
                    0 -> {
                        localeToSet = "de"
                        setLocale("de")
                    }
                    1 -> {
                        localeToSet = "en"
                        setLocale("en")
                    }
                }
                    recreate()
                    dialog.dismiss()
            }.setOnDismissListener {

                    finish()
            }
            langSelectorBuilder.create().show()

无需在此处启动 MainActivity,它就可以正常工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多