Proprietà System.Globalization.CultureInfo.CurrentUICulture

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La CurrentUICulture proprietà è una proprietà per thread. Ovvero, ogni thread ha impostazioni cultura correnti dell'interfaccia utente. Questa proprietà equivale a recuperare o impostare l'oggetto CultureInfo assegnato alla System.Threading.Thread.CurrentThread.CurrentUICulture proprietà . All'avvio di un thread, le impostazioni cultura dell'interfaccia utente vengono inizialmente determinate come segue:

  • Recuperando le impostazioni cultura specificate dalla DefaultThreadCurrentUICulture proprietà nel dominio applicazione in cui viene eseguito il thread, se il valore della proprietà non nullè .

  • Se il thread è un thread del pool di thread che esegue un'operazione asincrona basata su attività e l'app è destinata a .NET Framework 4.6 o versione successiva di .NET Framework, le impostazioni cultura dell'interfaccia utente sono determinate dalle impostazioni cultura dell'interfaccia utente del thread chiamante. L'esempio seguente modifica le impostazioni cultura dell'interfaccia utente correnti in Portoghese (Brasile) e avvia sei attività, ognuna delle quali visualizza l'ID thread, l'ID attività e le impostazioni cultura correnti dell'interfaccia utente. Ognuna delle attività (e dei thread) ha ereditato le impostazioni cultura dell'interfaccia utente del thread chiamante.

    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
    

    Per altre informazioni, vedere la sezione "Impostazioni cultura e operazioni asincrone basate su attività" nella CultureInfo documentazione.

  • Chiamando la funzione Windows GetUserDefaultUILanguage .

Per modificare le impostazioni cultura dell'interfaccia utente usate da un thread, impostare la Thread.CurrentUICulture proprietà sulle nuove impostazioni cultura. Se si modificano in modo esplicito le impostazioni cultura dell'interfaccia utente di un thread, questa modifica persiste se il thread supera i limiti del dominio dell'applicazione.

Nota

Se si imposta il valore della proprietà su un CultureInfo oggetto che rappresenta nuove impostazioni cultura, viene modificato anche il valore della Thread.CurrentThread.CurrentCulture proprietà .

Ottenere le impostazioni cultura correnti dell'interfaccia utente

La CultureInfo.CurrentUICulture proprietà è un'impostazione per thread, ovvero ogni thread può avere impostazioni cultura dell'interfaccia utente specifiche. Si ottengono le impostazioni cultura dell'interfaccia utente del thread corrente recuperando il valore della CultureInfo.CurrentUICulture proprietà, come illustrato nell'esempio seguente.

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]

È anche possibile recuperare il valore delle impostazioni cultura dell'interfaccia utente del thread corrente dalla Thread.CurrentUICulture proprietà .

Impostare in modo esplicito le impostazioni cultura correnti dell'interfaccia utente

A partire da .NET Framework 4.6, è possibile modificare le impostazioni cultura correnti dell'interfaccia utente assegnando un CultureInfo oggetto che rappresenta le nuove impostazioni cultura alla CultureInfo.CurrentUICulture proprietà . Le impostazioni cultura correnti dell'interfaccia utente possono essere impostate su impostazioni cultura specifiche(ad esempio en-US o de-DE) o su impostazioni cultura neutre (ad esempio en o de). L'esempio seguente imposta le impostazioni cultura dell'interfaccia utente correnti su fr-FR o francese (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

In un'applicazione multithreading è possibile impostare in modo esplicito le impostazioni cultura dell'interfaccia utente di qualsiasi thread assegnando un CultureInfo oggetto che rappresenta tali impostazioni cultura alla proprietà del Thread.CurrentUICulture thread. Se il thread le cui impostazioni cultura si desidera impostare è il thread corrente, è possibile assegnare le nuove impostazioni cultura alla CultureInfo.CurrentUICulture proprietà . Quando le impostazioni cultura dell'interfaccia utente di un thread vengono impostate in modo esplicito, tale thread mantiene le stesse impostazioni cultura anche se supera i limiti del dominio applicazione ed esegue il codice in un altro dominio applicazione.

Impostare in modo implicito le impostazioni cultura correnti dell'interfaccia utente

Quando un thread, incluso il thread principale dell'applicazione, viene creato per la prima volta, per impostazione predefinita le impostazioni cultura correnti dell'interfaccia utente vengono impostate come segue:

  • Utilizzando le impostazioni cultura definite dalla DefaultThreadCurrentUICulture proprietà per il dominio applicazione corrente se il valore della proprietà non nullè .
  • Usando le impostazioni cultura predefinite del sistema. Nei sistemi che usano il sistema operativo Windows, Common Language Runtime chiama la funzione Windows GetUserDefaultUILanguage per impostare le impostazioni cultura correnti dell'interfaccia utente. GetUserDefaultUILanguage restituisce le impostazioni cultura predefinite dell'interfaccia utente impostate dall'utente. Se l'utente non ha impostato una lingua predefinita dell'interfaccia utente, restituisce le impostazioni cultura installate originariamente nel sistema.

Se il thread supera i limiti dell'applicazione ed esegue il codice in un altro dominio applicazione, le impostazioni cultura sono determinate nello stesso modo di quello di un thread appena creato.

Si noti che se si impostano impostazioni cultura dell'interfaccia utente specifiche diverse dalle impostazioni cultura dell'interfaccia utente installate dal sistema o dalle impostazioni cultura preferite dell'interfaccia utente dell'utente e l'applicazione avvia più thread, le impostazioni cultura correnti di tali thread saranno le impostazioni cultura restituite dalla GetUserDefaultUILanguage funzione, a meno che non si assegnino impostazioni cultura alla DefaultThreadCurrentUICulture proprietà nel dominio applicazione in cui viene eseguito il thread.

Considerazioni sulla sicurezza

Per modificare le impostazioni cultura del thread corrente è necessaria un'autorizzazione SecurityPermission con il ControlThread valore impostato.

Attenzione

La modifica dei thread è pericolosa a causa dello stato di sicurezza associato ai thread. Pertanto, questa autorizzazione deve essere concessa solo al codice attendibile e quindi solo in base alle esigenze. Non è possibile modificare le impostazioni cultura dei thread nel codice semi-attendibile.

Impostazioni cultura dell'interfaccia utente e app UWP correnti

Nelle app piattaforma UWP (Universal Windows Platform) (UWP) la CurrentUICulture proprietà è di lettura/scrittura, proprio come avviee nelle app .NET Framework e .NET Core. È possibile usarla sia per ottenere che per impostare le impostazioni cultura correnti. Tuttavia, le app UWP non distinguono le impostazioni cultura correnti e le impostazioni cultura correnti dell'interfaccia utente. Le CurrentCulture proprietà e CurrentUICulture e corrispondono al primo valore dell'insieme Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

Nelle app .NET Framework e .NET Core le impostazioni cultura dell'interfaccia utente correnti sono un'impostazione per thread e la CurrentUICulture proprietà riflette le impostazioni cultura dell'interfaccia utente solo del thread corrente. Nelle app UWP le impostazioni cultura correnti vengono mappate alla proprietà Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , ovvero un'impostazione globale. L'impostazione della CurrentCulture proprietà modifica le impostazioni cultura dell'intera app. Le impostazioni cultura non possono essere impostate per ogni thread.