Как указано в комментариях, изменение языка зависит от уровня API, который вы поддерживаете. Вот как мы это делаем в моей компании, которая поддерживает также начиная с API 23.
Мы делаем это, оборачивая контекст единственного действия, которое мы имеем. Здесь я перехожу на французский, но вам нужно решить, какой язык использовать. Я думаю, что эта часть зависит от вашего варианта использования, поэтому я опущу это из этого ответа. Каждый раз, когда вы хотите изменить язык, вам нужно воссоздать игру. Это легко сделать, получив экземпляр действия и выполнив на нем recreate()
.
class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(newBase.wrap(Locale.FRENCH))
}
}
Метод, который оборачивает контекст, представляет собой функцию расширения, написанную как:
fun Context.wrap(desiredLocale: Locale): Context {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
return getUpdatedContextApi23(desiredLocale)
return if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N)
getUpdatedContextApi24(desiredLocale)
else
getUpdatedContextApi25(desiredLocale)
}
А вот каждый из методов, которые обновляют локаль в зависимости от версии:
@TargetApi(Build.VERSION_CODES.M)
private fun Context.getUpdatedContextApi23(locale: Locale): Context {
val configuration = resources.configuration
configuration.locale = locale
return createConfigurationContext(configuration)
}
private fun Context.getUpdatedContextApi24(locale: Locale): Context {
val configuration = resources.configuration
configuration.setLocale(locale)
return createConfigurationContext(configuration)
}
@TargetApi(Build.VERSION_CODES.N_MR1)
private fun Context.getUpdatedContextApi25(locale: Locale): Context {
val localeList = LocaleList(locale)
val configuration = resources.configuration
configuration.locales = localeList
return createConfigurationContext(configuration)
}