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

Posted

技术标签:

【中文标题】即使使用未翻译的字符串,如何在 Android Studio 上签署 APK?【英文标题】:How to sign APK on Android Studio even with non-translated strings? 【发布时间】: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 只会向我显示警告?还是确认对话框(如果我确定要这样做)?

【问题讨论】:

【参考方案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'
                        
                    

【讨论】:

以上是关于即使使用未翻译的字符串,如何在 Android Studio 上签署 APK?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复未安装的颤振医生错误android studio和IntelliJ IDEA,即使我已经安装了它

为啥我会收到“服务未注册”异常,即使我没有在 Android - Java/Kotlin 中使用任何服务?

如何使用 FUSED LOCATION API 优化电池 - Android

即使在 if (process) 块中使用,也未定义未捕获的进程? [复制]

Android Studio:未捕获的翻译错误,ExceptionWithContext

Android Lint:如何忽略故意仅覆盖某些默认翻译的区域语言环境字符串文件中缺少的翻译警告?