サテライトアセンブリを使う場合、
ResourceManager は「カルチャ」に従って、
各サテライトアセンブリを検索する。

例えば、スレッドのカルチャが「ja-JP」の場合、
まずは「ja-JP」のサテライトアセンブリを探す。
見つかればそのサテライトアセンブリを読み込む。

もし見つからない場合、フォールバックが行われ、
「ja」のサテライトアセンブリが検索される。
それも見つからなかった場合は、
メインのアセンブリに含まれるリソースが読み込まれる。
つまり、メインのアセンブリは「既定のリソース」となる。

サテライトアセンブリは、独立したアセンブリなので、
メインのアセンブリと別に保守・開発を行うことができる。

これは、大規模プロジェクト等では便利な機能だが、
サテライトアセンブリを作るために、幾つかの手順が必要で、
コマンドラインツールを利用する必要もあり、少し面倒だ。

今日はコードやリソースがそれほど大きくないので、
1 つのプロジェクトの中で全て管理し、
メインとサテライトアセンブリを同時に生成する方法を使う。

ではやってみよう。

まず、日本語のリソースを用意する。
一昨日作ったリソースファイルは日本語なので、
これをサテライトアセンブリ用に名前を変更しよう。

本来の拡張子の前にカルチャの拡張子を追加する。
これは、「ja-JP」用のリソースなので、
「ByteSizeColumn.ja-JP.resx」という名前に変更する。

日本語の場合、言語「ja」に対応する国が「JP」のみなので、
「ByteSizeColumn.ja.resx」としても良い。
この場合、将来「ja-XX」などのカルチャができた場合でも、このリソースは読み込まれることになる。

そして、改めて「ByteSizeColumn.resx」を作る。
これには「既定のリソース」を格納しておく。
まあ、文字列なら英語等を入れておくと良いか。

では、「ByteSizeColumn.resx」には、
以下のように登録することにしよう。

title: 「Byte Size」
description: 「File size in bytes.」
size: 「10」(System.UInt32)

また、次の作業は特に不要だが、参考までに書いておくと、
「ByteSizeColumn.ja-JP.resx」から、
同じ値である size のエントリを削除しても構わない。

リソースのフォールバックは、エントリ毎に行われるので、
ja-JP のサテライトアセンブリが見つかっても、
指定のエントリが見つからなかった場合は、
フォールバックが発生して引き続き検索してくれるからだ。

さて、ビルドしてみよう。

ビルドすると、LoaferShellEx.dll ができる以外に、
ja-JP/LoaferShellEx.resources.dll ができている。
後者がサテライトアセンブリと呼ばれ、
ja-JP のリソースはこちらに格納されている。

サテライトアセンブリは、カルチャ名のフォルダに保存され、
ファイル名は、メインのアセンブリの名前に
resources.dll を追加したものと決められている。
ファイル名が示すとおり、こちらにはロジックは含まれない。

IDE からビルドした場合、リソースとなるファイルの、
後ろから 2 つ目にある拡張子がカルチャを表す場合、
そのカルチャ用のサテライトアセンブリを作成し、
そちらの方に追加してくれるのだ。

ではエクスプローラの詳細表示をしてみよう。
うん、日本語になっている。

次に、エクスプローラを殺し、
日本語のサテライトアセンブリをリネームして、
再度エクスプローラを表示する。
よし、英語で表示された。

このように、サテライトアセンブリを分けることで、
各国版に依存するファイルを別に配布することができるのだ。

.NET のフレームワーク自身もこの方法で多言語化している。
Windows フォルダの下にある、
Microsoft.NET\Framework\v1.1.4322 には、
「JA」フォルダが入っているが、
これは、日本語用のサテライトアセンブリなのだ。