Для работы на всех APIS Используйте этот код в Activity
override fun attachBaseContext(base: Context) {
super.attachBaseContext(LocaleHelper.updateBaseContextLocale(base))
}
и
object LocaleHelper {
fun updateBaseContextLocale(baseContext: Context): Context {
val localeManager = LocaleManagerImpl(SharedPrefsStorage(baseContext))
val locale = localeManager.locale
Locale.setDefault(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResourcesLocale(baseContext, locale)
} else {
return updateResourcesLocaleLegacy(baseContext, locale)
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun updateResourcesLocale(context: Context, locale: Locale): Context {
val configuration = context.resources.configuration
configuration.setLocale(locale)
return context.createConfigurationContext(configuration)
}
private fun updateResourcesLocaleLegacy(context: Context, locale: Locale): Context {
val resources = context.resources
val configuration = resources.configuration
configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics)
return context
}
fun updateApplicationContextLocale(applicationContext: Context,
localeConfiguration: Configuration,
locale: Locale) {
applicationContext.resources.updateConfiguration(localeConfiguration,
applicationContext.resources.displayMetrics)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
applicationContext.createConfigurationContext(localeConfiguration)
} else {
Locale.setDefault(locale)
val config = applicationContext.resources.configuration
config.locale = locale
applicationContext.resources.updateConfiguration(config,
applicationContext.resources.displayMetrics)
}
}
fun getCurrentLocale(resources: Resources): Locale {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
resources.configuration.locales[0]
} else {
resources.configuration.locale
}
}
}
Кроме того, когда вы хотите изменить его во время выполнения, просто используйте функцию create () в Activity
.
Это единственный способ, с помощью которого я понял, изменив локаль на все API и все ресурсы. Вы не избежите использования устаревшего кода, если захотите заставить его работать.