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; }
member this.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!
Как показано в выходных данных из примера, при запуске примера на компьютере, системный язык и региональные параметры которых — английский (США), основной поток отображает начальную строку на русском языке. Тем не менее, поскольку язык и региональные параметры рабочего потока являются производными от текущего 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 странице.