O Java Server Faces disponibiliza um “sistema” de mensagens muito eficiente que permite uma fácil internacionalização de suas aplicações.
Para que este “sistema” de mensagens funcione você precisa informar a aplicação qual o Message Bundle e onde encontrá-lo. Feito isso, basta criar os arquivos .properties de acordo com os Locales desejados. É importante notar que um Locale é definido por uma língua (pt ou en) e por um país (BR ou US), porém não é necessário informar o país.
Configurando a Aplicação
Vamos contar a aplicação qual e aonde encontrar seu Message Bundle. Para tanto, adicione estas linhas ao faces-config.xml:
<application>
<message-bundle>pacote.Messages</message-bundle>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>pt_BR</supported-locale>
<supported-locale>en_US</supported-locale>
</locale-config>
</application>
Agora sua aplicação sabe aonde encontrar seu Message Bundle, sabe quais os Locales suportados e sabe qual o local padrão. Só nos resta criar os arquivos .properties para cada Locale. Então, crie os arquivos Messages_pt_BR.properties e Messages_en_US.properties com os seguintes conteúdos:
Messages_pt_BR.properties:
welcome=Bem vindo!
Messages_en_US.properties:
welcome=Welcome!
Nota:
Para parâmetros, segue-se a seguinte sintaxe:
welcome=Welcome {0}!
Utilizando os Message Bundles
Páginas JSP/JSF
Para utilizar numa página JSP/JSF, basta carregar o Message Bundle:
<f:loadBundle basename="pacote.Messages" var="msgBundle"/>
E utilizá-lo da seguinte forma:
<h:outputText value="#{msgBundle.welcome}"/>
Nota:
Para parâmetros, segue-se a seguinte sintaxe:
<h:outputFormat value="#{msgBundle.welcome}">
<f:param value="Seu Nome" />
</h:outputFormat>
Javascript (hard coded)
Para javascripts presentes (em código hard coded) na mesma página em que você carregou seu message bundle:
<script>
alert('<h:outputText value="#{msgBundle.welcome}"/>');
</script>
Componentes
Podemos criar uma classe utilitária (Sascha Wolski & Sebastian Hennebrueder de http://www.laliluna.de) para realizar o binding das mensagens para nós:
public class MessageBundleUtils {
protected static ClassLoader getCurrentClassLoader(Object defaultObject){
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if(loader == null)
loader = defaultObject.getClass().getClassLoader();
return loader;
}
public static String getMessageResourceString(String bundleName,
String key,
Object params[],
Locale locale){
String text = null;
ResourceBundle bundle =
ResourceBundle.getBundle(bundleName, locale,getCurrentClassLoader(params));
try{
text = bundle.getString(key);
} catch(MissingResourceException e){
text = "?? key " + key + " not found ??";
}
if(params != null){
MessageFormat mf = new MessageFormat(text, locale);
text = mf.format(params, new StringBuffer(), null).toString();
}
return text;
}
}
Podemos então realizar o binding da mensagem da seguinte forma:
public static final String WELCOME_MESSAGE_ID = "suataglib.seu.componente.WELCOME";
String text = MessageBundleUtils.getMessageResourceString(context.getApplication()
.getMessageBundle(), WELCOME_MESSAGE_ID, null, context.getViewRoot()
.getLocale());
Então basta definir o conteúdo de WELCOME_MESSAGE_ID nos nossos arquivos .properties assim como fizemos com o welcome.
Para utilizar os recursos do Message Bundle via javascript de um componente, devemos criar um HtmlInputHidden e atribuir a ele o valor de text (acima), e no javascript obter o input hidden (document.getElementById(idDoInputHidden)) e utilizar seu valor para qualquer finalidade.
Dica
Para promover uma melhor internacionalização com menos código, você pode extender o PhaseListener do JSF, realizar um override do método afterPhase(PhaseEvent phaseEvent) e definir o locale padrão para a ViewRoot corrente.