Propriedade System.Globalization.CultureInfo.CurrentCulture

Este artigo fornece observações complementares à documentação de referência para essa 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 do thread em 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 é alterado. No entanto, recomendamos que você sempre use a propriedade para recuperar e definir a CultureInfo.CurrentCulture cultura atual.

O CultureInfo objeto que essa propriedade retorna é somente leitura. Isso significa que você não pode mutar o objeto existente, por exemplo, alterando o DateTimeFormat. Para alterar o formato de data-hora ou algum outro aspecto 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 nullfor .

  • Se o thread for um thread de pool de threads que está executando uma operação assíncrona baseada em tarefa, sua cultura será determinada pela cultura do thread de 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 {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 (int ctr = 0; ctr <= 5; ctr++)
                tasks.Add(Task.Run(() =>
                {
                    Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                      Task.CurrentId,
                                      Thread.CurrentThread.ManagedThreadId,
                                      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.

  • Chamando a função no Windows ou a função da ICU, que atualmente chama a GetUserDefaultLocaleNameuloc_getDefault função POSIX setlocale com categoria LC_MESSAGES, em sistemas Unix-like.

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

Para obter mais informações sobre como a cultura de um thread é determinada, consulte a seção "Cultura e threads" na CultureInfo página de 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 do thread atual recuperando o valor da CultureInfo.CurrentCulture propriedade, 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 {0} [{1}]",
                        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]

Defina a propriedade CurrentCulture explicitamente

Para alterar a cultura usada por um thread existente, defina a propriedade para a CultureInfo.CurrentCulture 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 {0} in application domain {1}: {2}",
                          Thread.CurrentThread.Name,
                          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 usando a CultureInfo.CurrentCulture propriedade requer uma SecurityPermission permissão com o ControlThread valor definido. 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 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, , CompareInfoDateTimeFormat, NumberFormate TextInfo refletem a cultura específica associada à cultura neutra. Por exemplo, a cultura dominante para a cultura neutra inglesa é o inglês (Estados Unidos); a cultura dominante para a cultura alemã é o alemão (Alemanha). O exemplo a seguir ilustra a diferença na formatação quando a cultura atual é definida como uma cultura específica, francês (Canadá), e uma cultura neutra, 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: {0}",
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}\n", value);

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}", value);
   }
}
// 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 propriedade junto com a propriedade para definir a propriedade de um aplicativo ASP.NET para a cultura preferida do usuário, como ilustra o exemplo a CultureInfo.CurrentCultureHttpRequest.UserLanguagesCurrentCulture seguir.

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(Request13.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))

A cultura atual e as substituições do usuário

O Windows permite que os usuários substituam os valores de propriedade padrão do CultureInfo objeto e seus objetos associados usando Opções Regionais e de Idioma no Painel de Controle. O CultureInfo objeto retornado pela CurrentCulture propriedade reflete essas substituições de usuário nos seguintes casos:

  • Se a cultura de thread atual for definida implicitamente pela função do Windows GetUserDefaultLocaleName .

  • Se a cultura de thread atual definida pela DefaultThreadCurrentCulture propriedade corresponder à cultura atual do sistema Windows.

  • Se a cultura de thread atual for definida explicitamente como uma cultura retornada CreateSpecificCulture pelo método, 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, especialmente para aplicativos de servidor, definir a cultura atual como um CultureInfo objeto que reflete substituições de usuário pode ser indesejável. Em vez disso, você pode definir a cultura atual para um CultureInfo objeto que não reflete as substituições do usuário das seguintes maneiras:

A cultura e os aplicativos UWP atuais

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 CurrentCulture 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 atual é uma configuração por thread e a CurrentCulture propriedade reflete somente 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. A definição da CurrentCulture propriedade altera a cultura de todo o aplicativo, a cultura não pode ser definida por thread.