Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому 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 {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 {Thread.CurrentThread.CurrentUICulture.Name}"); Console.WriteLine($"Application thread is thread {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 {Task.CurrentId} on thread {Thread.CurrentThread.ManagedThreadId} is {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 {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: {CultureInfo.CurrentUICulture.Name}");
CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
Console.WriteLine($"The current UI culture: {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, общий язык выполнения вызывает функцию Windows
GetUserDefaultUILanguage
для установки текущей культуры пользовательского интерфейса.GetUserDefaultUILanguage
возвращает культуру пользовательского интерфейса по умолчанию, заданную пользователем. Если пользователь не установил язык пользовательского интерфейса по умолчанию, возвращается культура, первоначально установленная в системе.
Если поток пересекает границы приложения и выполняет код в другом домене приложения, его культура определяется таким же образом, как и у нового потока.
Обратите внимание, что если задать определенный язык и региональные параметры пользовательского интерфейса, отличные от установленного системой языка пользовательского интерфейса или предпочитаемого пользовательского интерфейса пользователя, а приложение запускает несколько потоков, текущий язык и региональные параметры этих потоков будут языком и региональными параметрами, возвращаемыми функцией GetUserDefaultUILanguage
, если только не назначьте язык и региональные параметры свойству DefaultThreadCurrentUICulture в домене приложения, в котором выполняется поток.
Вопросы безопасности
Для изменения культуры текущего потока требуется разрешение SecurityPermission, с установленным значением ControlThread.
Осторожность
Манипулирование потоками опасно из-за состояния безопасности, связанного с потоками. Таким образом, это разрешение должно быть предоставлено только надежному коду, а затем только по мере необходимости. Невозможно изменить культуру потока в полунадежном коде.
Культура текущего пользовательского интерфейса и приложения UWP
В приложениях универсальной платформы Windows (UWP) свойство CurrentUICulture является одновременно доступным для чтения и записи, как и в приложениях .NET Framework и .NET Core. его можно использовать как для получения, так и для задания текущей культуры. Однако приложения UWP не различают текущую культуру и текущую культуру пользовательского интерфейса. Свойства CurrentCulture и CurrentUICulture соответствуют первому значению в коллекции Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.
В приложениях .NET Framework и .NET Core текущий язык пользовательского интерфейса — это параметр для каждого потока, а свойство CurrentUICulture отражает только язык пользовательского интерфейса текущего потока. В приложениях UWP текущая культура сопоставляется со свойством Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages, которое является глобальным параметром. Настройка свойства CurrentCulture изменяет культуру всего приложения; Культуру нельзя задать в рамках потока.