[RESOLVIDO] Internacionalização com Vraptor3 + Tiles2 (atualizar conteúdo da página)

4 respostas
rogerio.alcantara

Salve galera do GUJ!

Primeiro, parabéns a todos os envolvidos pelo EXCELENTE Vraptor3! IMHO, o melhor framework web para java que já mexi! \o/

Bom, to com uma dúvida cabeçada que acho que é simples!

To internacionalizando o site, mas estou com problema para atualizar o conteudo depois de mudar a lingua. Para atualizar o conteúdo com a nova lingua, eu preciso ou dar um F5, ou mudar de página.

Alguém tem alguma dica?

Contexto:

- Vraptor3
- Tiles2.2

Detalhes (mais ou menos assim):

No meu projeto tenho:
src/resoures/messages_en_US.properties e
src/resoures/messages_pt_BR.properties
Então no web.xml, configuro:
<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>messages</param-value>
	</context-param>
Daew, tenho um objeto na sessão com a lingua
@SessionScoped
public class UserLogged {

         private String language = 'en_US';//para começar em ingles sempre

         get/set
}
e na JSP, que é base pra todas as páginas, eu faço assim:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:setLocale value="${userLogged.language}" scope="session"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
</head>
...
[code]<a href="<c:url value="/BR/" />" style="<c:if test="${userLogged.language eq 'pt_BR'}">font-weight: bold</c:if>;">
Portugues
</a>
|
<a href="<c:url value="/US/" />" style="<c:if test="${userLogged.language eq 'en_US'}">font-weight: bold</c:if>;">
English
</a>
....
Que simplesmente chama a HomeController, que só determina a lingua e volta pra index. Assim:
@Path("/BR/")
	public void br() {

		this.getUserLogged().setLanguage('pt_BR');

		this.getResult().redirectTo(this.getClass()).index();
	}
Bom, os problemas:

1 - por algum motivo bizarro, mesmo eu setando o language inicialmente para = 'en_US', o site sempre inicia em pt_BR e tenho q dar um F5 para ele mudar para en_US.

2 - quando eu mudo a língua (a nova língua aparece em negrito) mas o site continua na língua antiga. Tenho que dar um F5 ou mudar de página para valer a língua nova.

Dicas?? Conselhos? Preces? Mandingas? Simpatias?

Valeu turmaa!

;D

4 Respostas

Lucas_Cavalcanti

tenta fazer o seguinte.

-receba HttpSession no construtor da classe UserLogged.

implemente o getLanguage e o setLanguage assim:

import javax.servlet.jsp.jstl.core.Config;
....
public void setLanguage(String language) {
     Config.set(session, Config.FMT_LOCALE, language);
}
public String getLanguage() {
     return Config.get(session, Config.FMT_LOCALE);
}
rogerio.alcantara

Perfeito Lucas!!!

Ainda achei um post no blog da Caelum, que comenta exatamente isso (http://blog.caelum.com.br/i18n-internacionalizacao-com-jstl/).

AH! E aproveitando, para setar o default locale da app, eu coloquei no web.xml <context-param> <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name> <param-value>en_US</param-value> </context-param>E agora tá redondo! VALEEUZ!

G

Mesmo que não sirva para nada, aconselho você a passar o locale na URL. Isso porque o browser e proxies tendem a fazer cache da página, então se o URL for o mesmo para ambos idiomas, você corre o risco de que o cache esteja em um idioma diferente. Tem também o fator SEO, se for o caso.

rogerio.alcantara

Olá @garcia-jj! Muito obrigado pelo retorno!

Mas é claro que ajuda sim! Além de agregar conhecimento, melhora o sistema! por favor, sinta-se a vontade para qualquer dica! =)

Mas, para ser sincero, não sei se eu entendi direito.

Acontece, que na verdade, o código que eu postei aqui foi uma "versão simplificada" do que está implementado.

Hoje como é feito de verdade:

No link da língua, é chamado um javascript que trata a troca da língua assim:
<form id="formChangeLanguage" name="formChangeLanguage" action="<c:url value="/language/change" />" method="post"></form>
<a href="JavaScript: void(0);" onclick="JavaScript: changeLanguage('en_US')">English</a>
<a href="JavaScript: void(0);" onclick="JavaScript: changeLanguage('pt_BR')">Portugues</a>
E a definição do JavaScript, usando jquery:
function changeLanguage(locale) {	
       $.post($('#formChangeLanguage').attr('action'), {to:locale}, 

		function (result) {

			if(result != null && result.errors != null && result.errors != undefined) {

				alert(result.errors);

			} else {

				location.reload(true);
			}
		}, 

	'json');
}
Que faz um post para LanguageController, que trata a alteração.

O que achas? Pode me explicar, como posso implementar o que vc comentou?

Valeeuzz!

^^

Criado 15 de fevereiro de 2011
Ultima resposta 16 de fev. de 2011
Respostas 4
Participantes 3