Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
El objeto CultureInfo devuelto por la propiedad CurrentCulture y sus objetos asociados determina el formato predeterminado para las fechas, horas, números y valores monetarios, el orden de clasificació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 propiedad CultureInfo.CurrentCulture 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 objeto CultureInfo
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 cultura especificada por la propiedad DefaultThreadCurrentCulture en el dominio de aplicación en el que se está ejecutando el subproceso, si el valor de la propiedad no es
null
.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 {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 obtener más información, consulte Cultura y operaciones asincrónicas basadas en tareas.
Al llamar a la función
GetUserDefaultLocaleName
en Windows o a la funciónuloc_getDefault
desde ICU, que actualmente llama a la función POSIXsetlocale
con categoríaLC_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, consulte la sección "Referencia cultural y subprocesos" en la página de referencia CultureInfo.
Obtén la cultura 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 propiedad CultureInfo.CurrentCulture, 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 {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 configuración regional que usa un subproceso existente, establezca la propiedad CultureInfo.CurrentCulture en la nueva configuración regional. Si cambia explícitamente la cultura de un subproceso de esta manera, ese cambio persiste si el subproceso atraviesa los límites del dominio de la aplicación. En el siguiente ejemplo, se cambia la cultura del hilo 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 cultura actual permanece cambiada.
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
Nota:
Cambiar la cultura mediante la propiedad CultureInfo.CurrentCulture requiere un permiso SecurityPermission con el valor ControlThread establecido. 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 solo cuando sea necesario. No se puede cambiar la cultura del subproceso en código de confianza parcial.
A partir de .NET Framework 4, puede cambiar explícitamente la cultura del subproceso actual a una cultura específica (como el francés (Canadá)) o una cultura neutra (como el 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 siguiente ejemplo se ilustra la diferencia en el formato cuando la referencia cultural actual se establece en una específica, francés (Canadá) y una 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: {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 €
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 cultura 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 configuración cultural actual y las configuraciones personalizadas 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 el Panel de control. El objeto CultureInfo devuelto por la propiedad CurrentCulture refleja estas sobrescrituras de usuario en los casos siguientes:
Si la cultura del subproceso actual se establece implícitamente mediante la función
GetUserDefaultLocaleName
de Windows.Si la cultura del hilo actual definida por la propiedad DefaultThreadCurrentCulture corresponde a la cultura actual del sistema de Windows.
Si la referencia cultural del subproceso actual se establece explícitamente en una referencia cultural devuelta por el método CreateSpecificCulture y esa referencia cultural corresponde a la referencia cultural del sistema de Windows actual.
Si la referencia cultural de subprocesos actual se establece explícitamente en una referencia cultural de la que se crea una instancia CultureInfo(String) y esa referencia cultural corresponde a la referencia cultural actual del sistema Windows.
En algunos casos, especialmente para las aplicaciones de servidor, establecer la configuración regional actual en un objeto CultureInfo que refleje las configuraciones personalizadas de usuario puede no ser deseable. En su lugar, puede establecer la referencia cultural actual en un objeto CultureInfo que no refleje los ajustes del usuario de las siguientes maneras:
Llamando al constructor CultureInfo(String, Boolean) con un valor de
false
para el argumentouseUserOverride
.Mediante una llamada al GetCultureInfo método , que devuelve un objeto de solo lectura CultureInfo almacenado en caché.
La cultura actual y las aplicaciones UWP
En las aplicaciones de la Plataforma universal de Windows (UWP), la propiedad CurrentCulture es de lectura y escritura, igual que en aplicaciones de .NET Framework y .NET Core; puede usarla tanto para obtener como para establecer la cultura actual. Sin embargo, las aplicaciones para UWP no distinguen entre la cultura actual y la cultura de interfaz de usuario actual. 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 propiedad CurrentCulture cambia la cultura de toda la aplicación; la cultura no se puede establecer por hilo.