@player1ykt

При перезагрузке приложения путаются locale, в чем проблема?

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

createAndLoadRewardedAd

fun createAndLoadRewardedAd() {
    rewardedAd = RewardedAd(this, getString(R.string.ad_test))
    val adLoadCallback = object: RewardedAdLoadCallback() {
        override fun onRewardedAdLoaded() {
            adLoaded = "YES"
            findViewById<Button>(R.id.hint_open).setTextColor(getColor(R.color.white))
        }
        override fun onRewardedAdFailedToLoad(adError: LoadAdError) {
            // Ad failed to load.
        }
    }
    rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
}


Как этот блок относящийся к рекламе, сломал смену языка, без понятия. И еще заметил что локали после перезагрузки меняются на тот язык который стоит системным. Если язык системы - русский, то при выборе английского, некоторые textView будут менять язык на русский и наоборот. И этого бага нету на 6-ом андроиде, а с 7 по 10 - есть.

Чтобы менять язык я использую Lingver библиотеку. Вот весь код, который относится к смене языка.

applyEngLang function в MainActivity.kt (применяет язык, и перезагружает активити)

private fun applyEngLang() {
    findViewById<DrawerLayout>(R.id.drawer_layout).closeDrawer(GravityCompat.START)
    Thread.sleep(200)
    PreferenceManager.getDefaultSharedPreferences(this).edit().putString("LANG", "ENG").apply()
    LocaleHelper.setNewLocale(this@MainActivity, LANGUAGE_ENGLISH, LANGUAGE_ENGLISH_COUNTRY)
    recreate()
    Handler().postDelayed({
        PreferenceManager.getDefaultSharedPreferences(this).apply {
            val musicStatus = getString("MUSIC", "ON")
            if (musicStatus == "ON") {
                musicService?.musicControl("resume")
                musicDisabler = "OFF"
            }
        }
    }, 10)
}


LocaleHelper.kt

class LocaleHelper {
    companion object {

        fun langChanger(context: Context) {
            PreferenceManager.getDefaultSharedPreferences(context).apply {
                var currentLang = getString("LANG", "DEFAULT")
                val systemLang = Locale.getDefault().language.toString()
                if (currentLang == "DEFAULT") {
                    if (systemLang == "ru") {
                        setNewLocale(context, LANGUAGE_RUSSIAN, LANGUAGE_RUSSIAN_COUNTRY)
                        edit().putString("LANG", "RUS").apply()
                    } else if (systemLang == "be") {
                        setNewLocale(context, LANGUAGE_RUSSIAN, LANGUAGE_RUSSIAN_COUNTRY)
                        edit().putString("LANG", "RUS").apply()
                    } else if (systemLang == "kk") {
                        setNewLocale(context, LANGUAGE_RUSSIAN, LANGUAGE_RUSSIAN_COUNTRY)
                        edit().putString("LANG", "RUS").apply()
                    } else if (systemLang == "uk") {
                        setNewLocale(context, LANGUAGE_RUSSIAN, LANGUAGE_RUSSIAN_COUNTRY)
                        edit().putString("LANG", "RUS").apply()
                    } else if (systemLang == "en") {
                        setNewLocale(context, LANGUAGE_ENGLISH, LANGUAGE_ENGLISH_COUNTRY)
                        edit().putString("LANG", "ENG").apply()
                    } else {
                        setNewLocale(context, LANGUAGE_ENGLISH, LANGUAGE_ENGLISH_COUNTRY)
                        edit().putString("LANG", "ENG").apply()
                    }
                } else if (currentLang == "RUS") {
                    setNewLocale(context, LANGUAGE_RUSSIAN, LANGUAGE_RUSSIAN_COUNTRY)
                } else if (currentLang == "ENG") {
                    setNewLocale(context, LANGUAGE_ENGLISH, LANGUAGE_ENGLISH_COUNTRY)
                }
            }
        }

        fun setNewLocale(context: Context, language: String, country: String) {
            Lingver.getInstance().setLocale(context, language, country)
        }

    }
}


MainApplication.kt

class MainApplication: Application() {

    @Suppress("UNUSED_VARIABLE")
    override fun onCreate() {
        super.onCreate()
        val getSystemLang = Locale.getDefault().language.toString()
        var systemLang = Locale(LANGUAGE_ENGLISH)

        if (getSystemLang == "ru" || getSystemLang == "ru_RU" || getSystemLang == "ru_KG" || getSystemLang == "ru_KZ" || getSystemLang == "ru_BY" || getSystemLang == "ru_UA" || getSystemLang == "sah_RU" ) { systemLang = Locale(LANGUAGE_RUSSIAN) }
        else if (getSystemLang == "be" || getSystemLang == "be_BY") { systemLang = Locale(LANGUAGE_RUSSIAN) }
        else if (getSystemLang == "kk" || getSystemLang == "kk_KZ") { systemLang = Locale(LANGUAGE_RUSSIAN) }
        else if (getSystemLang == "uk" || getSystemLang == "uk_UA") { systemLang = Locale(LANGUAGE_RUSSIAN) }
        else if (getSystemLang == "en") { systemLang = Locale(LANGUAGE_ENGLISH) }
        else { systemLang = Locale(LANGUAGE_ENGLISH) }

        val lingver = Lingver.init(this, systemLang)
    }

    companion object {
        const val LANGUAGE_ENGLISH = "en"
        const val LANGUAGE_ENGLISH_COUNTRY = "US"
        const val LANGUAGE_RUSSIAN = "ru"
        const val LANGUAGE_RUSSIAN_COUNTRY = "RU"
    }
}
  • Вопрос задан
  • 12 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы