リソースのパッケージ化
ここまでの説明では、リソースの言語として既定の言語を 1 つだけ使用する場合を想定していました。今度は、より複雑なシナリオとして、複数のカルチャのリソースのセットが同時に存在する場合について説明します。これにより、複数のカルチャで動作する単一のアプリケーションを構築できます。言い換えると、実行時にユーザーのカルチャを検出して適切なリソースを読み込むことによって、アプリケーションを個々のユーザーの環境に対応させることができます。このアプローチでは、アプリケーション全体を新たにコンパイルして配布する必要なく、リソースを変更することもできます。つまり、文字列を更新したり、新しいカルチャを追加したりできます。この方法は、リソースが共有ディレクトリに置かれている場合に特に便利であり、変更は複数のユーザーに自動的に反映されます。
このチュートリアルに含まれている 2 つのローカライズ サンプル アプリケーション (WorldCalc および Graphic) は、プライベートなサテライト アセンブリを使用します。プライベートとは、グローバル アセンブリ キャッシュ (GAC) に格納されないということです。サテライトとは、アプリケーション コードが含まれる別のメイン アセンブリと一緒に動作する、リソース専用のアセンブリ (または DLL) であることを意味します。メイン アセンブリには、特定のローカライズされたリソースが存在しないときに使用される既定のリソース、つまりニュートラル カルチャ リソースも含まれます。メイン アセンブリのリソースは、.resources ファイル内のアプリケーション ディレクトリに格納され、コンパイラによってアセンブリに埋め込まれます。これらのリソースは、アセンブリ生成ツール (AL) を使用して後から埋め込むこともできます。
メモ AL の詳細については、「付録 B : リソース ツール」を参照してください。
リソース アセンブリを共有する場合、つまりリソース アセンブリを GAC に格納し、複数のアプリケーションで使用できるようにする場合は、追加のキーとバージョン情報を指定することにより、それらのアセンブリに厳密な名前を付ける必要があります。また、SatelliteContractVersionAttribute 属性を追加すると、メイン アセンブリに依存しないバージョンのサテライト リソース アセンブリを、構成ポリシー ファイルを使用せずに作成できます。厳密な名前を持つアセンブリの詳細については、「.NET Framework アプリケーションのパッケージ化と配置」を参照してください。
これらの各アプリケーションを調査するときは、アプリケーション ディレクトリの下にある一連のサブディレクトリに注意してください。各サブディレクトリにはカルチャ タグに対応する名前が付き、生のリソース情報および対応するサテライト アセンブリ (ビルドされている場合) が格納されます。このレイアウトは、2 つの重要な点を示しています。第一に、1 つのアセンブリには、単一のカルチャのリソースだけを含めることができます。第二に、各カルチャのリソースは、カルチャのタグに基づく名前の個々のサブディレクトリに格納されます。
文字列 - 文字列のローカリゼーションは、WorldCalc サンプルによって説明されています。文字列は、アプリケーション ディレクトリ内の MyStrings.txt という名前のファイル (既定値の英語に対応) と、2 つのローカライズされたカルチャ (ドイツ語の de、スイスのドイツ語の de-CH に対応) に、名前と値のペアとして格納されます。
WorldCalc サンプル アプリケーションのビルド処理 (Build.bat) によって実行される手順を次に示します (実際の Build.bat ファイルよりも論理的に編成してあります)。
math.dll コンポーネントと parser.dll コンポーネントをビルドします。
csc ... math.cs csc ... parser.cs
Resgen.exe を使用して、既定の .resources ファイルと、ローカライズされたすべての .resources ファイルをビルドします。
resgen MyStrings.txt MyStrings.resources resgen MyStrings.de.txt MyStrings.de.resources resgen MyStrings.de-CH.txt MyStrings.de-CH.resources
AL を使用してサテライト アセンブリを作成し、リソースを埋め込み (またはリンクし)、カルチャを設定します。
al /out:WorldCalc.Resources.Dll /v:1.0.0.0 /c:de /embed:MyStrings.de.resources,MyStrings.de.resources,Private al /out:WorldCalc.Resources.Dll /v:1.0.0.0 /c:de-CH /embed:MyStrings.de-CH.resources,MyStrings.de-CH.resources,Private
**メモ **カルチャ文字列では、大文字と小文字は区別されません。
アプリケーション自体をコンパイルし、/res スイッチを使用して既定のリソースをリンクします。
csc ... /target:winexe ... /addmodule:parser.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll /r:System.dll /r:math\math.dll /res:MyStrings.resources WorldCalc.cs
Visual Basic では次のようになります。
vbc ... /target:winexe ... /addmodule:parser.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll /r:System.dll /r:math\math.dll /res:MyStrings.resources WorldCalc.vb
これ以降、別のカルチャを追加するために必要な手順は、リソースを含む適切なテキスト ファイルを作成し、手順 2. と手順 3. を繰り返すことだけです。
イメージ - イメージのローカリゼーションは、Graphic サンプルによって説明されています。このサンプル アプリケーションのビルド処理は WorldCalc のプロセスに似ていますが、イメージを .resx ファイルに変換する手順が 1 つ追加されます。
resxgen /i:un.jpg /o:Images.resx /n:flag
cd en
resxgen /i:en.jpg /o:Images.en.resx /n:flag
cd ..\en-au
...
参照
コードによるリソースの取得 | リソースのまとめ | 付録 A : リソースに関する追加情報 | 付録 B : リソース ツール