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文化特性變更為葡萄牙文(巴西),並啟動六項工作,其中每個工作都會顯示其線程標識碼、工作標識元,以及目前的UI文化特性。 每個工作(和線程)都繼承呼叫線程的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文化特性,則線程跨越應用程式域界限時,該變更會持續發生。

注意

如果您將屬性值設定為 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]

您也可以從 Thread.CurrentUICulture 屬性擷取目前線程UI文化特性的值。

明確設定目前的UI文化特性

從 .NET Framework 4.6 開始,您可以將代表新文化特性的物件指派 CultureInfoCultureInfo.CurrentUICulture 屬性,以變更目前的 UI 文化特性。 目前的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文化特性,如下所示:

  • 如果屬性值不是 null,則使用目前應用程式域的 屬性所DefaultThreadCurrentUICulture定義的文化特性。
  • 使用系統的預設文化特性。 在使用 Windows 作業系統的系統上,Common Language Runtime 會呼叫 Windows GetUserDefaultUILanguage 函式來設定目前的 UI 文化特性。 GetUserDefaultUILanguage 會傳回用戶設定的預設UI文化特性。 如果使用者尚未設定預設UI語言,則會傳回原本安裝在系統上的文化特性。

如果線程跨越應用程式界限,並在另一個應用程式域中執行程序代碼,則會以與新建立線程相同的方式判斷其文化特性。

請注意,如果您設定與系統安裝的UI文化特性或使用者慣用UI文化特性不同的特定UI文化特性,而且您的應用程式會啟動多個線程,除非您將文化特性指派給DefaultThreadCurrentUICulture線程執行所在的應用程式域中的屬性,否則這些線程目前的UI文化特性將會是函式所傳回GetUserDefaultUILanguage的文化特性。

安全性考量

變更目前線程的文化特性需要 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 變更整個應用程式的文化特性;文化特性不能以每個線程為基礎設定。