Локализация иногда сбрасывается на системную локаль - PullRequest
0 голосов
/ 31 марта 2020

У меня есть одно приложение активности, языковые настройки в основном работают как задумано. Я устанавливаю тексты каждого вида в onCreateView() по идентификатору ресурса текста. Но иногда, когда я вхожу в свое приложение, язык является системным по умолчанию вместо выбранного языка. То же самое происходит, когда я перехожу к приложению по глубокой ссылке (виджет или уведомление). И когда я перехожу к другому фрагменту и возвращаюсь, все становится правильным с правильным языком.

Я попытался отладить свое приложение, чтобы обнаружить причина. Каждый текст по идентификатору ресурса, который я получил в соответствии с системой по умолчанию, а не выбранный язык. Когда я вместо этого оборачиваю свой фрагментный контекст и затем извлекаю текст, я получаю основной результат.

Вот как я устанавливаю свой язык:

private fun changeLang(lang: String, country: String) {
        activity?.let {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                updateResources(it, lang, country)
            }
            updateResourcesLegacy(it, lang, country)
        }
    }

    @TargetApi(Build.VERSION_CODES.N)
    private fun updateResources(context: Context, language: String, country: String) {
        val locale = Locale(language, country)
        Locale.setDefault(locale)
        val resources: Resources = context.resources
        val configuration: Configuration = resources.configuration
        configuration.setLocale(locale)
        context.createConfigurationContext(configuration)
    }

    private fun updateResourcesLegacy(context: Context, language: String, country: String) {
        val locale = Locale(language, country)
        Locale.setDefault(locale)
        val resources: Resources = context.resources
        val configuration: Configuration = resources.configuration
        configuration.locale = locale
        resources.updateConfiguration(configuration, resources.displayMetrics)
    }

В своей деятельности я отверг следующий метод :

override fun attachBaseContext(newBase: Context?) {
        newBase?.let {
            val pref = Preference(PreferenceHelper.customPrefs(it))
            super.attachBaseContext(ContextWrapper.wrap(newBase, pref.language, pref.country))
        }
    }
class ContextWrapper(base: Context?) : android.content.ContextWrapper(base) {
    companion object {

        fun wrap(context: Context?, lang: String? = "uz", country: String? = ""): ContextWrapper =
            wrap(context, Locale(lang, country))

        fun wrap(context: Context?, newLocale: Locale): ContextWrapper {
            var localizedContext = context

            val res = localizedContext?.resources
            val configuration = res?.configuration

            when {
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
                    configuration?.setLocale(newLocale)

                    val localeList = LocaleList(newLocale)
                    LocaleList.setDefault(localeList)
                    configuration?.setLocales(localeList)

                    localizedContext = localizedContext?.createConfigurationContext(configuration!!)

                }

                else -> {
                    configuration?.setLocale(newLocale)
                    localizedContext = localizedContext?.createConfigurationContext(configuration!!)
                }
            }

            res?.updateConfiguration(configuration, res.displayMetrics)

            return ContextWrapper(localizedContext)
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Причина не в том, чтобы установить язык для контекста приложения. Ресурсы приложения не обновлялись. Я применил локаль к методу attachBaseContext моего класса приложений.

0 голосов
/ 31 марта 2020

Попробуйте написать оба одновременно:

    configuration.setLocale(locale)
    configuration.locale = locale

попробуйте это в ContextWrapper классе и updateResources функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...