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

Posted

技术标签:

【中文标题】Android Lint:如何忽略故意仅覆盖某些默认翻译的区域语言环境字符串文件中缺少的翻译警告?【英文标题】:Android Lint: how to ignore missing translation warnings in a regional locale string file that purposely only overrides some default translations? 【发布时间】:2013-08-16 18:23:37 【问题描述】:

是否可以在一个单独的资源文件中翻译一些字符串,但不是全部,而不用 Lint 抱怨 MissingTranslation

例如:我的应用的字符串都在res/values/strings.xml中。其中一个字符串是

<string name="postal_code">Postal Code</string>

由于“邮政编码”在美国通常称为“邮政编码”,我想添加另一个资源 res/values-en-rUS/strings.xml,其内容为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="postal_code">Zip Code</string>
</resources>

但是,Lint 抱怨 values/strings.xml 中的其他字符串,但 values-en-rUS/strings.xml

中没有

我知道您可以通过在 values/strings.xml 中指定 tools:ignore 来抑制警告。但这是不可取的,因为 Lint 警告在翻译成另一种语言时实际上很有用。

相反,是否可以抑制 values-en-rUS/strings.xml 文件中的警告,例如告诉 Lint 在查找丢失的翻译时不要使用该文件作为标准?

【问题讨论】:

相关/几乎是骗子:Ignoring android Lint “MissingTranslation” check for partial translations 请将@blahdiblah 答案标记为已接受,因为它实际上是正确答案。 【参考方案1】:

如果您使用的是 Eclipse,请查看 Lint 警告视图的工具栏按钮。其中之一被称为“忽略文件”。这应该会有所帮助,但前提是 Lint 将错误分配给您的“US”文件。该按钮只是修改项目中的 lint.xml 文件,因此您可以轻松地进行调查(和撤消)。

有关该文件特定抑制的更多详细信息,请访问http://tools.android.com/tips/lint/suppressing-lint-warnings

【讨论】:

【参考方案2】:

我根据这个答案找到了更好的解决方案:https://***.com/a/13797364/190309

只需将ignore="MissingTranslation" 添加到您的string.xml,例如:

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

【讨论】:

OP 专门要求提供一种仅忽略 一些 缺失翻译的解决方案。此解决方案适用于给定文件中的所有内容。【参考方案3】:

Lint 支持部分区域翻译,但需要知道默认字符串是什么语言。这样一来,它就可以将部分区域翻译与不同语言环境中的缺失翻译区分开来。

values/strings.xml 中指定语言环境:

<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">

运行时引用 lint 命令行工具 lint --show

By default this detector allows regions of a language to just provide a
subset of the strings and fall back to the standard language strings. [...]

You can tell lint (and other tools) which language is the default language
in your res/values/ folder by specifying tools:locale="languageCode" for
the root <resources> element in your resource file. (The tools prefix
refers to the namespace declaration http://schemas.android.com/tools.)

来源:https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/TranslationDetector.java#88

将语言环境规范添加到您的默认语言文件中,en-rUS 不会出现该错误,但仍会收到任何其他缺失翻译的通知。

【讨论】:

您的回答有道理,但它不适用于我 - 我有一个默认字符串文件“values/strings.xml”,我将一些字符串转换为 en-rGB 我把它们放在“值-en-rUS/strings.xml" 文件 - 我将 tools:locale="en" 添加到 "values/strings.xml" 但仍然出现错误,某些字符串未转换为 "en" 我试试这个,它确实有效。如果您运行 lint 任务,在添加 tools:locale="en" 后,将不会出现 MissingTranslation 警告。但在 Android Studio 3.5.1 中,红线仍然存在。所以这可能是一个 Android Studio 错误。此答案应标记为正确答案 我已经为 Google 创建了一张票:issuetracker.google.com/issues/142590628 @michgauz 我看到你一直在谷歌的人那里做这个修复,即使他们不想这样做,对你很好,谢谢!【参考方案4】:

禁用 MissingTranslations 检查的好方法是在模块特定的build.gradle 文件中添加选项。

android 

    lintOptions
        disable 'MissingTranslation'
    

    //other build tags

如果字符串不存在于特定于语言环境的字符串文件中,它将从默认文件中获取字符串,通常为strings.xml

【讨论】:

请注意,这将禁用 all MissingTranslation 警告/错误,因此您不会因en-rUS 故意部分覆盖en 默认值而得到误报,但您也赢了当某些其他语言环境缺少翻译时,不会得到真正的肯定。 我确实发现您的回答很有用,但是,您可能有兴趣忽略不同级别的翻译(全部忽略,仅忽略给定文件中的字符串或仅忽略一个字符串)。看这里:***.com/a/53206467/973919【参考方案5】:

这似乎还没有回答,所以我给你一个解决方案:

在您的 DEFAULT xml 文件中,您可以定义不需要翻译的字符串,如下所示:

<string name="developer" translatable="false">Developer Name</string>

这个字符串不需要翻译,lint 也不会抱怨...

【讨论】:

这会将问题切换到有关在应该提供不同资源的语言环境中翻译不可翻译字符串的警告。【参考方案6】:

这是一个瑞士刀答案,因此您可以根据您的情况忽略缺少的翻译消息:

忽略所有MissingTranslation消息:

编辑您的build.gradle 文件:

android 
    lintOptions
        disable 'MissingTranslation'
    

忽略具体resources.xml 文件中的所有MissingTranslation 消息:

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

只忽略一个字符串的MissingTranslation消息:

<string name="developer" translatable="false">Developer Name</string>

【讨论】:

处理missingTranslation警告的三种方法【参考方案7】:

对于lint配置文件lint.xml

<issue id="MissingTranslation" severity="ignore" />

【讨论】:

【参考方案8】:

如果使用 gradle 7 的情况:

lint 
        disable("MissingTranslation")
    

【讨论】:

以上是关于Android Lint:如何忽略故意仅覆盖某些默认翻译的区域语言环境字符串文件中缺少的翻译警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Sonar 忽略 codeCoverage 指标的某些类?

Lint:如何忽略“<key> 未翻译成 <language>”错误?

Android 性能优化:使用 Lint 优化代码去除多余资源

android 中tools:ignore="UselessParent"这个属性的含义

如何在Flutter中忽略整个文件的lint规则?

Android Studio中不同的构建类型使用不同的lint.xml吗?