[RESOLVIDO]Internacionalização no struts-menu com Struts 2

11 respostas
Tiago_Farias

Olá pessoal, seguinte:

Fiz um menu utilizando struts-menu integrado com Struts 2, até aí funcionou tudo perfeito e beleza. Mas agora eu quero internacionalizar os nomes nos menus (title).

Esse é o meu menu-config.xml:

<Menu name="mainMenu" title="" >
		  <Item name="PrinterMenu" title="Impressoras" roles="USER" location="Disconnected" />
		  <Item name="reportsMenu" title="Relatórios" roles="ADMIN" location="AlarmReportSearch"/>
		  <Item name="fiscoMenu" title="Central" roles="ADMIN" location="UpdateFiscoForm"/>
		  <Item name="alarmMenu" title="Alarmes" roles="ADMIN" location="AlarmNotification"/>
		  <Item name="userMenu" title="application.header.users" roles="ADMIN" location="UserSearch"/>
		  <Item name="consoleMenu" title="Console" roles="ADMIN" location="ConsoleSearch"/>
		</Menu>

E aqui o jsp correspondente ao menu:

<menu:useMenuDisplayer permissions="rolesAdapter" name="Velocity" config="/WEB-INF/tabs.html">
				<menu:displayMenu name="mainMenu" />
			</menu:useMenuDisplayer>

Bom, o menu aparece e todos os itens tb. Todos os titles aparecem se escritos diretamente no atributo title, tipo title="Relatórios". Mas eu preciso internacionalizar, daí preciso passar uma key pra o title como no caso do menu 'userMenu' acima. Já tentei usar o atributo bundle na tag mas aparece na tela a key mesmo. Alguém sabe como fazer pra o struts-menu reconhecer o title como uma key para o arquivo message.properties?

11 Respostas

magnojg

Tiago, se por exemplo, você colocar a localidade do usuário no escopo de sessão com uma chave “user.locale”, então você deve usar a tag do tipo:

<menu:useMenuDisplayer name="listMenu" bundle="org.apache.struts.action.MESSAGE" locale="user.locale">

Acredito que desta forma funcione.

Tiago_Farias

Olá magnojg!

Cara, vc tá se referindo ao objeto Locale? O meu usuário não tem um Locale. Acho q não entendi essa parte. Dá pra explicar melhor? =D

Vlw!

magnojg

Tiago, no locale você deve colocar o atributo onde está sendo armazenado o idioma que o menu deverá ser exibido. No exemplo, utilizei o atributo “locale” do objeto “user”, que está na Stack Values. Consegui explicar? :smiley:

Tiago_Farias

Você tá explicando muito bem (e obrigado por isso), apenas não vejo aonde isso se relaciona com o meu caso. O struts me força a ter um objeto Locale dentro do User?? Eu coloquei um atributo locale=“user.locale” no meu jsp mas deu NullPointer =/. Obviamente, porque o objeto user não tem locale. A questão é: precisa SEMPRE ter? Eu quero usar o mesmo properties de mensagens que o resto do sistema usa. Aí tipo… não bastaria eu acertar aonde o bundle está, para achar o properties e a partir daí fazer o mapeamento chave-valor das mensagens?

Vlw!

magnojg

É Tiago, só com o bundle deveria funcionar…
Você está usando a taglib menu com esta uri?

<%@ taglib prefix="menu" uri="http://struts-menu.sf.net/tag-el"%>

Caso contrário, tenta com ela, pois há diferenças para esta:

<%@ taglib prefix="menu" uri="http://struts-menu.sf.net/tag"%>

A diferença é apenas o -el mesmo.

Tiago_Farias

Bom, eu tava usando a taglib sem o “-el” no fim. Mas mesmo colocando “-el” no fim não funciona. Continua exibindo no título menuItem a chave da mensagem: “application.header.user”. Me diz uma coisa, o bundle deve ser o nome do arquivo de internacionalização sem o “.properties” no final? Ou tem algum segredo de qual nome por no atributo bundle da tag?

Grato!

magnojg

Tiago, tenta com o seguinte bundle:

bundle="org.apache.struts.action.MESSAGE"

ou

bundle="org.apache.struts.action.ActionMessage"

Que diz pra o menu usar os mesmos recursos que o struts.

Tiago_Farias

Tentei com ambos agora e não rolou. É estranho inclusive que essa classe org.apache.struts.action.ActionMessage não parece ser do struts 2 mas do 1. Não sei. Mas não funcionou e agora eu não tenho mais saída. Caramba, como pode ser tão difícil internacionalizar um menu???
Fiquei sem abordagens agora… Alguma sugestão?

magnojg

Cara, vou ver se consigo mais alguma coisa (que funcione :smiley: ), e te passo.

Tiago_Farias

Pow… muito obrigado pela ajuda! Fico no aguardo (e tentando aqui)! =]

Tiago_Farias

Ae! Descobri qual é a magia.

Como o magnojg flw, trocar o taglib por <%@ taglib prefix=“menu” uri=“http://struts-menu.sf.net/tag-el”%> é o primeiro passo.

O segundo passo é apagar o bundle e o locale no xml e setar no web.xml o parâmetro:

javax.servlet.jsp.jstl.fmt.localizationContext *Messages

Onde *Messages é o nome do seu arquivo de internacionalização (que fica em WEB-INF/classes) sem o .properties no fim. Tipo, “router-messages” no meu caso.
Isso resolveu.

\o/

Criado 15 de fevereiro de 2011
Ultima resposta 16 de fev. de 2011
Respostas 11
Participantes 2