如何使用非翻译字符串在Android Studio上签名APK?

时间:2014-12-14 18:00:53

标签: android android-studio apk translation

背景

我最近已将my app迁移到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 个答案:

答案 0 :(得分:114)

解决问题的最简洁方法是仅对发布版本禁用Lint缺失翻译检查。

为此,请将“禁用'MissingTranslation'”添加到build.gradle文件中,如下所示:

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

答案 1 :(得分: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警告会将工作室视为错误,我实际上并不知道原因,但就翻译而言,我认为这是一种“停止"您发布的应用程序由于最后一分钟添加了一些文本而导致翻译不完整。

使用lintOptions checkReleaseBuilds abortOnError设置Lint检查不要为发布版本运行,如果"错误"也不会停止。找到了。下面我将解释可以找到Lint错误设置的位置,因此如果您想要更进一步,可以向前迈出一步,逐一阅读。其中一些提供了有用的代码优化指示。

  

我如何解决此问题,以便Lint会向我显示警告?   或确认对话框,如果我确定要这样做?

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

该选项位于Settings> Inspections> Android Lint。为了便于查找打开的设置,在搜索(位于顶部)键入Lint translation,您可以更改左侧显示的翻译选项,从错误到警告。

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

答案 2 :(得分: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
      }
  }
  ...

OR 您也可以添加:

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

答案 3 :(得分:1)

您可以尝试打开"翻译编辑器"并设置字符串" ..." as"不可亵渎"。 您还必须删除此字符串的所有翻译。

答案 4 :(得分:0)

FWIW:如果您不打算支持其他语言,则根本不需要禁用lint检查。有时您的项目设置(或您正在导入的库)可能意外地 - 或有意地 - 包含一个配置以支持其他语言,例如通过声明该语言的values-文件夹:

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

对我来说就是这种情况所以我只是删除了该文件夹。但是如果您无法控制违规库,那么可以选择禁用lint abortOnError(如接受的答案中所示),或者找到一种方法以某种方式排除“库导入的”文件夹。对于后一种选择,您可以启动here

答案 5 :(得分:0)

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

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

它是您的字符串文件中工具名称空间的ignore属性,如下所示:

<?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'
    }
}

答案 6 :(得分:0)

工作

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