具有应用内语言环境更改的Android App Bundle

时间:2018-10-10 02:17:19

标签: android locale android-app-bundle

当我需要从应用程序内部更改应用程序语言环境时(即在应用程序内部进行语言更改设置),我遇到了AAB问题,问题是AAB仅为我提供了设备语言资源,例如例如:

我的设备中安装了英语和法语,因此Aab仅向我提供英语和法语的资源,

但是在应用程序内部,可以选择在英语,法语和印尼语之间切换语言

在那种情况下,当将语言更改为英语或法语时,一切运行正常,但是当将其更改为印度尼西亚语时,该应用程序只是进入崩溃循环,因为它一直在寻找印度尼西亚语,但找不到。

>

这里的问题是,即使我重新启动了该应用程序,由于该应用程序仍在寻找缺少的语言资源,它也会再次进入崩溃循环,并且这里唯一的解决方案是清除现金或重新安装这些解决方案,普通用户不会通过。


只需提一下,这就是我通过应用程序更改语言环境的方式:

    // get resources
    Resources res = context.getResources();
    // create the corresponding locale
    Locale locale = new Locale(language); // for example "en"
    // Change locale settings in the app.
    android.content.res.Configuration conf = res.getConfiguration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        conf.setLocale(locale);
        conf.setLayoutDirection(locale);
    } else {
        conf.locale = locale;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        context.getApplicationContext().createConfigurationContext(conf);
    }
    res.updateConfiguration(conf, null);

P.S。将该应用程序构建为APK时,可以完美运行。

3 个答案:

答案 0 :(得分:16)

编辑:

PlayCore API 现在支持按需下载另一种语言的字符串: https://developer.android.com/guide/app-bundle/playcore#lang_resources

替代解决方案(不利):

您可以通过在build.gradle中添加以下配置来禁用按语言拆分

android {
    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
        }
    }
}

后一种解决方案将增加应用程序的大小。

答案 1 :(得分:3)

这对于应用程序捆绑包是不可能的:只有在设备的所选语言发生更改时,Google Play才会下载资源。

如果要使用应用内语言选择器,则必须使用APK。

答案 2 :(得分:1)

可以在此处找到按需下载语言的详细信息

https://android-developers.googleblog.com/2019/03/the-latest-android-app-bundle-updates.html

在您应用的 build.gradle 文件中:

dependencies {
    // This dependency is downloaded from the Google’s Maven repository.
    // So, make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.play:core:1.10.0'

    // For Kotlin users also add the Kotlin extensions library for Play Core:
    implementation 'com.google.android.play:core-ktx:1.8.1'
    ...
}

获取已安装语言的列表

val splitInstallManager = SplitInstallManagerFactory.create(context)
val langs: Set<String> = splitInstallManager.installedLanguages

请求其他语言

val installRequestBuilder = SplitInstallRequest.newBuilder()
installRequestBuilder.addLanguage(Locale.forLanguageTag("pl"))
splitInstallManager.startInstall(installRequestBuilder.build())

查看上面的链接以了解详细信息