即使在API Level 25+的基本上下文中实现了设置语言之后,也无法更改系统语言。

时间:2019-09-29 15:10:40

标签: android localization

因此,我正在为API级别为25以上的Android设备进行本地化。对于某些设备(一个是像素,另一个是三星,分别安装了Android Q和P),本地化根本不起作用。

我一直在关注本文https://proandroiddev.com/change-language-programmatically-at-runtime-on-android-5e6bc15c758,甚至在尝试了此处提到的所有内容之后,都没有进行本地化设置。我的attachBaseContext被调用,上下文被设置为新属性。但是,当我将调试器放入onCreate并尝试执行此操作时。getResources()。getConfiguration()。getLocales()则仅显示设备设置中的语言环境。

通过在android API 25+中的基本活动中添加以下几行,可以生成一个最小的可重现示例:-

fun wrap(context: Context, language: String?, theme: Int): ContextThemeWrapper {
        var context = context
        val config = context.resources.configuration
        if (language != null && language.isNotEmpty()) {
            val locale = Locale(language)
            Locale.setDefault(locale)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                setSystemLocale(config, locale)
            } else {
                setSystemLocaleLegacy(config, locale)
            }
            config.setLayoutDirection(locale)
            context = context.createConfigurationContext(config)
        }
        return ContextThemeWrapper(context, theme)
 }

@SuppressWarnings("deprecation")
fun setSystemLocaleLegacy(config: Configuration, locale: Locale) {
        config.locale = locale
}

@TargetApi(Build.VERSION_CODES.N)
fun setSystemLocale(config: Configuration, locale: Locale) {
        config.setLocale(locale)
}
@Override
public void attachBaseContext(Context newBase){
   super.attachBaseContext(wrap(newBase,"tr",R.style.AppTheme));
}

0 个答案:

没有答案