android-studio – 升级到Gradle 3.3后的MissingTranslation错误

自升级到Gradle 3.3后,由于缺少翻译错误,我无法构建代码:

Error: xxx is not translated in “af” (Afrikaans), “am” (Amharic), “ar” (Arabic), “az” (Azerbaijani), “az-AZ” (Azerbaijani: Azerbaijan), “be” (Belarusian), “bg” (Bulgarian), “ca” (Catalan), […], “zh-TW” (Chinese: Taiwan), “zu” (Zulu) [MissingTranslation]

大多数报告的语言都是由我的项目中包含的第三方模块支持的语言,现在它似乎定义了整个项目支持的语言,给出了所有未翻译成上述语言的字符串的错误.在升级到Gradle 3.3之前,这没有造成任何问题.

我考虑了以下解决方案:

>从其他模块中删除多余的翻译.我想避免这种情况,因为那些模块是外部的并且不必要地改变它们会真正损害我的项目的可维护性.
>禁用“不完整翻译”Lint检查 – 关于SO的类似问题的最常见建议.这是次优的,因为我想知道我的代码中缺少的翻译(到目前为止工作).除此之外,禁用检查不会消除错误.
>按照this answer中的描述在build.gradle中定义支持的配置.我喜欢这个选项(指定语言而不是依赖于模块中可用的翻译),但它也做了一些奇怪的事情:我正在丢失 – 字符串的翻译错误标记为可翻译=假.

目前,我正在降级到之前的Gradle版本.但是修复这些构建错误的最佳方法是什么?

最佳答案 我希望几个月前我发布这个问题后可能会有更正,我检查了情况.

似乎问题是Gradle插件2.3.0引入的,而不是我在问题中建议的Gradle 3.3本身.降级插件避免了错误,但很难成为长期解决方案.

我发现问题中的选项3是处理它的最佳方法:将其添加到应用程序的build.gradle:

android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}

这在Googles documentation中描述,如上所述,也在this answer中描述.它删除所有不必要的资源 – 以及警告/错误以及它们.

引用文档:

The Gradle resource shrinker removes only resources that are not referenced by your app code, which means it will not remove alternative resources for different device configurations. If necessary, you can use the Android Gradle plugin’s resConfigs property to remove alternative resource files that your app does not need.

For example, if you are using a library that includes language
resources (such as AppCompat or Google Play Services), then your APK
includes all translated language strings for the messages in those
libraries whether the rest of your app is translated to the same
languages or not. If you’d like to keep only the languages that your
app officially supports, you can specify those languages using the
resConfig property. Any resources for languages not specified are
removed.

我得到的“误报”(缺少不可翻译字符串的翻译错误)是针对在多个模块中定义的字符串.重命名字符串或为它们提供翻译解决了这个问题.这也似乎是Gradle插件2.3.0引入的.

点赞