Eclipse RCP アプリケーションを国際化する

UI で複数言語を容易にサポートする方法

Eclipse の RCP (Rich Client Platform) はソフトウェア開発で広く受け入れられつつあります。多国籍企業では、世界中の顧客のために複数言語をサポートするソフトウェアを提供することがますます重要になってきています。この記事では RCP アプリケーションの UI 要素を国際化する方法を学びます。UI 要素の例として、ウィンドウ、メニュー、ツールバー、ダイアログ、ウェルカム・ページ、スプラッシュ・スクリーン、そして Eclipse の標準的な UI 要素を取り上げます。またサンプルの Hello World アプリケーションをとおして、国際化のためのプロセスを学びます。

Wei Wang, Staff Software Engineer, IBM

Wei WangWei Wang は IBM China Software Development Lab のソフトウェア・エンジニアです。彼はパーベイシブ・コンピューティングのクライアント技術を中心とする業務行っています。



Yuan Yao Deng, Software Engineer, IBM

Yuan Yao Deng は ECM ウィジェットの開発者です。彼は Eclipse での開発に 5 年以上の経験があります。



2009年 7月 07日

はじめに

Eclipse の RCP (Rich Client Platform) には、迅速な開発、実際と同じルック・アンド・フィール、拡張性、そして複数プラットフォームのサポートなど、多くのメリットがあります。このため、多くの企業がソフトウェアの開発に RCP を採用するようになっています。多国籍企業では、世界中の顧客に販売するために、複数言語をサポートするソフトウェアを提供することがますます重要になってきています。国際化は RCP ソフトウェア開発の重要な部分です。RCP アプリケーションの UI を国際化する方法を、Hello World のサンプルを使って学びましょう。


サンプル・アプリケーション

この記事では例として、いくつかの単純な機能を持つ Hello World アプリケーションを国際化します。図 1 は、この Hello World アプリケーションのメインの UI を示しています。

図 1. Hello World RCP アプリケーション
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.nameabout.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 Worldos-eclipse-globalrcp-HelloWorld.zip161KB

参考文献

学ぶために

  • リッチ・クライアント・アプリケーションを作成するために必要なプラグインの最小セット、Eclipse RCP の詳細について学んでください。
  • Eclipse RCP のチュートリアルを読んでください。このチュートリアルでは、初めての RCP アプリケーションを作成するための方法、コマンド、ビュー、エディター、ダイアログの操作方法、設定ページの使い方、外部 JAR の使い方、製品の作成方法とブランド化、そして RCP アプリケーションにヘルプを追加する方法などを学ぶことができます。
  • ISO 639.2 (Codes for the Representation of Names of Languages: 言語の名前を表現するコード)、そして国名とコード要素に関する ISO 3166-1 とそれに対応する ISO 3166-1-alpha-2 コード要素について学んでください。
  • Globalize your On Demand Business」は IBM が国際的なマーケットでの競争をどのように重視しているかを解説しています。
  • Eclipse の推奨読み物リスト」を調べてみてください。
  • developerWorks には他にも Eclipse に関する資料が豊富に用意されています。
  • developerWorks を Twitter でフォローしてください。
  • Eclipse が初めての人は、developerWorks の記事「Eclipse Platform 入門」を読んでください。Eclipse の起源やアーキテクチャー、またプラグインを使って Eclipse を拡張する方法などを学ぶことができます。
  • IBM developerWorks の Eclipse project resources を利用して Eclipse のスキルを磨いてください。
  • developerWorks podcasts ではソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。
  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。

製品や技術を入手するために

議論するために

  • Eclipse に関する質問を議論するための最初の場所として、Eclipse Platform newsgroups があります (このリンクをクリックすると、デフォルトの Usenet ニュース・リーダー・アプリケーションが起動し、eclipse.platform が開きます)。
  • Eclipse newsgroupsには、Eclipse を利用し、拡張することに関心を持つ人達のために、さまざまなリソースが用意されています。
  • developerWorks blogs から developerWorks のコミュニティーに加わってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=418066
ArticleTitle=Eclipse RCP アプリケーションを国際化する
publish-date=07072009