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 странице.