(Kotlin) Изменение локали не работает с androidx.appcombat на android 6 (API 23) и 7 (API 24) - PullRequest
0 голосов
/ 10 апреля 2020

После прочтения этого и этого я все еще не смог заставить изменить язык для работы с API 23 и API 24.

ApplyOverrideConfiguration тоже не помогло.

applyOverrideConfiguration

override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
    if (overrideConfiguration != null) {
        val uiMode = overrideConfiguration.uiMode
        overrideConfiguration.setTo(baseContext.resources.configuration)
        overrideConfiguration.uiMode = uiMode
    }
    super.applyOverrideConfiguration(overrideConfiguration)
}

Это очень странно работает на Android 6, после переустановки изменение языка может работать или может не работать , И не во всех видах деятельности. И на Android 7 все работает, но вам нужно перезапустить приложение, чтобы применялся язык

Вот мой код. langChanger находится перед setContentView, чтобы определить язык системы при первом запуске и установить язык приложения на основании этого. И при следующих запусках примените язык, который был сохранен в SharPref.

private fun langChanger() {
    PreferenceManager.getDefaultSharedPreferences(this).apply {
        var currentLang = getString("LANG", "DEFAULT")
        val systemLang = Locale.getDefault().language.toString()
        if (currentLang == "DEFAULT") {
            if (systemLang == "ru") {
                setAppLocale("ru")
                PreferenceManager.getDefaultSharedPreferences(this@MainActivity).edit().putString("LANG", "RUS").apply()
            } else if (systemLang == "be") {
                setAppLocale("ru")
                PreferenceManager.getDefaultSharedPreferences(this@MainActivity).edit().putString("LANG", "RUS").apply()
            } else if (systemLang == "kk") {
                setAppLocale("ru")
                PreferenceManager.getDefaultSharedPreferences(this@MainActivity).edit().putString("LANG", "RUS").apply()
            } else if (systemLang == "uk") {
                setAppLocale("ru")
                PreferenceManager.getDefaultSharedPreferences(this@MainActivity).edit().putString("LANG", "RUS").apply()
            } else if (systemLang == "en") {
                setAppLocale("en")
                PreferenceManager.getDefaultSharedPreferences(this@MainActivity).edit().putString("LANG", "ENG").apply()
            } else {
                setAppLocale("en")
                PreferenceManager.getDefaultSharedPreferences(this@MainActivity).edit().putString("LANG", "ENG").apply()
            }
        } else if (currentLang == "RUS") {
            setAppLocale("ru")
        } else if (currentLang == "ENG") {
            setAppLocale("en")
        }
    }
}

private fun setAppLocale(localeCode: String) {
    val dm: DisplayMetrics = resources.displayMetrics
    val conf: Configuration = resources.configuration
    val locale = Locale(localeCode.toLowerCase())
    setDefault(locale)
    if (Build.VERSION.SDK_INT >= 26) {
        conf.setLocale(locale)
        baseContext.resources.updateConfiguration(conf, dm)
    } else {
        conf.locale = locale
        baseContext.applicationContext.createConfigurationContext(conf)
    }
}
...