国際対応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

と、なるはずです。