Internacionalização – Um software, vários idiomas!
Tudo bem, eu admito. Esse nome é muito grande e chato de pronunciar (porém muito útil!).
Imagine que você desenvolveu um super software (em Java é claro…) para atender um determinado nicho de mercado, levou 1 ano da sua vida para fazer isso. Quando você começou a vendê-lo foi o maior sucesso, seus clientes falaram bem do seu software pra todo mundo. Cada dia apareciam mais clientes, maravilha!
Até que um certo dia um americano ouviu falar do seu software e diz que paga um preço 5x maior do que você está acostumado a cobrar, porém o software tem que ser totalmente em Inglês…
E agora José???? Vai copiar o projeto e sair mudando todas as strings? Boa sorte…
Se tivesse pensado nisso antes, você teria planejado melhor o seu software e teria utilizado as facilidades que o Java oferece para Internacionalizar seu programa.
Mais chega de história, vamos a algo um pouco mais prático. Vamos criar uma pequena aplicação apenas para demonstrar como é fácil e útil internacionalizar seu programa em Java.
Crie um novo projeto Java para Área de Trabalho no NetBeans e apague tudo que ele já cria. Crie 2 pacotes: internacionalizacao e internacionalizacao.linguas:
Dentro do pacote internacionalizacao crie um JFrame e o deixe parecido com este:
Eu mudei os nomes dos JLabel’s e do JComboBox para:
- jL_Lingua
- jL_Nome
- jL_Telefone
- jL_Email
- jCB_Lingua
Fique a vontade para nomear como achar melhor.
Essa vai ser a cara do nosso aplicativo. Quando o usuário selecionar uma língua no combobox, todos os JLabel’s e o título do JFrame vão mudar para a língua escolhida.
Como as coisas não caem do céu, as informações de cada idioma devem estar armazenadas em algum lugar. E esse lugar é um arquivo que vai ficar no pacote internacionalizacao.linguas. Um arquivo para cada idioma.
O nome dos arquivos devem serguir um padrão: <nome*>_<idioma>_<país>.properties
O padrão pode variar um pouco pois existem alguns parâmetros opcionais, porém o que nos interessa é este mesmo.
* O nome de todos os arquivos devem ser iguais. Ex:
- Idioma_pt_BR
- Idioma_en_US
Sabendo disso, adicione 4 arquivos ao pacote internacionalizacao.linguas. Para adicioná-los clique com o botão direito no projeto e em Novo > Outro. Selecione a categoria “Java” e o tipo de arquivo “Arquivo de Propriedade”.
Adicione os seguintes arquivos:
Eu dei o nome padrão de “Linguas” aos meus arquivos. Como já foi dito, cada arquivo é responsável por um idioma:
- Linguas_de_DE –> Alemão
- Linguas_en_US –> Inglês
- Linguas_fr_FR –> Francês
- Linguas_pt_BR –> Português
Segue o conteúdo de cada arquivo de Línguas:
Linguas_de_DE.properties
titulo = Internationalisierung - EinfacheJava lingua = Sprache nome = Name telefone = Telefon email = E-Mail
Linguas_en_US.properties
titulo = Internationalization - SimpleJava lingua = Language nome = Name telefone = Phone email = Email
Linguas_fr_FR.properties
titulo = Internationalisation - SimpleJava lingua = Langue nome = Nom telefone = Téléphone email = Email
Linguas_pt_BR.properties
titulo = Internacionalização - JavaSimples lingua = Língua nome = Nome telefone = Telefone email = Email
Uma vez que os arquivos de idioma já contenham tudo o que vamos precisar, vamos atualizar o combobox. Mude a propriedade “model” e adicione os seguintes itens:
- pt_BR
- en_US
- fr_FR
- de_DE
Agora só falta adicionar o evento que vai cuidar da mudança dos idiomas de acordo com a seleção do usuário. Adicione o seguinte código ao evento ActionPerfomed do jCB_Linguas:
String[] selecionado = jCB_Lingua.getSelectedItem().toString().split("_"); Locale.setDefault(new Locale(selecionado[0],selecionado[1])); internacionaliza();
O vetor de String “selecionado” recebe o item que o usuário selecionou, porém separado pelo _ (underscore). Ex: se o usuário selecionar “pt_BR” –> “selecionado = {pt , BR}”.
Depois o Locale** default é setado para o que o usuário selecionou e é chamada a função internacionaliza().
** A Locale object represents a specific geographical, political, or cultural region. Um objeto Locale representa uma região geográfica, política ou cultural específica. (de acordo com a Documentação). Por default é a configuração do sistema operacional no qual a JVM foi instalada, ex: se o seu Windows é em português do Brasil, provavelmente sua Locale default será pt_BR.
Por fim, vamos ao código da função internacionaliza(), que é onde a mágica acontece:
public void internacionaliza() { Locale locale = Locale.getDefault(); ResourceBundle palavras = ResourceBundle.getBundle("internacionalizacao.linguas.Linguas", locale); this.setTitle(palavras.getString("titulo")); jL_Lingua.setText(palavras.getString("lingua")); jL_Nome.setText(palavras.getString("nome")); jL_Telefone.setText(palavras.getString("telefone")); jL_Email.setText(palavras.getString("email")); }
Primeiro é recuperado o Locale atual do computador e depois é instaciado o objeto palavras da classe ResouceBundle através do método estático ResourceBundle.getBundle(String,Locale). O que este método faz é procurar o arquivo cujo nome seja igual o passado no primeiro parâmetro e o Locale seja igual ao passado no segundo parâmetro.
Ex: A execução desse método:
ResourceBundle.getBundle("internacionalizacao.linguas.Linguas", new Locale(“pt”,”BR”);
Vai resultar na escolha do arquivo “Linguas_pt_BR.properties” do pacote “internacionalizacao.linguas”.
OBS Importante: É necessário passar o caminho completo do arquivo, ou seja: “pacote.NomePadrao”.
Agora que o objeto palavras contém a referência para todas as palavras daquele idioma, basta atribuí-las aos respectivos JLabels e ao título.
Muito legal não?
Quem quiser pode baixar o projeto através desse link.
É isso ai galera, qualquer dúvida é só deixar um comentário e prometo que respondo o mais rápido possível.
[]s,
Saab.
PS: Esse post também foi dica do Dang do Programei.org. Valew!
12 Responses so far
Diogo de Souza
março 21st, 2010
10:36
Cara, muito show esse post!!!
É impressionante como muitas vezes deixamos os pequenos detalhes de software de lado achando que são bem “pequenos”, quando na verdade eles fazema maior falta depois, principalmente nos quesitos “manutenibilidade” e “extensibilidade”
Vlew!!
Saab
março 21st, 2010
10:52
É isso ai Diego.
No final das contas os “pequenos” detalhes são os que fazem a maior diferença e dão uma super dor de cabeça… Por isso é bom planejar bem o software antes de abrir a IDE e sair programando.
[].
Luiz Henrique
março 22nd, 2010
22:16
Ta mandando bemm negão hehe…show de bola msm.
Abrço .
Nemesis
abril 4th, 2010
1:54
Do you have copy writer for so good articles? If so please give me contacts, because this really rocks!
Saab
abril 4th, 2010
9:42
I write the articles by my own… My contact is @fesaab… hehehhhe Follow me.
Soulless-BR
abril 4th, 2010
12:05
Muito bom amigo, perguntei la no GUJ sobre o assunto e era justamente isso que precisava. Como disse “meu dia de sorte” ahuhauhe… Artigo excelente cara. Abraços…
Daniel
maio 3rd, 2010
21:48
massa hein saab, mandou bem!
Valew la pelo crédito
Tacio
maio 28th, 2010
4:50
adorei!!!
já vi alguma coisa, mas não desse jeito!!
excelente post!!!!
Só não falo que você é o CARA porque fica chato!
Saab
maio 28th, 2010
10:50
Vlw pelos comentários pessoal!
Voltem sempre!
jão
maio 4th, 2011
12:37
excelente tutorial
mas como faz para que essa opção de idioma funcione para todo o resto do programa?
Saab
maio 4th, 2011
23:56
Basta criar um ResourceBundle estático e sempre que precisar de um valor internacionalizado utilize ele…
jão
maio 7th, 2011
10:09
po tentei fazer algumas coisas aqui e nao deram certo
eh q sou iniciante no java e manjo quase nada tb ;\
se nao for pedir d+ tem como me dar um mini tutorial estilo esse que voce fez ai em cima?
pq até agora o seu foi o melhor q eu vi na net sobre internacionalização
Leave a comment