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 開始,您可以將代表新文化特性的物件指派 CultureInfo 給 CultureInfo.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文化特性。 CurrentCulture和 CurrentUICulture 屬性會對應至 Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 集合中的第一個值。
在 .NET Framework 和 .NET Core 應用程式中,目前的 UI 文化特性是每一線程設定,而 CurrentUICulture 屬性只會反映目前線程的 UI 文化特性。 在UWP應用程式中,目前的文化特性會對應至 Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 屬性,這是全域設定。 設定 屬性會 CurrentCulture 變更整個應用程式的文化特性;文化特性不能以每個線程為基礎設定。