Свойство System.Globalization.CultureInfo.CurrentUICulture
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Это CurrentUICulture свойство является свойством для каждого потока. То есть каждый поток имеет собственный язык и региональные параметры пользовательского интерфейса. Это свойство эквивалентно получению или настройке объекта, назначенного CultureInfo свойству System.Threading.Thread.CurrentThread.CurrentUICulture
. При запуске потока его язык и региональные параметры пользовательского интерфейса изначально определяются следующим образом:
Извлекая язык и региональные параметры, указанные свойством DefaultThreadCurrentUICulture в домене приложения, в котором выполняется поток, если значение свойства не
null
является.Если поток является потоком пула потоков, выполняющим асинхронную операцию на основе задач, и приложение предназначено для платформа .NET Framework 4.6 или более поздней версии платформа .NET Framework, его язык и региональные параметры пользовательского интерфейса определяются языком пользовательского интерфейса вызывающего потока. В следующем примере изменяется текущий язык и региональные параметры пользовательского интерфейса на португальский (Бразилия) и запускается шесть задач, каждая из которых отображает идентификатор потока, идентификатор задачи и его текущий язык и региональные параметры пользовательского интерфейса. Каждая из задач (и потоков) наследует язык и региональные параметры пользовательского интерфейса вызывающего потока.
using System; using System.Collections.Generic; using System.Globalization; using System.Runtime.Versioning; using System.Threading; using System.Threading.Tasks; public class Example { public static async Task Main() { var tasks = new List<Task>(); Console.WriteLine("The current UI culture is {0}", Thread.CurrentThread.CurrentUICulture.Name); Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR"); // Change the current UI culture to Portuguese (Brazil). Console.WriteLine("Current UI culture changed to {0}", Thread.CurrentThread.CurrentUICulture.Name); Console.WriteLine("Application thread is thread {0}", Thread.CurrentThread.ManagedThreadId); // Launch six tasks and display their current culture. for (int ctr = 0; ctr <= 5; ctr++) tasks.Add(Task.Run(() => { Console.WriteLine("UI Culture of task {0} on thread {1} is {2}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.CurrentUICulture.Name); })); await Task.WhenAll(tasks.ToArray()); } } // The example displays output like the following: // The current UI culture is en-US // Current UI culture changed to pt-BR // Application thread is thread 9 // UI Culture of task 2 on thread 11 is pt-BR // UI Culture of task 1 on thread 10 is pt-BR // UI Culture of task 3 on thread 11 is pt-BR // UI Culture of task 5 on thread 11 is pt-BR // UI Culture of task 6 on thread 11 is pt-BR // UI Culture of task 4 on thread 10 is pt-BR
Imports System.Globalization Imports System.Threading Module Example1 Public Sub Main() Dim tasks As New List(Of Task) Console.WriteLine("The current UI culture is {0}", Thread.CurrentThread.CurrentUICulture.Name) Thread.CurrentThread.CurrentUICulture = New CultureInfo("pt-BR") ' Change the current UI culture to Portuguese (Brazil). Console.WriteLine("Current culture changed to {0}", Thread.CurrentThread.CurrentUICulture.Name) Console.WriteLine("Application thread is thread {0}", Thread.CurrentThread.ManagedThreadId) ' Launch six tasks and display their current culture. For ctr As Integer = 0 To 5 tasks.Add(Task.Run(Sub() Console.WriteLine("Culture of task {0} on thread {1} is {2}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.CurrentUICulture.Name) End Sub)) Next Task.WaitAll(tasks.ToArray()) End Sub End Module ' The example displays output like the following: ' The current culture is en-US ' Current culture changed to pt-BR ' Application thread is thread 9 ' Culture of task 2 on thread 11 is pt-BR ' Culture of task 1 on thread 10 is pt-BR ' Culture of task 3 on thread 11 is pt-BR ' Culture of task 5 on thread 11 is pt-BR ' Culture of task 6 on thread 11 is pt-BR ' Culture of task 4 on thread 10 is pt-BR
Дополнительные сведения см. в разделе "Язык и асинхронные операции на основе задач" документации CultureInfo .
Вызывая функцию Windows
GetUserDefaultUILanguage
.
Чтобы изменить язык и региональные параметры пользовательского интерфейса, используемые потоком, задайте Thread.CurrentUICulture для свойства новый язык и региональные параметры. Если вы явно изменяете язык и региональные параметры пользовательского интерфейса потока таким образом, это изменение сохраняется, если поток пересекает границы домена приложения.
Примечание.
Если задать значение свойства объекту CultureInfo , представляющего новый язык и региональные параметры, значение Thread.CurrentThread.CurrentCulture
свойства также изменяется.
Получение текущего языка и региональных параметров пользовательского интерфейса
Свойство CultureInfo.CurrentUICulture — это параметр для каждого потока. То есть каждый поток может иметь собственный язык и региональные параметры пользовательского интерфейса. Вы получаете язык и региональные параметры пользовательского интерфейса текущего CultureInfo.CurrentUICulture потока, извлекая значение свойства, как показано в следующем примере.
using System;
using System.Globalization;
public class Example2
{
public static void Main()
{
CultureInfo culture = CultureInfo.CurrentUICulture;
Console.WriteLine("The current UI culture is {0} [{1}]",
culture.NativeName, culture.Name);
}
}
// The example displays output like the following:
// The current UI culture is English (United States) [en-US]
Imports System.Globalization
Module Example3
Public Sub Main()
Dim culture As CultureInfo = CultureInfo.CurrentCulture
Console.WriteLine("The current UI culture is {0} [{1}]",
culture.NativeName, culture.Name)
End Sub
End Module
' The example displays output like the following:
' The current UI culture is English (United States) [en-US]
Вы также можете получить значение языка и региональных параметров пользовательского интерфейса текущего потока из Thread.CurrentUICulture свойства.
Явно задать текущий язык и региональные параметры пользовательского интерфейса
Начиная с платформа .NET Framework версии 4.6, можно изменить текущий язык и региональные параметры пользовательского интерфейса, назначив CultureInfo объект, представляющий новый язык и региональные параметры для CultureInfo.CurrentUICulture свойства. Текущий язык и региональные параметры пользовательского интерфейса можно задать для определенного языка и региональных параметров (например, en-US или de-DE) или нейтрального языка и региональных параметров (например, en или de). В следующем примере для текущего языка и региональных параметров пользовательского интерфейса задано значение fr-FR или французский (Франция).
using System;
using System.Globalization;
public class Example1
{
public static void Main()
{
Console.WriteLine("The current UI culture: {0}",
CultureInfo.CurrentUICulture.Name);
CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
Console.WriteLine("The current UI culture: {0}",
CultureInfo.CurrentUICulture.Name);
}
}
// The example displays output like the following:
// The current UI culture: en-US
// The current UI culture: fr-FR
Imports System.Globalization
Module Example2
Public Sub Main()
Console.WriteLine("The current UI culture: {0}",
CultureInfo.CurrentUICulture.Name)
CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
Console.WriteLine("The current UI culture: {0}",
CultureInfo.CurrentUICulture.Name)
End Sub
End Module
' The example displays output like the following:
' The current UI culture: en-US
' The current UI culture: fr-FR
В многопоточное приложение можно явно задать язык и региональные параметры пользовательского интерфейса любого потока, назначив CultureInfo объект, представляющий этот язык и региональные параметры свойству потока Thread.CurrentUICulture . Если поток, язык и региональные параметры которого вы хотите задать, является текущим потоком, можно назначить новому языку и региональные параметры свойству CultureInfo.CurrentUICulture . Если язык и региональные параметры пользовательского интерфейса потока заданы явным образом, этот поток сохраняет тот же язык и региональные параметры, даже если он пересекает границы домена приложения и выполняет код в другом домене приложения.
Неявно задать текущий язык и региональные параметры пользовательского интерфейса
Когда поток, включая основной поток приложения, сначала создается, по умолчанию его текущий язык и региональные параметры пользовательского интерфейса задаются следующим образом:
- Используя язык и региональные параметры, определенные свойством DefaultThreadCurrentUICulture для текущего домена приложения, если значение свойства не
null
является. - Используя язык и региональные параметры по умолчанию системы. В системах, использующих операционную систему Windows, среда CLR вызывает функцию Windows
GetUserDefaultUILanguage
, чтобы задать текущий язык и региональные параметры пользовательского интерфейса.GetUserDefaultUILanguage
возвращает язык и региональные параметры пользовательского интерфейса по умолчанию, заданные пользователем. Если пользователь не установил язык пользовательского интерфейса по умолчанию, он возвращает язык и региональные параметры, первоначально установленные в системе.
Если поток пересекает границы приложения и выполняет код в другом домене приложения, его язык и региональные параметры определяются таким же образом, как и только что созданный поток.
Обратите внимание, что если задать определенный язык и региональные параметры пользовательского интерфейса, отличные от языка и региональных параметров пользовательского интерфейса, установленного системой, или предпочтительный язык пользовательского интерфейса пользователя, а приложение запускает несколько потоков, текущий язык и региональные параметры этих потоков будут языком и региональными параметрами, возвращаемыми GetUserDefaultUILanguage
функцией, если только вы не назначите DefaultThreadCurrentUICulture свойству в домене приложения, в котором выполняется поток.
Вопросы безопасности
Для изменения языка и региональных параметров текущего потока требуется разрешение с набором SecurityPermission значений ControlThread .
Внимание
Управление потоками опасно из-за состояния безопасности, связанного с потоками. Таким образом, это разрешение должно быть предоставлено только надежному коду, а затем только по мере необходимости. Невозможно изменить язык и региональные параметры потока в полунадежном коде.
Текущие региональные параметры пользовательского интерфейса и приложения UWP
В приложениях универсальная платформа Windows (UWP) свойство выполняется чтение и запись, CurrentUICulture так же как и в приложениях платформа .NET Framework и .NET Core. Его можно использовать как для получения, так и для задания текущего языка и региональных параметров. Однако приложения UWP не различают текущий язык и региональные параметры и текущие региональные параметры пользовательского интерфейса. Свойства CurrentCulture сопоставляют первое значение в коллекции Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.CurrentUICulture
В приложениях платформа .NET Framework и .NET Core текущий язык пользовательского интерфейса — это параметр для каждого потока, а CurrentUICulture свойство отражает язык и региональные параметры пользовательского интерфейса текущего потока. В приложениях UWP текущий язык и региональные параметры сопоставляется со свойством Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , которое является глобальным параметром. CurrentCulture Настройка свойства изменяет язык и региональные параметры всего приложения. Язык и региональные параметры нельзя задать на основе потока.