如何停止Android Lint对未翻译的字符串进行投诉?

129

有没有办法指定在values目录中的文件中的字符串不被翻译成其他语言?

我有一堆对所有语言都通用且不需要翻译的字符串。我在values目录下创建了一个unlocalized-strings.xml文件。当我运行Android Lint检查问题时,它一直提示某些翻译缺失。

我不想在整个项目上禁用此检查。我只想在某些XML文件中禁用它。这可行吗?

这是我遇到的错误:

"title_widget_updater_service" is not translated in de, en, en-rUS, it

Issue: Checks for incomplete translations where not all strings are translated
Id: MissingTranslation

If an application has more than one locale, then all the strings declared in one language     
should also be translated in all other languages.

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 require all regions to 
provide a full translation by setting the environment variable 
ANDROID_LINT_COMPLETE_REGIONS.

错误:在af中未翻译“app_name”。 - LF00
11个回答

239

在您的字符串文件中,这是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>

<resources tools:ignore="MissingTranslation"> 给我返回了错误:解析XML时未绑定前缀。 - fIwJlxSzApHEZIl
5
这个方法很有效,但我不得不去项目->清理来永久性地消除错误。 - xonya
至少Eclipse没有强迫我们翻译所有东西,包括奇怪的字符串文件夹,如ids.xml和analytics.xml。 - Androidcoder
2
这应该是解决所有问题的最佳答案,只需两行代码。 - nhoxbypass

164

我不知道如何忽略整个文件,但你可以逐个字符串地使用以下方法:

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

1
非可翻译资源应该只在基础值/文件夹中定义。 - fIwJlxSzApHEZIl
3
没问题。如果你不想翻译某个字符串,应该只在“基本值/文件夹”中定义它,这意味着不要将该字符串输入到翻译后的值/文件夹中。 - Luis
1
@CyrilLeroux的答案更详细,应该标记为正确答案,因为它展示了将所有不可翻译的字符串放在一个文件中的选项。 - Yoel Gluschnaider
这个方法可以工作,但我认为标记一个实际可翻译的字符串为“不可翻译”来抑制错误信息并不是解决问题的最佳方式。我们只是选择暂时不翻译一些字符串。但这并不意味着它们不可翻译。 - Zili FENG
我想把字符串值放在只有一个语言的版本中,这个语言是德语(de),而不是默认的英语。我已经将它放在那里,但当我尝试发布构建时,出现了错误。在这种情况下应该怎么做? - Aanal Shah

153

添加到 build.gradle 文件:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}

7
处理自动生成的字符串资源的唯一可行解决方案。谢谢。 - SqueezyMo
7
不应这样做,基于这个问题:“我不想在整个项目中禁用此检查”。 - Yoel Gluschnaider
@Giraffe Lion,你应该将这个问题作为一个不同的问题发布,并自己回答它。感谢你提供的解决方案,以前我不得不手动禁用它。 - Diljeet
1
这将禁用整个检查,如果可能的话应该避免。我不明白为什么它有这么多票。 - tasomaniac

23

我知道3种方法:

逐个值地应用修改:在 <string> 定义上设置属性 translatable="false"

<string name="account_setup_imap" translatable="false">IMAP</string>

如果您有很多不应翻译的资源,可以将它们放在名为donottranslate.xml的文件中,lint将把它们全部视为不可翻译的资源。

我在浏览Hackers Keyboard项目源码时发现了另一种方法:
您可以向资源文件添加前缀donottranslate-。 就像之前的示例一样,lint将把它们全部视为不可翻译的资源。
在您的情况下,您可以使用donottranslate-strings.xml替换unlocalized-strings.xml。 这似乎有效,但我没有找到任何关于此提示的文档。

请参见:Android工具项目网站:不可翻译字符串


如果我们把字符串放在文件“donottranslate.xml”中,就不需要再添加“translatable = false”标签了,这是真的吗? - Yuchen
是的。我在所有项目中都使用donottranslate-strings.xml文件。效果很好。试试吧,非常有用! - Cyril Leroux

13

以下是一个针对这个致命Lint错误的Android Studio解决方案:

输入图像描述


2
这可能是一个烦人的错误,但当你意外忘记将新字符串翻译成应用程序语言之一时,它可以为你节省大麻烦。 - Elad Nava

2
我认为你需要做的不是禁用lint,而是使用属性标记它们。
translatable="false"

2
创建一个以“donottranslate”开头的资源文件(例如:donottranslate.xmldonottranslate_urls.xml等),当检查缺少翻译时,Lint将完全忽略该文件中的字符串。请注意保留HTML标签。

1
如果您想关闭缺少翻译的Lint检查,可以前往“项目属性-> Android Lint首选项->选择MissingTranslation->切换为忽略严重性”,希望这能帮助其他人,因为我刚遇到了这个问题 :)

2
有没有在Android Studio中实现它的方法?我找不到与lint相关的设置。 - Adrian L

1

另一种做法是将您的字符串添加到gradle文件中,使用resValuebuildConfigField。类似于以下内容:

buildTypes {
    debug {
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
}

用途:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)

0
为了避免在Android Studio中出现警告,请打开“首选项”==>“检查”,取消勾选“不完整的翻译”。但这不会影响Gradle构建。

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