Propiedad System.Globalization.CultureInfo.CurrentUICulture

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

La CurrentUICulture propiedad es una propiedad por subproceso. Es decir, cada subproceso tiene su propia referencia cultural de interfaz de usuario actual. Esta propiedad es equivalente a recuperar o establecer el CultureInfo objeto asignado a la System.Threading.Thread.CurrentThread.CurrentUICulture propiedad . Cuando se inicia un subproceso, su referencia cultural de interfaz de usuario se determina inicialmente de la siguiente manera:

  • Al recuperar la referencia cultural especificada por la DefaultThreadCurrentUICulture 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 y la aplicación tiene como destino .NET Framework 4.6 o una versión posterior de .NET Framework, la referencia cultural de la interfaz de usuario viene determinada por la referencia cultural de la interfaz de usuario del subproceso que realiza la llamada. En el ejemplo siguiente se cambia la referencia cultural de la interfaz de usuario 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 de la interfaz de usuario. Cada una de las tareas (y los subprocesos) ha heredado la referencia cultural de la interfaz de usuario 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 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 obtener más información, consulte la sección "Referencia cultural y operaciones asincrónicas basadas en tareas" en la CultureInfo documentación.

  • Llamando a la función de Windows GetUserDefaultUILanguage .

Para cambiar la referencia cultural de la interfaz de usuario usada por un subproceso, establezca la Thread.CurrentUICulture propiedad en la nueva referencia cultural. Si cambia explícitamente la referencia cultural de la interfaz de usuario de un subproceso de esta manera, ese cambio persiste si el subproceso cruza los límites del dominio de la aplicación.

Nota:

Si establece el valor de propiedad en un CultureInfo objeto que representa una nueva referencia cultural, el valor de la Thread.CurrentThread.CurrentCulture propiedad también cambia.

Obtención de la referencia cultural actual de la interfaz de usuario

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

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]

También puede recuperar el valor de la referencia cultural de la interfaz de usuario del subproceso actual de la Thread.CurrentUICulture propiedad .

Establecer explícitamente la referencia cultural de la interfaz de usuario actual

A partir de .NET Framework 4.6, puede cambiar la referencia cultural de la interfaz de usuario actual asignando un CultureInfo objeto que representa la nueva referencia cultural a la CultureInfo.CurrentUICulture propiedad . La referencia cultural de la interfaz de usuario actual se puede establecer en una referencia cultural específica (como en-US o de-DE) o en una referencia cultural neutra (como en o de). En el ejemplo siguiente se establece la referencia cultural de la interfaz de usuario actual en fr-FR o francés (Francia).

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

En una aplicación multiproceso, puede establecer explícitamente la referencia cultural de la interfaz de usuario de cualquier subproceso asignando un CultureInfo objeto que represente esa referencia cultural a la propiedad del Thread.CurrentUICulture subproceso. Si el subproceso cuya referencia cultural desea establecer es el subproceso actual, puede asignar la nueva referencia cultural a la CultureInfo.CurrentUICulture propiedad . Cuando la referencia cultural de la interfaz de usuario de un subproceso se establece explícitamente, ese subproceso conserva la misma referencia cultural incluso si cruza los límites del dominio de la aplicación y ejecuta código en otro dominio de aplicación.

Establecer implícitamente la referencia cultural de la interfaz de usuario actual

Cuando se crea un subproceso, incluido el subproceso de aplicación principal, se establece de forma predeterminada su referencia cultural de interfaz de usuario actual como se indica a continuación:

  • Mediante el uso de la referencia cultural definida por la DefaultThreadCurrentUICulture propiedad para el dominio de aplicación actual si el valor de la propiedad no nulles .
  • Mediante la referencia cultural predeterminada del sistema. En los sistemas que usan el sistema operativo Windows, Common Language Runtime llama a la función de Windows GetUserDefaultUILanguage para establecer la referencia cultural de la interfaz de usuario actual. GetUserDefaultUILanguage devuelve la referencia cultural de interfaz de usuario predeterminada establecida por el usuario. Si el usuario no ha establecido un idioma de interfaz de usuario predeterminado, devuelve la referencia cultural instalada originalmente en el sistema.

Si el subproceso cruza los límites de la aplicación y ejecuta código en otro dominio de aplicación, su referencia cultural se determina de la misma manera que la de un subproceso recién creado.

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

Consideraciones sobre la seguridad

Cambiar la referencia cultural del subproceso actual requiere un SecurityPermission permiso con el conjunto de ControlThread valores.

Precaución

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.

La referencia cultural actual de la interfaz de usuario y las aplicaciones para UWP

En las aplicaciones de Plataforma universal de Windows (UWP), la CurrentUICulture 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 de la interfaz de usuario actual es una configuración por subproceso y la CurrentUICulture propiedad refleja solo la referencia cultural de la interfaz de usuario 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.