読者です 読者をやめる 読者になる 読者になる

無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

System? User? UI language?

タイトルでわかる人にはわかるWindowsロケールのおはなしです(゜ω゜)
C#ロケールを取得する方法についてメモってみます。
Windowsロケールには、一般的に以下のものがあります。

  1. システムロケール : OSのロケール。 変更不可。
  2. ユーザーロケール : 環境設定で選択したロケール
  3. UI表示言語    : 環境設定で選択した、ダイアログや、メッセージを表示するロケール
  4. 入力ロケール   : ユーザーが入力する際に使用するロケール  キーボードやらIMEの言語判断に使用
このエントリーでは、各種ロケールの設定方法と、C#での取得方法について説明していきます。
(アプリケーション内でロケールを変更する場合は、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);
 }
}

GetSystemDefaultLCID()を使用すると、LCIDと呼ばれる、ロケールを示すint型の値が取得されます。
この取得したLCIDをCultureInfoクラスのコンストラクタに食わせると、システムロケールできあがり♪

ユーザーロケール
ユーザーロケールは、システム時間や、数値の表示方法などを管理しているロケールです。
[コントロール パネル]-[地域と言語のオプション]画面で変更可能です。

画像
ユーザーロケールを取得する場合は、現在のスレッドのCurrentCultureプロパティを参照します。

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をアプリケーション側で変更したい言語に設定し、指定した言語のリソースを用意することで簡単に対応できたりします。

入力ロケール
キーボードの配置などを管理しているロケールです。
こいつはちょっと特殊なので今回は説明から省きます。

入力ロケールは、[コントロール パネル]-[言語]で変更可能です。
詳細はスナップショットで確認してください。

画像
画像