Propiedad System.Globalization.CultureInfo.CurrentCulture

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

El CultureInfo objeto devuelto por la CurrentCulture propiedad y sus objetos asociados determina el formato predeterminado para las fechas, horas, números y valores de moneda, el orden de ordenación de texto, las convenciones de mayúsculas y minúsculas y las comparaciones de cadenas.

La referencia cultural actual es una propiedad del subproceso en ejecución. Al establecer esta propiedad en un CultureInfo objeto que representa una nueva referencia cultural, el valor de la Thread.CurrentThread.CurrentCulture propiedad también cambia. Sin embargo, se recomienda usar siempre la CultureInfo.CurrentCulture propiedad para recuperar y establecer la referencia cultural actual.

El CultureInfo objeto que devuelve esta propiedad es de solo lectura. Esto significa que no se puede mutar el objeto existente, por ejemplo, cambiando .DateTimeFormat Para cambiar el formato de fecha y hora o algún otro aspecto de la referencia cultural actual, cree un nuevo CultureInfo objeto y asígnelo a la propiedad .

Cómo se determina la referencia cultural de un subproceso

Cuando se inicia un subproceso, su referencia cultural se determina inicialmente de la siguiente manera:

  • Al recuperar la referencia cultural especificada por la DefaultThreadCurrentCulture propiedad en el dominio de aplicación en el que se ejecuta el subproceso, si el valor de la propiedad no nulles .

  • Si el subproceso es un subproceso de grupo de subprocesos que ejecuta una operación asincrónica basada en tareas, su referencia cultural viene determinada por la referencia cultural del subproceso que realiza la llamada. En el ejemplo siguiente se cambia la referencia cultural actual a Portugués (Brasil) y se inician seis tareas, cada una de las cuales muestra su identificador de subproceso, su identificador de tarea y su referencia cultural actual. Cada una de las tareas (y los subprocesos) ha heredado la referencia cultural del subproceso que realiza la llamada.

    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 obtener más información, consulte Referencia cultural y operaciones asincrónicas basadas en tareas.

  • Llamando a la GetUserDefaultLocaleName función en Windows o la uloc_getDefault función desde ICU, que actualmente llama a la función POSIX setlocale con categoría LC_MESSAGES, en sistemas similares a Unix.

Tenga en cuenta que si establece una referencia cultural específica diferente de la referencia cultural instalada por el sistema o la referencia cultural preferida del usuario, y la aplicación inicia varios subprocesos, la referencia cultural actual de esos subprocesos será la referencia cultural devuelta por la GetUserDefaultLocaleName función, a menos que asigne una referencia cultural a la DefaultThreadCurrentCulture propiedad en el dominio de aplicación en el que se ejecuta el subproceso.

Para obtener más información sobre cómo se determina la referencia cultural de un subproceso, vea la sección "Referencia cultural y subprocesos" en la CultureInfo página de referencia.

Obtención de la referencia cultural actual

La CultureInfo.CurrentCulture propiedad es una configuración por subproceso; es decir, cada subproceso puede tener su propia referencia cultural. Para obtener la referencia cultural del subproceso actual, recupere el valor de la CultureInfo.CurrentCulture propiedad , como se muestra en el ejemplo siguiente.

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]

Establecer explícitamente la propiedad CurrentCulture

Para cambiar la referencia cultural que usa un subproceso existente, establezca la CultureInfo.CurrentCulture propiedad en la nueva referencia cultural. Si cambia explícitamente la referencia cultural de un subproceso de esta manera, ese cambio persiste si el subproceso cruza los límites del dominio de la aplicación. En el ejemplo siguiente se cambia la referencia cultural del subproceso actual a Neerlandés (Países Bajos). También muestra que, cuando el subproceso actual cruza los límites del dominio de aplicación, su referencia cultural actual permanece modificada.

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

Nota:

El cambio de la referencia cultural mediante la CultureInfo.CurrentCulture propiedad requiere un SecurityPermission permiso con el conjunto de ControlThread valores. La manipulación de subprocesos es peligrosa debido al estado de seguridad asociado a los subprocesos. Por lo tanto, este permiso solo se debe conceder al código de confianza y, a continuación, solo según sea necesario. No se puede cambiar la referencia cultural de subprocesos en código de confianza parcial.

A partir de .NET Framework 4, puede cambiar explícitamente la referencia cultural del subproceso actual a una referencia cultural específica (como francés (Canadá)) o una referencia cultural neutra (como francés). Cuando un CultureInfo objeto representa una referencia cultural neutra, los valores de CultureInfo propiedades como Calendar, CompareInfo, DateTimeFormat, NumberFormaty TextInfo reflejan la referencia cultural específica asociada a la referencia cultural neutra. Por ejemplo, la cultura dominante para la cultura neutral inglesa es inglés (Estados Unidos); la cultura dominante para la cultura alemana es alemán (Alemania). En el ejemplo siguiente se muestra la diferencia en el formato cuando la referencia cultural actual se establece en una referencia cultural específica, francés (Canadá) y una referencia cultural 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 €

También puede usar la CultureInfo.CurrentCulture propiedad junto con la HttpRequest.UserLanguages propiedad para establecer la CurrentCulture propiedad de una aplicación de ASP.NET en la referencia cultural preferida del usuario, como se muestra en el ejemplo siguiente.

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

La referencia cultural actual y las invalidaciones del usuario

Windows permite a los usuarios invalidar los valores de propiedad estándar del CultureInfo objeto y sus objetos asociados mediante opciones regionales y de idioma en Panel de control. El CultureInfo objeto devuelto por la CurrentCulture propiedad refleja estas invalidaciones de usuario en los casos siguientes:

  • Si la función windows GetUserDefaultLocaleName establece implícitamente la referencia cultural del subproceso actual.

  • Si la referencia cultural del subproceso actual definida por la DefaultThreadCurrentCulture propiedad corresponde a la referencia cultural actual del sistema de Windows.

  • Si la referencia cultural del subproceso actual se establece explícitamente en una referencia cultural devuelta por el CreateSpecificCulture método y esa referencia cultural corresponde a la referencia cultural actual del sistema de Windows.

  • Si la referencia cultural del subproceso actual se establece explícitamente en una referencia cultural creada por el CultureInfo(String) constructor y esa referencia cultural corresponde a la referencia cultural actual del sistema de Windows.

En algunos casos, especialmente para las aplicaciones de servidor, establecer la referencia cultural actual en un CultureInfo objeto que refleje las invalidaciones del usuario puede no ser deseable. En su lugar, puede establecer la referencia cultural actual en un CultureInfo objeto que no refleje las invalidaciones del usuario de las siguientes maneras:

La referencia cultural actual y las aplicaciones para UWP

En las aplicaciones de Plataforma universal de Windows (UWP), la CurrentCulture propiedad es de lectura y escritura, al igual que en las aplicaciones de .NET Framework y .NET Core; puede usarla tanto para obtener como para establecer la referencia cultural actual. Sin embargo, las aplicaciones para UWP no distinguen entre la referencia cultural actual y la referencia cultural actual de la interfaz de usuario. Las propiedades CurrentCulture y CurrentUICulture se asignan al primer valor de la colección Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.

En las aplicaciones de .NET Framework y .NET Core, la referencia cultural actual es una configuración por subproceso y la CurrentCulture propiedad refleja solo la referencia cultural del subproceso actual. En las aplicaciones para UWP, la referencia cultural actual se asigna a la propiedad Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , que es una configuración global. Establecer la CurrentCulture propiedad cambia la referencia cultural de toda la aplicación; la referencia cultural no se puede establecer por subproceso.