O que significa $ NON-NLS-1 $?

320

No código-fonte do Eclipse, encontrei alguns '$ NON-NLS-1 $' nos comentários usados ​​assim:

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

O que isso significa ?

paulgreg
fonte

Respostas:

370

Eles silenciam um aviso que o Eclipse emite quando encontra literais de sequência (e foi configurado para reclamar).

A idéia é que as mensagens da interface do usuário não devem ser incorporadas como literais de seqüência de caracteres, mas sim originadas de um arquivo de recurso (para que possam ser traduzidas, revisadas, etc). Conseqüentemente, o Eclipse pode ser configurado para detectar literais de cadeia de caracteres, para que você não tenha deixado acidentalmente cadeias de UI não-externalizadas no código; no entanto, existem seqüências que não devem ser externalizadas (como regexps) e, portanto, // $ NON-NLS-1 $ fornece uma maneira de comunicar esse fato ao compilador.

Aaron Maenpaa
fonte
10
Então, o que significa o NLS?
MatrixFrog
39
@MatrixFrog parece ser "Suporte ao Idioma Nacional", pelo menos é o que é referido aqui: msdn.microsoft.com/en-us/library/ms906482.aspx
Daniel Dickison
23
Para ser avaliador, acho que esses marcadores específicos do IDE não devem ser usados ​​se o código for alterado em ambientes diferentes. Embora o marcador não cause danos, ele desorganiza o código e dificulta a manutenção.
migu
4
Então, como você configura o Eclipse para detectar literais de strings, para que // $ NON-NLS-1 $ ausente gere um aviso ou smt?
rpr
3
A Plataforma NetBeans usa a palavra-chave de comentário // NOI18N para a mesma finalidade
Matt
57

A sequência não é traduzível. Diz ao editor Eclipse para não sinalizar a sequência como sem recursos. Isso é importante para aplicativos multilíngues.

McDowell
fonte
8
Boa explicação para o motivo pelo qual a bandeira é chamada NON NLS (sem suporte ao idioma nacional). Obrigado.
Kaadzia 27/09/2013
28

NON-NLSmeios não - N acional L anguage S POIO .
Wikipedia também propõe Non - N ative L anguage S upport (NLS), mas este último não é muito utilizado.

O NLS trata da internacionalização de seu aplicativo. O Eclipse ajuda a localizar cadeias codificadas no seu código. Para indicar que uma string não faz parte da internacionalização, acrescente o comentário em //$NON-NLS-x$que x é a posição da string. No exemplo a seguir, ambas "!"são seqüências codificadas que não fazem parte da internacionalização:

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

Notas:

  • a liderança //é necessária cada vez
  • não é global $NON-NLS$para várias strings na mesma linha
    (por exemplo, se sua linha tiver seis strings, você precisará escrever seis vezes //$NON-NLS-x$)

O livro EMF: Eclipse Modeling Framework na página 250 diz:

Marcadores não NLS - O compilador Java do Eclipse tem a capacidade de sinalizar cadeias não externalizadas como um aviso ou erro, a fim de facilitar a ativação do NLS (National Language Support). O código gerado pelo EMF não usa cadeias codificadas permanentemente para mensagens que o usuário verá; no entanto, literais de seqüência de caracteres aparecem com freqüência, por exemplo, como chaves para pesquisa de seqüências de caracteres externalizadas em um arquivo de propriedades. Esta propriedade controla se deve incluir comentários que marcam esses literais como não traduzíveis, para que o compilador não os sinalize.

Para obter mais detalhes, consulte também as páginas A GUI do gerador e Como internacionalizar seu plug-in do Eclipse .

Você pode ativar / desativar esse recurso. No Eclipse Neon, vá para
Project > Properties > Java Compiler > Errors/Warnings
e selecione o campo
Non-externalized strings (missing/unused $NON-NLS$ tag)

Janela das propriedades do projeto no Eclipse

olibre
fonte
14

Se você é um desenvolvedor Android. Todas as strings que o usuário pode ver devem estar no arquivo de recursos /res/values/strings.xml para ler o arquivo strings.xml no código que você usa R.string. Ao adicionar a tag // $ NON-NLS- $ você está observando que a sequência não será vista pelos usuários.

O aviso no Eclipse Helios pode estar ativado em Window -> preferences -> java -> Compiler -> code style -> "Non-externalized Strings (missing/unused &NON-NLS$ tag).

Se você está planejando programar sua atividade para ser multilíngue, é recomendável ativar isso. E, em seguida, adicionando a tag & NON-NLS $ a cadeias internas à sua atividade. O Eclipse adicionará a tag & NON-NLS $ na correção rápida se você clicar com o botão direito do mouse no aviso ou erro.

fishjd
fonte
9

É usado pelo Eclipse para indicar que uma sequência não precisa ser traduzida, provavelmente porque não será vista pelos usuários do aplicativo.

Kees de Kooter
fonte
Algumas strings não funcionam corretamente quando são traduzidas. Se uma string representa um conjunto de caracteres, tag HTML / XML, regex etc., eles podem alterar o comportamento do programa.
yingted 18/03/12
5

Ele diz ao compilador para não reclamar de uma string não externalizada e que não requer localização.

Björn
fonte
4
Eu não acho que é o compilador, acho que é o Eclipse que reclama.
Paul Tomblin
6
O Eclipse possui seu próprio compilador como parte do JDT que ele usa para esse tipo de coisa. Então, sim, é o compilador (de qualquer maneira, o compilador do Eclipse).
Aaron Maenpaa 17/03/09