Swingユーザーインタフェースによる「国際化」
7754 ワード
国際化は、プログラムに十分な柔軟性をもたらし、世界のどの地域でも実行できるプロセスです.国際化が要求する必然的な結果は地方化である――一つのプログラムを特定の地域で実行できる過程である.Javaユーザーインタフェースのローカライズを簡単な例で実証しようとした.Java言語カーネルはUnicode 3.0(Java 1.4)に基づいて異なる国と異なる言語の文字に対する内部サポートを提供し、先天的な理由でJavaの国際化に対するサポートはC/C++よりはるかに優れている.私から見れば、ローカライズは以下の3つの条件を満たさなければならない:1、プログラムはローカライズされたテキストを読み書き操作しなければならない.2、プログラムは、日付と時間を表示したり、数字をフォーマットしたり、サブストリングをソートしたりする際に、地方の習慣に合わなければならない.(java.textパッケージの中のクラスでこれらの要求を実現できます)3、すべてのユーザーが表示できるテキストは、プログラムに直接書き込むのではなく、実行時に入手できます.(java.utilパッケージのResourceBundleクラスと彼のサブクラスを通じてこれらの要求を実現することができます.)この3つの面でプログラムの国際化を実現することができます.まず地域を調べてみましょう.地域は地理的、政治的、または文化的な地域を表す.Javaでは、地域はjava.util.Localeクラスで表されます.地域は、標準的な小文字のアルファベットコードで表される言語で定義されることが多い.(例:enはイギリスを代表し、frはフランスを代表し、zhは中国を代表する)が、言語が一つの地域を代表できない場合がある.それは言語の後ろに一つの国またはその国の地域(例えば、en_USはアメリカを代表し、zh_TW)を加えなければならない.Localeクラスには、Locale.setDefault()とLocale.getDefault()を使用して設定およびクエリーできる静的デフォルト領域が保存されています.1つのプログラムは、任意の数の非デフォルトのLocaleオブジェクトを生成および使用することができる.Unicode文字コードをもう一度見てみましょう.JavaはUnicodeの文字コードを使用しており、それ自体が国際化への大きな一歩である.Unicodeは、各文字を2バイトで符号化します.u****の形式で表します.Unicodeの文字は、他の符号化された文字に等価であってもよい(例えば、「20」から「7」までの文字は、ASCIIおよびISO 8859−1文字の0 x 20から0 x 7 Eに等価である).本文は主にユーザーインタフェースの地方化で、私が使っているのは資源ビームです!リソースビームについて説明する必要があります.ローカル化されたリソースの束を定義するには、ResourceBundle(リソース束)のサブクラスを生成し、handleGetObject()メソッドとgetKeys()メソッドの定義を提供する必要があります.プログラムでResourceBundleからのローカル化リソースを使用するには、静的getBundle()メソッドを呼び出し、getBundle()でResourceBundleオブジェクトを取得し、getObject()メソッドで名前でリソースを検索する必要があります.もちろん、getString()を使用して、getObject()の戻り値を1つのStringオブジェクトに簡単に割り当てることもできます.GetBundle()メソッドはbasenameを使用します.language_country_variait----見つからなかったら->basename_language_country----見つからなかったら->basename_language----見つからなかったら->basename(デフォルトリソースファイル)のアルゴリズムは適切なリソースを探します.以上が見つからない場合はMissingResourceException異常が放出されます.Javaプログラムのユーザーインタフェースを地方化する方法の簡単な例を見てみましょう.まず、プログラムは特定のLocaleオブジェクトに関連付けられたリソースパッケージを検索する必要があるので、ローカルのデフォルトの地域を取得するためにLocalオブジェクトを定義する必要があります.その後、ResourceBundleのgetBundleメソッドを呼び出し、localeオブジェクトをパラメータとして読み込むことができます.リスト1:
Locale locale = Locale.getDefault();//取得:デフォルト //リソースバンドルを取得します.見つからない場合はMissingResourceException例外が放出されます ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale); リスト1の「Properties.Dorian」は、Propertiesパッケージの下にDorianと命名されたデフォルトのリソースファイルを表します.これでリソースファイルを使用できます!リソースファイルがどのように定義されているかを見てみましょう.
リスト2:
#Dorian.propertiesは、デフォルトの「Dorian」リソースバンドルファイルです.
#中国人として、私は自分の地域をデフォルトとします.
Title=\u4e2d\u56fd; red.label=\u7ea2\u8272; green.label=\u7eff\u8272; blue.label=\u84dd\u8272; リスト3:
#ファイルDorian_en_US.propertiesは、アメリカ地域のリソースビーム#です.デフォルトのリソースビームTitle=Americaをカバーしています. red.label=Red; green.label=Green; blue.label=Blue ; インベントリ1と2は、デフォルトのリソースファイルと、米国地域のリソースファイルを定義します.ここで、等号の左側の文字列はプライマリ・キーを表し、それらは一意です.プライマリ・キーに対応する値を取得するには、ResourceBundleクラスのgetStringメソッドを呼び出し、プライマリ・キーをパラメータとして使用します.また、ファイルの「#」で始まる行はコメント行を表します.リスト2の「u 4 e 2 du 56 fd」は、文字「中国」のUnicode文字コードであることに注意してください.Java独自のnative 2 asciiツール(native 2 ascii in.properties out.properties)を使用して変換されます.これは、プログラムインタフェースで文字化けしが発生しないようにするためです.
リスト4:
cmdRed.setText(bundle.getString("red.label")); cmdBlue.setText (bundle.getString("blue.label")); cmdGreen.setText (bundle.getString("green.label")); リスト2のcmdRed、cmdBlue、cmdGreenはボタンです.bundle.getString(「red.label」)は、リソースファイル内のプライマリ・キーがred.labelである値を取得します.
ここまでJavaプログラムのユーザインタフェースのローカライズは簡単です.ただし、ユーザーインタフェースイベントのイベントリスナーコードを記述する場合は、特に注意してください.次のコードを見てください.
リスト5:
public class MyApplet extends Japplet implements ActionListener{ public void init(){ JButton cancelButton=new JButton(“Cancel”); CancelButton.addActionListener(this); ... } public void actionPerformed(ActionEvent e){ String s=e.getActionCommand(); if(arg.equals(“Cancel”); doCancel(); else …… } }リスト5のコードをローカライズしないと、彼女はうまく動作する可能性があります.しかし、ボタンが中国語にローカライズされると、「Cancel」が「キャンセル」になります.このとき、あなたが見たくない問題が発生します.次の3つの方法で、この潜在的な問題を解消することができます.
1>独立したactionPerformedプログラムを使用せずに内部クラスを使用します.
2>ラベルを使用せずに引用符を使用してコンポーネントを識別します.
3>nameプロパティを使用してコンポーネントを識別
この例の後のコードは、この問題を解消するために最初の方法を採用しています.
インベントリ6:完全なコード
Locale locale = Locale.getDefault();//取得:デフォルト //リソースバンドルを取得します.見つからない場合はMissingResourceException例外が放出されます ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale); リスト1の「Properties.Dorian」は、Propertiesパッケージの下にDorianと命名されたデフォルトのリソースファイルを表します.これでリソースファイルを使用できます!リソースファイルがどのように定義されているかを見てみましょう.
リスト2:
#Dorian.propertiesは、デフォルトの「Dorian」リソースバンドルファイルです.
#中国人として、私は自分の地域をデフォルトとします.
Title=\u4e2d\u56fd; red.label=\u7ea2\u8272; green.label=\u7eff\u8272; blue.label=\u84dd\u8272; リスト3:
#ファイルDorian_en_US.propertiesは、アメリカ地域のリソースビーム#です.デフォルトのリソースビームTitle=Americaをカバーしています. red.label=Red; green.label=Green; blue.label=Blue ; インベントリ1と2は、デフォルトのリソースファイルと、米国地域のリソースファイルを定義します.ここで、等号の左側の文字列はプライマリ・キーを表し、それらは一意です.プライマリ・キーに対応する値を取得するには、ResourceBundleクラスのgetStringメソッドを呼び出し、プライマリ・キーをパラメータとして使用します.また、ファイルの「#」で始まる行はコメント行を表します.リスト2の「u 4 e 2 du 56 fd」は、文字「中国」のUnicode文字コードであることに注意してください.Java独自のnative 2 asciiツール(native 2 ascii in.properties out.properties)を使用して変換されます.これは、プログラムインタフェースで文字化けしが発生しないようにするためです.
リスト4:
cmdRed.setText(bundle.getString("red.label")); cmdBlue.setText (bundle.getString("blue.label")); cmdGreen.setText (bundle.getString("green.label")); リスト2のcmdRed、cmdBlue、cmdGreenはボタンです.bundle.getString(「red.label」)は、リソースファイル内のプライマリ・キーがred.labelである値を取得します.
ここまでJavaプログラムのユーザインタフェースのローカライズは簡単です.ただし、ユーザーインタフェースイベントのイベントリスナーコードを記述する場合は、特に注意してください.次のコードを見てください.
リスト5:
public class MyApplet extends Japplet implements ActionListener{ public void init(){ JButton cancelButton=new JButton(“Cancel”); CancelButton.addActionListener(this); ... } public void actionPerformed(ActionEvent e){ String s=e.getActionCommand(); if(arg.equals(“Cancel”); doCancel(); else …… } }リスト5のコードをローカライズしないと、彼女はうまく動作する可能性があります.しかし、ボタンが中国語にローカライズされると、「Cancel」が「キャンセル」になります.このとき、あなたが見たくない問題が発生します.次の3つの方法で、この潜在的な問題を解消することができます.
1>独立したactionPerformedプログラムを使用せずに内部クラスを使用します.
2>ラベルを使用せずに引用符を使用してコンポーネントを識別します.
3>nameプロパティを使用してコンポーネントを識別
この例の後のコードは、この問題を解消するために最初の方法を採用しています.
インベントリ6:完全なコード
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class MyNative{
public static void main(String[] args){
JFrame frame = new MyNativeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
// Pop the window up.
}
}
class MyNativeFrame extends JFrame{
public MyNativeFrame(){
Locale locale = Locale.getDefault();// :
// 。 MissingResourceException
//"Properties.Dorian" Properties Dorian
ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
setTitle(bundle.getString("Title"));// getString() Title
setSize(WIDTH,HEIGHT); // Set the window size.
panel=new MyNativePanel();
Container contentPane=getContentPane();
contentPane.add(panel);
// *.label Label
panel.setCmdRed(bundle.getString("red.label"));
panel.setCmdBlue(bundle.getString("blue.label"));
panel.setCmdGreen(bundle.getString("green.label"));
}
private MyNativePanel panel;
private static final int WIDTH=400;
private static final int HEIGHT=100;
}
class MyNativePanel extends JPanel{
public MyNativePanel(){
layout=new BorderLayout();
setLayout(layout);
txt=new JTextField(50);
add(txt,layout.CENTER);
cmdRed=new JButton();
cmdBlue=new JButton();
cmdGreen=new JButton();
panel.add(cmdRed);
panel.add(cmdBlue);
panel.add(cmdGreen);
add(panel,layout.SOUTH);
cmdRed.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
txt.setBackground(Color.red);
txt.setText(s);
}
});
cmdBlue.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
txt.setBackground(Color.blue);
txt.setText(s);
}
});
cmdGreen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
txt.setBackground(Color.green);
txt.setText(s);
}
});
}
public void setCmdRed(String s){
cmdRed.setText(s);
}
public void setCmdBlue(String s){
cmdBlue.setText(s);
}
public void setCmdGreen(String s){
cmdGreen.setText(s);
}
JPanel panel=new JPanel();
BorderLayout layout;
private JTextField txt;
private JButton cmdRed,cmdBlue,cmdGreen;
}
//~
:
# Dorian.properties "Dorian" 。
# ,
Title=\u4e2d\u56fd
red.label=\u7ea2\u8272
green.label=\u7eff\u8272
blue.label=\u84dd\u8272
# Dorian_en_US.properties,
#
Title=America
red.label=Red
green.label=Green
blue.label=Blue
# Dorian_zh_CN.properties,
# ,