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 的二进制 .resources 文件。

resgen greetingstrings.txt

以下名为 GreetingStrings.ru-RU.txt 文本文件包含俄语资源:

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

它通过以下命令使用资源文件生成器 GreetingStrings.ru 名为 GreetingStrings.ru-RU.resources 的二 进制 .resources 文件。

resgen greetingstrings.ru-RU.txt

如下所示的应用程序代码驻留在名为 Example1.vb 或 Example1.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区域性,而不是应用程序的当前区域性,因此工作线程以英语显示其字符串。

下面的示例使用 和 DefaultThreadCurrentCulture 属性定义新应用程序线程的当前区域性 DefaultThreadCurrentUICulture 和当前 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 线程的区域性。

除非显式设置,否则 属性的值为 ,并且应用程序域中所有尚未分配显式区域性的线程的当前区域性由系统区域性Windows DefaultThreadCurrentUICulture null 定义。

有关区域性、线程和应用程序域详细信息,请参阅参考页中的"区域性和线程"和"区域性和应用程序 CultureInfo 域"部分。

适用于

另请参阅