Internacionalização de mensagens com JSF – Exemplo prático.
Autor: Thiago | Publicado: 2009-07-12T07:30:00-07:00

Nesta postagem vamos mostrar como fazer a internacionalização de mensagens utilizando JSF. Internacionalizar mensagens é uma maneira de isolar toda a mensageiria de uma aplicação em arquivos. Desta forma, pode-se definir mensagens em idiomas diferentes em arquivos separados sem que a aplicação sofra nenhum impacto.Para exemplificar a internacionalização com JSF, vamos aproveitar a aplicação exemplo mostrada na postagem “Iniciando com JSF (Tutorial com exemplo prático)”.Primeiramente deve-se definir os arquivos com as mensagens. Para isso foi criado um pacote com.sample.messages e lá foram colocados dois arquivos com as mensagens da aplicação (um com mensagens em  inglês e outro em português).A listagem 1 e  2 mostram como ficaram os arquivos com as mensagens da aplicação.messages_en_US.properties (mensagens em inglês)portuguese=Portugueseenglish=Englishsave=Savedelete=Deletename=Namenationality=Nationalitytitle=JSFListagem 1messages_pt_BR.properties (mensagens em português)portuguese=Portuguesenglish=Inglessave=Salvardelete=Excluirname=Nomenationality=Nacionalidadetitle=JSFListagem 2O pacote com os arquivos  de mensagens é ilustrado na figura 1:Figura 1: Pacote mensagensAgora temos que configurar o faces-config.xml para o funcionamento da mensageiria. Para isso basta adicionar o seguinte trecho no faces-config.xml conforme a listagem 3: &lt;application&gt;     &lt;resource-bundle&gt;     &lt;base-name&gt;com.sample.messages.messages&lt;/base-name&gt;     &lt;var&gt;msgs&lt;/var&gt;  &lt;/resource-bundle&gt;  &lt;locale-config&gt;         &lt;default-locale&gt;pt_BR&lt;/default-locale&gt;         &lt;supported-locale&gt;en_US&lt;/supported-locale&gt;  &lt;/locale-config&gt;  &lt;message-bundle&gt;       com.sample.messages.messages  &lt;/message-bundle&gt;       &lt;/application&gt;Listagem 3Vamos agora criar um controller para gerenciar qual será o locale (idioma) usado na aplicação. Esse controller chamaremos de LocaleController e ficará dentro do pacote com.sample.controller do exemplo. A listagem 4 mostra a implementação do LocaleController.package com.sample.controller;import java.util.Locale;import javax.faces.component.UIViewRoot;import javax.faces.context.FacesContext;public class LocaleController { private Locale currentLocale = new Locale("pt", "BR"); public void englishLocale() {  UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();  currentLocale = Locale.US;  viewRoot.setLocale(currentLocale); } public void portugueseLocale() {  UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();  currentLocale = new Locale("pt", "BR");  viewRoot.setLocale(currentLocale); } public Locale getCurrentLocale() {  return currentLocale; }}Listagem 4Vamos também definir um managed-bean no faces-config.xml para o LocaleController (listagem 5).&lt;managed-bean&gt;  &lt;managed-bean-name&gt;localeController&lt;/managed-bean-name&gt;  &lt;managed-bean-class&gt;  com.sample.controller.LocaleController  &lt;/managed-bean-class&gt;  &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;   &lt;/managed-bean&gt;Listagem 5Agora vamos definir a página pessoa.jsp para testar a internacionalização (listagem 6).&lt;%@ page contentType="text/html; charset=UTF-8"%&gt;&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&gt;&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&gt;&lt;html&gt;&lt;f:view locale="#{localeController.currentLocale}"&gt; &lt;head&gt;  &lt;title&gt;&lt;h:outputText value="#{msgs.title}" /&gt;&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h:form&gt;  &lt;table&gt;     &lt;tr&gt;     &lt;td&gt;&lt;h:commandLink value="#{msgs.portuguese}" action="#{localeController.portugueseLocale}" /&gt;&lt;/td&gt;     &lt;td&gt;&lt;h:commandLink value="#{msgs.english}" action="#{localeController.englishLocale}" /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;    &lt;td&gt;&lt;h:outputText value="#{msgs.name}" /&gt;:&lt;/td&gt;    &lt;td&gt;&lt;h:inputText value="#{pessoaController.pessoa.nome}" /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;&lt;h:outputText value="#{msgs.nationality}" /&gt;:&lt;/td&gt;    &lt;td&gt;&lt;h:inputText value="#{pessoaController.pessoa.nacionalidade}" /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td&gt;&lt;h:commandButton value="#{msgs.save}" action="#{pessoaController.save}" /&gt;&lt;/td&gt;   &lt;/tr&gt;  &lt;/table&gt;  &lt;h:dataTable value="#{pessoaController.pessoas}" var="p" rendered="#{not empty pessoaController.pessoas}" border="1"&gt;   &lt;h:column&gt;    &lt;f:facet name="header"&gt;     &lt;h:outputText value="#{msgs.name}" /&gt;    &lt;/f:facet&gt;    &lt;h:commandLink value="#{p.nome}" action="#{pessoaController.edit}"&gt;     &lt;f:param name="id" value="#{p.id}" /&gt;         &lt;/h:commandLink&gt;       &lt;/h:column&gt;   &lt;h:column&gt;    &lt;f:facet name="header"&gt;     &lt;h:outputText value="#{msgs.nationality}" /&gt;    &lt;/f:facet&gt;    &lt;h:commandLink value="#{p.nacionalidade}" action="#{pessoaController.edit}"&gt;     &lt;f:param name="id" value="#{p.id}" /&gt;         &lt;/h:commandLink&gt;      &lt;/h:column&gt;   &lt;h:column&gt;    &lt;f:facet name="header"&gt;     &lt;h:outputText value="#{msgs.delete}" /&gt;    &lt;/f:facet&gt;        &lt;h:commandLink value="#{msgs.delete}" action="#{pessoaController.delete}"&gt;     &lt;f:param name="id" value="#{p.id}" /&gt;    &lt;/h:commandLink&gt;      &lt;/h:column&gt;  &lt;/h:dataTable&gt; &lt;/h:form&gt;  &lt;/body&gt;&lt;/f:view&gt;&lt;/html&gt;Listagem 6Com as configurações mostradas acima podemos ver o comportamento da aplicação (figura 2).Figura 2: Comportamento da aplicaçãoEm síntese, com a aplicação exemplificamos como internacionalizar mensagens.Os fontes do exemplo completo estão disponíveis aqui.Até!