System? User? UI language?
タイトルでわかる人にはわかるWindowsロケールのおはなしです(゜ω゜)
C#でロケールを取得する方法についてメモってみます。
Windowsのロケールには、一般的に以下のものがあります。
- システムロケール : OSのロケール。
変更不可。 - ユーザーロケール : 環境設定で選択したロケール
- UI表示言語 : 環境設定で選択した、ダイアログや、メッセージを表示するロケール
- 入力ロケール : ユーザーが入力する際に使用するロケール キーボードやらIMEの言語判断に使用
(アプリケーション内でロケールを変更する場合は、windowsの設定は汚しませんので好きな言語に変更どーぞ)
■システムロケール
システムロケールは、Windowsのデフォルトのロケールになります。
日本語のWindowsを入れると「日本語」、英語のWindowsを入れると「英語」が設定され、以降は変更できないReadonlyな設定です。ます。
[コントロール パネル]-[地域と言語のオプション]-[詳細設定]画面で変更可能です。
システムロケールを取得する際には、Win32APIのGetSystemDefaultLCID を使用します。
DllImportを使用してWin32APIを使用するのですが、pInvokeの詳細な説明は省きます。
あんまり難しくないから自分で調べて〜(;´ω`)
using System.Runtime.InteropServices;
using System.Globalization;
class GetLocale
{
[DllImport("kernel32.dll", CharSet=CharSet.Auto, EntryPoint="GetSystemDefaultLCID")]
internal static extern int GetSystemDefaultLCID();
public void GetSystemLocale()
{
int lcid = GetLocale.GetSystemDefaultLCID();
CultureInfo culture = new CultureInfo(lcid);
}
}
この取得したLCIDをCultureInfoクラスのコンストラクタに食わせると、システムロケールできあがり♪
■ユーザーロケール
ユーザーロケールは、システム時間や、数値の表示方法などを管理しているロケールです。
[コントロール パネル]-[地域と言語のオプション]画面で変更可能です。
using System.Globalization;
class GetLocale
{
public void GetUserLocale()
{
CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentCulture;
}
}
Windows上でアプリケーションを起動した際、アプリケーションのスレッドが立ち上がります。
立ち上がったスレッドには、ロケール情報が設定されており、初期値としてユーザーが設定しているロケールが入っています。
サンプルコードは、そのスレッド情報にアクセスして、スレッドのロケール情報を参照しています。
■UI表示言語
UI表示言語は、Windowsのボタンコントロールなどの表示言語を管理しているロケールです。
ただ、こいつにはちょっと問題がありまして、通常のWindowsOSをインストールした場合は設定を変更できません。
例として、日本語版WindowsXPをインストールした環境では、設定変更できるコントロールが非表示状態になります。
UI表示言語を変更したい場合は、MUI(Multi User Inteface)版のOSが必要になります。
UI表示言語は、[コントロール パネル]-[言語]で変更可能です。
ユーザーロケールを取得する場合は、現在のスレッドのCurrentUICultureプロパティを参照します。using System.Globalization;
class GetLocale
{
public void GetUILocale()
{
CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
}
}
ちなみに、C#で多言語対応する場合、このCurrentUICultureをアプリケーション側で変更したい言語に設定し、指定した言語のリソースを用意することで簡単に対応できたりします。
■入力ロケール
キーボードの配置などを管理しているロケールです。
こいつはちょっと特殊なので今回は説明から省きます。
入力ロケールは、[コントロール パネル]-[言語]で変更可能です。
詳細はスナップショットで確認してください。