2006年06月13日

en-US では resource ja-JP では 資源

今日はちょっと目先を変えてローカリゼーションの話。いや、某掲示板でうっかり名前を消し忘れたのでついでに。ほとぼりも冷めた頃かと思いますし。

.NET Framework では、アプリケーションのグローバリゼーション・リソースのローカリゼーションが比較的簡単に実現できるようになっています。

リソースは、ニュートラルカルチャ用のリソースとそれ以外のローカライズリソースに区分されます。ニュートラルカルチャ用のリソースは、ローカライズリソースが見つからなかった場合に使用されるリソースで、アセンブリに直接埋め込まれます。そして、それ以外のローカライズリソースはサテライトアセンブリとして独立した DLL を構成し、特定のディレクトリに配置されます。

アプリケーションは、ローカライズされるべきリソースは ResourceManager を通して読み込みます。ResourceManager は、自動的に現在のカルチャに相応しいリソースを探してくれます。

カルチャは言語と国の二つで識別され、ja-JP(日本語-日本)とか en-US(英語-アメリカ合衆国)とかいう風になっています。

検索の順番は以下のようになっています(現在のカルチャが ja-JP の場合)。サテライトアセンブリの名前は、基本的に [現在のアセンブリ名].resources.dll という名前で決め撃ちです。

GAC(グローバルアセンブリキャッシュ)にサテライトアセンブリをインストールする事も可能ですが、そんなのは Microsoft 専用と考えて差し支えないでしょう。

  1. 現在のアセンブリのあるディレクトリ中から ja-JP と言う名前のディレクトリを検索します。

  2. ディレクトリが見つかった場合、その中に現在のアセンブリに対応するサテライトアセンブリがあるか確認します。

  3. サテライトアセンブリがあった場合、そのサテライトアセンブリに目的のリソース名を持ったリソースがあるか調べ、見つかればそれで完了です。見つからなかったら次です。

  4. ja-JP のリソースが見つからなかったら、次は ja のリソースを探します。ja-JP の時と同じように、ディレクトリ、サテライトアセンブリ、リソースを確認します。

  5. ja のリソースが見つからなかったら、最終的にニュートラルカルチャ用リソースに含まれるリソースが返されます。

  6. ちなみにニュートラルカルチャ用のリソースにも見つからなかったら例外が投げられますが、そんな事態にならないように注意しましょう。

さて、ここで問題なのが「サテライトアセンブリをどう作るか」でしょう。実のところ、VS を使ってれば普通悩みません。ローカリゼーションは IDE でサポートされており、ちょいちょいとやるだけで実現できます。が、そこはそれ私自身ろくすっぽ VS を使わない身、なんとか手作業で仕上げてみたいものです。

と言う事で以前調べた結果が以下のリストになります。

コンパイル時
  • カルチャとは、** または **-@@ 形式(例:en、ja-JP)。以下 カルチャ名

  • 各カルチャごとに、カルチャ名 のサブディレクトリを作る(例:./ja-JP/)。

  • リソースファイルを key=value の形式で書く。UTF-8(BOMの有無は自由)にする必要がある。

  • resgen リソースファイル リソース名.カルチャ名.resources というコマンドで .resources ファイルを作る。

  • リソース名は、検索対象の既定は対象型の完全限定名(例:HongliangSoft.Samples.Localization)。

  • al /out:対象のアセンブリ名.resources.dll /c:カルチャ名 /embed:.resourcesファイル名 でリソース dll を作る。リソース以外(コードとか)を入れる事はできない。

  • 対象のアセンブリが厳密名を持つ場合、サテライトアセンブリも厳密名を持つ必要がある。この場合 al.exe に渡すオプションに以下を追加する。

    • キーファイルを使って対象アセンブリを署名した場合、 /template:対象のアセンブリ /keyf:対象のアセンブリに使用したキーファイル

    • キーコンテナを使って対象アセンブリを署名した場合、 /template:対象のアセンブリ /keyn:対象のアセンブリに使用したキーコンテナ名

  • 既定のリソースは、アセンブリのコンパイルオプションで直接 /res:リソース名.resources を追加。

使用時
  • System.Resources.ResourceManager を、以下のいずれかで作成する。

    • リソース名と対象アセンブリを指定して作成する。

      例えばリソース名に Locale 、対象アセンブリに LocaleTest.dll(を指す Assembly 型) を指定した場合、検索対象のリソースは LocaleTest.resources.dll 、リソース名は Locale(リソースファイル名では Locale[.カルチャ名].resources)と言う事になる。

    • 型を指定して作成する。対象アセンブリは型から特定され、使用リソースは型の完全限定名を用いる。

      例えば、HongliangSoft.Samples.Localization 型を指定した場合、対象アセンブリはこの型が属するアセンブリ(LocaleTest.exe だとしたら LocaleTest.resources.dll)、使用リソースは HongliangSoft.Samples.Localization(リソースファイル名では HongliangSoft.Samples.Localization[.カルチャ名].resources)になる。

  • ResourceManager の Get... メソッドを使用して値を取得する。

  • リソースの検索順は、**-@@** > 既定のリソース。

  • デフォルトで取得するのは現在のスレッドの CurrentCulture または CurrentUICulture のカルチャのリソース。

  • Get... のオーバーロードを使用したり CurrentCulture を変更する事で他のカルチャリソースにアクセスできる。

  • ResourceManager.GetResourceSet で特定カルチャのリソースを纏めて取得できる。

躓きやすいのはリソースの名前の部分でしょう。私も初めは .resources ファイルの名前に意味があるとは思ってませんでした。いや、必ずしもリソースファイルの名前じゃなくても、al.exe でリソースファイルを指定する時に別の(正しい)名前を与える事はできるんですが。また対象となるアセンブリに署名して厳密名を持たせた場合、サテライトアセンブリも同じ厳密名を持たなければならない点も注意して下さい。そのため第三者が勝手にサテライトアセンブリを作成する事はできないようです。ちょっと不便ですね。

また、ここでは文字列リソースしか扱っていません。.txt ファイルをリソースの元にする限り仕方のない事ですが。それ以外のリソースも含めたいのなら、System.Resources 名前空間の ResourceWriter または ResXResourceWriter を使用して .resources ファイル(または .resx ファイル。この場合あとで resgen しなければならない)をコードから作成しなければなりません。

それから、.NET 2.0 SDK 付属の resgen には、厳密に型指定されたリソースを取得するためのクラスのソースファイルを作成するオプションが指定可能です。非常に便利なので今後リソースにはこれを使っていきたいところ。VS2005 でもこの厳密に型指定されたリソースがサポートされています。

と言ったところの簡単リソース作成講座でした。ちなみに簡単なのは説明であって作成手順的には全然簡単じゃないので、面倒な人は VS とか使うようにしましょう。

ちなみに、元々の話題は Compact Framework にて以上の手順を踏んだのだが参照してくれないという話でした。そのときは結論として al.exe に /template:対象のアセンブリ オプションを追加すれば OK と言うものでしたが、私自身は Compact Framework を触った事がないので何とも言えません。デフォルトで厳密名が指定されてるんでしょうか。それにしては質問した方が /keyf や /keyn をお使いになったとは聞いてないんですが。

posted by Hongliang at 04:42| Comment(1) | TrackBack(2) | C# | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
ぬるり。: en-US では resource
ja-JP では 資源
Posted by gucci 財布 通販 at 2013年07月20日 18:38
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

azienda di fermentazione della citt? del capitol
Excerpt: <a href="http://1029.tisfimes.info/">barche veloci del rc</a> <a href="http://2737.tisfimes.info/">avvocato della famiglia della carolina del sud</a> <a href="http://213.tisfimes.info/">azienda di ipoteca nel tx de ..</a>
Weblog: azienda di fermentazione della citt? del capitol
Tracked: 2006-08-22 22:52

papier peint de no時計 de pc
Excerpt: <a href="http://3823.nigures.info/">voyage canadien de ligne a駻ienne</a> <a href="http://874.nigures.info/">basse liste de r馮ime de carb</a> <a href="http://3981.nigures.info/">mine de diamant d'argyle</a> <a href="http://2923.nigures.info/">g穰eaux de..</a>
Weblog: papier peint de no時計 de pc
Tracked: 2006-08-28 23:04

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。