Eclipseは、ハードコーディングされた文字列を外部ファイル(*.properties)に外出しするというリファクタリングをすることができます。この機能を使って、Eclipseプラグインの文字列を外部化してみたいと思います。
Eclipseで文字列を外部化する方法は2通りあります。
今回はEclipseプラグイン開発なので、後者の方法でやってみました。サンプルとして、
package nu.mine.kino.plugin.messagesamples; public class Samples1 { public static final String hoge1 = "ほげ1"; public static final String hoge2 = "ほげ2"; }
package nu.mine.kino.plugin.messagesamples; public class Samples2 { public static final String fuga1 = "ふが1"; public static final String fuga2 = "ふが2"; }
という二つのファイルをプラグイン内に作成しておきました。
外部化のやり方は以下の通り:
プロジェクトを選択して、
ソース >> 外部化するストリングの検索
とすると、外部化できるストリングがあるソースコードの一覧がダイアログとしてあがります。
まずはSamples1.javaを選択し、外部化をクリックすると、以下のようなゴテゴテしたダイアログがあがります。
今回は「Eclipseのストリング外部化機構」を使用するので、「Eclipseのストリング外部化機構を使用する」にチェックを入れます。
また、その他の項目は以下の通りとしました。
ほげ1 | Sample1_HOGE1 |
ほげ2 | Sample1_HOGE2 |
チェック | 外部化 | 外部化する |
× | 無視 | 以後無視するよう、//$NON-NLS-1$ をつける |
×' | 内部化 | //$NON-NLS-1$ をはずすもしくはなにもしない |
結局のところ以下のような状態になりました。
あとは次へ次へで完成です。生成、変更されたソースコードは以下の通りです。
・Samples1クラス
package nu.mine.kino.plugin.messagesamples; public class Samples1 { public static final String hoge1 = Messages.Sample1_HOGE1; <-変更 public static final String hoge2 = Messages.Sample1_HOGE2; <-変更 }
・messages.properties
Sample1_HOGE1=ほげ1 <-実際はascii文字 Sample1_HOGE2=ほげ2 <-実際はascii文字
・Messagesクラス
package nu.mine.kino.plugin.messagesamples; import org.eclipse.osgi.util.NLS; public class Messages extends NLS { private static final String BUNDLE_NAME = "nu.mine.kino.plugin.messagesamples.messages"; //$NON-NLS-1$ private Messages() { } static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); } public static String Sample1_HOGE1; public static String Sample1_HOGE2; }
以上で外部化が完了しました。以後、"ほげ1" という文字列を使用したい箇所にはMessages.Sample1_HOGE1と書けばよいわけです。
次に、Samples2クラスをやってみます。先のダイアログでSamples2.javaを選択し、ゴテゴテしたダイアログを出します。そこで「ふが2」に対して、無視を選択し、次へ次へで終了します。生成されたコードは以下の通りです。
・Samples2クラス
package nu.mine.kino.plugin.messagesamples; public class Samples2 { public static final String fuga1 = Messages.Samples2_FUGA1; public static final String fuga2 = "ふが2"; //$NON-NLS-1$ }
・messages.properties
Sample1_HOGE1=ほげ1 Sample1_HOGE2=ほげ2 Samples2_FUGA1=ふが1
・Messagesクラス
package nu.mine.kino.plugin.messagesamples; import org.eclipse.osgi.util.NLS; public class Messages extends NLS { private static final String BUNDLE_NAME = "nu.mine.kino.plugin.messagesamples.messages"; //$NON-NLS-1$ private Messages() { } static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); } public static String Sample1_HOGE1; public static String Sample1_HOGE2; public static String Samples2_FUGA1; }
このように「無視」を選択した文字列については、今後このストリング外部化ではこの文字列は無視してね、という意味の //$NON-NLS-1$ が付与されます。以後、外部化をやってもこれは無視されます。でも無視されちゃうと、やっぱり外部化しようと思ったときにちょっと困るわけですが、どうもプロジェクトを選択して全体で外部化文字列を探すと無視されちゃうけど、明示的にそのソースを選択して外部化をすると、一応出てくるみたいです。また、ゴテゴテしたダイアログでフィルタをかけて非表示にすることもできるみたいですね。
以上で完了です。これは国際化とかするときにむちゃくちゃ便利そうです。自分らでStringを外部化しよーってゴリゴリやるのはアホくさいけど、これならやる気になりますねえ。
外部化文字列にはプレースホルダを使用することができます。Pluginクラスに以下のメソッドを追加します。
public void exe() { String foo = "こんにちは {0}さんと {1} さん"; System.out.println(foo); }
この文字列を外部化します。messages.propertiesには
MessagesamplesPlugin_HELLO=こんにちは {0}さんと {1} さん
が追加されました。上のメソッドはfooが外部化されましたが、さらに以下のようにプレースホルダを使用するよう変更しました。
public void exe() { String foo = Messages.MessagesamplesPlugin_HELLO; System.out.println(NLS.bind(foo, new String[] { "AAA", "BBB" })); }
テストクラスを作って、このメソッドを呼び出してみます。実行結果は以下の通り。
こんにちは AAAさんと BBB さん
たしかに{0},{1}が置換されました。
って書いてて思ったんですが、これ別に外部化の話と関係なかったですね。
さてキー値はルールを考えておいた方が良さそうです。つっても、
くらいですかね。Eclipseのソースをちょこっと見てみましたが、Eclipseも上の考え方でやってるところと、とくに接頭文字を指定してないところ両方あるみたいです。
でもプラグインの国際化とかを考えると、Pluginクラス*1のディレクトリに一個おいて、プラグイン内全てで共有するってやり方もあるみたいですね。
この記事は
現在のアクセス:24406