Поделиться через


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 Framework при определении текущего языка и региональных параметров нового потока. В ней используются ресурсы на английском и русском языках. Следующий текстовый файл с именем GreetingStrings.txt содержит ресурсы на английском языке:

greeting =Hello again!
newGreeting=Hello!

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

resgen greetingstrings.txt

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

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

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

Как показано в выходных данных примера, при выполнении примера на компьютере с языком и региональными параметрами на английском языке (США), поток main отображает свою начальную строку на русском языке. Тем не менее, так как язык и региональные параметры рабочего потока являются производными от текущего языка и региональных параметров Windows, а не из текущего языка и региональных параметров приложения, рабочий поток отображает свою строку на английском языке.

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

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

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

Важно!

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

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

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

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

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