USJT – 2016 – CCO & SI – PPINT – Práticas de Programação Integrada
Professores:
Calvetti, Élcio, Fúlvio, Hamilton, Liliane e Rodrigo
Aula:
07
Assunto:
Internacionalização em Java.
Conceitos Básicos abordados pelo Professor:
- Bundle;
- ResourceBundle;
- Locale; e
- getString.
Resumo:
Internacionalizar uma aplicação é apresentar todas as informações, fornecidas ao usuário, em um
idioma selecionado.
Para internacionalizar uma aplicação em Java é necessário cumprir as seguintes etapas:
1. Criar um arquivo de configuração, chamado Bundle, para cada idioma/país utilizado, seguindo o
padrão:
<nomearquivo>_<linguagem>_<país>.properties
2. Fazer a carga desses arquivos através da classe:
ResourceBundle
3. Invocar o método getString() da classe ResourceBundle para cada informação que será
apresentada na tela;
4. O conteúdo da aplicação sempre deverá seguir o padrão <chave> = <valor> para cada uma das
informações que serão internacionalizadas. Observar que a chave deverá ser a mesma em toda a
aplicação;
5. Para que a aplicação seja internacionalizada é necessário substituir o valor da informação pela
chamada do método:
getString(“<chave>”)
Ao invés de se colocar um texto fixo, deverá ser feita uma chamada ao método getString(),
informando a chave do arquivo de Bundle que contém o valor que deverá ser apresentado no local;
6. A carga do Bundle será feita com as classes ResourceBundle e Locale;
7. Os arquivos de Bundle devem estar no classpath para que sejam carregados (por exemplo, na pasta
de classes Java).
Exemplo: TelaExemplo.java
import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Locale; import java.util.ResourceBundle; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField;public class TelaExemplo extends JFrame implements ActionListener {
private JButton bt; private JTextField tx; private JLabel rt;
private ResourceBundle bn = null; public TelaExemplo()
{ // Menu simples de escolha de idioma
int op = Integer.parseInt( JOptionPane.showInputDialog(
"Idioma - Language - Langue\n\n1- Português\n2- English\n3- Française\n ")); // Carga dos arquivos de internacionalização
switch(op) {
case 1: bn = ResourceBundle.getBundle("ex1", new Locale("pt", "BR")); break;
case 2: bn = ResourceBundle.getBundle("ex1", Locale.US); break;
case 3: bn = ResourceBundle.getBundle("ex1", Locale.FRANCE); break;
default: bn = ResourceBundle.getBundle("ex1"); break;
}
// Escolhe Layout do conteiner
Container cx = getContentPane(); cx.setLayout(new FlowLayout()); // Instânciação dos objetos
bt = new JButton(bn.getString("tela1.botao.calcular")); rt = new JLabel(bn.getString("tela1.rotulo.valor") + ":"); tx = new JTextField(10);
// Inclusão no container
cx.add(rt); cx.add(tx); cx.add(bt);
// Registro no listener dos objetos controlados
bt.addActionListener(this); // Ajustes finais do frame
setTitle(bn.getString("tela1.titulo")); setSize(193, 104);
setVisible(true); }
// Implementacao do metodo da interface ActionListener
public void actionPerformed(ActionEvent e) { if (tx.getText().length() == 0) { JOptionPane.showMessageDialog( null, bn.getString("mensagem.valor.nulo"), bn.getString("tela1.erro.titulo"), JOptionPane.ERROR_MESSAGE ); } }
public static void main(String args[]) {
TelaExemplo exemplo = new TelaExemplo();
exemplo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
Ex1_pt_BR.properties
tela1.botao.calcular=Calcular tela1.rotulo.valor=Valor tela1.titulo=Exemplo
tela1.erro.titulo=Mensagem de Erro
mensagem.valor.nulo=O campo "valor" não pode ser vazio.
Ex1_en_US.properties
tela1.botao.calcular=Calculate tela1.rotulo.valor=Value tela1.titulo=Example
tela1.erro.titulo=Error Message
mensagem.valor.nulo=The field "value" can not be empty.
Ex1_fr_FR.properties
tela1.botao.calcular=Calculer tela1.rotulo.valor=Valeur tela1.titulo=Exemple
tela1.erro.titulo=Message d'erreur
mensagem.valor.nulo=Le domaine de la "valeur" ne peut pas être vide (by google).
Atividade Prática:
Reescreva o programa das figuras 22.5 e 22.6 do Livro do Deitel (6ª Edição), adaptando a interface com
o usuário do idioma Inglês para os idiomas Português, Inglês, Francês e Italiano. O idioma deverá ser
escolhido pelo usuário através de um novo menu de idiomas, inserido no próprio aplicativo.
// Fig. 22.5: MenuFrame.java // Demonstrando menus. import java.awt.Color; import java.awt.Font; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.ItemListener; import java.awt.event.ItemEvent; import javax.swing.JFrame; import javax.swing.JRadioButtonMenuItem; import javax.swing.JCheckBoxMenuItem; import javax.swing.JOptionPane; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.ButtonGroup; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JMenuBar;
public class MenuFrame extends JFrame {
private final Color colorValues[] =
{ Color.BLACK, Color.BLUE, Color.RED, Color.GREEN };
private JRadioButtonMenuItem colorItems[]; // itens do menu Color
private JRadioButtonMenuItem fonts[]; // itens do menu Font
private JCheckBoxMenuItem styleItems[]; // itens do menu Font Style
private JLabel displayJLabel; // exibe texto de exemplo
private ButtonGroup fontButtonGroup; // gerencia itens do menu Font
private ButtonGroup colorButtonGroup; // gerencia itens do menu Color
private int style; // utilizado para criar estilos de fontes
// construtor sem argumento para configurar a GUI
public MenuFrame() {
super( "Using JMenus" );
JMenu fileMenu = new JMenu( "File" ); // cria o menu File
fileMenu.setMnemonic( 'F' ); // configura o mnemônico como F
// cria item de menu About...
JMenuItem aboutItem = new JMenuItem( "About..." );
aboutItem.setMnemonic( 'A' ); // configura o mnemônico com A
fileMenu.add( aboutItem ); // adiciona o item about ao menu File
aboutItem.addActionListener(
new ActionListener() // classe interna anônima
{
// exibe um diálogo de mensagem quando o usuário seleciona About...
public void actionPerformed( ActionEvent event ) {
JOptionPane.showMessageDialog( MenuFrame.this, "This is an example\nof using menus", "About", JOptionPane.PLAIN_MESSAGE ); } // fim do método actionPerformed
} // fim da classe interna anônima
); // fim da chamada para addActionListener
JMenuItem exitItem = new JMenuItem( "Exit" ); // cria o item exit
exitItem.setMnemonic( 'x' ); // configura o mnemônico como x
fileMenu.add( exitItem ); // adiciona o item exit ao menu File
exitItem.addActionListener(
new ActionListener() // classe interna anônima
{
// termina o aplicativo quando o usuário clica exitItem
public void actionPerformed( ActionEvent event ) {
System.exit( 0 ); // encerra o aplicativo
} // fim do método actionPerformed
} // fim da classe interna anônima
); // fim da chamada para addActionListener
JMenuBar bar = new JMenuBar(); // cria a barra de menus
setJMenuBar( bar ); // adiciona uma barra de menus ao aplicativo
JMenu formatMenu = new JMenu( "Format" ); // cria o menu Format
formatMenu.setMnemonic( 'r' ); // configura o mnemônico como r
// array listando cores de string
String colors[] = { "Black", "Blue", "Red", "Green" }; JMenu colorMenu = new JMenu( "Color" ); // cria o menu Color
colorMenu.setMnemonic( 'C' ); // configura o mnemônico como C
// cria itens do menu Color com botões de opção
colorItems = new JRadioButtonMenuItem[ colors.length ]; colorButtonGroup = new ButtonGroup(); // gerencia cores
ItemHandler itemHandler = new ItemHandler(); // handler para cores
// cria itens do menu Color com botões de opção
for ( int count = 0; count < colors.length; count++ ) {
colorItems[ count ] = new JRadioButtonMenuItem( colors[ count ] ); // cria o item
colorMenu.add( colorItems[ count ] ); // adiciona o item ao menu Color
colorButtonGroup.add( colorItems[ count ] ); // adiciona ao grupo
colorItems[ count ].addActionListener( itemHandler ); } // fim do for
colorItems[ 0 ].setSelected( true ); // seleciona o primeiro item Color
formatMenu.add( colorMenu ); // adiciona o menu Color ao menu Format
formatMenu.addSeparator(); // adiciona um separador no menu
// array listando nomes de fonte
String fontNames[] = { "Serif", "Monospaced", "SansSerif" }; JMenu fontMenu = new JMenu( "Font" ); // cria a fonte do menu
fontMenu.setMnemonic( 'n' ); // configura o mnemônico como n
// cria itens do menu radiobutton para nomes de fonte
fonts = new JRadioButtonMenuItem[ fontNames.length ];
fontButtonGroup = new ButtonGroup(); // gerencia os nomes das fontes
// criar itens do menu Font com botões de opção
for ( int count = 0; count < fonts.length; count++ ) {
fonts[ count ] = new JRadioButtonMenuItem( fontNames[ count ] );
fontMenu.add( fonts[ count ] ); // adiciona fonte ao menu Font
fontButtonGroup.add( fonts[ count ] ); // adiciona ao grupo de botões
fonts[ count ].addActionListener( itemHandler ); // adiciona handler
} // fim do for
fonts[ 0 ].setSelected( true ); // seleciona o primeiro item do menu Font
fontMenu.addSeparator(); // adiciona uma barra separadora ao menu Font
String styleNames[] = { "Bold", "Italic" }; // nomes dos estilos
styleItems = new JCheckBoxMenuItem[ styleNames.length ];
StyleHandler styleHandler = new StyleHandler(); // handler de estilo
// criar itens do menu Style com caixas de seleção
for ( int count = 0; count < styleNames.length; count++ ) {
styleItems[ count ] = new JCheckBoxMenuItem( styleNames[ count ] ); // para estilo
fontMenu.add( styleItems[ count ] ); // adiciona ao menu Font
styleItems[ count ].addItemListener( styleHandler ); // handler
} // fim do for
formatMenu.add( fontMenu ); // adiciona o menu Font ao menu Format
bar.add( formatMenu ); // adiciona o menu Format à barra de menus
// configura o rótulo para exibir texto
displayJLabel = new JLabel( "Sample Text", SwingConstants.CENTER ); displayJLabel.setForeground( colorValues[ 0 ] );
displayJLabel.setFont( new Font( "Serif", Font.PLAIN, 72 ) ); getContentPane().setBackground( Color.CYAN ); // configura o fundo
add( displayJLabel, BorderLayout.CENTER ); // adiciona displayJLabel
// classe interna para tratar eventos de ação dos itens de menu
private class ItemHandler implements ActionListener {
// processa seleções de cor e fonte
public void actionPerformed( ActionEvent event ) {
// processa a seleção de cor
for ( int count = 0; count < colorItems.length; count++ ) {
if ( colorItems[ count ].isSelected() ) {
displayJLabel.setForeground( colorValues[ count ] ); break;
} // fim do if
} // fim do for
// processa a seleção de fonte
for ( int count = 0; count < fonts.length; count++ ) {
if ( event.getSource() == fonts[ count ] ) {
displayJLabel.setFont(
new Font( fonts[ count ].getText(), style, 72 ) ); } // fim do if
} // fim do for
repaint(); // redesenha o aplicativo
} // fim do método actionPerformed
} // fim da classe ItemHandler
// classe interna para tratar eventos dos itens de menu com caixa de seleção
private class StyleHandler implements ItemListener {
// processa seleções de estilo da fonte
public void itemStateChanged( ItemEvent e ) {
style = 0; // inicializa o estilo
// verifica se negrito foi selecionado
if ( styleItems[ 0 ].isSelected() )
style += Font.BOLD; // adiciona negrito ao estilo
// verifica se itálico foi selecionado
if ( styleItems[ 1 ].isSelected() )
style += Font.ITALIC; // adiciona itálico ao estilo
displayJLabel.setFont(
new Font( displayJLabel.getFont().getName(), style, 72 ) ); repaint(); // redesenha o aplicativo
} // fim do método itemStateChanged
} // fim da classe StyleHandler
} // fim da classe MenuFrame
//---
// Fig. 22.6: MenuTest.java // Testando MenuFrame. import javax.swing.JFrame;
public class MenuTest {
public static void main( String args[] ) {
MenuFrame menuFrame = new MenuFrame(); // criar MenuFrame
menuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); menuFrame.setSize( 500, 200 ); // configura o tamanho do frame
menuFrame.setVisible( true ); // exibe o frame
} // fim de main
} // fim da classe MenuTest
/************************************************************************** * (C) Copyright 1992-2005 by Deitel & Associates, Inc. and * * Pearson Education, Inc. All Rights Reserved. * * * * DISCLAIMER: The authors and publisher of this book have used their * * best efforts in preparing the book. These efforts include the * * development, research, and testing of the theories and programs * * to determine their effectiveness. The authors and publisher make * * no warranty of any kind, expressed or implied, with regard to these * * programs or to the documentation contained in these books. The authors * * and publisher shall not be liable in any event for incidental or * * consequential damages in connection with, or arising out of, the * * furnishing, performance, or use of these programs. * *************************************************************************/