Чтобы изменить локаль, я использую метод создания нового контекста и передачи его в #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)
}