国際対応Hello, World
.NETではサテライト アセンブリというカルチャに依存したリソースを外だしする仕組みがあります。簡単な例としてサテライト アセンブリを使ったHello,Worldアプリケーションを作成してみました。まず、モジュール構成ですが、
- hello.exe
- hello.resources.dll
の2種類です。ただし、hello.resources.dllについてはローカライズさせる分だけ用意します。また、モジュール配置も決まっていて
とする必要があります。
まずは、米国用のサテライト アセンブリです。
en-USディレクトリに移動し、hello.en-US.txtファイルを作成して以下の内容を打ち込みます。
greeting=Hello World
で、コマンドラインから
> resgen hello.en-US.txt
を、実行するとhello.en-US.resourcesファイルが作成されます。これを、
> al /c:en-US /out:hello.resources.dll /embed:hello.en-US.resources
とすると、米国用サテライト アセンブリが作成されます。/c:en-USオプションがen-USディレクトリが対応します。次に日本用サテライト アセンブリです。基本的にen-USをja-JPに変えるだけですが、
greeting=こんにちは 世界
というようにマルチバイト文字を含む場合は、utf-8で保存しなければならない点に注意です。
サテライト アセンブリが出来たところでHello,Worldアプリケーション本体の作成に入ります。hello.csは以下のようになります。
using System; using System.Globalization; using System.Threading; using System.Resources; using System.Reflection; class Program { static void Main(string[] args) { string culture; string res = "hello"; // 引数からカルチャーを取得する(ja-JPなど) if (args.Length > 0) culture = args[0]; else culture = ""; // カルチャーを設定 Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; // リソースマネージャ経由で文字列を取得 ResourceManager rm = new ResourceManager(res, Assembly.GetEntryAssembly()); Console.WriteLine(rm.GetString("greeting")); } }
また、hello.exeにはデフォルトのリソースが必要なのでhello.txtを用意して以下の内容を打ち込みます。
greeting=Bonan tagon Monda
言語指定無しは、とりあえずエスペラント語(あっているかは不明)に。(^^; で、コイツも
> resgen hello.txt
として、hello.resources作成します。最後に、hello.csとhello.resourcesをまとめてコンパイルします。
> csc /res:hello.resources hello.cs
これで完成です。で、実行すると、
> hello.exe ja-JP こんにちは 世界 > hello.exe en-US Hello World > hello.exe Bonan tagon Monda
と、なるはずです。