运行时应用程序本地化不适用于应用程序捆绑包

时间:2018-12-13 08:21:44

标签: android

对于不同的语言,我有不同的字符串值。 在运行时,用户可以选择另一种语言。 minSdkVersion 21

我正在使用这些方法更新语言环境

public static Context setNewLocale(Context c, String language) {
    persistLanguage(c, language); // persists new language in shared prefs
    return updateResources(c, language);
}

private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language, language + "_" + language.toUpperCase());
    Locale.setDefault(locale);
    Resources res = context.getResources();
    Configuration config = res.getConfiguration();
    config.setLocale(locale);
    context = context.createConfigurationContext(config);
    return context;
}

在我覆盖了 attachBaseContext 的地方有一个BaseActivity,每个活动都对其进行扩展。

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleManager.setLocale(base));
}

并且在BaseApplication中也已覆盖

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleManager.setLocale(base)); //updates resources
    MultiDex.install(getBaseContext());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleManager.setLocale(this); //updates resources
}

用户选择新语言后,我将重新创建活动。 当我从商店下载发行版本时,尽管所有这些在调试时都可以正常工作,但该应用程序仅使用默认语言。改变语言无济于事。

1 个答案:

答案 0 :(得分:0)

首先,问题不在于代码,而在于Android如何通过新应用捆绑包处理资源。以前使用APK来下载所有资源。现在,它仅下载手机可以使用的资源。如果您只使用首选语言的英语,则除非您另有说明,否则它将不会下载其他语言

bundle {
    language {
        // Specifies that the app bundle should not support
        // configuration APKs for language resources. These
        // resources are instead packaged with each base and
        // dynamic feature APK.
        enableSplit = false
    }
    density {
        // This property is set to true by default.
        enableSplit = true
    }
    abi {
        // This property is set to true by default.
        enableSplit = true
    }
}