TOC

This article is currently in the process of being translated into Italian (~98% done).

Working with Culture & Regions:

Application Culture & UICulture

Come abbiamo detto nell'articolo precedente, la gestione della cultura è molto importante, soprattutto quando si lavora con date e numeri. Per questo motivo, l'applicazione avrà sempre un'istanza della classe CultureInfo definita come "CurrentCulture", un'istanza di ripiego per tutte le situazioni in cui non si specifica quale cultura debba essere utilizzata, ad esempio per l'output di un numero. A meno che non si modifichi questa proprietà, che esiste sulla classe CultureInfo, sarà la stessa cultura utilizzata dal sistema operativo. Ecco un modo semplice per verificarlo:

Console.WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);

In questo articolo, utilizzeremo sempre la classe CultureInfo, quindi non dimenticate di includerla nell'istruzione using, come mostrato nella parte superiore dell'esempio.

L'esempio restituirà la cultura utilizzata dall'applicazione, ad esempio "en-US" per un computer in lingua inglese negli Stati Uniti. Se si vive in Germania e il computer utilizza la lingua tedesca, il risultato sarà invece "de-DE". In altre parole, le prime due lettere specificano la lingua, mentre le ultime due lettere specificano il Paese o la regione.

Comunque, è possibile che si voglia avere un maggiore controllo sulla cultura utilizzata dall'applicazione. Per esempio, se la vostra applicazione utilizza la lingua inglese in ogni punto, ha senso produrre numeri in un formato tedesco o svedese solo perché il computer dell'utente lo specifica? Forse sì, ma in caso contrario è possibile specificare facilmente una nuova cultura di default/fallback, utilizzando nuovamente la proprietà CurrentCulture:

CultureInfo.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);

float largeNumber = 12345.67f;
Console.WriteLine("Number format (Current culture): " + largeNumber.ToString());

CultureInfo germanCulture = new CultureInfo("de-DE");
Console.WriteLine("Number format (German): " + largeNumber.ToString(germanCulture));

In pratica, si va a sovrascrivere la proprietà CurrentCulture, impostandola su una cultura en-US. Quindi la produciamo, insieme a un grande numero in virgola mobile. Si noterà che il risultato è un numero formattato come in inglese. Nelle ultime due righe, illustriamo come sia possibile ignorare la cultura di ripiego, passando un'altra istanza di CultureInfo al metodo ToString(): in questo caso, il numero verrà emesso anche in formato tedesco. Il risultato di questo esempio dovrebbe essere simile a questo:

Current culture: en-US
Number format (Current culture): 12345.67
Number format (German): 12345,67

CurrentCulture vs. CurrentUICulture

Si può notare che CultureInfo ha anche una proprietà chiamata CurrentUICulture. Questa proprietà è rilevante solo se si utilizzano file di risorse per la localizzazione dell'interfaccia utente: in questo caso, l'applicazione saprà quali versioni dei file di risorse devono essere caricate, in base alla proprietà CurrentUICulture. Per tutti gli altri scopi, compresa la formattazione di numeri, date e così via, si deve usare la proprietà CurrentCulture.

CurrentCulture and Threads

Non abbiamo ancora parlato di thread, ma si tratta fondamentalmente di un concetto che consente all'applicazione di lavorare su più cose contemporaneamente. Quando un'applicazione .NET viene avviata, viene creato un singolo thread e solo questo verrà utilizzato, a meno che non se ne crei uno nuovo, utilizzando una delle tante strategie multi-threading del framework. Ne parlo qui perché è molto importante anche per quanto riguarda la cultura di ripiego dell'applicazione. Infatti, CultureInfo.CurrentCulture è fondamentalmente una scorciatoia per la proprietà Thread.CurrentThread.CurrentCulture, il che significa che ogni volta che si definisce CurrentCulture, questa è valida solo per il thread corrente.

Prima della versione 4.5 del framework .NET, era necessario specificare manualmente la cultura di ogni nuovo thread creato. Tuttavia, in .NET 4.5 è stata introdotta la proprietà CultureInfo.DefaultThreadCurrentCulture. Quando la si imposta, ogni nuovo thread creato utilizzerà questa cultura ed è facile da usare come la proprietà CurrentCulture:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

Ma cosa succede al thread esistente? In realtà, se non si è già definita un'altra cultura per la proprietà CurrentCulture, l'impostazione della proprietà DefaultThreadCurrentCulture sarà applicata anche alla proprietà CurrentCulture. In altre parole, ha senso usare DefaultThreadCurrentCulture invece di CurrentCulture se si prevede di utilizzare più thread nell'applicazione: si occuperà di tutti gli scenari.

Riepilogo

Utilizzando le proprietà CultureInfo.CurrentCulture e/o CultureInfo.DefaultThreadCurrentCulture, è possibile definire una cultura di ripiego per l'applicazione, che verrà sempre utilizzata ogni volta che viene emesso un numero o una data, a meno che non venga specificamente esclusa in ogni situazione.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!