前回「Eclipseプラグインを作る(1)」では時計の秒針が動く簡単なプラグインを作成しました。このままでは少し寂しいので、このプラグインにアクションを追加します。さらに、プラグインとして再配布できるようにプラグインの国際化(日本語化)とパッケージ化を行います。
なお、本稿の解説は前回と同様にEclipseのヘルプを参照しながら話を進めていきます。Eclipseには、ヘルプ・サーバという内部サーバ機能が用意されており、Webブラウザからヘルプページを参照することができます。ヘルプ・サーバを利用するためには[ウィンドウ]→[設定]の[ヘルプ]→[ヘルプ・サーバ]設定画面で、[listenするサーバのポート]に“12080”を設定してOKをクリックした後、[ヘルプ]メニューから[ヘルプ目次]を実行して、ヘルプサーバを起動しておいてください。記事中のリンクをクリックするとヘルプページを参照できるようになります(ヘルプ・サーバで参照できる記事中のリンクは< >で囲われています)。
アクションを拡張する
まず、アクションを拡張してみましょう。アクションとは、メニューやボタン、ポップアップメニューから項目を選択して実行することのできる機能単位です。アクションを拡張することで、メニューに独自の項目を追加することができます。
サンプルとして、アナログクロックにストップウオッチモードを追加してみましょう。ストップウオッチには、スタート、ストップ、リセットというアクションが必要です。また、通常の時刻表示に戻すためのアクションも定義しておきましょう。
前回のViewPart1.javaに、いまどのモードかを示すモードフラグと、“start”、“stop”、“reset”、“clock”という4つのメソッドを以下のリストのように実装します。
/** ストップウオッチモードを追加 */ public static final int CLOCK_MODE = 0; public static final int RUNNING_MODE = 1; public static final int STOP_MODE = 2; private int mode = CLOCK_MODE; private long startTime = System.currentTimeMillis(); private long stopTime = startTime; public void start() { startTime = System.currentTimeMillis(); mode = RUNNING_MODE; } public void stop() { stopTime = System.currentTimeMillis(); mode = STOP_MODE; } public void reset() { startTime = stopTime; } public void clock() { mode = CLOCK_MODE; }
そして、これらのモードに対応するために、paintControl()に以下の修正を加えます。
// 現在時刻を取得し、針の角度を算出する Calendar now = new GregorianCalendar(Locale.getDefault()); // ストップウオッチモードだったら、時間を算出して設定する if (mode == RUNNING_MODE) stopTime = now.getTimeInMillis(); if (mode == RUNNING_MODE || mode == STOP_MODE) { now.setTimeInMillis(stopTime - startTime); now.setTimeZone(java.util.TimeZone.getTimeZone("GMT")); }
次に、“start”、“stop”、“reset”、“clock”の各メソッドを呼び出す仕組みを作っていきます。
アクションを実装する
Eclipseプラグインでは、メニューやボタンなどから実行できる動作を「アクション」といいます。アクションを実装するには、<JFaceのActionクラス>を継承し、実行させたい動作を<run()メソッド>でオーバライドしていきます。
例えば、スタートボタンをビューのツールバーに配置するコードは以下のようになります。
void makeActions() { IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager(); { Action action = new Action() { public void run() { start(); } }; action.setText("start"); action.setToolTipText(action.getText()); action.setImageDescriptor( ImageDescriptor.createFromFile(this.getClass(), "start.gif")); toolbar.add(action); } }
このコードを、ビューが生成されるとき(すなわちcreatePartControl()が実行されるとき)から呼び出すようにします(また、筆者はstart.gifという名前の16×16程度のボタンイメージを作成し、このクラスと同じフォルダに置いておきました)。
前回と同様に、ランタイムワークベンチを実行して動作を確認してみましょう。ビューにスタートボタンが表示され、これを押すと0時0分からスタートすることを確認してください。
メモ:拡張ポイント<org.eclipse.ui.actionSets>を利用することで、アクションをメニューやポップアップメニューなどに追加することも可能です。
国際化して日本語を表示させる
ここでプラグインの国際化について言及しておきましょう。プラグインの国際化は、通常のJavaアプリケーションと同様、国際化リソースを用意するだけで容易に実現できるようになっています。
いま、ビューのタイトルは「org.ocharake.matobaa.analogClock.view1」という、長くて見栄えの悪いものになっています。このタイトルはplugin.xmlの拡張(view)のname属性で指定されています。これを、国際化に対応するように設定してみましょう。
まず、plugin.xmlと同じフォルダにplugin.propertiesというファイルを用意し、以下のように記述します。
pluginName = Analog Clock Plugin providerName = Ocharake Programmers Association viewName = Analog Clock
次に、plugin.xmlをマニフェストエディタで開いて、拡張タブの「(view)」と書いてある拡張をクリックします。プロパティビューに、この拡張のプロパティの編集画面が現れるので「name」の部分を、「%viewName」と書き換えます。ついでなので、概要タブの「プラグイン名」「プロバイダー名」も、定義しておいた「%pluginName」および「%providerName」のようにしておきましょう。これで、それぞれの値はプロパティファイルから読み込まれるようになります。
日本語リソースを作成してみましょう。plugin.propertiesファイルと同じフォルダに、plugin_ja.propertiesというファイルを用意し、以下の内容を記述します。
pluginName = アナログクロックプラグイン providerName = おちゃらけプログラマ協会 viewName = アナログ時計
ここで1点注意しなければなりません。このファイルはUnicodeエスケープする必要があります。Unicodeエスケープには「連載:Eclipseを使おう!第1回」でもご紹介した礒部氏が作成したプロパティファイル用エディタプラグインを使うとよいでしょう。保存時に自動的にUnicodeエスケープに変換する機能を提供してくれるので、このプラグインを導入しておくと、プロパティファイルを開いて普通に日本語を入力するだけでよく、非常に便利です。
ファイルを作成できたら、先ほどと同じ要領でランタイムワークベンチを起動してみてください。ビューのタイトルが日本語になっていますか?
ソースコード中に埋め込んだ、“start”や“stop”といった文字列も国際化対応すべきですね。リソース文字列は、自動生成されたAnalogClockPluginクラスのgetResourceStringメソッドで取得できます。これを利用するように書き換えてみましょう。
メニューから[ソース]→[ストリングの外部化]を選択し、外部化したい“start”、“stop”、“reset”、“clock”の各文字列が選択されていることを確認し、[次へ]をクリックします。プロパティファイル名として、AnalogClockPluginResources.propertiesを指定し、その下の[デフォルト置換パターンを使用]のチェックを外したうえで、置換パターンに[AnalogClockPlugin.getResourceString(${key})]と設定し、[次へ]をクリックします。すると確認画面が出てきますので、確認して[終了]をクリックします。
前述のアクションは、自動的に以下のように修正されます。
void makeActions() { IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager(); { Action action = new Action() { public void run() { start(); } }; action.setText(AnalogClockPlugin.getResourceString ("ViewPart1.start_1")); //$NON-NLS-1$ action.setToolTipText(action.getText()); action.setImageDescriptor( ImageDescriptor.createFromFile(this.getClass(), "start.gif"))); toolbar.add(action); } }
リソースファイルとして、同じフォルダにAnalogClockPluginResources.propertiesという名前のファイルが生成されています。このファイルには、もともとの英語メッセージが登録されています。
これを先ほどと同様、日本語化してみましょう。AnalogClockPluginResources.propertiesをAnalogClockPluginResources_ja.propertiesというファイル名でコピーして、メッセージを日本語に直します。
これで日本語化は完了です。先ほどと同様、ランタイムワークベンチを実行してみて、アクションのポップアップメッセージが日本語で表示されることを確認してください。
なお、[実行]→[実行]メニューでランタイムワークベンチの起動構成を複製し、起動パラメータのja_JPをen_USに修正しておけば、英語環境のランタイムワークベンチを起動できます。
i18n、l10nにまつわる話
「国際化」という言葉自体は、ここではいわゆる「グローバリゼーション」ではなく、「インターナショナライゼーション」という概念を指します。すなわち、ロケールに依存する部分をプログラムの外部に切り出しておき、その部分を置き換えることで各国語に対応できるような構造にしておくことをいいます。
各国語用のリソースを用意することは、「ローカライゼーション」という概念です。記事中でいえば、“*_ja.properties”というリソースを用意する作業がこれに当たります。なお、Internationalizationは、iとnの間に18文字あることから、しばしば「i18n」と省略されます。Localizationは同様に「l10n」と書くことがあります。
また、IBMでは、ブラジルポルトガル語(pt_BR)、フランス語(fr)、ドイツ語(de)、イタリア語(it)、日本語(ja)、韓国語(ko)、簡体字中国語(zh-CN)、繁体字中国語(zh-TW)、スペイン語(es)を「Group-1 Languages」と定義しています。Eclipse言語パックにもこれらが含まれています。「国際化対応済み」をうたうのであれば、これにならって、英語を含めた10言語のリソースを用意しておけばよいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.