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

50

在不让Lint提示MissingTranslation错误的情况下,是否可能将某些字符串翻译成其他语言并放在单独的资源文件中?

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

<string name="postal_code">邮政编码</string>

由于在美国通常使用“zip code”而不是“postal code”,因此我想添加另一个资源文件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在寻找缺少的翻译时不要使用该文件作为标准?


相关/几乎是重复的:忽略Android Lint“MissingTranslation”检查部分翻译 - blahdiblah
1
请将@blahdiblah的答案标记为已接受,因为它实际上是一个正确的答案。 - Vadim Kotov
9个回答

71

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

android {

    lintOptions{
        disable 'MissingTranslation'
    }

    //other build tags
}

如果在本地化的字符串文件中找不到字符串,它将从默认文件 (strings.xml) 中获取字符串。


2
请注意,这将禁用所有缺失翻译警告/错误,因此您不会因为en-rUS有意部分覆盖en默认值而得到虚假的结果,但是当其他语言环境缺少翻译时,您也不会得到真正的结果。 - blahdiblah
2
我肯定发现你的答案很有用,但是,也许你对忽略不同级别的翻译感兴趣(忽略所有翻译,仅忽略给定文件中的字符串或仅忽略一个字符串)。请看这里:https://dev59.com/UmMl5IYBdhLWcg3wp4Wk#53206467 - xarlymg89

41

根据这个答案,我找到了一个更好的解决方案:https://dev59.com/eGcs5IYBdhLWcg3ww2xP#13797364

只需在你的string.xml文件中添加 ignore="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>

6
OP明确要求解决方案只忽略某些缺失的翻译。而这个解决方案适用于给定文件中的所有内容。 - Sterling

25

Lint支持针对部分地区的翻译,但需要知道默认字符串的语言。这样,它就可以将部分地区的翻译与其他语言环境中缺失的翻译区分开来。

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

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

运行 lint --show 命令时,来自 lint 命令行工具的引用:

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的该错误,但仍会被告知任何其他缺少的翻译。


2
你的回答很有道理,但对我不起作用。
  • 我有一个默认的字符串文件 "values/strings.xml",我将其中一些字符串翻译成了 en-rGB,并将它们放在 "values-en-rUS/strings.xml" 文件中。
  • 我在 "values/strings.xml" 中添加了 tools:locale="en",但仍然出现错误,提示某些字符串未被翻译成 "en"。
- Ahmed Hashem
3
我尝试了这个方法,实际上很有效。如果你运行一个lint任务,在添加了"tools:locale='en'"之后,就不会出现MissingTranslation警告。 但是在Android Studio 3.5.1中,红色下划线仍然存在。所以这可能是一个Android Studio的bug。 这个答案应该被标记为正确答案。 - michgauz
3
我已创建了一张针对Google的工单:https://issuetracker.google.com/issues/142590628 - michgauz
@michgauz 我看到你一直在催谷歌的人修复这个问题,即使他们不想修复,你做得很好,谢谢! - Matt Jenje

16

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

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

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

这个字符串不需要翻译,lint也不会对它进行检查...


这将把问题转换为警告,提示在应该提供不同资源的区域设置中翻译无法翻译的字符串。 - blahdiblah

16

这是一个瑞士军刀式的答案,所以你可以根据情况忽略所有的缺失翻译信息:

  • 忽略所有的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 警告的三种方法 - mukesh

    0
    如果使用的是gradle 7

    lint {
            disable("MissingTranslation")
        }
    

    0
    在 Android Gradle 插件 7.4.x 和 .kts 的情况下:
    android {
      lint {
        disable.add("MissingTranslation")
      }
    }
    

    0
    如果您正在使用Eclipse,请查看Lint警告视图的工具栏按钮。其中一个称为“在文件中忽略”。这应该有所帮助,但仅当Lint将错误分配给您的“US”文件时才有效。该按钮只是修改项目中的lint.xml文件,因此您可以轻松地进行调查(和撤消)。
    有关该文件特定抑制的更多详细信息,请参见http://tools.android.com/tips/lint/suppressing-lint-warnings

    0

    对于lint配置文件lint.xml

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

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