CultureInfo.DefaultThreadCurrentUICulture Свойство

Определение

Возвращает или задает язык и региональные параметры пользовательского интерфейса по умолчанию для потоков в текущем домене приложения.

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

Значение свойства

Язык и региональные параметры пользовательского интерфейса по умолчанию для потоков в текущем домене приложения или null если текущий язык и региональные параметры пользовательского интерфейса системы — это язык пользовательского интерфейса потока по умолчанию в домене приложения.

Исключения

В операции Name набора значение свойства недопустимо.

Примеры

В следующем примере показано поведение .NET по умолчанию при определении текущего языка и региональных параметров нового потока. В нем используются ресурсы английского и русского языка. Следующий текстовый файл с именем GreetingStrings.txt содержит ресурсы английского языка:

greeting =Hello again!
newGreeting=Hello!

Он компилируется в двоичный файл ресурсов с именем GreetingStrings.resources с помощью генератора файлов ресурсов с помощью следующей команды.

resgen greetingstrings.txt

Следующий текстовый файл с именем GreetingStrings.ru-RU.txt содержит ресурсы русского языка:

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

Он компилируется в двоичный файл ресурсов с именем GreetingStrings.ru-RU.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

При запуске пример задает текущую культуру и текущий язык и региональные параметры пользовательского интерфейса для российских (Россия) для всех систем, кроме тех, на которых система по умолчанию уже является русской (Россия). Если системный язык по умолчанию уже русский (Россия), код задает текущий язык и региональные параметры и текущий язык пользовательского интерфейса на английский (США). Затем он вызывает подпрограмму 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 параметры для определения текущего языка и региональных параметров и региональных параметров пользовательского интерфейса нового потока приложения.

В примере используются те же файлы ресурсов, что и в предыдущем примере. Команды для компиляции и внедрения локализованных языковых ресурсов в вспомогательной сборке также идентичны, за исключением того, что имя исполняемой сборки изменяется.

При запуске пример задает текущую культуру и текущий язык и региональные параметры пользовательского интерфейса для российских (Россия) для всех систем, кроме тех, на которых система по умолчанию уже является русской (Россия). Если системный язык по умолчанию уже русский (Россия), он задает текущую культуру и текущий язык и региональные параметры пользовательского интерфейса на английский (США). Затем он вызывает подпрограмму 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 и предыдущих версиях язык и региональные параметры пользовательского интерфейса всех потоков задаются в системном языке Windows. Для приложений, текущие региональные параметры пользовательского интерфейса которых отличаются от системного языка и региональных параметров по умолчанию, это поведение часто нежелательно. В .NET Framework 4.5+ DefaultThreadCurrentUICulture свойство позволяет определить язык и региональные параметры пользовательского интерфейса по умолчанию для всех потоков в домене приложения.

Это важно

Если вы явно не задали язык и региональные параметры пользовательского интерфейса существующих потоков, выполняемых в домене приложения, задание DefaultThreadCurrentUICulture свойства также изменяет язык и региональные параметры этих потоков. Однако если эти потоки выполняются в другом домене приложения, их язык и региональные параметры определяются DefaultThreadCurrentUICulture свойством в этом домене приложения или, если значение по умолчанию не определено, по умолчанию системный язык и региональные параметры. Из-за этого мы рекомендуем всегда явно задать язык и региональные параметры основного потока приложения и не полагаться на DefaultThreadCurrentUICulture свойство, чтобы определить язык и региональные параметры основного потока приложения.

Если оно не задано явным образом, значение DefaultThreadCurrentUICulture свойства равно null, а текущий язык и региональные параметры всех потоков в домене приложения, которые не назначены явным языком и региональными параметрами, определяются по умолчанию системным языком и региональными параметрами Windows.

Дополнительные сведения о языках и региональных параметрах, потоках и доменах приложений см. в разделах "Язык и региональные параметры и потоки" и "Домены CultureInfoязыка и приложений".

Применяется к

См. также раздел