mar

20

Internacionalização – Um software, vários idiomas!

By Felipe Saab

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:

image

Dentro do pacote internacionalizacao crie um JFrame e o deixe parecido com este:

image

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:

image

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.


image image image image

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

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

É 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.
[].

Ta mandando bemm negão hehe…show de bola msm.
Abrço .

Do you have copy writer for so good articles? If so please give me contacts, because this really rocks! :)

I write the articles by my own… My contact is @fesaab… hehehhhe Follow me. :D

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…

massa hein saab, mandou bem!
Valew la pelo crédito ;)

adorei!!!
já vi alguma coisa, mas não desse jeito!!
excelente post!!!!
Só não falo que você é o CARA porque fica chato!

Vlw pelos comentários pessoal!
Voltem sempre! :D

excelente tutorial
mas como faz para que essa opção de idioma funcione para todo o resto do programa?

Basta criar um ResourceBundle estático e sempre que precisar de um valor internacionalizado utilize ele…

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