Internacionalização (i18n) em Java: tornando a aplicação multilíngue
Internacionalização (frequentemente abreviada como i18n — da palavra internationalization, onde 18 é o número de letras entre o primeiro 'i' e o último 'n') — é o processo de projetar software de forma que ele possa ser adaptado a diferentes idiomas e particularidades regionais sem alterar o código-fonte. Em Java, essa tarefa é resolvida de forma elegante e poderosa com as APIs integradas: java.util.Locale, java.util.ResourceBundle e um conjunto de classes para formatação.
Neste artigo, vamos abordar como implementar suporte a vários idiomas em uma aplicação Java usando recursos padrão. Você aprenderá a criar arquivos de localização, alternar dinamicamente o idioma e formatar corretamente números, datas e moedas.
Componentes principais do i18n em Java
O Java fornece três elementos-chave para trabalhar com internacionalização:
- Locale — objeto que representa um idioma e região específicos (por exemplo, português do Brasil —
pt_BR, inglês dos EUA —en_US). - ResourceBundle — classe para carregar recursos localizados (strings, mensagens, rótulos) de arquivos
.propertiesou classes. - Formatadores — classes do pacote
java.text(NumberFormat,DateFormat,MessageFormat) para exibir corretamente números, datas e mensagens compostas.
Passo 1: Criando arquivos de recursos
A forma tradicional de armazenar strings localizadas são os arquivos .properties. Eles são criados seguindo a regra:
Messages.properties # Arquivo padrão (geralmente inglês)Messages_pt_BR.properties # Para português do BrasilMessages_de_DE.properties # Para alemão (Alemanha)Messages_fr.properties # Para francês (sem especificação de região)Exemplo de conteúdo do arquivo Messages.properties (inglês, padrão):
welcome.message = Welcome to our application!farewell.message = Goodbye!date.format = dd/MM/yyyyExemplo de conteúdo do arquivo Messages_pt_BR.properties (português do Brasil):
welcome.message = Bem-vindo à nossa aplicação!farewell.message = Até logo!date.format = dd/MM/yyyyImportante: os arquivos devem estar na codificação ISO 8859-1 (Latin-1) ou usar escape Unicode para caracteres que não pertencem a essa codificação. Para caracteres acentuados em português, será necessário escape, por exemplo \\u00E9. No entanto, em ambientes de desenvolvimento modernos (IntelliJ IDEA, Eclipse) e ao compilar com Maven/Gradle, isso geralmente é automatizado.
Passo 2: Carregando recursos no código
Para usar strings localizadas, basta criar um objeto Locale e obter o ResourceBundle correspondente:
import java.util.Locale;import java.util.ResourceBundle;
public class I18nDemo { public static void main(String[] args) { // Cria uma locale para português do Brasil Locale ptLocale = new Locale("pt", "BR"); // Carrega o bundle (nome base do arquivo - "Messages") ResourceBundle bundle = ResourceBundle.getBundle("Messages", ptLocale);
// Obtém as strings String welcome = bundle.getString("welcome.message"); String farewell = bundle.getString("farewell.message");
System.out.println(welcome); // Bem-vindo à nossa aplicação! System.out.println(farewell); // Até logo! }}Se o arquivo para uma locale específica não for encontrado, o Java usa automaticamente o arquivo padrão (Messages.properties).
Passo 3: Alternância dinâmica de idioma
Em aplicações web