マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

  • Windowsでは、ロケール(win32)をカルチャ(.net)と呼ぶ。
  • .NETでは、カルチャ設定によって自動的に動作が変わる国際化(多言語化)機能 を持っている。
    • Date型の文字列化時の既定のフォーマットが変化する。
    • 画面上のコントロールの配置・キャプションなどの各種プロパティ、カレンダ コントロールなどの表示が変化する。

種類

アプリケーションの国際化(多言語化)に利用されるWindows ロケールに対応するカルチャには以下の3種類がある。

既定カルチャ(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 台湾

Culture

  • .NETでは、カルチャを指定することによって、ユーザの文化的慣習に応じた、「文字列」、「日付の形式」、「数値の形式」などの情報に対する一般的な設定のセットを使用できる。
  • カルチャにはUICultureとCultureの2つのカルチャ値があり、2つのカルチャ設定に別々の値を設定することができる。

CurrentUICulture概要

  • UIに表示される言語に関すカルチャ、例外メッセージ等も、こちらのカルチャを使用する。
  • カルチャ固有の「リソースファイル」を検索するために使用されるリソース専用カルチャ。
  • 命名規則によりカルチャ毎に読み込むリソース ファイルが選択される。

サンプルコード

//CurrentUICultureの取得
System.Globalization.CultureInfo uiCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;

//CurrentUICultureの設定
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

参考

CurrentCulture?概要

  • .NET Framework APIの内部動作で使用されるスレッドのカルチャ。
  • CurrentUICultureのUI以外のすべて(「日付の形式」、「数値の形式」など)を決定する。
  • 設定
    • .NET Framework 3.5以前は、en-US や en-GB などの「特定カルチャ」だけ設定できる。
      ニュートラル・カルチャを設定しようとするとNotSupportedException?例外が発生する。
    • NET4.からはニュートラル・カルチャを設定可能になっている。
      これにより、en-US と en-GBで異なる通貨記号が使用され、en に使用する正しい通貨記号を識別する必要がなくなる。
  • 用途(例)
    • フォーマット
      • DateTime?.ToString?()の既定のフォーマット
      • 通貨の書式指定子のフォーマット
  • メソッド
    • Microsoft.VisualBasic?.Strings.StrConv? メソッド(全角半角変換)
      全角文字が存在しないカルチャではエラーとなる。

サンプルコード

  • 基本
    //CurrentCultureの取得
    System.Globalization.CultureInfo culture = System.Threading.Thread.CurrentThread.CurrentCulture;
    
    //CurrentCultureの設定
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
  • Windows Forms限定で以下の書き方も可能
    //CurrentCultureの取得 ※[[Windows Forms]]限定
    System.Globalization.CultureInfo culture = Application.CurrentCulture;
    
    //CurrentCultureの設定 ※[[Windows Forms]]限定
    Application.CurrentCulture = new System.Globalization.CultureInfo("en-US");

参考

動作まとめ

デフォルト値

何も設定せずにアプリケーションを実行した際の値は、
それぞれ以下の環境設定が使用される。

CurrentCulture?

地域と言語の設定値によって決定される。

  • WindowsXP
    [コントロールパネル]-[地域と言語のオプション]-[地域オプション]タブ-[標準と形式]グループ
  • Windows7
    [コントロールパネル]-[時計、言語、および地域]-[地域と言語]-[形式]タブ-[形式]

CurrentUICulture

OSの言語バージョンによって決定される。

  • 日本語OSの場合は、ja-JP
  • マルチ言語OSの場合は、選択中の言語

リッチ・クライアントのカルチャ

  • Windows FormsWPFなどのウィンドウ・システム(メッセージ・ループ)を処理する
    UIサブシステムは、基本的にUI処理を行うスレッド=1つの主スレッドである。
  • このため、モーダルダイアログ、モードレスダイアログで表示される子画面は、
    親画面と同一スレッドとなり、カルチャ値は子画面と親画面で同一となる。

ASP.NETのカルチャ

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

既定値の設定

web.configのglobalization要素を設定する。

  • culture属性にCurrentCulture?の既定値
  • uiCulture属性にCurrentUICultureの既定値
 <system.web>
   <globalization culture="ja-JP" uiCulture="ja-JP" 

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

ブラウザの言語設定の使用

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

<system.web>
  <globalization culture="auto" uiCulture="auto" 
  • Internet Explorer8
    • [ツール]-[インターネットオプション]-[全般]タブ-[言語]
    • ここの設定により、HTTPヘッダに言語情報が追加される(Accept-Language)。

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

参考

作成されたスレッドのカルチャ

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

サンプルコード

  • 基本
    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());   // → 親カルチャと同じ値
    }

並列処理のカルチャ

  • Parallel.For、Parallel.Invokeを利用した並列処理では、
    本体スレッドによる処理と別スレッドによる処理が混在する。
  • 別スレッドのカルチャはデフォルト値となる。
    ※web.configの設定は適用されない。

サンプルコード

  • 基本
    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());   // → 本体スレッドと同じカルチャ
        });

参考

参考


Tags: :.NET開発, :国際化対応


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-03-27 (月) 10:50:26 (878d)