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 la propria cultura UI corrente. Questa proprietà equivale a recuperare o impostare l'oggetto CultureInfo assegnato alla System.Threading.Thread.CurrentThread.CurrentUICulture
proprietà . All'avvio di un thread, la cultura dell'interfaccia utente viene inizialmente determinata come segue:
Recuperando le impostazioni culturali specificate dalla proprietà DefaultThreadCurrentUICulture nel dominio dell'applicazione in cui il thread viene eseguito, se il valore della proprietà non è
null
.Se il thread è un thread del pool che esegue un'operazione asincrona basata su attività e l'app funziona con .NET Framework 4.6 o versione successiva, le impostazioni culturali dell'interfaccia utente sono determinate dalle impostazioni culturali dell'interfaccia utente del thread chiamante. L'esempio seguente modifica la cultura dell'interfaccia utente corrente in portoghese (Brasile) e avvia sei attività, ognuna delle quali visualizza il thread ID, il task ID e la cultura corrente dell'interfaccia utente. Ognuna delle attività (e dei thread) ha ereditato la 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 {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
Per ulteriori informazioni, vedere la sezione "Cultura e operazioni asincrone basate su attività" nella documentazione CultureInfo.
Chiamando la funzione Windows
GetUserDefaultUILanguage
.
Per modificare la cultura dell'interfaccia utente utilizzata da un thread, impostare la proprietà Thread.CurrentUICulture sulla nuova cultura. Se si modificano in modo esplicito le impostazioni culturali dell'interfaccia utente di un thread, questa modifica persiste se il thread attraversa i confini del dominio dell'applicazione.
Nota
Se si imposta il valore della proprietà su un oggetto CultureInfo che rappresenta una nuova cultura, anche il valore della proprietà Thread.CurrentThread.CurrentCulture
cambia.
Ottieni la cultura corrente dell'interfaccia utente
La CultureInfo.CurrentUICulture proprietà è un'impostazione per thread, ovvero ogni thread può avere impostazioni cultura dell'interfaccia utente specifiche. Si ottiene l'impostazione cultura dell'interfaccia utente del thread corrente recuperando il valore della proprietà CultureInfo.CurrentUICulture, 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 {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 esplicitamente la cultura corrente 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à . La cultura attuale dell'interfaccia utente può essere impostata su una cultura specifica (ad esempio en-US o de-DE) o su una cultura neutrale (ad esempio en o de). L'esempio seguente imposta la cultura corrente dell'interfaccia utente su fr-FR o francese (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
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 la cultura corrente 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 dell'applicazione corrente se il valore della proprietà non è
null
. - Utilizzando le impostazioni predefinite della cultura del sistema. Nei sistemi che usano il sistema operativo Windows, il Common Language Runtime chiama la funzione Windows
GetUserDefaultUILanguage
per impostare la cultura corrente dell'interfaccia utente.GetUserDefaultUILanguage
restituisce la cultura predefinita dell'interfaccia utente dall'utente. Se l'utente non ha impostato una lingua predefinita dell'interfaccia utente, restituisce la cultura originariamente installata nel sistema.
Se il thread supera i confini dell'applicazione ed esegue il codice in un altro dominio applicativo, la cultura del thread è determinata nello stesso modo di quella 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 la cultura del thread corrente è necessaria un'autorizzazione SecurityPermission con valore ControlThread 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 la cultura dei thread nel codice semi-attendibile.
Cultura dell'interfaccia utente corrente e app UWP
Nelle app UWP (Universal Windows Platform), la proprietà CurrentUICulture è di lettura/scrittura, proprio come nelle app .NET Framework e .NET Core; è possibile usarla sia per ottenere che per impostare la cultura corrente. Tuttavia, le app UWP non distinguono tra la cultura corrente e la cultura dell'interfaccia utente corrente. Le proprietà CurrentCulture e CurrentUICulture 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, la cultura corrente viene mappata alla proprietà Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages, che è un'impostazione globale. L'impostazione della proprietà CurrentCulture modifica le impostazioni cultura dell'intera app; le impostazioni cultura non possono essere impostate per thread.