Compartilhar via


System.Globalization.CultureInfo.CurrentUICulture propriedade

Este artigo fornece observações complementares à documentação de referência para essa API.

A CurrentUICulture propriedade é uma propriedade por thread. Ou seja, cada thread tem sua própria cultura de interface do usuário atual. Essa propriedade é equivalente a recuperar ou definir o CultureInfo objeto atribuído à System.Threading.Thread.CurrentThread.CurrentUICulture propriedade. Quando um thread é iniciado, sua cultura de interface do usuário é inicialmente determinada da seguinte maneira:

  • Recuperando a cultura especificada pela DefaultThreadCurrentUICulture propriedade no domínio do aplicativo no qual o thread está sendo executado, se o valor da propriedade não nullfor .

  • Se o thread for um thread de pool de threads que está executando uma operação assíncrona baseada em tarefa e o aplicativo tem como alvo o .NET Framework 4.6 ou uma versão posterior do .NET Framework, sua cultura de interface do usuário é determinada pela cultura de interface do usuário do thread de chamada. O exemplo a seguir altera a cultura atual da interface do usuário para português (Brasil) e inicia seis tarefas, cada uma das quais exibe sua ID de thread, sua ID de tarefa e sua cultura de interface do usuário atual. Cada uma das tarefas (e os threads) herdou a cultura da interface do usuário do thread de chamada.

    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
    

    Para obter mais informações, consulte a seção "Cultura e operações assíncronas CultureInfo baseadas em tarefas" na documentação.

  • Chamando a função do Windows GetUserDefaultUILanguage .

Para alterar a cultura da interface do usuário usada por um thread, defina a propriedade para a Thread.CurrentUICulture nova cultura. Se você alterar explicitamente a cultura da interface do usuário de um thread dessa maneira, essa alteração persistirá se o thread cruzar os limites do domínio do aplicativo.

Observação

Se você definir o valor da propriedade para um CultureInfo objeto que representa uma nova cultura, o valor da Thread.CurrentThread.CurrentCulture propriedade também será alterado.

Obter a cultura atual da interface do usuário

A CultureInfo.CurrentUICulture propriedade é uma configuração por thread, ou seja, cada thread pode ter sua própria cultura de interface do usuário. Você obtém a cultura da interface do usuário do thread atual recuperando o valor da CultureInfo.CurrentUICulture propriedade, como ilustra o exemplo a seguir.

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]

Você também pode recuperar o valor da cultura de interface do usuário do thread atual da Thread.CurrentUICulture propriedade.

Definir explicitamente a cultura atual da interface do usuário

A partir do .NET Framework 4.6, você pode alterar a cultura atual da interface do usuário atribuindo um CultureInfo objeto que representa a nova cultura à CultureInfo.CurrentUICulture propriedade. A cultura atual da interface do usuário pode ser definida como uma cultura específica (como en-US ou de-DE) ou para uma cultura neutra (como en ou de). O exemplo a seguir define a cultura atual da interface do usuário como fr-FR ou francês (França).

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

Em um aplicativo multithreaded, você pode definir explicitamente a cultura da interface do usuário de qualquer thread atribuindo um CultureInfo objeto que representa essa cultura à propriedade do Thread.CurrentUICulture thread. Se o thread cuja cultura você deseja definir for o thread atual, você poderá atribuir a nova cultura à CultureInfo.CurrentUICulture propriedade. Quando a cultura de interface do usuário de um thread é definida explicitamente, esse thread mantém a mesma cultura, mesmo que cruze os limites do domínio do aplicativo e execute código em outro domínio do aplicativo.

Definir implicitamente a cultura atual da interface do usuário

Quando um thread, incluindo o thread do aplicativo principal, é criado pela primeira vez, por padrão, sua cultura de interface do usuário atual é definida da seguinte maneira:

  • Usando a cultura definida pela DefaultThreadCurrentUICulture propriedade para o domínio do aplicativo atual se o valor da propriedade não nullfor .
  • Usando a cultura padrão do sistema. Em sistemas que usam o sistema operacional Windows, o Common Language Runtime chama a função Windows GetUserDefaultUILanguage para definir a cultura de interface do usuário atual. GetUserDefaultUILanguage retorna a cultura de interface do usuário padrão definida pelo usuário. Se o usuário não tiver definido um idioma de interface do usuário padrão, ele retornará a cultura originalmente instalada no sistema.

Se o thread cruzar os limites do aplicativo e executar código em outro domínio de aplicativo, sua cultura será determinada da mesma maneira que a de um thread recém-criado.

Observe que, se você definir uma cultura de interface do usuário específica que seja diferente da cultura de interface do usuário instalada pelo sistema ou da cultura de interface do usuário preferencial do usuário, e seu aplicativo iniciar vários threads, a cultura de interface do usuário atual desses threads será a cultura retornada pela função, a GetUserDefaultUILanguage menos que você atribua uma cultura à DefaultThreadCurrentUICulture propriedade no domínio do aplicativo no qual o thread está sendo executado.

Considerações de segurança

Alterar a cultura do thread atual requer uma SecurityPermission permissão com o ControlThread valor definido.

Cuidado

A manipulação de threads é perigosa devido ao estado de segurança associado aos threads. Portanto, essa permissão deve ser dada apenas ao código confiável e, em seguida, somente conforme necessário. Não é possível alterar a cultura de thread em código semi-confiável.

A cultura atual da interface do usuário e os aplicativos UWP

Em aplicativos da Plataforma Universal do Windows (UWP), a propriedade é leitura-gravação, assim como nos aplicativos .NET Framework e .NET Core, você pode usá-la para obter e definir a CurrentUICulture cultura atual. No entanto, os aplicativos UWP não distinguem entre a cultura atual e a cultura atual da interface do usuário. As propriedades CurrentCulture e CurrentUICulture são mapeadas para o primeiro valor na coleção Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.

Nos aplicativos .NET Framework e .NET Core, a cultura de interface do usuário atual é uma configuração por thread e a propriedade reflete somente a CurrentUICulture cultura de interface do usuário do thread atual. Em aplicativos UWP, a cultura atual é mapeada para a propriedade Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , que é uma configuração global. A definição da CurrentCulture propriedade altera a cultura de todo o aplicativo, a cultura não pode ser definida por thread.