$ NON-NLS-1 $是什么意思?


320

在Eclipse源代码中,我在这样的注释中找到了一些'$ NON-NLS-1 $':

private String toolTip = ""; //$NON-NLS-1$

这意味着什么 ?

Answers:


370

它们使Eclipse在遇到字符串文字时发出警告(并且已配置为抱怨),从而使警告消失。

这个想法是,UI消息不应作为字符串文字嵌入,而应从资源文件中获取(以便可以进行翻译,校对等)。因此,可以将Eclipse配置为检测字符串文字,这样您就不会在代码中无意中留下未外部化的UI字符串。但是,有些字符串不应该外部化(例如regexps),因此// $ NON-NLS-1 $提供了一种将事实传达给编译器的方法。


10
那么,NLS代表什么呢?
MatrixFrog 2010年

39
@MatrixFrog似乎是“国家语言支持”,至少在这里是这样的:msdn.microsoft.com/en-us/library/ms906482.aspx
Daniel Dickison 2010年

23
为了进行评估,我认为如果代码在不同的环境中更改,则不应使用此类特定于IDE的标记。虽然标记没有害处,但会使代码混乱,并使维护起来更加困难。
migu 2011年

4
因此,如何配置Eclipse以检测字符串文字,以便缺少// $$ NON-NLS-1 $会发出警告或smt?
rpr

3
NetBeans平台将// NOI18N注释关键字用于同一目的
Matt

57

该字符串不可翻译。它告诉Eclipse编辑器不要将字符串标记为非资源。这对于多语言应用程序很重要。


8
很好地解释了为什么将该标记称为NON NLS(无本国语言支持)。谢谢。
Kaadzia

28

NON-NLS装置 - ñ大号 anguage 小号 upport
维基百科还提出 - ñ ative 大号 anguage 小号 upport(NLS),但是这最后一个不是很习惯。

NLS是关于国际化您的应用程序的。Eclipse帮助您在代码中找到硬编码的字符串。为了表明字符串不是国际化的一部分,请//$NON-NLS-x$在x处附加注释,其中x是字符串的位置。在以下示例中,这两个"!"都是硬编码的字符串,不属于国际化:

 public String foo(String key) { 
   return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$ 
 } 

笔记:

  • 领导 //每次都要
  • $NON-NLS$在同一行中没有多个字符串的全局值
    (例如,如果您的行中有六个字符串,则必须编写六次//$NON-NLS-x$

第250页的《EMF:Eclipse建模框架》一书说:

非NLS标记-Eclipse的Java编译器具有将非外部化的字符串标记为警告或错误的功能,以便于启用本国语言支持(NLS)。EMF生成的代码不对用户将看到的消息使用硬编码字符串。但是,字符串文字确实经常出现,例如,作为在属性文件中查找外部字符串的键。此属性控制是否包括将这些文字标记为不可翻译的注释,以便编译器不会标记它们。

有关更多详细信息,另请参见“生成器GUI”和“ 如何国际化Eclipse插件 ”页面。

您可以启用/禁用此功能。在Eclipse Neon上,转到
Project > Properties > Java Compiler > Errors/Warnings
并选择字段
Non-externalized strings (missing/unused $NON-NLS$ tag)

Eclipse上的项目属性窗口


14

如果您是Android开发人员。用户可能看到的所有字符串都应该位于资源文件/res/values/strings.xml中,以使用R.string读取代码中的strings.xml文件。通过添加标签// $ NON-NLS- $,您可以注意该字符串不会被用户看到。

Eclipse Helios中的警告可能在处打开Window -> preferences -> java -> Compiler -> code style -> "Non-externalized Strings (missing/unused &NON-NLS$ tag)

如果您打算将您的活动编程为多语言,则建议将其打开。然后将&NON-NLS $标记添加到您活动内部的字符串中。如果右键单击警告或错误,Eclipse将在快速修复中添加&NON-NLS $标签。


9

Eclipse使用它来指示不需要翻译字符串,这可能是因为应用程序的用户不会看到它。


某些字符串在翻译后无法正常工作。如果字符串表示字符集,HTML / XML标记,正则表达式等,则它们可能会更改程序的行为。
2012年

5

它告诉编译器不要抱怨未外部化的字符串,并且不需要本地化。


4
我认为不是编译器,而是Eclipse。
Paul Tomblin,2009年

6
Eclipse将自己的编译器作为JDT的一部分,用于这种情况。是的,它是编译器(还是Eclipse的编译器)。
亚伦·曼帕
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.