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; }
static member DefaultThreadCurrentUICulture : System.Globalization.CultureInfo with get, set
Public Shared Property DefaultThreadCurrentUICulture As 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-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!

如示例输出所示,当示例在系统区域性为英语 (美国) 的计算机上运行时,main线程以俄语显示其初始字符串。 但是,由于工作线程的区域性派生自当前 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:
'       Привет!
'       Еще раз привет!

如示例输出所示,当示例在系统区域性为英语 (美国) 的计算机上运行时,main线程和工作线程都以俄语显示其字符串。

注解

在 .NET Framework 4 及早期版本中,默认情况下,所有线程的 UI 区域性都设置为 Windows 系统区域性。 对于当前 UI 区域性不同于默认系统区域性的应用程序,此行为通常是不可取的。 在 .NET Framework 4.5 中, DefaultThreadCurrentUICulture 属性允许你定义应用程序域中所有线程的默认 UI 区域性。

重要

如果尚未显式设置在应用程序域中执行的任何现有线程的 UI 区域性,则设置 DefaultThreadCurrentUICulture 属性也会更改这些线程的区域性。 但是,如果这些线程在另一个应用程序域中执行,则它们的区域性由 DefaultThreadCurrentUICulture 该应用程序域中的 属性定义,如果未定义默认值,则由默认系统区域性定义。 因此,我们建议始终显式设置main应用程序线程的区域性,并且不要依赖 DefaultThreadCurrentUICulture 属性来定义main应用程序线程的区域性。

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

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

适用于

另请参阅