Propriété System.Globalization.CultureInfo.CurrentUICulture

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

La CurrentUICulture propriété est une propriété par thread. Autrement dit, chaque thread a sa propre culture actuelle de l’interface utilisateur. Cette propriété équivaut à récupérer ou à définir l’objet CultureInfo affecté à la System.Threading.Thread.CurrentThread.CurrentUICulture propriété. Lorsqu’un thread est démarré, sa culture d’interface utilisateur est initialement déterminée comme suit :

  • En récupérant la culture spécifiée par la DefaultThreadCurrentUICulture propriété dans le domaine d’application dans lequel le thread s’exécute, si la valeur de la propriété n’est pas null.

  • Si le thread est un thread de pool de threads qui exécute une opération asynchrone basée sur des tâches et que l’application cible .NET Framework 4.6 ou une version ultérieure du .NET Framework, sa culture d’interface utilisateur est déterminée par la culture de l’interface utilisateur du thread appelant. L’exemple suivant modifie la culture actuelle de l’interface utilisateur en portugais (Brésil) et lance six tâches, chacune affichant son ID de thread, son ID de tâche et sa culture actuelle de l’interface utilisateur. Chacune des tâches (et les threads) a hérité de la culture de l’interface utilisateur du thread appelant.

    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
    

    Pour plus d’informations, consultez la section « Opérations asynchrones basées sur la culture et les tâches » dans la CultureInfo documentation.

  • En appelant la fonction Windows GetUserDefaultUILanguage .

Pour modifier la culture de l’interface utilisateur utilisée par un thread, définissez la Thread.CurrentUICulture propriété sur la nouvelle culture. Si vous modifiez explicitement la culture de l’interface utilisateur d’un thread de cette façon, cette modification persiste si le thread traverse les limites du domaine d’application.

Remarque

Si vous définissez la valeur de la propriété sur un CultureInfo objet qui représente une nouvelle culture, la valeur de la Thread.CurrentThread.CurrentCulture propriété change également.

Obtenir la culture actuelle de l’interface utilisateur

La CultureInfo.CurrentUICulture propriété est un paramètre par thread ; autrement dit, chaque thread peut avoir sa propre culture d’interface utilisateur. Vous obtenez la culture de l’interface utilisateur du thread actuel en récupérant la valeur de la CultureInfo.CurrentUICulture propriété, comme l’illustre l’exemple suivant.

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]

Vous pouvez également récupérer la valeur de la culture de l’interface utilisateur du thread actuel à partir de la Thread.CurrentUICulture propriété.

Définir explicitement la culture actuelle de l’interface utilisateur

À compter de .NET Framework 4.6, vous pouvez modifier la culture actuelle de l’interface utilisateur en affectant un CultureInfo objet qui représente la nouvelle culture à la CultureInfo.CurrentUICulture propriété. La culture actuelle de l’interface utilisateur peut être définie sur une culture spécifique (par exemple, en-US ou de-DE) ou sur une culture neutre (par exemple, en ou de). L’exemple suivant définit la culture actuelle de l’interface utilisateur sur fr-FR ou Français (France).

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

Dans une application multithread, vous pouvez définir explicitement la culture de l’interface utilisateur de n’importe quel thread en affectant un CultureInfo objet qui représente cette culture à la propriété du Thread.CurrentUICulture thread. Si le thread dont vous souhaitez définir est le thread actuel, vous pouvez affecter la nouvelle culture à la CultureInfo.CurrentUICulture propriété. Lorsque la culture de l’interface utilisateur d’un thread est définie explicitement, ce thread conserve la même culture même si elle franchit les limites du domaine d’application et exécute du code dans un autre domaine d’application.

Définir implicitement la culture actuelle de l’interface utilisateur

Lorsqu’un thread, y compris le thread d’application principal, est créé en premier, par défaut, sa culture actuelle de l’interface utilisateur est définie comme suit :

  • En utilisant la culture définie par la DefaultThreadCurrentUICulture propriété pour le domaine d’application actuel si la valeur de propriété n’est pas null.
  • En utilisant la culture par défaut du système. Sur les systèmes qui utilisent le système d’exploitation Windows, le Common Language Runtime appelle la fonction Windows GetUserDefaultUILanguage pour définir la culture actuelle de l’interface utilisateur. GetUserDefaultUILanguage retourne la culture de l’interface utilisateur par défaut définie par l’utilisateur. Si l’utilisateur n’a pas défini de langue d’interface utilisateur par défaut, il retourne la culture installée à l’origine sur le système.

Si le thread franchit les limites de l’application et exécute du code dans un autre domaine d’application, sa culture est déterminée de la même façon que celle d’un thread nouvellement créé.

Notez que si vous définissez une culture d’interface utilisateur spécifique différente de la culture de l’interface utilisateur installée par le système ou de la culture d’interface utilisateur préférée de l’utilisateur, et que votre application démarre plusieurs threads, la culture actuelle de ces threads est la culture retournée par la GetUserDefaultUILanguage fonction, sauf si vous attribuez une culture à la DefaultThreadCurrentUICulture propriété dans le domaine d’application dans lequel le thread s’exécute.

Considérations de sécurité

La modification de la culture du thread actuel nécessite une SecurityPermission autorisation avec le jeu de ControlThread valeurs.

Attention

La manipulation de threads est dangereuse en raison de l’état de sécurité associé aux threads. Par conséquent, cette autorisation doit être accordée uniquement au code fiable, puis uniquement si nécessaire. Vous ne pouvez pas modifier la culture des threads dans du code semi-approuvé.

La culture actuelle de l’interface utilisateur et les applications UWP

Dans les applications plateforme Windows universelle (UWP), la CurrentUICulture propriété est en lecture-écriture, tout comme dans les applications .NET Framework et .NET Core. Vous pouvez l’utiliser à la fois pour obtenir et définir la culture actuelle. Toutefois, les applications UWP ne font pas la distinction entre la culture actuelle et la culture actuelle de l’interface utilisateur. Les propriétés CurrentCulture et CurrentUICulture mappées à la première valeur de la collection Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.

Dans les applications .NET Framework et .NET Core, la culture actuelle de l’interface utilisateur est un paramètre par thread et la CurrentUICulture propriété reflète la culture de l’interface utilisateur du thread actuel uniquement. Dans les applications UWP, la culture actuelle est mappée à la propriété Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , qui est un paramètre global. La définition de la CurrentCulture propriété modifie la culture de l’ensemble de l’application ; la culture ne peut pas être définie sur une base par thread.