次の方法で共有


System.Globalization.CultureInfo.CurrentUICulture プロパティ

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

この CurrentUICulture プロパティはスレッドごとのプロパティです。 つまり、各スレッドには独自の現在の UI カルチャがあります。 このプロパティは、プロパティに割り当てられたオブジェクトを CultureInfo 取得または設定することと System.Threading.Thread.CurrentThread.CurrentUICulture 同じです。 スレッドが開始されると、その UI カルチャは最初に次のように決定されます。

  • アプリケーションのプロパティで指定されたカルチャをDefaultThreadCurrentUICulture取得することでメインスレッドが実行されている場合は、プロパティ値が実行されませんnull

  • スレッドがタスク ベースの非同期操作を実行しているスレッド プール スレッドであり、アプリが .NET Framework 4.6 以降のバージョンの .NET Framework を対象とする場合、その UI カルチャは呼び出し元スレッドの UI カルチャによって決定されます。 次の例では、現在の UI カルチャをポルトガル語 (ブラジル) に変更し、それぞれスレッド ID、タスク ID、および現在の UI カルチャを表示する 6 つのタスクを起動します。 各タスク (およびスレッド) は、呼び出し元スレッドの UI カルチャを継承しています。

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.Versioning;
    using System.Threading;
    using System.Threading.Tasks;
    
    public class Example
    {
        public static async Task Main()
        {
            var tasks = new List<Task>();
            Console.WriteLine("The current UI culture is {0}",
                              Thread.CurrentThread.CurrentUICulture.Name);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR");
            // Change the current UI culture to Portuguese (Brazil).
            Console.WriteLine("Current UI culture changed to {0}",
                              Thread.CurrentThread.CurrentUICulture.Name);
            Console.WriteLine("Application thread is thread {0}",
                              Thread.CurrentThread.ManagedThreadId);
            // Launch six tasks and display their current culture.
            for (int ctr = 0; ctr <= 5; ctr++)
                tasks.Add(Task.Run(() =>
                {
                    Console.WriteLine("UI Culture of task {0} on thread {1} is {2}",
                                      Task.CurrentId,
                                      Thread.CurrentThread.ManagedThreadId,
                                      Thread.CurrentThread.CurrentUICulture.Name);
                }));
    
            await Task.WhenAll(tasks.ToArray());
        }
    }
    // The example displays output like the following:
    //     The current UI culture is en-US
    //     Current UI culture changed to pt-BR
    //     Application thread is thread 9
    //     UI Culture of task 2 on thread 11 is pt-BR
    //     UI Culture of task 1 on thread 10 is pt-BR
    //     UI Culture of task 3 on thread 11 is pt-BR
    //     UI Culture of task 5 on thread 11 is pt-BR
    //     UI Culture of task 6 on thread 11 is pt-BR
    //     UI Culture of task 4 on thread 10 is pt-BR
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example1
        Public Sub Main()
            Dim tasks As New List(Of Task)
            Console.WriteLine("The current UI culture is {0}",
                              Thread.CurrentThread.CurrentUICulture.Name)
            Thread.CurrentThread.CurrentUICulture = New CultureInfo("pt-BR")
            ' Change the current UI culture to Portuguese (Brazil).
            Console.WriteLine("Current culture changed to {0}",
                              Thread.CurrentThread.CurrentUICulture.Name)
            Console.WriteLine("Application thread is thread {0}",
                              Thread.CurrentThread.ManagedThreadId)
            ' Launch six tasks and display their current culture.
            For ctr As Integer = 0 To 5
                tasks.Add(Task.Run(Sub()
                                       Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                                         Task.CurrentId,
                                                         Thread.CurrentThread.ManagedThreadId,
                                                         Thread.CurrentThread.CurrentUICulture.Name)
                                   End Sub))
            Next
            Task.WaitAll(tasks.ToArray())
        End Sub
    End Module
    ' The example displays output like the following:
    '     The current culture is en-US
    '     Current culture changed to pt-BR
    '     Application thread is thread 9
    '     Culture of task 2 on thread 11 is pt-BR
    '     Culture of task 1 on thread 10 is pt-BR
    '     Culture of task 3 on thread 11 is pt-BR
    '     Culture of task 5 on thread 11 is pt-BR
    '     Culture of task 6 on thread 11 is pt-BR
    '     Culture of task 4 on thread 10 is pt-BR
    

    詳細については、ドキュメントの「カルチャとタスクベースの非同期操作」セクションを CultureInfo 参照してください。

  • Windows GetUserDefaultUILanguage 関数を呼び出す。

スレッドで使用されるユーザー インターフェイス カルチャを変更するには、プロパティを Thread.CurrentUICulture 新しいカルチャに設定します。 この方法でスレッドの UI カルチャを明示的に変更した場合、スレッドがアプリケーションの境界を越えた場合メインその変更は保持されます。

Note

新しいカルチャを表すオブジェクトに CultureInfo プロパティ値を設定すると、プロパティの Thread.CurrentThread.CurrentCulture 値も変更されます。

現在の UI カルチャを取得する

この CultureInfo.CurrentUICulture プロパティはスレッドごとの設定です。つまり、各スレッドは独自の UI カルチャを持つことができます。 次の例に示すように、プロパティの値を取得することで、現在のスレッドの CultureInfo.CurrentUICulture UI カルチャを取得します。

using System;
using System.Globalization;

public class Example2
{
    public static void Main()
    {
        CultureInfo culture = CultureInfo.CurrentUICulture;
        Console.WriteLine("The current UI culture is {0} [{1}]",
                          culture.NativeName, culture.Name);
    }
}
// The example displays output like the following:
//       The current UI culture is English (United States) [en-US]
Imports System.Globalization

Module Example3
    Public Sub Main()
        Dim culture As CultureInfo = CultureInfo.CurrentCulture
        Console.WriteLine("The current UI culture is {0} [{1}]",
                        culture.NativeName, culture.Name)
    End Sub
End Module
' The example displays output like the following:
'     The current UI culture is English (United States) [en-US]

プロパティから現在のスレッドの UI カルチャの値を Thread.CurrentUICulture 取得することもできます。

現在の UI カルチャを明示的に設定する

.NET Framework 4.6 以降では、新しいカルチャを表すオブジェクトを CultureInfo プロパティに割り当てることで、現在の UI カルチャを CultureInfo.CurrentUICulture 変更できます。 現在の UI カルチャは、特定のカルチャ (en-US や de-DE など) またはニュートラル カルチャ (en や de など) に設定できます。 次の例では、現在の UI カルチャを fr-FR またはフランス語 (フランス) に設定します。

using System;
using System.Globalization;

public class Example1
{
    public static void Main()
    {
        Console.WriteLine("The current UI culture: {0}",
                          CultureInfo.CurrentUICulture.Name);

        CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        Console.WriteLine("The current UI culture: {0}",
                          CultureInfo.CurrentUICulture.Name);
    }
}
// The example displays output like the following:
//       The current UI culture: en-US
//       The current UI culture: fr-FR
Imports System.Globalization

Module Example2
    Public Sub Main()
        Console.WriteLine("The current UI culture: {0}",
                        CultureInfo.CurrentUICulture.Name)

        CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
        Console.WriteLine("The current UI culture: {0}",
                        CultureInfo.CurrentUICulture.Name)
    End Sub
End Module
' The example displays output like the following:
'       The current UI culture: en-US
'       The current UI culture: fr-FR

マルチスレッド アプリケーションでは、そのカルチャを表すオブジェクトをスレッドのプロパティに割り当てること CultureInfo で、任意のスレッドの Thread.CurrentUICulture UI カルチャを明示的に設定できます。 カルチャを設定するスレッドが現在のスレッドである場合は、プロパティに新しいカルチャを CultureInfo.CurrentUICulture 割り当てることができます。 スレッドの UI カルチャが明示的に設定されている場合、そのスレッドはアプリケーションの境界を越えてメイン別のアプリケーションでコードを実行する場合でも同じカルチャを保持メイン。

現在の UI カルチャを暗黙的に設定する

メイン アプリケーション スレッドを含むスレッドが最初に作成されると、既定では、現在の UI カルチャは次のように設定されます。

  • 現在のアプリケーションのプロパティによって定義されたカルチャをDefaultThreadCurrentUICulture使用するとメインプロパティ値が .null
  • システムの既定のカルチャを使用する。 Windows オペレーティング システムを使用するシステムでは、共通言語ランタイムによって Windows GetUserDefaultUILanguage 関数が呼び出され、現在の UI カルチャが設定されます。 GetUserDefaultUILanguage は、ユーザーによって設定された既定の UI カルチャを返します。 ユーザーが既定の UI 言語を設定していない場合は、システムに最初にインストールされたカルチャが返されます。

スレッドがアプリケーションの境界を越えて別のアプリケーションでコードを実行する場合メイン、そのカルチャは新しく作成されたスレッドと同じ方法で決定されます。

システムにインストールされている UI カルチャまたはユーザーの優先 UI カルチャとは異なる特定の UI カルチャを設定し、アプリケーションが複数のスレッドを開始する場合、スレッドが実行されているアプリケーションのプロパティにカルチャを割り当てない限り、それらのスレッドの現在の UI カルチャは関数によってGetUserDefaultUILanguage返されるカルチャDefaultThreadCurrentUICultureになりますメイン。

セキュリティに関する考慮事項

現在のスレッドのカルチャを変更するには、値が SecurityPermission 設定されたアクセス許可が ControlThread 必要です。

注意

スレッドの操作は、スレッドに関連付けられているセキュリティ状態のために危険です。 そのため、このアクセス許可は信頼できるコードにのみ付与し、必要に応じてのみ付与する必要があります。 半信頼コードでスレッド カルチャを変更することはできません。

現在の UI カルチャと UWP アプリ

ユニバーサル Windows プラットフォーム (UWP) アプリでは、CurrentUICulture.NET Framework アプリと .NET Core アプリの場合と同様に、プロパティは読み取り/書き込み可能です。現在のカルチャの取得と設定の両方に使用できます。 ただし、UWP アプリでは、現在のカルチャと現在の UI カルチャは区別されません。 CurrentCultureCurrentUICulture プロパティは、Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages コレクションの最初の値にマップされます。

.NET Framework アプリと .NET Core アプリでは、現在の UI カルチャはスレッドごとの設定であり CurrentUICulture 、プロパティには現在のスレッドの UI カルチャのみが反映されます。 UWP アプリでは、現在のカルチャは、グローバル設定である Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages プロパティにマップされます。 プロパティを CurrentCulture 設定すると、アプリ全体のカルチャが変更されます。カルチャをスレッドごとに設定することはできません。