$NON-NLS-1$ 是啥意思?

Posted

技术标签:

【中文标题】$NON-NLS-1$ 是啥意思?【英文标题】:What does $NON-NLS-1$ mean?$NON-NLS-1$ 是什么意思? 【发布时间】:2010-10-13 19:59:57 【问题描述】:

在 Eclipse 源代码中,我在 cmets 中发现了一些 '$NON-NLS-1$' :

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

这是什么意思?

【问题讨论】:

【参考方案1】:

当 Eclipse 遇到字符串文字时,它们会发出警告(并且已配置为抱怨)。

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

【讨论】:

那么,NLS 代表什么? @MatrixFrog 似乎是“国家语言支持”,至少这里指的是:msdn.microsoft.com/en-us/library/ms906482.aspx 为了进行评估,我认为如果代码在不同环境中发生更改,则不应使用此类特定于 IDE 的标记。虽然标记并没有什么害处,但它会使代码变得杂乱,并使其更难维护。 那么,如何配置 Eclipse 来检测字符串文字,以便丢失 //$NON-NLS-1$ 会引发警告或 smt? NetBeans 平台出于相同目的使用 //NOI18N 注释关键字【参考方案2】:

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

【讨论】:

很好地解释了为什么该标志被称为 NON NLS(无国家语言支持)。谢谢。【参考方案3】:

NON-NLS 表示-N国家的L语言S支持.Wikipedia 还提出-N母语L语言S >支持(NLS),但最后一个不是很常用。

NLS 是关于国际化您的应用程序。 Eclipse 有助于在您的代码中定位硬编码字符串。要指示字符串不是国际化的一部分,请附加注释//$NON-NLS-x$,其中 x 是字符串的位置。在以下示例中,"!" 都是硬编码字符串,不属于国际化:

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

注意事项:

每次都需要前导// 对于同一行中的多个字符串,没有全局 $NON-NLS$ (例如,如果你的行有六个字符串,你必须写六次//$NON-NLS-x$

这本书EMF: Eclipse Modeling Framework at page 250 说:

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

有关更多详细信息,另请参阅页面The Generator GUI 和How to Internationalize your Eclipse Plug-In。

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

【讨论】:

【参考方案4】:

如果您是 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$ 标记。

【讨论】:

【参考方案5】:

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

【讨论】:

某些字符串在翻译后无法正常工作。如果字符串表示字符集、html/XML 标记、正则表达式等,它们可能会改变程序的行为。【参考方案6】:

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

【讨论】:

我不认为是编译器,我认为是 Eclipse 抱怨。 Eclipse 有它自己的编译器作为 JDT 的一部分,它用于这种事情。所以是的,它是编译器(无论如何都是 Eclipse 的编译器)。

以上是关于$NON-NLS-1$ 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

PPPoE是啥意思,PPPoE是啥意思

“?”是啥意思?在 Erlang 中是啥意思? [复制]

“this”这个词是啥意思,“static”是啥意思?

“||”是啥意思在 var 语句中是啥意思? [复制]

CVE是啥意思,CVE是啥意思

“内容”是啥意思:在招摇/openapi“响应”中是啥意思: