No caso de JSP e JSTL é só usar as tags fmt:setBundle e fmt:message da taglib de formatação, da mesma forma que uma aplicação web comum (sem portlets).
E o JavaServer Faces?
O mecanismo nativo de i18n do JSF funciona para portlets, é só definir os idiomas suportados no faces-config.xml, usar a tag f:loadBundle e por fim outputText e/ou outputFormat indicando o bundle e chave da label.
Em ambas alternativas, JSF ou JSP/JSTL, existe uma limitação: o title do portlet, que normalmente é definido no descritor portlet.xml, não se encaixa nos modelos de i18n descritos.
A solução é bem simples, no caso do JSTL a alternativa que encontrei foi apelar para a própria API de Portlets. No portlet.xml mapeio como title a chave que corresponde ao título no arquivo de i18n, já no código java do portlet sobreescrevo o método getTitle (herança de GenericPortlet) pegando a informação do xml e na raça acessando o bundle indicando a chave, o código seria próximo a esse:
portlet.xml
1 2 3 4 5 6 7 8 9 | < portlet-app ... > < portlet > ... < portlet-info > < title >meu.portlet.titulo</ title > </ portlet-info > </ portlet > ... </ portlet-app > |
messages_pt_BR.properties:
1 2 3 | ... meu.portlet.titulo=Testando i18n em Portlet c/ JSTL ... |
trecho do código java do Portlet:
1 2 3 4 5 6 7 8 9 10 11 12 | protected String getTitle(RenderRequest request) { String key = super .getTitle(request); try { ResourceBundle bundle = ResourceBundle.getBundle( "messages" , request.getLocale(),getClass().getClassLoader()); return bundle.getString(key); } catch (Exception ex) { //log4j log.error( "Valor [" +key+ "] (i18n) p/ titulo nao encontrado" , ex); return key; } } |
A solução no JSF é mais simples! Coloque a chave javax.portlet.title com o respectivo valor dentro do arquivo de i18n do aplicativo. Mas existe um macete, no portlet.xml também é preciso indicar o arquivo i18n e os idiomas suportados. A seguir um exemplo de como isso é feito.
messages_pt_BR.properties:
1 2 3 | ... javax.portlet.title=Testando i18n em Portlet c/ JSF ... |
portlet.xml
1 2 3 4 5 6 7 8 9 | < portlet-app ... > < portlet > ... < supported-locale >pt_BR</ supported-locale > < supported-locale >en_US</ supported-locale > < resource-bundle >messages</ resource-bundle > </ portlet > ... </ portlet-app > |
Importante: Sobre o que foi descrito em relação a JSF, o portlet roda no JBoss Portal com JBoss Portlet Bridge.
http://twitter.com/edermag
http://www.yaw.com.br