Android - Программное переключение языка в релизной сборке

Рейтинг: 1Ответов: 1Опубликовано: 06.03.2023

Сделал переключалку языка

На эмуляторе и по шнурку работает хорошо. Но когда делаю release сборку AAB для стора, то переключение не работает. При том что в логах все как нужно...

App : Application() {
    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(LocaleManager.setLocale(base))
    }
}

open class BaseActivity : AppCompatActivity() {

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(LocaleManager.setLocale(base))
    }

    fun changeLocal(language: Language) {
        LocaleManager.setNewLocale(this, language)
    }
}

object LocaleManager {

    private const val localePrefKey = "localePrefKey"

    fun setLocale(context: Context) : Context {
        return setNewLocale(context, getLanguage())
    }

    fun setNewLocale(context: Context, language: Language) : Context {
        Preferences.putString(localePrefKey, language.code)

        return updateResources(context, language.code)
    }

    fun getLanguage(): Language {
        val pref = Preferences.getString(localePrefKey, "")

        return Language.values().find {
            it.code == if(pref == "") Locale.getDefault().language else pref
        } ?: Language.EN
    }

    private fun updateResources(context: Context, language: String) : Context {

        val locale = Locale(language)
        Locale.setDefault(locale)

        return context.createConfigurationContext(
            Configuration(context.resources.configuration).apply {
                setLocale(locale)
            }
        )
    }

}

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

Ответы

▲ 1Принят

Спасибо комментаторам, нашел решение. Добавляем в gradle следующий блок, и все.

android {
    bundle {
        language {
            enableSplit = false
        }
    }
}

С AAB собирается APK только с теми ресурсами, что требуются скачивающему устройству. Таким образом мы просим положить все строковые ресурсы, а не обрезать их.