Свойство 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 Настройка свойства изменяет язык и региональные параметры всего приложения. Язык и региональные параметры нельзя задать на основе потока.