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!! :D

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. :~(

Nenhum comentário ainda.

Escreva um comentário: