【问题标题】:How to sign APK on Android Studio even with non-translated strings?即使使用未翻译的字符串,如何在 Android Studio 上签署 APK?
【发布时间】:2015-02-12 20:30:46
【问题描述】:

背景

我最近将 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 只会向我显示警告?还是确认对话框(如果我确定要这样做)?

【问题讨论】:

    标签: android android-studio apk translation


    【解决方案1】:

    在我看来,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" 或者在根项或每个不可翻译的字符串中。

    【讨论】:

    • 您能告诉我在哪里可以更改 Lint 设置以使其保持警告状态吗?另外,你建议的修复究竟是做什么的?另外,我认为您的意思是不同的文件。 “gradle.build”不存在。出于某种原因,顺便说一句,消息窗口有时会消失。
    • 他的意思是你模块的build.gradle
    • @Emmanuel 是的,我试过了。有用。但是,我想知道后果是什么以及解决方案的真正作用。
    • 关于文件,这是一个错字,对不起。我认为我设法在我的回答中包含了与您的额外问题相关的所有信息。
    • @madlymad 所以我可以将“Android Lint”列表(在“设置”->“检查”内)中的“不完整翻译”设置为“警告”,对吧?
    【解决方案2】:

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

    为此,将“disable 'MissingTranslation'”添加到您的 build.gradle 文件中,如下所示:

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

    【讨论】:

    • 希望有更好的解决方案。必须有一个选项来保留未翻译的字符串。
    • @RahulRastogi 更好的“解决方案”需要 Android 平台支持“语言中立”字符串。目前,我的项目中有带有此类字符串的“strings-international.xml”文件。但我不能告诉 Android 该文件包含不应翻译的字符串。
    • @yvolk 同意你的观点!我制作了一个 keys.xml 来保存诸如 facebook 和 google 的 api 键之类的字符串。
    • @RahulRastogi 似乎有一种方法可以告诉Android不应该翻译整个文件:“如果你有很多不应该翻译的资源,你可以将它们放在一个名为 donottranslate.xml 的文件和 lint 将认为所有这些资源都是不可翻译的资源”(来自 tools.android.com/recent/non-translatablestrings )。
    • @yvolk 耶!我会在空闲时间尝试使用构建系统(gradle)和 Lint 来促进此类功能。
    【解决方案3】:

    解决此错误的简单方法

    只需添加以下代码即可将“disable 'MissingTranslation'”添加到您的 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
          }
      }
      ...
    

    或者你也可以添加这个:

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

    【讨论】:

      【解决方案4】:

      您可以尝试打开“翻译编辑器”并将字符串“...”设置为“Unstranlatable”。 您还必须删除此字符串的所有翻译。

      【讨论】:

      • 报告的字符串不是应用的。它属于支持库。我无法编辑它们。
      【解决方案5】:

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

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

      我就是这种情况,所以我只是删除了该文件夹。但是,如果您无法控制有问题的库,那么一个选择是禁用 lint abortOnError,如已接受的答案中所示,或者找到一种方法以某种方式排除“库导入”文件夹。对于后一个选项,您可以开始 here

      【讨论】:

        【解决方案6】:

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

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

        就是你的strings文件中tools命名空间的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'
            }
        }
        

        【讨论】:

        • tools:ignore="MissingTranslation" 仍然将它放在翻译编辑器中,所以 translatable="false" 仍然是一个好东西放在那里...
        【解决方案7】:

        工作

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

        【讨论】:

          猜你喜欢
          • 2016-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-21
          • 1970-01-01
          • 1970-01-01
          • 2015-09-04
          • 2014-05-13
          相关资源
          最近更新 更多