Android: Как динамически изменить языковой стандарт для ресурсов уровня приложения? - PullRequest
0 голосов
/ 21 января 2020

Чтобы изменить локаль, я использую метод создания нового контекста и передачи его в #super.attachBaseContext.

Это прекрасно работает для Активностей, так как в моем случае использования оно применимо к начальным операциям до запуска основного рабочего процесса, поэтому я могу обойтись без простого вызова #Activity.recreate(), и attachBaseContext будет позвонил снова.

Однако это не относится к классу приложения, и Я использую контекст приложения для загрузки ресурсов, в которых недоступен контекст, таких как модели представления, репозитории и вспомогательные классы.

Таким образом, языковые стандарты не обновляются при доступе с использованием контекста приложения, поскольку я нигде не сообщаю классу приложения, что ресурсы изменились. #Application.attachBaseContext может быть вызван только один раз, и я не смог найти способ воссоздать класс приложения, и это будет плохой пользовательский опыт.

Так что есть способ перезагрузить ресурсы уровня приложения динамически? Есть ли способ воссоздать класс приложения?

Как мы можем динамически изменять локаль на ресурсах уровня приложения?

override fun attachBaseContext(newBase: Context?) {
    newBase?.let {
        val langCode : String = LocaleHelper().getCurrentLocale().code
        toast("attachBaseContext")
        val context : Context = changeLang(it, langCode)
        super.attachBaseContext(context)
    } ?: run {
        super.attachBaseContext(newBase)
    }
}

private fun changeLang(newContext: Context, langCode: String): ContextWrapper {
    var context = newContext
    val sysLocale: Locale

    val rs = context.resources
    val config = rs.configuration

    if (langCode != "") {
        val locale = Locale(langCode)
        Locale.setDefault(locale)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(locale)
        } else {
            config.locale = locale
        }
        context = context.createConfigurationContext(config)
    }

    return ContextWrapper(context)
}

1 Ответ

0 голосов
/ 21 января 2020

Я много искал ту же топику c, заканчивающуюся использованием Android -Локализация , так как Android локализация основана на языке устройства по умолчанию

Примечание: вы можете сталкиваются с проблемами на android 6.0 и ниже, используя Android -Локализационную библиотеку, так что протестируйте ее хорошо!

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