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
null
for .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
null
for . - 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.