Compartir a través de


Propiedad System.Globalization.CultureInfo.CurrentUICulture

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

La propiedad CurrentUICulture es una propiedad individual de cada subproceso. Es decir, cada subproceso tiene su propia referencia cultural actual de la interfaz de usuario. 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, la referencia cultural de su interfaz de usuario se determina inicialmente de la siguiente manera:

  • Al recuperar la cultura especificada por la propiedad DefaultThreadCurrentUICulture 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 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 {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 {Thread.CurrentThread.CurrentUICulture.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($"UI Culture of task {Task.CurrentId} on thread {Thread.CurrentThread.ManagedThreadId} is {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 "Cultura y operaciones asincrónicas basadas en tareas" en la documentación de CultureInfo.

  • Mediante una llamada a la función de Windows GetUserDefaultUILanguage.

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

Nota:

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

Obtener la referencia cultural de la interfaz de usuario actual

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 IU del subproceso actual, recupere el valor de la propiedad CultureInfo.CurrentUICulture, 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 {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 desde la propiedad Thread.CurrentUICulture.

Establecer explícitamente la cultura 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 cultura de la interfaz de usuario actual se puede establecer en una cultura específica (como en-US o de-DE) o en una cultura 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: {CultureInfo.CurrentUICulture.Name}");

        CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        Console.WriteLine($"The current UI culture: {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 cultura desea establecer es el subproceso actual, puede asignar la nueva cultura a la propiedad CultureInfo.CurrentUICulture. 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 cultura actual de la interfaz de usuario

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 propiedad DefaultThreadCurrentUICulture para el dominio de aplicación actual si el valor de la propiedad no es null.
  • Mediante el uso de la referencia cultural predeterminada del sistema. En los sistemas que utilizan el sistema operativo Windows, el entorno de ejecución de lenguaje común llama a la función de Windows GetUserDefaultUILanguage para establecer la cultura de la interfaz de usuario actual. GetUserDefaultUILanguage devuelve la referencia cultural de la interfaz de usuario predeterminada establecida por el usuario. Si el usuario no ha establecido un idioma de interfaz de usuario predeterminado, devuelve la configuración regional 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 de seguridad

Cambiar la referencia cultural del subproceso actual requiere un permiso SecurityPermission con el valor ControlThread configurado.

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 solo cuando sea necesario. No se puede cambiar la cultura del subproceso en código de confianza parcial.

La cultura actual de la interfaz de usuario y las aplicaciones UWP

En las aplicaciones de la Plataforma universal de Windows (UWP), la propiedad CurrentUICulture 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 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 propiedad CurrentCulture cambia la cultura de toda la aplicación; la cultura no se puede establecer por hilo.