レベル: 初級 Wei Wang, Staff Software Engineer, IBM Yuan Yao Deng, Software Engineer, IBM
2009年 7月 07日 Eclipse の RCP (Rich Client Platform) はソフトウェア開発で広く受け入れられつつあります。多国籍企業では、世界中の顧客のために複数言語をサポートするソフトウェアを提供することがますます重要になってきています。この記事では RCP アプリケーションの UI 要素を国際化する方法を学びます。UI 要素の例として、ウィンドウ、メニュー、ツールバー、ダイアログ、ウェルカム・ページ、スプラッシュ・スクリーン、そして Eclipse の標準的な UI 要素を取り上げます。またサンプルの Hello World アプリケーションをとおして、国際化のためのプロセスを学びます。
はじめに
Eclipse の RCP (Rich Client Platform) には、迅速な開発、実際と同じルック・アンド・フィール、拡張性、そして複数プラットフォームのサポートなど、多くのメリットがあります。このため、多くの企業がソフトウェアの開発に RCP を採用するようになっています。多国籍企業では、世界中の顧客に販売するために、複数言語をサポートするソフトウェアを提供することがますます重要になってきています。国際化は RCP ソフトウェア開発の重要な部分です。RCP アプリケーションの UI を国際化する方法を、Hello World のサンプルを使って学びましょう。
サンプル・アプリケーション
この記事では例として、いくつかの単純な機能を持つ Hello World アプリケーションを国際化します。図 1 は、この Hello World アプリケーションのメインの UI を示しています。
図 1. Hello World RCP アプリケーション
File メニューで Say Hello をクリックすると、「Hello! This is a sample!」というメッセージを表示するダイアログが表示されます。このアプリケーションを起動すると、あるいは Help メニューで Welcome をクリックすると、メインの UI にウェルカム・ページが表示され、アプリケーションを紹介するための情報が表示されます。Help メニューで About Hello World をクリックすると、アプリケーションとバージョンに関する情報が表示されます。アプリケーションの機能はこれだけであり、非常に単純です。
この Hello World アプリケーションの作成には Eclipse V3.4.1 を使用しました。また「RCP application with an intro」テンプレートを基に、プラグイン・プロジェクト・ウィザードに従ってアプリケーションを作成しました。ウィザードによる作業を終了した後、コードを少し追加する必要があります。このサンプル・アプリケーションのソース・コードを参照してください。ソース・コードは「ダウンロード」セクションから入手することができます。この記事の焦点は国際化なので、他の機能のコードについての説明は省略します。
Hello World のコーディングを終了した状態では、デフォルトで英語しかサポートされていません。これから、このアプリケーションに多言語のサポートを追加します。国際化が必要な UI 要素には、メニュー、ツールバー、ダイアログ、スプラッシュ・スクリーン、ウェルカム・ページ、プラグインと製品の情報、そして Eclipse の標準的な UI 要素などがあります。
共通リソース・バンドル
他の Java™ アプリケーションの場合と同じように、この RCP アプリケーションのためのリソース・バンドルを作成する必要があります。この例では、リソース・バンドルは helloworld.resource パッケージの中に置かれ、リソースの名前は「custom」です。リソース・バンドルのファイル名は Java のリソース・バンドルの命名規則に従う必要があります (<リソース名>_<言語コード>_<国コード>.properties)。例えば、custom_fr.properties はフランス語用のリソース・バンドルであり、custom_zh_CN.properties は簡体字中国語のリソース・バンドルです。言語コードと国コードの情報については「参考文献」を参照してください。図 2 は、この Hello World アプリケーションのリソース・バンドルを示しています。
図 2. リソース・バンドルの構造
リソース・バンドル・ファイルにはキーと値のペアが含まれています。そのバンドルの中にあるロケール特有のオブジェクトを、キーによって一意に識別します。国際化対象の各 UI 要素に対して、キーと値の 1 つのペアを作成する必要があります。リスト 1 は、英語用の properties ファイルを示しています。
リスト 1. custom_en.properties というリソース・バンドル・ファイルの内容
MAIN_WINDOW_TITLE=Hello World
MENU_FILE=&File
MENU_FILE_SAY_HELLO=Say Hello
MENU_HELP=&Help
DIALOG_TITLE=Hello
DIALOG_MESSAGE=Hello! This is a sample!
|
この時点で、リソース・バンドルを読み取るためのユーティリティーが必要です。リスト 2 に示すように、CustomString クラスには次の 2 つの関数があります。
setBundle はロケールに従ってリソース・バンドル・オブジェクトを初期化します。
getString は指定のキーに対する値を指定された言語で返します。
リスト 2. リソース・バンドルを読み取るためのユーティリティー (CustomString.java)
public class CustomString {
private static final String BUNDLE_NAME = "helloworld.resource.custom";
private static ResourceBundle rb = null;
public static void setBundle(Locale locale) {
try {
rb = ResourceBundle.getBundle(BUNDLE_NAME, locale);
} catch (Exception e) {
rb = ResourceBundle.getBundle(BUNDLE_NAME, Locale.ENGLISH);
}
}
public static String getString(String key) {
try {
String keyValue = new String(rb.getString(key).getBytes(
"ISO-8859-1"), "UTF-8");
return keyValue;
} catch (Exception e) {
return key;
}
}
}
|
リソース・バンドルとユーティリティーが用意できたら、アプリケーションの起動時に使用される言語をアプリケーションに通知します。RCP アプリケーションのエントリーは Application.java です。Application.java では、start() メソッドの中でリソース・バンドルを初期化することをお勧めします。start() メソッドの中では、Locale.getDefault() によってシステムのデフォルトのロケールが返され、返されたロケールは CustomString.setLocale() に渡されます (リスト 3)。アプリケーションはシステム・ロケールを使ってリソース・バンドルを初期化します。
リスト 3. Application.java でロケールを設定する
public Object start(IApplicationContext context) {
CustomString.setLocale(Locale.getDefault());
...
}
|
これで、この共通のリソース・バンドルをアプリケーション全体で利用することができます。次のセクションでは、UI の中でリソース・バンドルを呼び出す方法を説明します。
ツールバー、メニュー、ダイアログ
RCP アプリケーションでは、メニューとツールバーのエントリーはアクションによって表現されます。メニューとツールバーの追加はコードまたは拡張機能によって行います。この記事のサンプルでは、メニューのアクションをコードによって登録します。アクションを定義するクラスの中で、setText() メソッドによってコンストラクター内でアクションのラベルが定義されます。このテキストはメニューのラベルとして表示されます。コードを見るとわかるように、このテキストは英語専用にハードコーディングされています。変更されたコードでは、setText() メソッドの中でリソース・バンドルを使って "Say Hello" を置き換えます。
リスト 4. メニューとツールバーに対する HelloAction.java のアクションのテキストを設定する
public HelloAction(IWorkbenchWindow iworkbenchwindow) {
this.window = iworkbenchwindow;
this.setText("Say Hello");
this.setImageDescriptor(WorkbenchImages.
getImageDescriptor(IWorkbenchGraphicConstants.IMG_VIEW_DEFAULTVIEW_MISC));
// Must setId,otherwise can not leverage Register method
setId("helloworld.actions.HelloAction");
window.getSelectionService().addSelectionListener(this);
}
/**
Modified Code
**/
public HelloAction(IWorkbenchWindow iworkbenchwindow) {
....
this.setText(CustomString.getString("MENU_FILE_SAY_HELLO"));
....
}
|
UI にテキストを表示するコードはダイアログによって異なりますが、国際化の方法は同じです。これと同じ方法を使って、Java コードによって生成される他の UI も国際化することができます。この方法は、メニュー、ツールバー、ダイアログにしか使えないわけではありません。
リスト 5. ダイアログのタイトルとメッセージを設定する
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
"Hello",
"Hello! This is a sample!");
/**
Modified Code
**/
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
CustomString.getString("DIALOG_TITLE"),
CustomString.getString("DIALOG_MESSAGE"));
|
ここまでの段階では、UI の国際化は通常の Java アプリケーションの場合と似ています。次のセクションでは、RCP アプリケーションとしての特徴を導入する方法について説明します。
スプラッシュ・スクリーン
スプラッシュ・スクリーンはアプリケーションのロード中に表示される画像です。スプラッシュ・スクリーンはユーザーに対して、プログラムがロード中であることを知らせると同時に、アプリケーションに関する情報 (製品名や著作権) を表示します。通常、RCP アプリケーションのスプラッシュ・スクリーンには、splash.bmp という名前が付けられ、プラグイン・プロジェクトのルート・フォルダーの下に置かれます。ただし、このアプリケーションの splash.bmp は英語専用のルート・フォルダーの下にあります。多言語アプリケーションのさまざまな言語に応じて異なるスプラッシュ・スクリーンを表示するためには、スプラッシュ・スクリーンのパスに関する規則に従う必要があります。図 3 はその一例を示しています。
プラグイン・プロジェクトのルート・フォルダーの名前を <plugin-root>. splash.bmp にします。このルート・フォルダーは <plugin-root>/nl/<Language Code>/<Country Code> に配置する必要があります。例えば簡体字中国語用のスプラッシュ・スクリーンのファイルの場合には、<plugin-root>/nl/zh/CN に配置する必要があります。
図 3. スプラッシュ・スクリーンのパスの規則
ウェルカム・ページ
ウェルカム・ページ機能は org.eclipse.ui.intro プラグインによって実現します。ウェルカム・ページとして、新しいユーザーに製品を紹介する特別なページを定義することができます。ウェルカム・ページは、ある製品が起動されると最初に表示されるページで、製品の機能に関してユーザーを教育するための手段になります。RCP のウェルカム・ページは紹介用コンテンツ・ファイルとページ・ファイル (HTML、画像、CSS など) から構成されます。
各言語用に 1 つのページ・ファイル・セットがあるかもしれないため、ロケールごとに異なる introContent.xml を使って異なるウェルカム・ページを見つける必要があります。この紹介用コンテンツ・ファイルは plugin.xml によって参照されます。紹介用コンテンツ・ファイルの名前を plugin.xml の中で外部ストリングとして抽象化します。この外部ストリングは properties ファイルに保存され、命名規則は、plugin_<言語コード>_<国コード>.properties です。これらのファイル間の関係を図 4 に示します。
図 4. 国際化されたウェルカム・ページの間の関係
リスト 6 のコード・スニペットは plugin.xml の抜粋です。content 属性の中で、ハードコーディングされた introContent.xml というファイル名の代わりに変数 %welcome.page が使われています。実際のファイル名は properties ファイルの中で指定されており、plugin.xml はロケールに応じて対応するコンテンツ・ファイルを見つけることができます。
リスト 6. plugin.xml のウェルカム・ページ・セクション
<extension
point="org.eclipse.ui.intro.config">
<config
introId="helloworld.intro"
content="%welcome.page"
id="HelloWorld.configId">
<presentation
home-page-id="root">
<implementation
kind="html"
os="win32,linux,macosx">
</implementation>
</presentation>
</config>
</extension>
|
例として中国語を使いましょう。ユーザーが中国語環境で Hello World アプリケーションを起動すると、plugin.xml は中国語の外部ストリング・ファイル plugin_zh_CN.properties を検出し、この properties ファイル内の welcome.page というキーの値に従うファイル名を取得します。ここでは、下記のように中国語のコンテンツ・ファイルとして、welcome/introContent_zh_CN.xml が使われます。
リスト 7. plugin_zh_CN.properties の中の紹介用コンテンツ・ファイルの名前
#Properties file for HelloWorld
Bundle-Name = HelloWorld Plug-in
perspective.name = RCP Perspective
product.name = Hello World
welcome.page=welcome/introContent_zh_CN.xml
|
リスト 8 を見ると、introContent_zh_CN.xml ファイルが HTML フォーマットの中国語のウェルカム・ページを指定する方法がわかります。welcome_zh_CN.html は中国語で製品紹介情報を表示する HTML ファイルです。このアプリケーションを中国語の OS で使用しているユーザーには、中国語のウェルカム・ページが表示されます。
リスト 8. introContent_zh_CN.xml 内で設定されたウェルカム・ページ
<?xml version="1.0" encoding="utf-8" ?>
<introContent>
<page id="root" content="welcome_zh_CN.html"/>
</introContent>
|
プラグインと製品
プラグインや製品の中の情報も国際化することができます (製品名、メイン・ウィンドウのタイトル、About ページのテキストなど)。これらの情報は plugin.xml の中に保存されています。国際化の方法はウェルカム・ページの場合と同じです。国際化に必要なファイルは plugin.xml と plugin.properties のみです。plugin.xml の中のすべての情報は plugin.properties に外部化することができます。
リスト 9. plugin.xml の製品情報セクション
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
application="HelloWorld.application"
name="%product.name">
<property
name="windowImages"
value="icons/alt_window_16.gif,icons/alt_window_32.gif">
</property>
<property
name="appName"
value="%product.name">
</property>
<property
name="aboutText"
value="%about.text">
</property>
</product>
</extension>
|
先ほどの plugin.properties ファイルを使って、product.name と about.text という 2 つのプロパティーを追加します。product.name の値はウィンドウのタイトルと About メニューに表示されます。about.text の値は About ダイアログを開くと表示されます。
リスト 10. plugin.properties
#Properties file for HelloWorld
Bundle-Name = HelloWorld Plug-in
perspective.name = RCP Perspective
welcome.page=welcome/introContent.xml
product.name = Hello World
#About text has multiple line.
about.text=This is HelloWorld\n\
\n\
Version 1.0
|
製品名や About ページのテキストなど、ASCII ではない文字が properties ファイルの中に含まれている場合には、ネイティブのエンコーディングから、Unicode エスケープを使う ASCII へと、properties ファイルを変換する必要があります。この変換には <JDK_HOME>\bin\native2ascii を使用することができます。中国語のリソース・バンドル plugin_zh_CN.properties の場合には、この変換を行う必要があります。変換後の plugin_zh_CN.properties はリスト 11 のようになります。
リスト 11. plugin_zh_CN.properties
#Properties file for HelloWorld
Bundle-Name = HelloWorld Plug-in
perspective.name = RCP Perspective
product.name = \u4f60\u597d
welcome.page=welcome/introContent_zh_CN.xml
about.text=\u8fd9\u662f\u4e00\u4e2a\u4f8b\u5b50\n\
\n\
\u7248\u672c 1.0
|
Eclipse の標準的な UI 要素
Eclipse には、自分で作成したアプリケーション・コードには含まれていない UI 要素がいくつかあります (ウィンドウを最大化、最小化するボタンのツール・チップなど)。このアプリケーションの UI の場合には、これらの UI 要素も国際化する必要があります。幸いなことに、この問題の解決に Eclipse が役立ちます。Eclipse の言語パックをダウンロードし、それを RCP アプリケーションのプラグインのディレクトリーの下に置きます。すると、これらの UI 要素はアプリケーションが起動されるときに自動的に国際化されます。
まとめ
RCP アプリケーションには、さまざまな種類の UI 要素があります。さまざまな手法を使って、さまざまな UI 要素を国際化する必要があります。この記事では国際化 (G11N) の実装例として、ツールバー、メニュー、ダイアログ、スプラッシュ・スクリーン、ウェルカム・ページ、製品情報、そして Eclipse の標準的な UI 要素の国際化について紹介しました。
サンプルの Hello World アプリケーションは非常に機能が限定されていますが、UI 要素の大部分をカバーしています。これで皆さんも、完全に国際化をサポートした UI を RCP アプリケーション用に作成できるはずです。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Hello World | os-eclipse-globalrcp-HelloWorld.zip | 161KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Wei Wang は IBM China Software Development Lab のソフトウェア・エンジニアです。彼はパーベイシブ・コンピューティングのクライアント技術を中心とする業務行っています。 |
 | |  | Yuan Yao Deng は ECM ウィジェットの開発者です。彼は Eclipse での開発に 5 年以上の経験があります。 |
記事の評価
|