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行追加するほうがよいでしょう。