Problema com acentuação no i18n com vRaptor 3

Estou com problemas para apresentar caracteres acentuados na minha aplicação com vRaptor 3.2.0.

No web.xml eu configurei:

<context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>

Meus JSPs contém:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head>

Mas quando uso JSTL para exibir uma mensagem do meu arquivo de properties, saí todo zoado na tela:

<fmt:message key="app.title" />

Resultado: Prógols

Embora, se tiver caracter acentuado no jsp, ele sai correto na tela, mas vindo do properties pelo JSTL (i18n), sai todo zuado. Tentei converter o arquivo para UTF-8, mas continua com problema.

E também coloquei o um parâmetro adicional na JVM para subir Tomcat e nada: -Dfile.encoding=UTF-8

Sugestões?

A única forma que achei de solucionar este problema é colocar o texto no properties codificado para Unicode ou caracteres especiais do HTML.

Exemplo:

app.title=Prógols app.name=Par\u00E1

Mas eu não queria resolver assim, gostaria de ter o meu properties com o texto “puro”.

tenta colocar o arquivo messages.properties em ISO-8859-1 e colocar os acentos

Ontem mesmo mudei a propriedade dele pelo Eclipse e não rolou, mesmo alterando todas as configs do vRaptor e content-type para ISO-8859-1 e para UTF-8.

Eu desisti e coloquei meu arquivo cheio de “&aacute” e afins.

Mas eu ainda quero deixar meu arquivo puro, sem HTML codes ou unicodes.

tentou deixar só o arquivo messages.properties em iso e todo o resto em utf-8?

Imagine todas as possibilidade entre ISO e UTF… eu fiz…

Cara… se conseguir colocar o vRaptor-blank com um um message.properties (limpo e com acentuação) pra funcionar, me manda, por favor!

Pre-reqs:

  • JSP em UTF-8 e aceitar acentuação (ex: “descrição” - sem usar HTML codes).
  • Config do vRaptor no web.xml com UTF-8

TKS!

tenta colocar essas 3 configs no seu web.xml:

<context-param>
		<param-name>br.com.caelum.vraptor.encoding</param-name>
		<param-value>UTF-8</param-value>
	</context-param>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>messages</param-value>
	</context-param>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
		<param-value>pt_BR</param-value>
	</context-param>

só isso deveria ser o suficiente pra funcionar com o messages properties

Não adianta trocar o encoding da requisição se o arquivo continua em ISO-8859-1. Você precisa converter o arquivo para UTF-8 ou grava-lo novamente salvando como UTF-8.

então, garcia, aparentemente o messages.properties precisa estar em ISO-8859-1, pq o java lê ele com esse encoding.

o que parece estar acontecendo é que o messages.properties está em UTF-8 e o java lê em ISO, por isso fica tudo zuado…

Lucas, bem lembrado, eu não reparei que era um .properties.

danieldestro, você está usando Eclipse? Se sim, clique com o botão direito, clique em properties e veja qual o é o encoding do arquivo. Creio que o conteúdo dele esteja como ISO-8859-1 mas a propriedade está como UTF-8. Se sim, troque a propriedade para ISO-8859-1.

great news!

Hoje criei um novo properties, mudei seu encoding para ISO-8859-1 e coloquei as mensages.

Deixei as configurações do web.xml (vraptor) e do encoding dos JSPs como UTF-8 e FUNCIONOU!

Valeu, abraços!

Galera, vou ressuscitar esse tópico apesar do tempo…acho que ele é util pra explicar o meu contexto.

Estou passando pelo mesmo problema relatado pelo @danieldestro, ocorre que o meu arquivo message.properties está com encoding UTF-8, e já está sendo lido por algumas outras partes da aplicação fora o VRaptor. Dessa forma, a príncipio não desejo alterar o arquivo.

Dando uma olhada no codigo fonte do VRaptor, vejo que o resource bundle é criado com o método ResourceBundle.get() (https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/core/JstlLocalization.java), que tem esse comportamento que o Lucas comentou (lê com encoding ISO-8859-1).

Penso em criar um componente que sobrescreva essa leitura passando o meu encoding (bastaria ler o arquivo com a classe PropertyResourceBundle, passando um InputStream que foi lido passando o encoding desejado). De qualquer forma, não seria razoável o VRaptor permitir customizar isso, dando suporte para o usuário definir qual o encoding do arquivo?

Obrigado!

essa especificação do arquivo .properties ser ISO-8859-1 é do próprio java, não sei se o VRaptor deveria se meter nisso.

você pode customizar sobrescrevendo o componente Localization (impl padrão é a JstlLocalization) e retornando o bundle lido com UTF-8

Pois é Lucas, por isso comentei dessa classe aqui (http://docs.oracle.com/javase/6/docs/api/java/util/PropertyResourceBundle.html), o próprio Javadoc comenta a respeito disso e indica essa classe como a adequada para usar nessa situação. Eu acho que seria interessante sim, através de algum parametro doido ai da aplicação, permitir usar outros encodings pra esse arquivo…

Mas por enquanto sua sugestão já resolve, hehe. Valeu pela ajuda!