Next: C#, Previous: Smalltalk, Up: List of Programming Languages [Contents][Index]
java、java2
java
"abc"
_("abc")
GettextResource.gettext、GettextResource.ngettext、GettextResource.pgettext、GettextResource.npgettext
—
かわりにResourceBundle.getResourceを使用してください
—
かわりにCLASSPATHを使用してください
自動
—
—
Java specific message catalog formatを使用してください
xgettext -k_
MessageFormat.format "{1,number} {0,number}"
完全な可搬性がある
—
文字列をインターナショナライズ可能とマークする前に、文字列結合演算子を使って、MessageFormatアプリケーションで変換が必要な文字列を結合してください。たとえば"file
"+filename+" not found"は、MessageFormat.format("file {0} not found",
new Object[] { filename })となります。これを行った後のみ、文字列をマークして抽出することが可能になります。
GNU gettextはJava
本来がもつ、ResourceBundleという名前のインターナショナリゼーションのメカニズムを使います。ResourceBundleには、.propertiesと.classという、2つのファイル
フォーマットがあります。.propertiesファイルは、POファイルのように翻訳者が直接編集できるテキスト形式ですが、plural
formをサポートしません。.classは、.javaのソースコードからコンパイルされた形式で、plural
formをサポートします(適切なAPIを通じてのアクセスが提供されています。以下を参照してください)。
POファイルを.propertiesファイルに変換するためには、msgcatプログラムの
--properties-outputオプションを使うことができます。逆に.propertiesファイルをPOファイルに変換するには、msgcatプログラムの--properties-inputオプションを使うことができます。POファイルを扱うすべてのツールは、--properties-inputおよび/または--properties-outputオプションにより、.propertiesも同様に取り扱うことができます。
POファイルをResourceBundle
classに変換するためには、msgfmtプログラムの、--java(または--java2)オプションを使うことができます。逆にResourceBundleをPOファイルに変換するためには、msgunfmtの--javaオプションを使うことができます。
プログラムからResourceBundleにアクセスするために、異なる2つのAPIを使うことができます。これら2つのAPIは、ResourceBundleがGNU
gettextにより生成されたものであるか、それともこれ以外の.classや.propertiesファイルであるかによらず、すべての種類のResourceBundleを扱えることに注意してください。
java.util.ResourceBundle API
特徴は、これのgetString関数が、翻訳された文字列を戻すことです。翻訳がない場合には、MissingResourceExceptionが発生することに注意してください。
これは、標準のAPIに採用されるためには有利な特徴といえます。さらに、このAPIは追加のライブラリーを必要とせず、msgcatによって生成された.propertiesファイルか、msgfmtによって生成された.classファイルだけが必要です。しかし、このAPIはpluralを処理できず、それはpluralを処理するPOファイルからmsgfmtで生成されたリソースの場合も同様です。
gnu.gettext.GettextResource API
javadoc2 directoryに、Javadoc 1.1 style formatのReference documentation があります。
このAPIのgettext関数は、翻訳された文字列を戻します。翻訳がない場合には、msgidが変更されずに戻されることに注意してください。
このAPIの有利な点は、pluralを処理するngettext関数があること、そして特定のcontextにたいする制約をもつ文字列を処理するpgettextとnpgettextのある点です。
このAPIを使うために必要なのは、GNU
gettextパッケージの一部であるlibintl.jarだけで、これはLGPLのもとで配布されています。
2番目のAPIを使うための例としては、examplesディレクトリーの、hello-java、hello-java-awt、hello-java-swing、hello-java-qtjambiが利用できます。
ではAPIの使い方と、‘getString’の略記をしてみましょう。以下の3つの用法から選択することができましょう:
ResourceBundleのインスタンスを保持するstaticな変数を定義する場合、以下のような略記を定義します:
private static ResourceBundle myResources =
ResourceBundle.getBundle("domain-name");
public static String _(String s) {
return myResources.getString(s);
}
そして、インターナショナライズする文字列を含むすべてのクラスに、以下の宣言を含めます
import static Util._;
これで以下のようにして略記を使うことができます:
System.out.println(_("Operation completed."));
ResourceBundleのインスタンスを保持するstaticな変数を定義する場合、以下のような略記を定義します:
public static ResourceBundle myResources =
ResourceBundle.getBundle("domain-name");
そして、インターナショナライズする文字列を含むすべてのクラスに、以下の宣言を含めます
private static ResourceBundle res = Util.myResources;
private static String _(String s) { return res.getString(s); }
これで以下のようにして略記を使うことができます:
System.out.println(_("Operation completed."));
public class S {
public static ResourceBundle myResources =
ResourceBundle.getBundle("domain-name");
public static String _(String s) {
return myResources.getString(s);
}
}
これで以下のようにして略記を使うことができます:
System.out.println(S._("Operation completed."));
3つの用法のどれを選ぶかは、あなたのプロジェクトがJava 1.5より前のバージョンにたいする互換性を必要とするかに依存します。もしその必要がある場合には、プロジェクトのすべてのクラスに1文字のクラスを追加するより、すべてのクラスに2行追加するほうがよいでしょう。