如何在Android Studio上签署APK,即使存在未翻译的字符串?

52

背景

最近我已将我的应用迁移到了Android Studio。虽然在迁移过程中遇到了一些问题,但最终还是成功解决了。

问题

但不知何故,在使用Android Studio签署APK时,我遇到了很多类似这样的错误:

Error:(16) Error: "..." is not translated in "de" (German), "el" (Greek), "iw" (Hebrew) [MissingTranslation]

(其中“...”是一个字符串)

在底部,在发生许多这种错误后,我看到了这个:

Error:Execution failed for task ':app:lintVitalRelease'.
> Lint found fatal errors while assembling a release target.
To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}
...

问题

我不确定哪里出了问题,也不知道该如何解决。在Eclipse上我很容易就解决了这个问题。缺少翻译似乎不应该阻止我签署APK...

对我来说,似乎是Lint阻止了APK的导出,原因是我没有翻译所有的字符串。这是真的吗?

有人能帮帮我吗?我该如何解决这个问题,让Lint只显示警告信息呢?或者如果我确定要这样做,会出现确认对话框吗?

7个回答

114

解决该问题最干净的方法是仅在发布版本中禁用缺失翻译的 Lint 检查。

要这样做,请按照以下示例将 "disable 'MissingTranslation'" 添加到您的 build.gradle 文件中:

android {
    buildTypes {
        release {
            lintOptions {
                disable 'MissingTranslation'
            }
        }
    }
}

希望有更好的解决方案。必须有一个选项来保留未翻译的字符串。 - Rahul Rastogi
@RahulRastogi 更好的“解决方案”需要 Android 平台支持“语言中立”的字符串。目前,我在项目中有一个名为“strings-international.xml”的文件,其中包含这些字符串。但是我无法告诉 Android 这个文件包含不应翻译的字符串。 - yvolk
@yvolk 您的观点很有道理!我创建了一个keys.xml文件来保存像Facebook和Google的API密钥这样的字符串。 - Rahul Rastogi
@RahulRastogi 看起来有一种方法可以告诉 Android 不应该翻译整个文件:“如果您有许多不应该被翻译的资源,您可以将它们放在名为 donottranslate.xml 的文件中,lint 将把它们全部视为不可翻译的资源”(来源:http://tools.android.com/recent/non-translatablestrings)。 - yvolk
@yvolk 是的!我会在空闲时间尝试使用构建系统(gradle)和 Lint 来实现这样的功能。 - Rahul Rastogi

30
在我看来,Lint似乎阻止了APK的导出,原因是我没有翻译所有的字符串。这是真的吗?
是的。默认选项是lintOptions.abortOnError = true 有人能帮帮我吗?
你应该打开位于主项目模块的build.gradle文件,或者如果你没有模块,则打开通用文件夹。然后添加建议的行:
android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}

一些 Lint 警告默认情况下会被转换为 Studio 中的错误,我其实不知道为什么,但在翻译方面,我想这是一种“停止”你发布应用程序的方式,因为翻译由于最后一分钟添加了一些文本而不完整。

使用 lintOptions checkReleaseBuilds abortOnError,您可以设置 Lint 的检查不运行于发布版本,并且如果发现“错误”,也不会停止。下面我将解释 Lint 错误设置的位置,所以如果您想进一步了解,可以一步一步地阅读它们。其中一些提供了有关代码优化的有用说明。

我该如何修复这个问题,以便 Lint 只显示警告? 或者如果我确定要这样做,是否有确认对话框?

Android Studio 设置中还有一个选项,可以将任何 Lint 错误更改为 Lint 警告,但我从未测试过。我通常会转向 gradle 解决方案。

该选项位于设置 > 检查 > Android Lint。为了方便查找,打开设置并在搜索框(位于顶部)中键入Lint translation,然后您可以将翻译选项从错误更改为警告,出现在左侧。

如果您的错误字符串永远不会被翻译,另一个选择是在XML字符串文件中添加tools:ignore="MissingTranslation",可以在根项目或每个不可翻译的字符串中添加。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - android developer
他的意思是你模块的 build.gradle 文件。 - Emmanuel
1
@madlymad,所以我只需要将“Android Lint”列表(在“设置”->“检查”内部)中的“不完整翻译”设置为“警告”,对吗? - android developer
仅仅将“Android Lint”列表(在“设置”->“检查”内)中的“不完整翻译”设置为“警告”并不能解决这个问题,必须采用abortOnError。 - Henrique de Sousa
同时,tools:ignore="MissingTranslation" 工具也没有起作用,我尝试了 <?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/apk/res/android" tools:ignore="MissingTranslation"> - Henrique de Sousa
显示剩余3条评论

5

解决此错误的简单方法

只需在您的build.gradle文件中添加以下代码即可实现"禁用'MissingTranslation'",如下所示:

...
  android {
      lintOptions {
          checkReleaseBuilds false
          // Or, if you prefer, you can continue to check for errors in release builds,
          // but continue the build even when errors are found:
          abortOnError false
      }
  }
  ...

或者,您也可以添加以下内容:

android {
        buildTypes {
            release {
                lintOptions {
                    disable 'MissingTranslation'
                }
            }
        }
    }

1
你可以尝试打开“翻译编辑器”,将字符串“…”设置为“不可翻译”。 同时,你还需要移除该字符串的所有翻译。

所报告的字符串不属于应用程序,而是支持库的一部分。我无法编辑它们。 - android developer

0

工作中

             buildTypes {
                        release {
                            lintOptions {
                                checkReleaseBuilds false
                                abortOnError false
                            }
                            minifyEnabled false
                            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                        }
                    }

0

顺便说一下:如果您不打算支持其他语言,则根本不需要禁用lint检查。有时,您的项目设置(或导入的库)可能会意外地或故意地包含一个配置来支持其他语言,例如通过声明类似于以下内容的值文件夹:

<your project source folder>/main/res/values-ar

这就是我的情况,所以我只需删除该文件夹即可。但是,如果您无法控制有问题的库,则可以选择禁用lint abortOnError,如接受的答案中所示,或找到一种方法来排除“导入的库”文件夹。对于后一种选项,您可以从此处开始。


0

有很多解决方案,但我尝试了

<string name="hello" translatable="false">hello</string>

这是您字符串文件中工具命名空间的忽略属性,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources
  xmlns:tools="http://schemas.android.com/tools"
  tools:ignore="MissingTranslation" >

  <!-- your strings here; no need now for the translatable attribute -->

</resources>

并且来自Gradle

 release {
            lintOptions {
                disable 'MissingTranslation'
            }
        }

并且

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}

tools:ignore="MissingTranslation" 仍然会将其放入翻译编辑器中,因此在那里放置 translatable="false" 仍然是一个好的选择... - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接