Что означает $ NON-NLS-1 $?

320

В исходном коде Eclipse я нашел в комментариях «$ NON-NLS-1 $»:

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

Что это значит ?

paulgreg
источник

Ответы:

370

Они заставляют замолчать предупреждение, которое Eclipse выдает, когда встречает строковые литералы (и было настроено жаловаться).

Идея состоит в том, что сообщения пользовательского интерфейса не должны быть встроены в виде строковых литералов, а должны быть получены из файла ресурсов (чтобы их можно было переводить, проверять и т. Д.). Следовательно, Eclipse может быть настроен на обнаружение строковых литералов, чтобы вы случайно не оставили в коде неинтернализованные строки пользовательского интерфейса; однако есть строки, которые не должны быть выведены из внешнего вида (например, регулярные выражения), поэтому // $ NON-NLS-1 $ дает возможность сообщить об этом факте компилятору.

Аарон Маенпаа
источник
10
Итак, что означает NLS?
MatrixFrog
39
@MatrixFrog, похоже, «Поддержка национальных языков», по крайней мере, это то, на что здесь ссылаются: msdn.microsoft.com/en-us/library/ms906482.aspx
Даниэль Дикисон
23
Чтобы быть оценочным, я думаю, что такие специфичные для IDE маркеры не следует использовать, если код изменяется в разных средах. Хотя маркер не причиняет вреда, он загромождает код и делает его немного более сложным в обслуживании.
Migu
4
Итак, как настроить Eclipse для обнаружения строковых литералов, чтобы отсутствующий // $ NON-NLS-1 $ вызвал предупреждение или smt?
рпр
3
Платформа NetBeans использует // ключевое слово комментария NOI18N для той же цели
Мэтт,
57

Строка не переводима. Он говорит редактору Eclipse не отмечать строку как не имеющую ресурсов. Это важно для многоязычных приложений.

Макдауэлл
источник
8
Хорошее объяснение, почему флаг называется NON NLS (без поддержки национальных языков). Спасибо.
Каадзия
28

NON-NLSсредство Номер - N АЦИОНАЛЬНОГО L anguage S оддержка .
Википедия предлагает также Non - N ческих L anguage 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 на странице 250 гласит:

Не-NLS-маркеры . Java-компилятор Eclipse имеет возможность пометить неэкстернализованные строки как предупреждение или ошибку, чтобы облегчить поддержку поддержки национальных языков (NLS). Сгенерированный EMF код не использует жестко закодированные строки для сообщений, которые увидит пользователь; однако строковые литералы часто появляются, например, как ключи для поиска внешних строк в файле свойств. Это свойство определяет, следует ли включать комментарии, помечающие эти литералы как непереводимые, чтобы компилятор не отмечал их.

Для получения дополнительной информации см. Также страницы «Графический интерфейс генератора» и « Как интернационализировать ваш подключаемый модуль Eclipse» .

Вы можете включить / отключить эту функцию. На Eclipse Neon зайдите
Project > Properties > Java Compiler > Errors/Warnings
и выберите поле
Non-externalized strings (missing/unused $NON-NLS$ tag)

Окно свойств проекта на Eclipse

olibre
источник
14

Если вы разработчик Android. Все строки, которые может видеть пользователь, должны находиться в файле ресурсов /res/values/strings.xml для чтения файла strings.xml в коде, который вы используете R.string. Добавив тег // $ NON-NLS- $, вы получите отмечая, что строка не будет видна пользователям.

Предупреждение в Eclipse Helios может быть включено в Window -> preferences -> java -> Compiler -> code style -> "Non-externalized Strings (missing/unused &NON-NLS$ tag).

Если вы планируете программировать свою деятельность на несколько языков, рекомендуется включить ее. А затем добавьте тег & NON-NLS $ к строкам, которые являются внутренними для вашей деятельности. Eclipse добавит тег & NON-NLS $ в быстрое исправление, если щелкнуть правой кнопкой мыши предупреждение или ошибку.

fishjd
источник
9

Он используется Eclipse для указания того, что строку не нужно переводить, возможно потому, что ее не увидят пользователи приложения.

Кеес де Коутер
источник
Некоторые строки не работают должным образом, когда они переведены. Если строка представляет кодировку, тег HTML / XML, регулярное выражение и т. Д., Они могут изменить поведение программы.
променял
5

Он говорит компилятору не жаловаться на неэкстернализованную строку и не требует локализации.

Бьерн
источник
4
Я не думаю, что это компилятор, я думаю, что это Eclipse, который жалуется.
Пол Томблин
6
Eclipse имеет свой собственный компилятор как часть JDT, который он использует для такого рода вещей. Так что да, это компилятор (в любом случае компилятор Eclipse).
Аарон Маенпаа