国際化対応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使う訳じゃないし・・・