国際化対応2.0
その昔、.NET1.0向けにネタにしましたが、バージョンアップということで。(^^;
Visual Studio 2005では、カスタムツールが強化されたので、リソース回りが扱いやすくなっています。仕事上よくあるのが、文字列の管理をどうするかで、C/C++だとヘッダファイルに集めたりしますが、C#の場合は、リソースファイルを使うとよさげです。
たとえば、MyResource.resxファイルを作ります。で、これに文字列リソースをどんどん追加します。
HelloとGoodbyを追加しました。で、早速使ってみましょう。
using System; namespace ConsoleApplication12 { class Program { static void Main (string[] args) { Console.WriteLine (MyResource.Hello); Console.WriteLine (MyResource.Goodby); } } } /* Hello Goodby */
カスタムツールのおかげで型付きで使えます(ファイル名.名前でアクセス)。また、文字列だけでなく、数値やイメージファイルなどもOKだったりします。さて、本題は国際化対応なので、取りかかってみましょう。
先ほどのリソースファイルにja-JPを追加したファイル名にします。
違いが分かるようにHelloだけ日本語にします。で、実行。
こんにちは Goodby
見事、日本語表示されました。
大活躍のResXFileCodeGeneratorですが、1つダメなところがあります。生成されたコードを見てみると、
internal class MyResource {
なんとクラスがinternalです。これではリソースをまとめて1つのDLLにして共通化とかができません。なぜ、こんな仕様にしたか謎ですが、ここまで来て諦めるのも悔しいので、困った時のCode Project頼み。探せば見つかるもので、ResXFileCodeGeneratorExなるものを発見。これで型付きのまま1つのDLLにリソースを集めることができるようになりました。
ただ、resxファイルをVisual Studio無しで編集するのは面倒なので、
XXX="AAA" #文字列 YYY=123 #数値は自動判別してInt32,Double,Decimalの何れかを割り当てる ZZZ=[file:abc.jpg] #一応イメージデータも埋め込めるように
みたいなプレーンテキストを食べて.resxを吐き出すツールこさえました。翻訳する人がVisual Studio使う訳じゃないし・・・