// 
//     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[]



. Na janela Propriedades, marque a caixa de seleção na propriedade Automatic Internationalization.

image::images/properties.png[]



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



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



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



. 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`` 


. Digite  ``Localizar:``  no campo Valor.


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



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


. 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"]
--



. Pressione Ctrl-S para salvar suas edições.


. Selecione a guia  ``FindDialog.java``  para exibir o form que você está internacionalizando.


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


. 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"]
--



. Clique em OK.


. 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"]
--



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


. Clique em Próximo.


. 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"]
--



. Clique em Próximo.


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


. 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"]
--



. 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`` .



. Clique em Selecionar para selecionar um arquivo de propriedades particular ou crie um novo.


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


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


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



. Role pelo código-fonte e localize o método principal.


. 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);
            }
        });
               }
----


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


. 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).


. 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`` .


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



. 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+]
