C++/Win32プログラムの多言語対応について(2)

昨日(id:lord_hollow:20081023)の続き。
折角リソースを多言語化したので、どうせならコマンドライン引数やアプリの設定で言語を切り替えられるようにしたいじゃないですか。そのためには、Win32APIのSetThreadLocaleを使って、スレッドのロケールを設定すればいいわけです。

if (Setting::Language == LANG_JP){
    ::SetThreadLocale(0x0411);	//日本語
} else {
    ::SetThreadLocale(0x0409(;	//英語
}

ところがこいつはスレッドのロケールを設定する関数なので、たとえばメインスレッド開始直後に呼び出したとしても、他のワーカースレッドのロケールは変更されません。なので、スレッド化する関数の先頭でSetThreadLocaleを再び呼ぶ必要があるわけです。それはあまりにも面倒なので、スレッドをカプセルかするクラスを作成することで対応します。

typedef void ThreadProc(void* param);
class Thread{
public:
    Thread(ThreadProc* proc, void* param);
    virtual ~Thread();
    static void SetLocale(LCID locale);
    static LCID GetLocale();
protected:
    HANDLE hThread;
    static LCID locale;
};

これで、OKですね!実装は省略しますが、大体わかるでしょう。プログラムの最初で、Thread::SetLocaleを使用することで、これから作成される全スレッドのロケールを設定できるわけですよ。
スレッドのカプセル化はこれ以外にもたくさんメリットがあるので、多言語化する・しないにかかわらずぜひ行っておきたいですね。