I18N com JSTL
Bom, se você, assim como eu, está dando manutenção em alguns sistemas legados da sua empresa que infelizmente não utilizam frameworks que já oferecem suporte à internacionalização, chegou a hora de parar de ficar olhando de cara feia para as mensagens escritas diretamente nos JSPs e colocar I18N utilizando JSTL!!
Ainda estou pesquisando a fim de descobrir se a forma que irei apresentar é a ideal e a de melhor desempenho, mas.. é aquela velha história: funcionar, funciona!
Passo 1: Crie um arquivo de propriedades
Crie um arquivo de extensão properties (ou mais de um, dependendo de quantas línguas você irá internacionalizar seu projeto) e coloque ali o conjunto de chaves necessárias para a I18N. Um arquivo de propriedades é composto por chaves e valores separador por igual (”=”).
Um exemplo de conteúdo deste tipo de arquivo seria:
# ---------------------------------
# Propriedades do SISTEMA X
# ---------------------------------
# --~--~---------~--~
# ARQUIVO: login.jsp
# --~--~---------~--~
login.label.login=Login:
login.label.senha=Senha:
login.botao.cadastro=Cadastro de Usuário
login.botao.login=Login
# --~--~---------~--~
# ARQUIVO: relatorios.jsp
# --~--~---------~--~
relatorios.title=Relatórios
Passo 2: Crie uma classe Java para pegar o valor das propriedades
Um exemplo de implementação:
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* MyProperties class.
*
* This class was created in order to get strings of the properties file.
*
* @author thania
*/
public class MyProperties {
/**
* A ResourceBundle instance to refer the MyProperties file.
*/
private static ResourceBundle resourceBundle = ResourceBundle.
getBundle("pacote.MyProperties");
/**
* Gets the string of the ResourceBundle instance.
*
* @param key The key for searching the string.
* @return The value that was searched in the properties file.
*
*/
public static String getString(String key)
{
String value = null;
try
{
value = resourceBundle.getString(key);
}
catch(MissingResourceException e)
{
e.printStackTrace();
System.err.println(new StringBuilder("ERROR: Properties :: getString -> ").
append(key).append("\n").append(e));
}
if (value == null)
{
System.err.println(new StringBuilder("ERROR: Properties :: getString -> ").
append(key));
}
return value;
}
}
Passo 3: Configure o web.xml
É preciso informar no web.xml qual será o arquivo que contém as mensagens do seu sistema. Para isto, basta adicionar a seguinte configuração no arquivo:
<context-param>
<description>Arquivo de propriedades do Sistema X</description>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>pacote.MyProperties</param-value>
</context-param>
Passo 4: Use I18N no seu JSP!
Para utilizar as mensagens nas suas páginas JSP, importe a taglib fmt do JSTL:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
Setar a classe que cria uma instância de ResourceBundle para buscar a valor no arquivo de propriedades:
<fmt:setBundle var="messages" basename="pacote.MyProperties"/>
E, finalmente, use no texto do formulário:
<fmt:message key="login.label.senha" bundle="${messages}"/>
Isso retornará: “Senha:”
Enjoy!
ps.: Se alguém tiver uma maneira melhor de fazer isso, por favor, mande-me um comentário. Nesse caso, não vale usar framework. Estou com um sistema legado aqui sem direito a refactoring e replanejamento da arquitetura, por enquanto. :~(
Bom, como disse antes, o seminário estava muito interessante como um todo, valeu muito a pena. Apesar de eu ter me atrapalhado para encontrar o local do evento (são 2 SENAIs em Floripa), o resto foi recompensador. A Tatiana e a Erika (