Next: gawk, Previous: Java, Up: List of Programming Languages [Contents][Index]
pnet、pnetlib 0.6.2以降、またはmono 0.29以降
cs
"abc"
, @"abc"
_("abc")
GettextResourceManager.GetString
,
GettextResourceManager.GetPluralString
GettextResourceManager.GetParticularString
GettextResourceManager.GetParticularPluralString
new GettextResourceManager(domain)
—
実行可能ファイルを含むディレクトリーのサブディレクトリーにコンパイルされたmessage catalogが配置されます
自動
—
—
C# specific message catalog formatを使用してください
xgettext -k_
String.Format "{1} {0}"
完全な可搬性がある
—
文字列をインターナショナライズ可能とマークする前に、文字列結合演算子を使って、String.Format
呼び出しで変換が必要な文字列を結合してください。たとえば"file
"+filename+" not found"
は、String.Format("file {0} not found",
filename)
となります。これを行った後のみ、文字列をマークして抽出することが可能になります。
GNU
gettextは、ResourceManager
およびResourceSet
という名前の、C#/.NET本来のインターナショナリゼーション
メカニズムを使います。アプリケーションはResourceManager
のメソッドを使って、母国語に翻訳された文字列を取得します。メッセージカタログファイルをインメモリーに展開したものが、ResourceSet
のインスタンスです。ResourceManager
は、翻訳を検索する必要が生じると、ResourceSet
のインスタンスをロード・アクセスします。
C#のランタイムが直接ロードできるResourceSet
には、.resources
ファイル、および.dll
ファイルという、2つの形式があります:
.resources
の形式はバイナリーのファイルで、通常はresgen
またはmonoresgen
ユーティリティーにより生成され、この形式はplural
formをサポートしません。.resources
は、.NETの.exe
ファイルに埋め込むこともできます。これは、メッセージカタログをロードするためにファイルシステムにアクセスするかどうかに影響を及ぼすだけで、メッセージカタログの内容には影響しません。
.dll
の形式は、ソースコードの.cs
からコンパイルされたバイナリーファイルで、plural
formをサポートします(これは以下で記述するように、GNU gettext APIを通じてアクセスすることにより提供されます)。
これら
.NETの.dll
や.exe
ファイルは、特定のプラットフォームに限定されたものではないことに注意してください。これらのファイル形式、およびC#のためのGNU
gettextは、任意のプラットフォームで使用できます。
msgfmt
プログラムに‘--csharp-resources’オプションを指定することにより、POファイルを.resources
ファイルに変換できます。また、msgunfmt
プログラムに‘--csharp-resources’オプションを指定することにより、.resources
ファイルからPOファイルに逆変換できます。これらの処理は、resgen
プログラム(pnet
パッケージ)や、monoresgen
プログラム(mono
/mcs
パッケージ)でできる場合もあります。これらのプログラムは、.resources
ファイルからPOファイルへの逆変換もできます。しかし、この文書を記述している時点(2004年1月)では、monoresgen
コンバーターにはバグが多く、resgen
コンバーターはPOファイルのエンコーディングを無視することに注意してください。
msgfmt
プログラムに--csharp
オプションを指定することにより、POファイルを.dll
ファイルに変換できます。GettextResourceSet
(このクラスもResourceSet
のサブクラスです)のサブクラスを含んだ、.dll
ファイルを得ることができます。また、msgunfmt
プログラムに--csharp
オプションを指定することにより、サブクラスGettextResourceSet
を含む.dll
ファイルをPOファイルに逆変換できます。
.resources
形式に比べて、.dll
形式には、以下のような利点があります:
ResourceManager
のコンストラクターをプログラマーが使った場合、アプリケーション用の一連の.resources
ファイルは、アプリケーションのビルド時に指定しなければならず、後から拡張はできません。
.dll
形式のメッセージカタログは、pluralを処理するための関数GetPluralString
をサポートします。一方、.resources
ファイルは、含まれているデータと、単一の文字列にもとづく検索だけをサポートします。
.dll
形式のメッセージカタログは、contextにもとづく問い合わせをおこなうための関数GetParticularString
およびGetParticularPluralString
をサポートします。一方、.resources
ファイルは、含まれているデータと、単一の文字列にもとづく検索だけをサポートします。
GettextResourceManager
は、.dll
形式の中のメッセージカタログのロードと、メッセージ単位でのロードも提供します。たとえばAustrian(de_AT
)のlocaleでは、メッセージがAustrianのメッセージカタログにないときに、German(de
)のメッセージカタログが使用されます。つまり、Austrianの翻訳者は、Germanの翻訳とは異なるいくつかのメッセージだけを、Austrianに翻訳する必要があるということです。一方、.resources
ファイルでは、各メッセージカタログは、それ自身に含まれるすべてのメッセージの翻訳を提供しなければなりません。
GettextResourceManager
は、翻訳が見つからないときはEnglishのmsgidを戻すというフォールバック付きで、.dll
形式のメッセージカタログをロードします。一方、.resources
ファイルでは、その.resources
が言語中立な場合、フォールバックを明示的に提供しなければなりません。
プログラム用のAPIという面では、プログラマーは標準のResourceManager
APIと、GNU
GettextResourceManager
API
のどちらを使うこともできます。前者のResourceManager
のサブクラスが、後者のGettextResourceManager
なので、後者の方が拡張されています。
System.Resources.ResourceManager
API
このAPIは、.resources
形式のリソースにたいして動作します。
ResourceManager
を生成するには、以下のようにします
new ResourceManager(domainname, Assembly.GetExecutingAssembly())
GetString
関数は、文字列にたいする翻訳を戻します。翻訳がない場合はnullが戻されることに注意してください(例:
これはフォールバックのリソースファイルの場合にも適用されます)。
GNU.Gettext.GettextResourceManager
API
このAPIは、.dll
形式のリソースにたいして動作します。
Reference documentationは、csharpdoc directoryにあります。
ResourceManager
を生成するには、以下のようにします
new GettextResourceManager(domainname)
このAPIのGetString
関数は、翻訳された文字列を戻します。翻訳がない場合には、msgidが変更されずに戻されることに注意してください。
GetPluralString
関数は、Cのngettext
関数のように、文字列にたいしてplural処理をした翻訳を戻します。
GetParticularString
関数は、Cのpgettext
関数のように、特定のcontextが指定された文字列の翻訳を戻します。翻訳がない場合には、msgidが変更されずに戻されることに注意してください。
GetParticularPluralString
関数は、Cのnpgettext
関数のように、特定のcontextが指定された文字列にたいして、plural処理をした翻訳を戻します。
このAPIを使うために必要なのは、GNU
gettextパッケージの一部であるGNU.Gettext.dll
だけで、これはLGPLのもとで配布されています。
2つのアプローチをミックスすることもできます:
たとえばGNU.Gettext.GettextResourceManager
コンストラクターは使うが、ResourceManager
型とGetString
メソッドだけを使うような場合です。これはPOファイル用のツールに適合させたいが、ResourceManager
を使う既存のソースコードを変更したくなくて、(まだ)GetPluralString
メソッドが必要ないときには適しているでしょう。
2番目のAPIを使うためには、examplesディレクトリーのhello-csharp
、hello-csharp-forms
の2つの例が利用できます。
ではAPIの使い方と、‘GetString’の略記をしてみましょう。以下の3つの用法から選択することができましょう:
ResourceManager
のインスタンスを保持するstaticな変数を定義する場合は、以下のような略記を定義します:
public static GettextResourceManager MyResourceManager = new GettextResourceManager("domain-name");
そして、インターナショナライズする文字列を含むすべてのクラスに、以下の宣言を含めます
private static GettextResourceManager Res = Util.MyResourceManager; private static String _(String s) { return Res.GetString(s); }
これで以下のようにして略記を使うことができます:
Console.WriteLine(_("Operation completed."));
public class S { public static GettextResourceManager MyResourceManager = new GettextResourceManager("domain-name"); public static String _(String s) { return MyResourceManager.GetString(s); } }
これで以下のようにして略記を使うことができます:
Console.WriteLine(S._("Operation completed."));
2つの用法のどちらを選ぶかは、すべてのクラスに上記の2行をコピーするのがよいか、それともすべてのクラスに1文字のクラスを追加するのがよいかによります。
Next: gawk, Previous: Java, Up: List of Programming Languages [Contents][Index]