Windowsの色々なロケール設定

現在日本のテストチームでは、今後どの国の人でもあらゆる言語のテストが出来るよう、ローカリゼーションとグローバリゼーション関係の機能について、情報収集、資料作成をしています。私自身、チームに加わり間もないためにこれまであまりインターナショナライゼーションには精通していませんでしたが、この作業を通して、様々なことが明確になってきました。
今回の内容はそのごく一部ですが、すでに理解されている方にとっては、特に真新しい情報ではないかもしれませんのでご了承ください。

システム ロケール
この設定を変更するには、[コントロール パネル] の [地域と言語オプション] を開きます。Windows XP と Server 2003 の場合は、[詳細設定] タブで機能の説明を参照し、オプションを変更することができます。Vista と Server 2008 では、[詳細設定] ではなく [管理] タブを利用します。
Unicode に対応していないプログラムを利用する場合は、システム ロケールをそのプログラムの言語に設定しなければ、そのプログラムの UI が正しく表示されない可能性があります。例えば、システム ロケールを英語に設定すると、日本語のレガシーソフトウェアの UI が文字化けすることがあります。プログラム コードから、この言語を変更することはできませんが、GetSystemDefaultLCID という Windows API 関数を使えば、システム ロケールの現在の設定を取得できます。尚、システムロケールの設定は、そのシステム上のユーザー全員に適用されます。

ユーザー ロケール
この設定を変更するには、[コントロール パネル] の [地域と言語のオプション] を開きます。Windows XP と Server 2003 の場合は、[地域オプション] タブで、機能の説明を参照し、オプションを変更することができます。 Vista と Server 2008 では [形式] タブを利用します。
上記ダイアログに表示されている数値、通貨、時刻、日付の情報は、[現在の形式] に設定されているユーザー ロケールに従って表示されます。これらのユーザーロケール情報は、.NET framework の関連する関数 に返される情報や、Visual Studio に標準で搭載されているコントロール (DateTimePicker や MonthCalendar コントロール等) に表示される情報として使用されます。
また、ユーザー ロケール設定は、ユーザー アカウント毎に各ユーザーが好みに従って変更することができます。

プログラム コードによってユーザー ロケールを直接変更できませんが、特定スレッドに対してその実行が終わるまで一時的に変更することはできます。この方法だと別のスレッドに影響を及ぼさず、コントロール パネルの設定も変わりません。C# で設定を変更するには、System.Threading.Thread クラスで CurrentThread プロパティーの一つである CurrentCultureを利用します。
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(1041);

入力ロケール
Vista と Server 2008 でこの設定を変更するには、[キーボードと言語] タブをクリックして [キーボードの変更] ボタンをクリックします。XP と Server 2003 の場合は、[言語] タブの [詳細] ボタンを利用します。ここで設定可能な情報により、どの言語をどのようになキーボードレイアウトで入力するかなどを決めることができます。各ユーザーはこの設定をカスタマイズすることができますし、アプリケーションの実行中に、言語バーまたはコードを通して変更できます。コードで変更するにはGetKeyboardLayout(https://msdn.microsoft.com/ja-jp/library/cc364671.aspx)、ActivateKeyboardLayout(https://msdn.microsoft.com/ja-jp/library/cc430248.aspx)、および上記のページの参照欄のWindows API関数を使用します。PInvokeを使えば.NETコードでこれらの関数を呼び出せます。

UI言語
メニューやダイアログなどの UI が、どの言語で表示されるかを決める設定です。この設定に従って、ResourceManager クラスがリソースの読み込みを行います。スレッドが起動すると、この設定は OS の UI の言語に設定されます。MUI をサポートする OS では、ユーザーがその言語を選べます。MUI をサポートしない環境では、OS をインストールするときに言語が確定されます。
OS の機能に関わらず、プログラム コードでこの設定を一時的に変更することができます。その場合、OS の言語には影響がありませんが、ResourceManager クラスが、リソースを読み込むときの優先すべき言語を指定出来ます。設定を変更するには、System.Threading.Thread クラスの CurrentThread プロパティーの 一つである CurrentUICulture を利用します。
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(1040);

上記の設定は全て別々に変更することができます。ひとつの設定を変更したとしても、他の設定に影響を及ぼすことはありません。
但し例外として、ユーザー ロケールをコントロール パネルで変更した場合は、新しい設定に適したキーボードが入力ロケールに追加されます。

screenshot.tif