Dae pessoal, não faz tanto tempo assim que postei algum “drop” de sabedoria aqui. Então vamos a mais um: internacionalização!Diretamente das definições da Sun: “internacionalização é o processo de projetar uma aplicação, de modo que ela possa ser adaptada a varias linguagens e regiões sem mudanças de engenharia.” – leia-se mudanças no código.Bom, você já deve ter ouvido ou lido em algum código o prefixo “i18n” ou “l10n”. i18n é a abreviação de internationalization, pois do primeiro i ao último n há 18 letras. O l10n é a abreviação de localization e segue a mesma regra do número de caracteres entre l e n.Existem certas características em um programa internacionalizado, como:• Dado uma localização (Locale), o mesmo binário do programa deve funcionar em qualquer lugar;• Os dados textuais do programa (mensagens de erro, mensagens de tela, rótulos, etc...) não devem estar atribuídos de forma “hardcode” aos elementos dentro dos códigos do programa e sim externados em um arquivo apropriado;• Suporte a outros idiomas não deve requerer nova compilação do programa;• Dados dependentes de localização, como formatação de datas e campos monetários, devem ser apresentados de acordo com a região do usuário e seu idioma;Bom, se você tiver sons e imagens que possam fazer sentido internacionalizar, é uma boa idéia!Vamos cortar o nhe nhe nhe e partir para a ação.Vamos a um simples exemplo. Uma classe que deva imprimir:Nome: Jean Jorge MichelNome de usuário: jmichelSenha: minhasenhaultrasecretaPorém os rótulos (nome, nome de usuário e senha) devem ser impressos corretamente para cada idioma (tá, não exageremos, vamos testar com português e inglês apenas).Então vamos começar pelos fatos primeiros (como diria o grande sábio), criando os arquivos com a tradução do nosso programa. Para isso, no pacote estudo.internacionalizacao criei dois arquivos:• ResourceBundle_pt_BR.properties;• ResourceBundle_en_US.properties.E o conteúdo de cada um deles (na ordem de criação):name=Nomepassword=Senhausername=Nome de usuárioname=Namepassword=Passwordusername=UsernameAgora no mesmo pacote criei a classe Internacionalizada.java:package estudo.internacionalizacao;import java.util.Locale;import java.util.ResourceBundle;public class Internacionalizada { public static void main(String[] args) { final Locale defaultLocale = Locale.getDefault(); final ResourceBundle rbDefault = ResourceBundle.getBundle("estudo.internacionalizacao.ResourceBundle", defaultLocale); System.out.println(new StringBuilder().append(rbDefault.getString("name")).append(": Jean Jorge Michel")); System.out.println(new StringBuilder().append(rbDefault.getString("username")).append(": jmichel")); System.out.println(new StringBuilder().append(rbDefault.getString("password")).append(": minhasenhaultrasecreta").append("\n\n")); final Locale otherLocale = new Locale("en", "GB"); final ResourceBundle rb = ResourceBundle.getBundle("estudo.internacionalizacao.ResourceBundle", otherLocale); System.out.println(new StringBuilder().append(rb.getString("name")).append(": Jean Jorge Michel")); System.out.println(new StringBuilder().append(rb.getString("username")).append(": jmichel")); System.out.println(new StringBuilder().append(rb.getString("password")).append(": minhasenhaultrasecreta")); }}Agora é só rodar e ver o resultado das duas saídas que devem parecer com isso:Nome: Jean Jorge MichelNome de usuário: jmichelSenha: minhasenhaultrasecretaName: Jean Jorge MichelUsername: jmichelPassword: minhasenhaultrasecretaLembra daquela Enum do post anterior? Poderia ser internacionalizada não? :)Até mais! Bons códigosMarcadores: i18n, internacionalização, java, l10n, locale, localização