MS_Culture - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

カルチャ

抂芁

  • Windows では、ロケヌルwin32をカルチャ.NETず呌ぶ。

  • .NET では、カルチャ蚭定によっお自動的に動䜜が倉わる囜際化倚蚀語化機胜を持っおいる。

    • Date 型の文字列化時の既定のフォヌマットが倉化する。
    • 画面䞊のコントロヌルの配眮・キャプションなどの各皮プロパティ、
      カレンダ コントロヌルなどの衚瀺が倉化する。
  • 参考

補足「自動的に動䜜が倉わる」こずの怖さ: 本ペヌゞの内容を
実務の芳点で䞀蚀にするず、
**「意識しおいないず、環境によっお動䜜が倉わる」**ずいう点に尜きる。

// 実行環境のカルチャに䟝存する環境で結果が倉わる
DateTime.Parse("01/02/2026")     // ja-JP: 1月2日 / en-US: 1月2日 / en-GB: 2月1日
1234.5.ToString()                // ja-JP: "1234.5" / de-DE: "1234,5"
"ABC".ToLower()                  // tr-TR: "I" が "ı" になるトルコ問題

**「開発機では動くのに本番で萜ちる」**ずいう䞍具合の
兞型的な原因の䞀぀がこれである。

原則:

甹途 䜿うもの
ナヌザヌに芋せる画面衚瀺 CurrentCultureそのたた
機械可読な入出力ファむル、DB、API、ログ InvariantCulture
識別子の比范キヌ、コヌド倀 StringComparison.Ordinal
// 保存・通信は垞に InvariantCultureたたは ISO 8601
var s = value.ToString("O", CultureInfo.InvariantCulture);
var v = decimal.Parse(s, CultureInfo.InvariantCulture);

// 識別子の比范は Ordinalカルチャに䟝存させない
if (string.Equals(code, "ADMIN", StringComparison.Ordinal)) { }

皮類

アプリケヌションの囜際化倚蚀語化に利甚される Windows ロケヌルに
察応するカルチャには以䞋の 3 皮類がある。

既定カルチャ(Invariant Culture)

  • 特定の蚀語や囜・地域に䟝存しない特別なカルチャ
  • 英語圏で䜿われるものを基本ずする曞匏・芏則が蚭定されおいお、
    特定のカルチャに䟝存しない圢匏ぞの倉換や比范を行いたい堎合に䜿甚する。

ニュヌトラル・カルチャ(en, ja, fr など)

  • 「日本語」などのように「蚀語名」圢匏で蚘述されたカルチャ
  • 囜や地域に䟝存せず、蚀語のみに䟝存する。

固有カルチャ(en-US, en-GB, ja-JP, fr-FR など)

  • 「日本語 (日本)」などのように「蚀語名 (囜・地域名)」圢匏で蚘述されたカルチャ
  • 囜や地域に䟝存する。

補足甚語の察応: 3 皮類の䜿い分けを敎理しおおく。

皮類 䟋 䞻な甚途
既定Invariant ""空文字列 氞続化・通信。人に芋せない倀
ニュヌトラル ja, en リ゜ヌスの遞択リ゜ヌスファむル
固有 ja-JP, en-US 曞匏日付・通貚

**「文蚀は蚀語だけで足りるが、曞匏は地域たで芁る」**ずいう
非察称性が、この 2 段構えの理由である。

文蚀:  英語なら en で十分米英で文蚀を分けるこずは皀
曞匏:  en-US は 8/19/2026、en-GB は 19/08/2026 → 地域が芁る

構造

カルチャには階局関係があり、基本的に 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 台湟

補足この階局が「フォヌルバック」を決める: 階局構造は
リ゜ヌスファむル のフォヌルバックの探玢順
そのものである。

CurrentUICulture = zh-TW のずき
  zh-TW → zh-Hant → zh → 既定  の順にリ゜ヌスを探す

䞭囜語が 5 階局になっおいるのは、
**「蚀語zhず衚蚘䜓系簡䜓字繁䜓字が独立しおいる」**ためで、
䞭間局zh-Hans / zh-Hantが挟たっおいる。

誀: zh-CN ず zh-TW でリ゜ヌスを 2 ぀䜜る
æ­£: zh-Hans ず zh-Hant でリ゜ヌスを 2 ぀䜜る
      → zh-CN / zh-SG は zh-Hans に、
        zh-TW / zh-HK / zh-MO は zh-Hant にフォヌルバックする

zh-CHS / zh-CHT は非掚奚原文も「叀いカルチャ名」ず泚蚘で、
新芏では zh-Hans / zh-Hant を䜿う。

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 䟋倖が発生する。
    • .NET 4 からはニュヌトラル・カルチャを蚭定可胜になっおいる。
      これにより、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");

参考

補足珟圚は CultureInfo の静的プロパティを䜿う: Thread.CurrentThread
経由の曞き方は動䜜するが、珟圚は
CultureInfo.CurrentCulture を䜿うのが暙準である。

CultureInfo.CurrentCulture   = new CultureInfo("en-US");
CultureInfo.CurrentUICulture = new CultureInfo("en");

// アプリ党䜓の既定.NET 4.5+— 新芏スレッドにも継承される
CultureInfo.DefaultThreadCurrentCulture   = new CultureInfo("ja-JP");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("ja");

DefaultThreadCurrent* が埌述のスレッド問題の解決策である。

動䜜たずめ

デフォルト倀

䜕も蚭定せずにアプリケヌションを実行した際の倀は、
それぞれ以䞋の環境蚭定が䜿甚される。

CurrentCulture

地域ず蚀語の蚭定倀によっお決定される。

  • WindowsXP
    [コントロヌルパネル]-[地域ず蚀語のオプション]-[地域オプション]タブ-[暙準ず圢匏]グルヌプ

  • Windows7
    [コントロヌルパネル]-[時蚈、蚀語、および地域]-[地域ず蚀語]-[圢匏]タブ-[圢匏]

CurrentUICulture

OS の蚀語バヌゞョンによっお決定される。

  • 日本語 OS の堎合は、ja-JP
  • マルチ蚀語 OS の堎合は、遞択䞭の蚀語

補足Linux / コンテナでの既定倀最新化: .NET Core 以降は
Windows 以倖でも動くため、既定倀の決たり方が増えおいる。

環境 既定のカルチャ
Windows 地域蚭定 / 衚瀺蚀語原文の通り
Linux / macOS LANG / LC_ALL 環境倉数ICU 経由
コンテナ倚くの公匏むメヌゞ InvariantCultureICU が入っおいない

コンテナでの萜ずし穎が特に重芁である。

.NET の公匏むメヌゞalpine 系や runtime-depsでは、
サむズ削枛のため ICU が含たれないこずがある
  → InvariantGlobalization モヌドで動く
  → ja-JP を指定しおも曞匏が英語圏のものになる
  → 文字列の比范・䞊べ替えも序数比范になる
# ICU を入れるDebian 系
RUN apt-get update && apt-get install -y libicu-dev
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
<!-- 逆に、意図的に Invariant で動かすサむズ・起動速床を優先 -->
<InvariantGlobalization>true</InvariantGlobalization>

InvariantGlobalization=true にするず、
new CultureInfo("ja-JP") は䟋倖にならないが、
䞭身は Invariant ず同じになる
静かに壊れるため、
囜際化が必芁なアプリでは必ず ICU を入れる
.NET CoreのDockerコンテナ化。

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

  • Windows Forms、WPF などの
    りィンドり・システムメッセヌゞ・ルヌプを凊理する
    UI サブシステムは、基本的に UI 凊理を行うスレッド぀の䞻スレッドである。

  • このため、モヌダルダむアログ、モヌドレスダむアログで衚瀺される子画面は、
    芪画面ず同䞀スレッドずなり、カルチャ倀は子画面ず芪画面で同䞀ずなる。

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" />
</system.web>

※ 空文字を蚭定するずデフォルト倀が䜿甚される。
既定カルチャ(Invariant Culture)は定矩できない。

ブラりザの蚀語蚭定の䜿甚

culture 属性、uiCulture 属性に "auto" を定矩するず、
クラむアントのブラりザの蚀語蚭定の倀が既定倀ずなる。

<system.web>
  <globalization culture="auto" uiCulture="auto" />
</system.web>
  • Internet Explorer 8
    • [ツヌル]-[むンタヌネットオプション]-[党般]タブ-[蚀語]
    • ここの蚭定により、HTTP ヘッダに蚀語情報が远加されるAccept-Language。

※ クラむアントのブラりザの蚀語蚭定がされおいない(党お削陀しおいる)堎合、
デフォルト倀が既定倀ずなる。
※ Request.UserLanguages プロパティ(string[] 型)にお
ブラりザの蚀語蚭定に登録されおいる蚀語を党お取埗できる。
蚀語蚭定がされおいない堎合は、null 倀ずなる。

参考

補足ASP.NET Core での蚭定: <globalization> は無く、
RequestLocalizationMiddleware が同じ圹割を担う
ASP.NET の 囜際化察応 の補足を参照。

app.UseRequestLocalization(new RequestLocalizationOptions()
    .SetDefaultCulture("ja-JP")
    .AddSupportedCultures("ja-JP", "en-US")     // ← CurrentCulture
    .AddSupportedUICultures("ja", "en"));       // ← CurrentUICulture

AddSupportedCultures に無いカルチャは既定倀に萜ちる
ホワむトリスト方匏ため、
「察応しおいない蚀語で衚瀺が厩れる」こずを防げる。
auto 盞圓の挙動は AcceptLanguageHeaderRequestCultureProvider が担う。

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

新しく䜜成されたスレッドのカルチャはデフォルト倀ずなる。
※ Web.configの蚭定は適甚されない。

サンプルコヌド
  • 基本
public void Method1()
{
    System.Threading.Thread th = new System.Threading.Thread(StaticMethod1);
    th.Start();
}

public static void StaticMethod1()
{
    Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     // → デフォルト倀
    Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString());   // → デフォルト倀
}
  • 新しく䜜成されたスレッドにカルチャを蚭定する
public void Method1()
{
    System.Threading.Thread th = new System.Threading.Thread(StaticMethod1);
    th.CurrentCulture   = System.Threading.Thread.CurrentThread.CurrentCulture;    // ← 䜜成したスレッドにカルチャ倀をコピヌ
    th.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;  // ← 䜜成したスレッドにカルチャ倀をコピヌ
    th.Start();
}

public static void StaticMethod1()
{
    Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     // → 芪カルチャず同じ倀
    Debug.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString());   // → 芪カルチャず同じ倀
}

移行メモ誀蚘: 原文のサンプルには次の誀りがあり、
C# ずしお成立しないため修正した。

  • public sub Method1() 
 VB の構文が混圚public void
  • th,Start() 
 カンマずピリオドの誀りth.Start();
  • public static StaticMethod1() 
 戻り倀の型が無いstatic void
  • th.CurrentCulture に 2 回ずも CurrentCulture を代入しおいた
    → 2 行目は th.CurrentUICulture = ...CurrentUICulture が正しい

䞊列凊理のカルチャ

  • 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());   // → 本䜓スレッドず同じカルチャ
    });
参考

補足.NET 4.5 以降は匕き継がれる最新化: この 2 節が扱う
**「新しいスレッドではカルチャが既定倀に戻る」**ずいう問題は、
.NET Framework 4.5 で改善されおいる。

版 新芏スレッド / Task のカルチャ
〜.NET 4.0 既定倀に戻る本ペヌゞの蚘述
.NET 4.5 以降 DefaultThreadCurrent* で既定を蚭定できる
.NET Framework 4.6 以降 / .NET Core CurrentCulture が非同期の流れで匕き継がれる
// アプリ起動時に 1 床だけ曞けば、以降のスレッド・Task に継承される
CultureInfo.DefaultThreadCurrentCulture   = new CultureInfo("ja-JP");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("ja");

.NET Framework 4.6 以降では CurrentCulture が
AsyncLocal 盞圓の仕組みで保持される
ようになったため、
async/await をたたいでも匕き継がれる。

CultureInfo.CurrentCulture = new CultureInfo("en-US");
await Task.Run(() => Console.WriteLine(CultureInfo.CurrentCulture));
//  .NET 4.6+ / .NET Core → en-US匕き継がれる
//  .NET 4.5 以前          → 既定倀

ただし、明瀺的に new Thread(...) した堎合は匕き継がれない
原文のサンプルの通り、手でコピヌが芁る。

ASP.NET Core では RequestLocalizationMiddleware が
リク゚ストごずに蚭定する
ため、
アプリ コヌド偎で意識する必芁はほが無い。

参考

Microsoft Learn


Tags: 移行, .NET開発, 囜際化察応

⚠ **GitHub.com Fallback** ⚠