Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo fornece observações complementares à documentação de referência para esta API.
O CultureInfo objeto retornado pela CurrentCulture propriedade e seus objetos associados determina o formato padrão para datas, horas, números e valores de moeda, a ordem de classificação do texto, convenções de caixa e comparações de cadeia de caracteres.
A cultura atual é uma propriedade de um fio de execução. Quando você define essa propriedade como um CultureInfo objeto que representa uma nova cultura, o valor da Thread.CurrentThread.CurrentCulture
propriedade também muda. No entanto, recomendamos que se use sempre a propriedade CultureInfo.CurrentCulture para recuperar e definir a cultura atual.
O objeto CultureInfo
que esta propriedade retorna é de leitura apenas. Isso significa que você não pode mutar o objeto existente, por exemplo, alterando o DateTimeFormat
. Para alterar o formato de data e hora ou algum outro aspeto da cultura atual, crie um novo CultureInfo
objeto e atribua-o à propriedade.
Como a cultura de um fio é determinada
Quando um thread é iniciado, sua cultura é inicialmente determinada da seguinte maneira:
Recuperando a cultura especificada pela DefaultThreadCurrentCulture propriedade no domínio do aplicativo no qual o thread está sendo executado, se o valor da propriedade não
null
for .Se o tópico for um tópico do pool de tópicos que esteja executando uma operação assíncrona baseada em tarefas, a sua cultura será determinada pela cultura do tópico que faz a chamada. O exemplo a seguir altera a cultura atual para português (Brasil) e inicia seis tarefas, cada uma das quais exibe sua ID de thread, sua ID de tarefa e sua cultura atual. Cada uma das tarefas (e os threads) herdou a cultura 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 Example14 { public static async Task Main() { var tasks = new List<Task>(); Console.WriteLine($"The current culture is {Thread.CurrentThread.CurrentCulture.Name}"); Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR"); // Change the current culture to Portuguese (Brazil). Console.WriteLine($"Current culture changed to {Thread.CurrentThread.CurrentCulture.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($"Culture of task {Task.CurrentId} on thread {Thread.CurrentThread.ManagedThreadId} is {Thread.CurrentThread.CurrentCulture.Name}"); })); await Task.WhenAll(tasks.ToArray()); } } // 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
Imports System.Globalization Imports System.Threading Module Example1 Public Sub S1() Dim tasks As New List(Of Task) Console.WriteLine("The current culture is {0}", Thread.CurrentThread.CurrentCulture.Name) Thread.CurrentThread.CurrentCulture = New CultureInfo("pt-BR") ' Change the current culture to Portuguese (Brazil). Console.WriteLine("Current culture changed to {0}", Thread.CurrentThread.CurrentCulture.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.CurrentCulture.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 Cultura e operações assíncronas baseadas em tarefas.
Ao chamar a função
GetUserDefaultLocaleName
no Windows ou a funçãouloc_getDefault
da ICU, que atualmente chama a função POSIXsetlocale
com a categoriaLC_MESSAGES
, em sistemas tipo Unix.
Nota que, se definires uma cultura específica que seja diferente da cultura instalada no sistema ou da cultura preferida do utilizador, e a tua aplicação iniciar vários threads, a cultura atual desses threads será a cultura retornada pela função GetUserDefaultLocaleName
, a menos que atribuas uma cultura à propriedade DefaultThreadCurrentCulture no domínio da aplicação em que o thread está a ser executado.
Para obter mais informações sobre como a cultura de um fluxo é determinada, consulte a seção "Cultura e fluxos" na página de CultureInfo referência.
Obtenha a cultura atual
A CultureInfo.CurrentCulture propriedade é uma configuração por thread, ou seja, cada thread pode ter sua própria cultura. Você obtém a cultura da thread atual recuperando o valor da propriedade CultureInfo.CurrentCulture, como ilustra o exemplo a seguir.
using System;
using System.Globalization;
public class Example5
{
public static void Main()
{
CultureInfo culture = CultureInfo.CurrentCulture;
Console.WriteLine($"The current culture is {culture.NativeName} [{culture.Name}]");
}
}
// The example displays output like the following:
// The current culture is English (United States) [en-US]
Imports System.Globalization
Module Example3
Public Sub S1()
Dim culture As CultureInfo = CultureInfo.CurrentCulture
Console.WriteLine("The current culture is {0} [{1}]",
culture.NativeName, culture.Name)
End Sub
End Module
' The example displays output like the following:
' The current culture is English (United States) [en-US]
Definir a propriedade CurrentCulture explicitamente
Para alterar a cultura usada por um thread existente, defina a CultureInfo.CurrentCulture propriedade como a nova cultura. Se você alterar explicitamente a cultura de um thread dessa maneira, essa alteração persistirá se o thread cruzar os limites do domínio do aplicativo. O exemplo a seguir altera a cultura de thread atual para holandês (Holanda). Ele também mostra que, quando o thread atual cruza os limites do domínio do aplicativo, sua cultura atual permanece alterada.
using System;
using System.Globalization;
using System.Threading;
public class Info11 : MarshalByRefObject
{
public void ShowCurrentCulture()
{
Console.WriteLine($"Culture of {Thread.CurrentThread.Name} in application domain {AppDomain.CurrentDomain.FriendlyName}: {CultureInfo.CurrentCulture.Name}");
}
}
public class Example11
{
public static void Main()
{
Info11 inf = new Info11();
// Set the current culture to Dutch (Netherlands).
Thread.CurrentThread.Name = "MainThread";
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
inf.ShowCurrentCulture();
// Create a new application domain.
AppDomain ad = AppDomain.CreateDomain("Domain2");
Info11 inf2 = (Info11)ad.CreateInstanceAndUnwrap(typeof(Info11).Assembly.FullName, "Info11");
inf2.ShowCurrentCulture();
}
}
// The example displays the following output:
// Culture of MainThread in application domain ChangeCulture1.exe: nl-NL
// Culture of MainThread in application domain Domain2: nl-NL
Imports System.Globalization
Imports System.Threading
Public Class Info : Inherits MarshalByRefObject
Public Sub ShowCurrentCulture()
Console.WriteLine("Culture of {0} in application domain {1}: {2}",
Thread.CurrentThread.Name,
AppDomain.CurrentDomain.FriendlyName,
CultureInfo.CurrentCulture.Name)
End Sub
End Class
Module Example2
Public Sub S1()
Dim inf As New Info()
' Set the current culture to Dutch (Netherlands).
Thread.CurrentThread.Name = "MainThread"
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL")
inf.ShowCurrentCulture()
' Create a new application domain.
Dim ad As AppDomain = AppDomain.CreateDomain("Domain2")
Dim inf2 As Info = CType(ad.CreateInstanceAndUnwrap(GetType(Info).Assembly.FullName, "Info"),
Info)
inf2.ShowCurrentCulture()
End Sub
End Module
' This example displays the following output:
' Culture of MainThread in application domain Example.exe: nl-NL
' Culture of MainThread in application domain Domain2: nl-NL
Observação
Alterar a cultura utilizando a propriedade CultureInfo.CurrentCulture requer uma permissão SecurityPermission com o valor ControlThread definido. A manipulação de threads é perigosa devido ao estado de segurança associado aos threads. Portanto, essa permissão deve ser dada apenas a um código confiável e, em seguida, apenas conforme necessário. Não é possível alterar a cultura de threads em código semiconfiável.
A partir do .NET Framework 4, você pode alterar explicitamente a cultura de thread atual para uma cultura específica (como francês (Canadá)) ou uma cultura neutra (como francês). Quando um CultureInfo objeto representa uma cultura neutra, os valores de CultureInfo propriedades como Calendar, CompareInfo, DateTimeFormat, NumberFormat, e TextInfo refletem a cultura específica que está associada à cultura neutra. Por exemplo, a cultura dominante para a cultura neutra inglesa é a inglesa (Estados Unidos); a cultura dominante para a cultura alemã é a alemã (Alemanha). O exemplo a seguir ilustra a diferença na formatação quando a cultura atual é definida como uma cultura específica, o francês (Canadá), e uma cultura neutra, o francês.
using System;
using System.Globalization;
using System.Threading;
public class Example12
{
public static void Main()
{
double value = 1634.92;
CultureInfo.CurrentCulture = new CultureInfo("fr-CA");
Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
Console.WriteLine($"{value:C2}\n");
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
Console.WriteLine($"{value:C2}");
}
}
// The example displays the following output:
// Current Culture: fr-CA
// 1 634,92 $
//
// Current Culture: fr
// 1 634,92 €
Imports System.Globalization
Imports System.Threading
Module Example4
Public Sub S1()
Dim value As Double = 1634.92
CultureInfo.CurrentCulture = New CultureInfo("fr-CA")
Console.WriteLine("Current Culture: {0}",
CultureInfo.CurrentCulture.Name)
Console.WriteLine("{0:C2}", value)
Console.WriteLine()
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr")
Console.WriteLine("Current Culture: {0}",
CultureInfo.CurrentCulture.Name)
Console.WriteLine("{0:C2}", value)
End Sub
End Module
' The example displays the following output:
' Current Culture: fr-CA
' 1 634,92 $
'
' Current Culture: fr
' 1 634,92 €
Você também pode usar a CultureInfo.CurrentCulture propriedade junto com a HttpRequest.UserLanguages propriedade para definir a CurrentCulture propriedade de um aplicativo ASP.NET para a cultura preferida do usuário, como ilustra o exemplo a seguir.
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(Request13.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))
A cultura atual e as sobreposições do utilizador
O Windows permite que os utilizadores substituam os valores de propriedade padrão do objeto CultureInfo e dos seus objetos associados usando as Opções Regionais e de Idioma no Painel de Controle. O objeto CultureInfo retornado pela propriedade CurrentCulture reflete essas alterações feitas pelo utilizador nos seguintes casos:
Se a cultura de thread atual for definida implicitamente pela função do Windows
GetUserDefaultLocaleName
.Se a cultura da thread atual, que é definida pela propriedade DefaultThreadCurrentCulture, corresponder à cultura atual do sistema operativo Windows.
Se a cultura de thread atual for definida explicitamente como uma cultura retornada pelo método CreateSpecificCulture, e essa cultura corresponder à cultura atual do sistema Windows.
Se a cultura de thread atual for definida explicitamente como uma cultura instanciada CultureInfo(String) pelo construtor, e essa cultura corresponder à cultura atual do sistema Windows.
Em alguns casos, particularmente para aplicativos de servidor, definir a cultura atual para um CultureInfo objeto que reflita substituições de usuário pode ser indesejável. Em vez disso, pode-se definir a cultura atual para um objeto CultureInfo que não reflete as substituições do utilizador nas maneiras seguintes:
Ao chamar o construtor CultureInfo(String, Boolean) com um valor
false
para o argumentouseUserOverride
.Ao chamar o método GetCultureInfo, que retorna um objeto em cache somente de leitura CultureInfo.
A cultura atual e os aplicativos UWP
Em aplicações da Plataforma Universal do Windows (UWP), a propriedade CurrentCulture é leitura-gravação, assim como nas aplicações .NET Framework e .NET Core; você pode usá-la para obter e definir a 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 correspondem ao primeiro valor da coleção de linguagens Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.
Nos aplicativos .NET Framework e .NET Core, a cultura atual é uma configuração por thread e a CurrentCulture propriedade reflete apenas a cultura 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. Definir a CurrentCulture propriedade altera a cultura de todo o aplicativo, a cultura não pode ser definida por thread.