// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Internacionalizando um Form de GUI
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Internacionalizando um Form de GUI - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Internacionalizando um Form de GUI

O tutorial a seguir conduz você por algumas das etapas básicas da internacionalização no NetBeans IDE. Nós iremos configurar a internacionalização de um form e depois criar esse form. Em seguida, internacionalizaremos todo o projeto, que contém vários forms em alguns pacotes diferentes. Você pode internacionalizar aplicações especificando a internacionalização automática ou usando um assistente especial.

*Duração esperada: 30 minutos*


image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.0 e versão mais recente"]


*Para concluir este tutorial, você precisa dos seguintes recursos e softwares.*

|===
|Software ou Recurso |Versão Necessária 

|link:http://netbeans.org/downloads/index.html[+NetBeans IDE+] |versão 7.0 ou posterior 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 6, 7 ou 8 
|===


== Princípio da Internacionalização

A internacionalização permite que as aplicações sejam adaptadas a vários idiomas e regiões sem exigir alterações de engenharia ou recompilação. Programas de internacionalização permitem que elementos textuais, como mensagens de status e labels de componentes de GUI, sejam armazenados fora do código-fonte e recuperados dinamicamente, em vez de codificados no programa.

Geralmente, as strings internacionalizadas são armazenadas em arquivos de propriedades, na forma de pares chave/valor. A chave é o identificador usado pelo programa para recuperar o texto e o valor é o texto em si. Crie um arquivo de propriedades para cada configuração regional (ou idioma) para o qual o programa for traduzido. As chaves são as mesmas em cada configuração regional - somente as strings são diferentes.

O IDE fornece ferramentas para realizar as seguintes tarefas:

* Inserir strings internacionalizadas à medida que você cria um form GUI ou programa JAVA
* Substituir todas as strings codificadas em um arquivo individual ou grupo de arquivos por strings internacionalizadas


== Internacionalizando um Form de GUI em Tempo de Design

Neste exercício, abriremos o projeto da aplicação Java de demonstração, que contém uma caixa de diálogo Localizar bastante conhecida criada com o GUI Builder. Em seguida, ativaremos a internacionalização automática para o form FindDialog.java. Para testar o form de GUI internacionalizado, adicionaremos uma nova configuração regional ao arquivo de propriedades e executaremos o form em uma configuração regional que não é a default.


=== Abrindo o Projeto de Exemplo

1. Faça download e descompacte o projeto link:https://netbeans.org/files/documents/4/770/InternationalizeDemo.zip[+InternationalizeDemo.zip+] em qualquer lugar no computador.
2. Escolha Arquivo > Abrir Projeto, navegue para o projeto  ``InternationalizeDemo``  extraído na última etapa e clique em Abrir. A pasta do projeto pode estar em uma outra pasta também chamada  ``InternationalizeDemo`` .
3. Expanda Pacotes de Códigos-fonte > Demonstração e clique duas vezes em  ``FindDialog.java`` . O form de exemplo é aberto no GUI Builder.

image::images/finddialog_ai18n.png[]


=== Ativar a Internacionalização Automática

1. Selecione o nó-raiz na janela Navegador (chamado  ``Form FindDialog`` ).

image::images/navigator.png[]


[start=2]
. Na janela Propriedades, marque a caixa de seleção na propriedade Automatic Internationalization.

image::images/properties.png[]


[start=3]
. Clique em Upgrade na caixa de diálogo Upgrade do Formato do Form GUI.

Se a caixa de seleção estiver marcada, o IDE cria o arquivo  ``Bundle.properties``  no pacote  ``demo``  conforme está definido na propriedade  ``Properties Bundle File`` .

image::images/bundle_new.png[]

Se você precisar que o arquivo  ``Bundle.properties``  fique em outro local, poderá clicar no botão de reticências (...) à direita do Arquivo Conjunto de Propriedades e escolher um local ou digitar diretamente o caminho no campo de texto da propriedade.


[start=4]
. Na janela Projetos, clique duas vezes no nó  ``Bundle.properties``  na janela Projetos ou clique com o botão direito do mouse no nó e escolha Editar.

O arquivo de propriedades é aberto no Editor de Código-fonte. Como você pode ver, todas as chaves e os valores apropriados para o form  ``FindDialog.java``  são gerados. (O nome de cada chave é obtido do nome do arquivo de form e do nome de variável do componente). Por exemplo, a chave  ``FindDialog.jLabel1.text``  é gerada para um componente com o nome de variável  ``jLabel1``  colocado no arquivo de form  ``FindDialog`` . O valor  ``jLabel1``  representa a propriedade Text do componente neste exemplo.


[start=5]
. Escolha o arquivo  ``Bundle.properties`` .


=== Internacionalizando Componentes GUI Individuais

Nós agora utilizaremos o GUI Builder para inserir strings internacionalizadas para os JLabels e os JButtons no form.

1. Selecione o componente GUI apropriado (por ex.  ``jLabel1`` ) na área de Design.
2. Na janela Propriedades, clique no botão de reticências (...) da propriedade Text.

*Observação:* você também pode internacionalizar outras propriedades que tenham valor de Strings, como Mnemonic, Accessible Name, Accessible Descriptor e ToolTip.


[start=3]
. O editor de propriedade é alternado para o modo de pacote de recursos. Verifique se o campo Nome do Pacote está definido como  ``demo.Bundle``  e se o campo Chave contém a string  ``FindDialog.jLabel1.text`` 

[start=4]
. Digite  ``Localizar:``  no campo Valor.

[start=5]
. Clique em OK.

Repita as etapas anteriores para todos os componentes para que o form tenha a aparência semelhante à figura a seguir:

[.feature]
--
image::images/finddialog_new_small.png[role="left", link="images/finddialog_new.png"]
--

*Observação:* as etapas de 1 a 5 podem ser realizadas de uma maneira mais simples e rápida. Clique duas vezes em  ``jLabel1``  na view design, altere o texto de  ``jLabel1``  para  ``Localizar:``  e pressione Enter. O resultado é o mesmo das etapas mencionadas acima.

Para fazer com que os componentes tenham a mesma largura, complete as etapas abaixo:

1. Pressione Ctrl -clique em todos os oito JTextFields do form para selecioná-los.
2. Com os JCheckBoxes selecionados, clique com o botão direito do mouse em um deles e escolha Mesmo Tamanho > Mesma Largura no menu pop-up.
3. Aplique as etapas 1-2 para os três jButtons.


=== Adicionando uma Nova Configuração Regional

1. Selecione o nó-raiz na janela Navegador (o nó do  ``Form FindDialog`` ).
2. Na janela Propriedades, clique no botão de reticências (...) da propriedade Design Locale.
3. Na caixa de diálogo, Nova Configuração Regional, escolha  ``es_ES``  na caixa de combinação  ``Configurações Regionais Predefinidas:`` .
4. Clique em OK.

A nova configuração regional aparece abaixo do nó  ``Bundle.properties`` , como mostrado abaixo:

image::images/addlocale_new.png[]


[start=5]
. Na janela Projetos, clique com o botão direito do mouse em  ``Bundle.properties``  e escolha Abrir.

[start=6]
. Traduza mensagens individuais na coluna correspondente da tabela para o novo idioma (por exemplo, espanhol), como mostrado abaixo:

[.feature]
--
image::images/bundles_new_small.png[role="left", link="images/bundles_new.png"]
--


[start=7]
. Pressione Ctrl-S para salvar suas edições.

[start=8]
. Selecione a guia  ``FindDialog.java``  para exibir o form que você está internacionalizando.

[start=9]
. Clique com o botão direito do mouse no nó-raiz da janela Navegador e escolha Recarregar Form (se preferir, pressione Ctrl-R).

[start=10]
. Clique em Salvar na caixa de diálogo Pergunta que é exibida. 
O form é reaberto e a configuração regional Espanhol é carregada no design, como mostrado abaixo:

[.feature]
--
image::images/finddialog_es_new_small.png[role="left", link="images/finddialog_es_new.png"]
--


=== Testando uma Configuração Regional Não Default

1. Na janela Projetos, clique com o botão direito do mouse no projeto InternationalizeDemo e escolha Propriedades.
2. No painel Categorias, selecione o nó Executar.
3. Insira  ``-Duser.language=es -Duser.country=ES``  no campo Opções VM.

[.feature]
--
image::images/prjproperties_small.png[role="left", link="images/prjproperties.png"]
--


[start=4]
. Clique em OK.

[start=5]
. Clique com o botão direito do mouse no nó do projeto InternationalizeDemo e escolha Executar.

O IDE executa a caixa de diálogo  ``FindDialog``  na configuração regional Espanhol, como mostrado abaixo.

[.feature]
--
image::images/run_small.png[role="left", link="images/run.png"]
--


== Internacionalizando um Projeto Inteiro

Em geral, nós temos vários arquivos na configuração regional default e precisamos adaptá-los para que sejam traduzidos em outros idiomas. O Assistente de Internacionalização é a ferramenta perfeita para esta tarefa, pois ele pode internacionalizar vários arquivos de uma vez. Nós mostraremos esta funcionalidade no projeto de exemplos de forms de GUI , que contém o form criado no tutorial link:quickstart-gui.html[+Criando um GUI Swing+].


=== Criando um Projeto de Exemplo

1. Escolha Arquivo > Novo Projeto ou clique no ícone Novo Projeto na barra de ferramentas do IDE.
2. No painel Categorias, selecione o nó Exemplos > Java. No painel Projetos, selecione Exemplos de Forms de GUI. Clique em Próximo.
3. Insira  ``GUIFormExamples``  no campo Nome do Projeto e especifique o local do projeto (por ex.,  ``/space/projects`` ).
4. Clique em Finalizar.

image::images/formexamples.png[]


=== Preparando um Arquivo de Propriedades

1. Escolha Arquivo > Novo arquivo ou clique no ícone Novo Arquivo na barra de ferramentas do IDE.
2. No painel Categorias, selecione o nó Outros e, no painel Tipos de Arquivos, escolha Arquivo de Propriedades. Clique em Próximo.
3. Insira  ``ContactEditor``  no campo Nome do Arquivo.
4. Clique em Procurar e especifique a pasta  ``GUIFormExamples/src/examples``  como a localização do arquivo na caixa de diálogo Procurar Pastas.
5. Clique em Selecionar Pasta.
6. Clique em Finalizar.

O IDE cria o arquivo  ``ContactEditor.properties``  e o abre no Editor de Código-fonte.

Repita as etapas anteriores para criar outro arquivo  ``Antenna.properties`` .

image::images/ceprjprops.png[]


=== Chamando o Assistente de Internacionalização

1. No menu Principal, escolha Ferramentas > Internacionalização > Assistente de Internacionalização.
2. Na primeira página do Assistente, clique em Adicionar Códigos-fonte.
3. Na caixa de diálogo Selecionar Códigos-fonte, expanda os nós  ``Pacotes de Código-fonte``  >  ``exemplos``  e pressione Ctrl+Clique nos arquivos  ``Antenna.java`` ,  ``ContactEditor.java``  e  ``Find.java``  para selecioná-los.
4. Clique em OK.

Os arquivos de código-fonte aparecem na primeira página do assistente, como mostrado abaixo:

[.feature]
--
image::images/i18nwizardone_small.png[role="left", link="images/i18nwizardone.png"]
--


[start=5]
. Para fins de demonstração, selecione  ``examples.Find.``  e clique no botão Remover Código-fonte.

[start=6]
. Clique em Próximo.

[start=7]
. Verifique se o Assistente de Internacionalização oferece os arquivos de propriedades corretos  ``examples.Antenna``  e  ``examples.ContactEditor`` . Caso não ofereça, use o botão Selecionar Recurso para escolher o arquivo de propriedades correto.

[.feature]
--
image::images/i18nwizardtwo_small.png[role="left", link="images/i18nwizardtwo.png"]
--


[start=8]
. Clique em Próximo.

[start=9]
. Pule a página 3 do Assistente, pois você não criará quaisquer campos nem modificará valores adicionais, e clique em Próximo.

[start=10]
. Todas as strings codificadas são exibidas na última etapa do Assistente de internacionalização e é possível decidir quais delas virão do arquivo de propriedades (use a caixa de seleção). Você pode personalizar ainda mais comentários, valores, chaves individuais e o formato de strings substituídas clicando no botão de reticências (...) de uma string.

[.feature]
--
image::images/i18nwizardthree_small.png[role="left", link="images/i18nwizardthree.png"]
--


[start=11]
. Clique em Finalizar.

Agora, que a internacionalização do código-fonte está finalizada, outra configuração regional pode ser <<newlocale,adicionada>> e <<testlocale,testada>>, como mostrado anteriormente.


== Internacionalizando um Único Form

Usar as funcionalidades automáticas do I18n é a maneira mais fácil de internacionalizar um form de GUI. Mas se você não tiver o pacote de atualização instalado, ou se também desejar internacionalizar o código não gerado pelo Editor de form, então a maneira mais adequada é usar a janela Internacionalizar. (Esta funcionalidade funciona com qualquer arquivo  ``.java`` , não apenas com os arquivos criados com o Editor de Form). O próximo exemplo usa a janela Internacionalização, que faz parte da instalação default do Netbeans IDE.

Neste último exercício, nós reutilizaremos o projeto de exemplos de forms de GUI e internacionalizaremos o form Find.java, que foi excluído no exercício anterior. Nós chamaremos a caixa de diálogo Internacionalizar para substituir todas as strings codificadas neste arquivo. Finalmente, percorreremos uma curta demonstração de como inserir uma string internacionalizada no código-fonte ao escrever um programa.


=== Usando a Caixa de Diálogo Internacionalizar

1. Na janela Projetos, selecione  ``Find.java``  e escolha Ferramentas > Internacionalização > Internacionalizar no menu principal.

O IDE mostra a caixa de diálogo Internacionalização e faz um preenchimento prévio da primeira string codificada do código-fonte  ``Find.java`` .


[start=2]
. Clique em Selecionar para selecionar um arquivo de propriedades particular ou crie um novo.

[start=3]
. Na caixa de diálogo Selecionar Pacote de Recursos , digite  ``Find.properties``  no campo de texto Nome do Arquivo, clique em Criar Novo e, em seguida, em OK.

[start=4]
. Você pode modificar o formato da string substituída, a chave, o valor ou o comentário, se necessário. Nós manteremos os valores default.

[start=5]
. Clique em Substituir para confirmar a alteração e mover um foco na próxima string codificada.

Se uma string codificada não precisar ser substituída, clique no botão Ignorar.

[.feature]
--
image::images/i18ndialog_small.png[role="left", link="images/i18ndialog.png"]
--


=== Inserindo uma String Internacionalizada Simples

1. Na janela Projetos, clique com o botão direito do mouse em  ``Find.java``  e escolha Editar.

O IDE abre o arquivo  ``Find.java``  no Editor de Código-fonte.


[start=2]
. Role pelo código-fonte e localize o método principal.

[start=3]
. Insira a seguinte linha em negrito no método principal:

[source,xml]
----

    public static void main(String args[]) {
			   /* Set the Nimbus look and feel */
			   //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            javax.swing.UIManager.LookAndFeelInfo[] installedLookAndFeels=javax.swing.UIManager.getInstalledLookAndFeels();
			for (int idx=0; idx<installedLookAndFeels.length; idx++)
			if ("Nimbus".equals(installedLookAndFeels[idx].getName())) {
			    javax.swing.UIManager.setLookAndFeel(installedLookAndFeels[idx].getClassName());
				break;
			}
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        *System.out.println();*
		/* Create and display the form */ 
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Find().setVisible(true);
            }
        });
               }
----

[start=4]
. Coloque o cursor do mouse em parênteses em  ``System.out.println();``  de forma que uma string internacionalizada seja inserida como um parâmetro.

[start=5]
. Pressione Ctrl-Shift-J para chamar a caixa de diálogo Inserir String Internacionalizada (se preferir, é possível escolher Ferramentas > Internacionalização > Inserir String Internacionalizada no menu principal).

[start=6]
. Para o Nome do Pacote, clique no botão Selecionar, selecione a pasta  ``Pacotes de Código-fonte > exemplos``  e insira  ``Localizar``  como o Nome do pacote no campo de texto Nome do Arquivo. Em seguida, clique em OK. 
O campo Nome do Pacote da caixa de diálogo Inserir String Internacionalizada mostra  ``examples.Find`` .

[start=7]
. Digite  ``Iniciar``  na caixa drop-down Chave e  ``Iniciar caixa de diálogo Localizar``  no campo Valor. Em seguida, clique em OK.

image::images/insi18nstring.png[]


[start=8]
. O IDE insere uma string internacionalizada:

[source,xml]
----

    public static void main(String args[]) {
			   /* Set the Nimbus look and feel */
			   //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            javax.swing.UIManager.LookAndFeelInfo[] installedLookAndFeels=javax.swing.UIManager.getInstalledLookAndFeels();
			for (int idx=0; idx<installedLookAndFeels.length; idx++)
			if ("Nimbus".equals(installedLookAndFeels[idx].getName())) {
			    javax.swing.UIManager.setLookAndFeel(installedLookAndFeels[idx].getClassName());
				break;
			}
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Find.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
*        System.out.println(java.util.ResourceBundle.getBundle("examples/Find").getString("Start"));*
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Find().setVisible(true);
                }
            });
               }
----


link:/about/contact_form.html?to=3&subject=Feedback:Internationalizing%20a%20GUI%20Form%20in%20NetBeans%20IDE[+Enviar Feedback neste Tutorial+]



== Consulte Também

Para obter mais informações, consulte os seguintes links:

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG920[+Implementando GUIs de Java+] em _Desenvolvendo Aplicações com o NetBeans IDE_
* link:../../trails/matisse.html[+Trilha de Aprendizado das Aplicações de GUI do Java+]
* link:quickstart-gui.html[+Criando um GUI do Swing+]
* link:http://wiki.netbeans.org/wiki/view/NetBeansUserFAQ[+FAQ do GUI Builder+]
