Open棟梁Project - マイクロソフト系技術情報 Wiki
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]

-[[戻る>国際化対応項目]]

* 目次 [#nc4f9c25]
#contents

*概要 [#v7967294]
アプリケーション多言語化、地域化に利用される~
Windows ロケールに対応するカルチャには以下の3種類がある。~
#Windowsでは、ロケール(win32)をカルチャ(.net)とも呼ぶ。


**種類と構造 [#vbe1ddad]
-既定カルチャ(Invariant Culture)
--特定の言語や国・地域に依存しない特別なカルチャ
--英語圏で使われるものを基本とする書式・規則が設定されていて、~
特定のカルチャに依存しない形式への変換や比較を行いたい場合に使用する。

-ニュートラル・カルチャ(en, ja, fr など)
--「日本語」などのように「<言語名>」形式で記述されたカルチャ
--国や地域に依存せず、言語のみに依存する。

-固有カルチャ(en-US, en-GB, ja-JP, fr-FR など)
--「日本語 (日本)」などのように「<言語名> (<国・地域名>)」形式で記述されたカルチャ
--国や地域に依存する。

カルチャには階層関係があり、基本的に3階層となっている。

 既定カルチャ
  ├ja 日本語
  │└ja-JP 日本
  │
  ├en 英語
  │├en-US 米国
  │├en-GB 英国
  │├en-AU オーストラリア
  :

例外的に中国語のカルチャは5階層となる。~
※ zh, zh-Hans, zh-CHS, zh-Hant, zh-CHTはニュートラルカルチャ

 既定カルチャ
  └zh 中国語
   ├zh-Hans 簡体字中国語
   │└zh-CHS 簡体字中国語(古いカルチャ名)
   │ ├zh-CN 中国
   │ └zh-SG シンガポール
   │
   └zh-Hant 繁体字中国語
    └zh-CHT 繁体字中国語(古いカルチャ名)
     ├zh-HK 香港
     ├zh-MO マカオ
     └zh-TW 台湾

**参考 [#o4210ed9]
-CultureInfo クラス (System.Globalization)~
http://msdn.microsoft.com/ja-jp/library/system.globalization.cultureinfo.aspx

*Culture [#sd43ff60]
**CurrentCulture概要 [#e63e0e65]
-.NET Framework APIの内部動作で使用されるスレッドのカルチャ。
-.NET Framework 3.5以前は、CurrentCultureに書式プロバイダとして使用できない~
ニュートラルカルチャを設定しようとするとNotSupportedException例外が発生する。

-用途(例)
--フォーマット
---DateTime.ToString()の既定のフォーマット
---通貨の書式指定子のフォーマット

--メソッド
---Microsoft.VisualBasic.Strings.StrConv メソッド(全角半角変換)~
全角文字が存在しないカルチャではエラーとなる。

***サンプルコード [#v7b8cf7a]
-基本
 //CurrentCultureの取得
 System.Globalization.CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentCulture;
 
 //CurrentCultureの設定
 System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

-Windowsフォーム限定で以下の書き方も可能
 //CurrentCultureの取得 ※Windowsフォーム限定
 System.Globalization.CultureInfo culture = Application.CurrentCulture;
 
 //CurrentCultureの設定 ※Windowsフォーム限定
 Application.CurrentCulture = new System.Globalization.CultureInfo("en-US");

***参考 [#d357a7bb]
-Thread.CurrentCulture プロパティ (System.Threading)~
http://msdn.microsoft.com/ja-jp/library/system.threading.thread.currentculture.aspx

-Application.CurrentCulture プロパティ (System.Windows.Forms)~
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.currentculture.aspx

-CultureInfo クラス (System.Globalization)~
http://msdn.microsoft.com/ja-jp/library/system.globalization.cultureinfo.aspx

**CurrentUICulture概要 [#y49eb4cd]
-UIに表示される言語に関すカルチャ、例外メッセージ等も、こちらのカルチャを使用する。
-カルチャ固有の「[[リソースファイル]]」を検索するために使用されるリソース専用カルチャ。

***サンプルコード [#y85b5b7d]
 //CurrentUICultureの取得
 System.Globalization.CultureInfo uiCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
 
 //CurrentUICultureの設定
 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

***参考 [#d31a3ebd]
-Thread.CurrentUICulture プロパティ (System.Threading)~
http://msdn.microsoft.com/ja-jp/library/system.threading.thread.currentuiculture.aspx

-CultureInfo クラス (System.Globalization)~
http://msdn.microsoft.com/ja-jp/library/system.globalization.cultureinfo.aspx

-ResourceManager クラス (System.Resources)~
http://msdn.microsoft.com/ja-jp/library/system.resources.resourcemanager.aspx

*動作まとめ [#n2f84f49]
**デフォルト値 [#w08e7537]
何も設定せずにアプリケーションを実行した際の値は、~
それぞれ以下の環境設定が使用される。

***CurrentCulture [#i9ef38a5]
地域と言語の設定値によって決定される。

-WindowsXP~
[コントロールパネル]-[地域と言語のオプション]-[地域オプション]タブ-[標準と形式]グループ

-Windows7~
[コントロールパネル]-[時計、言語、および地域]-[地域と言語]-[形式]タブ-[形式]

***CurrentUICulture [#bca66b8a]
OSの言語バージョンによって決定される。
-日本語OSの場合は、ja-JP
-マルチ言語OSの場合は、選択中の言語

**リッチ・クライアントのカルチャ [#v8b9c15b]
-Windowsフォーム、WFPなどのウィンドウ・システム(メッセージ・ループ)を処理する~
UIサブシステムは、基本的にUI処理を行うスレッド=1つの主スレッドである。~

-このため、モーダルダイアログ、モードレスダイアログで表示される子画面は、~
親画面と同一スレッドとなり、カルチャ値は子画面と親画面で同一となる。

**ASP.NETのカルチャ [#p790670e]
Webアプリケーション(ASP.NET, ASP.NET AJAX, Webサービス)では
config設定にて動作の定義が可能である。~
※ Windowsアプリケーションにconfig設定は存在しない。

***既定値の設定 [#hc4ef439]
web.configのglobalization要素を設定する。
-culture属性にCurrentCultureの既定値
-uiCulture属性にCurrentUICultureの既定値

  <system.web>
    <globalization culture="ja-JP" uiCulture="ja-JP" 

※ 空文字を設定するとデフォルト値が使用される。~
既定カルチャ(Invariant Culture)は定義できない。

***ブラウザの言語設定の使用 [#bdacf964]
culture属性、uiCulture属性に"auto"を定義すると、~
クライアントのブラウザの言語設定の値が既定値となる。

 <system.web>
   <globalization culture="auto" uiCulture="auto" 

-Internet Explorer8~
--[ツール]-[インターネットオプション]-[全般]タブ-[言語]
--ここの設定により、HTTPヘッダに言語情報が追加される(Accept-Language)。

※ クライアントのブラウザの言語設定がされていない(全て削除している)場合、デフォルト値が既定値となる。~
※ Request.UserLanguagesプロパティ(string[]型)にてブラウザの言語設定に登録されている言語を全て取得できる。言語設定がされていない場合は、null値となる。

***参考 [#p2da03cc]
-globalization 要素 (ASP.NET 設定スキーマ)~
http://msdn.microsoft.com/ja-jp/library/hy4kkhe0.aspx
-HttpRequest.UserLanguages プロパティ (System.Web)~
http://msdn.microsoft.com/ja-jp/library/system.web.httprequest.userlanguages.aspx

**作成されたスレッドのカルチャ [#o18b42b2]
新しく作成されたスレッドのカルチャはデフォルト値となる。~
※ web.configの設定は適用されない。

***サンプルコード [#pded24d8]
-基本
 public sub Method1()
 {
     System.Threading.Thread th = new System.Threading.Thread(StaticMethod1);
     th,Start()
 }
 
 public static StaticMethod1()
 {
     Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());   // → デフォルト値
     Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString());   // → デフォルト値
 }

-新しく作成されたスレッドにカルチャを設定する
 public sub Method1()
 {
     System.Threading.Thread th = new System.Threading.Thread(StaticMethod1);
     th.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;      // ← 作成したスレッドにカルチャ値をコピー
     th.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;    // ← 作成したスレッドにカルチャ値をコピー
     th,Start()
 }
 
 public static StaticMethod1()
 {
     Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());   // → 親カルチャと同じ値
     Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString());   // → 親カルチャと同じ値
 }

**並列処理のカルチャ [#f9c20c5a]
-Parallel.For、Parallel.Invokeを利用した並列処理では、~
本体スレッドによる処理と別スレッドによる処理が混在する。~

-別スレッドのカルチャはデフォルト値となる。~
※web.configの設定は適用されない。

***サンプルコード [#xce6ae20]
-基本
 System.Threading.Tasks.Parallel.For(0, 5, i =>
     {
         Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());   // → 別スレッドで実行される場合はデフォルト値
         Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString());   // → 別スレッドで実行される場合はデフォルト値
     });

-別スレッドにカルチャを設定する
 System.Globalization.CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentCulture;      // ← 本体スレッドのカルチャ値をコピー
 System.Globalization.CultureInfo uiCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;    // ← 本体スレッドのカルチャ値をコピー
 
 System.Threading.Tasks.Parallel.For(0, 5, i =>
     {
         System.Threading.Thread.CurrentThread.CurrentCulture = culture;      // ← コピーしたカルチャを設定
         System.Threading.Thread.CurrentThread.CurrentUICulture = uiCulture;    // ← コピーしたカルチャを設定
     
         Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());   // → 本体スレッドと同じカルチャ
         Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString());   // → 本体スレッドと同じカルチャ
     });

***参考 [#leffa37d]
-Parallel クラス (System.Threading.Tasks)~
http://msdn.microsoft.com/ja-jp/library/system.threading.tasks.parallel.aspx

*参考 [#r426ebba]
-カルチャの基本とカルチャ情報 (CultureInfo)~
 - Programming-.NET Framework-ロケール(カルチャ) - 総武ソフトウェア推進所~
http://smdn.jp/programming/netfx/locale/0_abstract/


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS