CultureInfo.DefaultThreadCurrentUICulture 屬性

定義

取得或設定目前應用程式定義域中之執行緒的預設 UI 文化特性。

public:
 static property System::Globalization::CultureInfo ^ DefaultThreadCurrentUICulture { System::Globalization::CultureInfo ^ get(); void set(System::Globalization::CultureInfo ^ value); };
public static System.Globalization.CultureInfo DefaultThreadCurrentUICulture { get; set; }
public static System.Globalization.CultureInfo? DefaultThreadCurrentUICulture { get; set; }
member this.DefaultThreadCurrentUICulture : System.Globalization.CultureInfo with get, set
Public Shared Property DefaultThreadCurrentUICulture As CultureInfo

屬性值

CultureInfo

在目前的應用程式定義域中為執行緒的預設 UI 文化特性,若目前的系統 UI 文化特性是應用程式定義域中的預設執行緒 UI 文化特性,則為 null

例外狀況

設定作業中,Name 屬性值無效。

範例

下列範例說明在定義新執行緒的目前文化特性時,.NET Framework 的預設行為。 它會使用英文和俄文語言資源。 下列名為 GreetingStrings.txt 的文字檔包含英文語言資源:

greeting =Hello again!
newGreeting=Hello!

它會使用 資源檔 產生器搭配下列命令,編譯成名為 GreetingStrings 的二進位 .resources 檔案。

resgen greetingstrings.txt

下列名為 GreetingStrings.ru-RU.txt 的文字檔包含俄文語言資源:

greeting=Еще раз привет!
newGreeting=Привет!

它會使用 資源檔 產生器搭配下列命令,編譯成名為 GreetingStrings.ru 的二進位 .resources 檔案。

resgen greetingstrings.ru-RU.txt

應用程式程式碼(如下所示)位於名為範例1的檔案中,或範例 1 .cs。 它會使用 Visual Basic 編譯器的下列命令,編譯成可執行檔:

vbc Example1.vb /resource:GreetingStrings.resources

C # 編譯器的命令類似:

csc /resource:GreetingStrings.resources Example1.cs

這會建立一個包含範例可執行程式碼的元件,以及其回溯文化特性的資源。 您也可以使用 元件連結器 來建立俄文 (俄羅斯) 文化特性的資源檔,並使用下列命令:

>al /embed:greetingstrings.ru-RU.resources /c:ru-RU /template:example1.exe /out:ru-RU\Example1.resources.dll

在啟動時,此範例會將目前的文化特性和目前的 UI 文化特性,設定為所有系統上的俄文 (俄羅斯) ,除了預設系統文化特性已經是俄文 (俄羅斯) 以外的所有系統。 如果預設系統文化特性已經是俄文 (俄羅斯) ,程式碼會將目前的文化特性和目前的 UI 文化特性設定為英文 (的) 。 然後,它會呼叫 ShowGreeting 常式,其會在第一次呼叫時顯示簡單字串,並在後續的方法呼叫中顯示稍微不同的字串。 接下來,它會建立新的執行緒,這也會執行 ShowGreeting 常式。

using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;

[assembly:NeutralResourcesLanguageAttribute("en-US")]

public class Example
{
   private static int nGreetings = 0;
   private static ResourceManager rm;

   public static void Main()
   {
      AppDomain domain = AppDomain.CurrentDomain;
      rm = new ResourceManager("GreetingStrings",
                               typeof(Example).Assembly);

      CultureInfo culture = null;
      if (Thread.CurrentThread.CurrentUICulture.Name == "ru-RU")
         culture = CultureInfo.CreateSpecificCulture("en-US");
      else
         culture = CultureInfo.CreateSpecificCulture("ru-RU");

      Thread.CurrentThread.CurrentCulture = culture;
      Thread.CurrentThread.CurrentUICulture = culture;

      ShowGreeting();
      Thread.Sleep(1000);

      Thread workerThread = new Thread(Example.ShowGreeting);
      workerThread.Start();
   }

   private static void ShowGreeting()
   {
      string greeting = nGreetings == 0 ? rm.GetString("newGreeting") :
                                          rm.GetString("greeting");
      nGreetings++;
      Console.WriteLine("{0}", greeting);
   }
}
// The example displays the following output:
//       Привет!
//       Hello again!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguageAttribute("en-US")>

Public Class Example
   Private Shared nGreetings As Integer = 0
   Private Shared rm As ResourceManager

   Public Shared Sub Main()
      Dim domain As AppDomain = AppDomain.CurrentDomain
      rm = New ResourceManager("GreetingStrings", 
                               GetType(Example).Assembly)
                  
      Dim culture As CultureInfo = Nothing
      If Thread.CurrentThread.CurrentUICulture.Name = "ru-RU" Then
         culture = CultureInfo.CreateSpecificCulture("en-US")
      Else
         culture = CultureInfo.CreateSpecificCulture("ru-RU")
      End If   
      Thread.CurrentThread.CurrentCulture = culture
      Thread.CurrentThread.CurrentUICulture = culture

      ShowGreeting()
      Thread.Sleep(1000)

      Dim workerThread As New Thread(AddressOf Example.ShowGreeting)
      workerThread.Start()
   End Sub
   
   Private Shared Sub ShowGreeting()
      Dim greeting As String = CStr(IIf(nGreetings = 0, 
                                        rm.GetString("newGreeting"),
                                        rm.GetString("greeting")))
      nGreetings += 1
      Console.WriteLine("{0}", greeting)   
   End Sub
End Class
' The example displays the following output:
'       Привет!
'       Hello again!

如範例的輸出所示,當範例是在其系統文化特性是英文 (美國) 的電腦上執行時,主執行緒會以俄文顯示其初始字串。 不過,因為背景工作執行緒的文化特性衍生自目前的 Windows 系統文化特性,而不是應用程式目前的文化特性,所以背景工作執行緒會以英文顯示其字串。

下列範例會使用 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 屬性來定義新應用程式執行緒目前的文化特性和目前的 UI 文化特性。

此範例使用與上一個範例相同的資源檔。 要編譯以及將當地語系化的俄文語言資源內嵌至附屬元件的命令也相同,不同之處在于可執行檔元件的名稱會變更。

在啟動時,此範例會將目前的文化特性和目前的 UI 文化特性,設定為所有系統上的俄文 (俄羅斯) ,除了預設系統文化特性已經是俄文 (俄羅斯) 以外的所有系統。 如果預設系統文化特性已經是俄文 (俄羅斯) ,它會將目前的文化特性和目前的 UI 文化特性設定為英文 (的) 。 然後,它會呼叫 ShowGreeting 常式,其會在第一次呼叫時顯示簡單字串,並在後續的方法呼叫中顯示稍微不同的字串。 接下來,它會建立新的執行緒,這也會執行 ShowGreeting 常式。

using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;

[assembly:NeutralResourcesLanguageAttribute("en-US")]

public class Example
{
   private static int nGreetings = 0;
   private static ResourceManager rm;

   public static void Main()
   {
      AppDomain domain = AppDomain.CurrentDomain;
      rm = new ResourceManager("GreetingStrings",
                               typeof(Example).Assembly);

      CultureInfo culture = null;
      if (Thread.CurrentThread.CurrentUICulture.Name == "ru-RU")
         culture = CultureInfo.CreateSpecificCulture("en-US");
      else
         culture = CultureInfo.CreateSpecificCulture("ru-RU");

      CultureInfo.DefaultThreadCurrentCulture = culture;
      CultureInfo.DefaultThreadCurrentUICulture = culture;

      Thread.CurrentThread.CurrentCulture = culture;
      Thread.CurrentThread.CurrentUICulture = culture;

      ShowGreeting();
      Thread.Sleep(1000);

      Thread workerThread = new Thread(Example.ShowGreeting);
      workerThread.Start();
   }

   private static void ShowGreeting()
   {
      string greeting = nGreetings == 0 ? rm.GetString("newGreeting") :
                                          rm.GetString("greeting");
      nGreetings++;
      Console.WriteLine("{0}", greeting);
   }
}
// The example displays the following output:
//       Привет!
//       Еще раз привет!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguageAttribute("en-US")>

Public Class Example
   Private Shared nGreetings As Integer = 0
   Private Shared rm As ResourceManager

   Public Shared Sub Main()
      Dim domain As AppDomain = AppDomain.CurrentDomain
      rm = New ResourceManager("GreetingStrings", 
                               GetType(Example).Assembly)
                  
      Dim culture As CultureInfo = Nothing
      If Thread.CurrentThread.CurrentUICulture.Name = "ru-RU" Then
         culture = CultureInfo.CreateSpecificCulture("en-US")
      Else
         culture = CultureInfo.CreateSpecificCulture("ru-RU")
      End If   
      CultureInfo.DefaultThreadCurrentCulture = culture
      CultureInfo.DefaultThreadCurrentUICulture = culture
       
      Thread.CurrentThread.CurrentCulture = culture
      Thread.CurrentThread.CurrentUICulture = culture

      ShowGreeting()
      Thread.Sleep(1000)

      Dim workerThread As New Thread(AddressOf Example.ShowGreeting)
      workerThread.Start()
   End Sub
   
   Private Shared Sub ShowGreeting()
      Dim greeting As String = CStr(IIf(nGreetings = 0, 
                                        rm.GetString("newGreeting"),
                                        rm.GetString("greeting")))
      nGreetings += 1
      Console.WriteLine("{0}", greeting)   
   End Sub
End Class
' The example displays the following output:
'       Привет!
'       Еще раз привет!

如範例的輸出所示,當範例是在其系統文化特性是英文 (美國) 的電腦上執行時,主要執行緒和背景工作執行緒都會以俄文語言顯示其字串。

備註

在 .NET Framework 4 和先前的版本中,所有線程的 UI 文化特性預設會設定為 Windows 系統文化特性。 對於目前的 UI 文化特性與預設系統文化特性不同的應用程式,通常不需要這種行為。 在 .NET Framework 4.5 中, DefaultThreadCurrentUICulture 屬性可讓您定義應用程式域中所有線程的預設 UI 文化特性。

重要

如果您未明確設定在應用程式域中執行之任何現有線程的 UI 文化特性,則設定 DefaultThreadCurrentUICulture 屬性也會變更這些執行緒的文化特性。 但是,如果這些執行緒是在另一個應用程式域中執行,則其文化特性是由 DefaultThreadCurrentUICulture 該應用程式域中的屬性所定義,或者,如果沒有定義預設值,則預設系統文化特性為。 基於這個原因,我們建議您一律明確地設定主應用程式執行緒的文化特性,而不要依賴 DefaultThreadCurrentUICulture 屬性來定義主應用程式執行緒的文化特性。

除非明確設定,否則屬性的值 DefaultThreadCurrentUICulturenull ,而且尚未指派明確文化特性之應用程式域中所有線程的目前文化特性是由預設 Windows 系統文化特性所定義。

如需有關文化特性、執行緒和應用程式域的詳細資訊,請參閱參考頁面中的「文化特性和執行緒」和「文化特性和應用程式域」章節 CultureInfo

適用於

另請參閱