Friday, June 18, 2010

i18n de Portlets em JSF e JSP com JSTL

Existem várias formas p/ internacionalizar labels no desenvolvimento de Portlets, no post comento sobre 2 alternativas: básico com JSP e JSTL, outra opção é JavaServer Faces.

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
<portlet-app ... >  
  <portlet>
      ...
    <portlet-info>
      <title>meu.portlet.titulo</title>
    </portlet-info>
  </portlet>
  ...
</portlet-app>

messages_pt_BR.properties:
...
meu.portlet.titulo=Testando i18n em Portlet c/ JSTL
...

trecho do código java do Portlet:
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:
...
javax.portlet.title=Testando i18n em Portlet c/ JSF
...

portlet.xml
<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

No comments: