Domanda Differenza tra CurrentCulture, InvariantCulture, CurrentUICulture e InstalledUICulture


Qual è la differenza tra CurrentCulture, InvariantCulture, CurrentUICulture e InstalledUICulture a partire dal System.Globalization.CultureInfo?


44
2018-02-20 22:16


origine


risposte:


Cercherò di dare una risposta un po 'più perspicua di questo.

CurrentCulture dovrebbe essere usato per la formattazione. Cioè, numeri, valute, percentuali, date e orari dovrebbero sempre essere formattato con questa cultura prima mostrandoli all'utente. Alcuni esempi qui:

const string CURRENCY_FORMAT = "c";
const string PERCENTAGE_FORMAT = "p";

DateTime now = DateTime.UtcNow; // all dates should be kept in UTC internally
// convert time to local and format appropriately for end user
dateLabel.Text = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);

float someFloat = 12.3456f;
// yields 12,3456 for pl-PL Culture
floatLabel.Text = someFloat.ToString(CultureInfo.CurrentCulture);
// yields 12,35 zł for pl-PL Culture - rounding takes place!
currencyLabel.Text = someFloat.ToString(CURRENCY_FORMAT, CultureInfo.CurrentCulture);
// yields 1234,56% for pl-PL Culture - 1.0f is 100%
percentageLabel.Text = someFloat.ToString(PERCENTAGE_FORMAT, CultureInfo.CurrentCulture);

Una cosa importante da notare è che non si dovrebbe mai usare float né double per la memorizzazione di informazioni relative alla valuta in primo luogo (decimal è la scelta giusta).
L'altro caso di uso comune per CurrentCulture è l'analisi in base alle impostazioni locali. La tua applicazione dovrebbe sempre consentire agli utenti di fornire input nel loro formato regionale:

float parsedFloat;
if (float.TryParse(inputBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture, out parsedFloat))
{
    MessageBox.Show(parsedFloat.ToString(CultureInfo.CurrentCulture), "Success at last!");
}

Si prega di notare che fornisco sempre IFormatProvider parametro, anche se è implicito e presunto di essere CultureInfo.CurrentCulture. Il motivo è che voglio comunicare con altri sviluppatori: questo è qualcosa che verrà mostrato agli utenti finali. Questo è uno dei motivi per cui FxCop tratta omettendo questo parametro come errore.


InvariantCulture d'altra parte dovrebbe essere usato per convertire in modo affidabile una delle classi sopra menzionate nella sua rappresentazione testuale. Quindi se vuoi ad esempio trasmettere DateTime, float, double o oggetto simile via rete, memorizzarlo nel database o qualche tipo di file di testo (incluso XML), dovresti sempre uso InvariantCulture:

float someFloat = 1234.56f;
// yields 1234.56
string internalFloat = someFloat.ToString(CultureInfo.InvariantCulture);
DateTime now = DateTime.UtcNow;
// yields something like 04/16/2011 19:02:46
string internalDateAndTime = now.ToString(CultureInfo.InvariantCulture);

Una cosa da notare qui è che il formato data / ora offerto da InvariantCulture è in realtà esattamente lo stesso di en-US. Sebbene sia affidabile, non è esattamente corretto. Quello che dovrebbe essere veramente usato è Formato di data e ora intercambiabile ISO8601. Per qualche motivo, Microsoft non fornisce nemmeno questo tipo di pattern (i più vicini sono Sortable pattern - "s" e Universal pattern - "u" che assomigliano solo al formato ISO8601), dovresti crearne uno proprio come questo:

const string iso8601Pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
string iso8601Formatted = now.ToString(iso8601Pattern);

Abbastanza importante nota a margine: IFormatProvider è effettivamente necessario in questo caso l'omissione di questo parametro potrebbe comportare errori gravi. Una volta ho dovuto correggere un difetto sul sistema operativo francese. Il codice era così:

float dbVersion = // some kind of logic that took float from database
string versionString = dbVersion.ToString(); // culture-aware formatting used
Version ver = new Version(versionString); // exception thrown here

Il motivo era molto semplice: il float formattato sul sistema operativo francese (con formattazione regionale francese) era formattato per qualcosa come 10,5 e Version la classe richiede l'input della cultura invariante.


CurrentUICulture è responsabile del caricamento di risorse traducibili appropriate per la tua applicazione. Vale a dire, dovrebbe essere usato per visualizzare messaggi di testo, colori e immagini corretti.
Nell'applicazione Asp.Net se si desidera, per qualche motivo, implementare il meccanismo di localizzazione CSS (possibilità di sovrascrivere le definizioni CSS per lingua), CurrentUICulture è un buon modo per andare (a condizione che tu legga effettivamente questa proprietà dal browser web).
Allo stesso modo se si desidera implementare il meccanismo di cambio lingua, CurrentUICulture è quello che dovrebbe essere ignorato.


InstalledUICulture è collegato a Impostazioni internazionali dell'interfaccia utente predefinita. Come MSDN dice:

Questa proprietà è l'equivalente di GetSystemDefaultUILanguage nell'API di Windows.

Per capire veramente che cos'è questa proprietà, dobbiamo scavare in una teoria. Esistono diverse linee di prodotti Windows:

  • lingua unica (inglese, francese, tedesco, giapponese, ecc.)
  • MUI (ovvero interfaccia utente multilingue - SO base inglese e pacchetti lingua)

Per le linee di prodotto in una sola lingua, InstalledUICulture restituirà sempre il linguaggio del sistema operativo, mentre per MUI dovrebbe sempre restituire l'inglese (Stati Uniti) alias en-US. È utile? Non lo so, non ho mai avuto bisogno di una tale informazione. E personalmente non ho visto il programma che ha approfittato di questa proprietà.


99
2018-04-16 20:29



Preso da questa risposta:

CurrentCulture è la rappresentazione .NET delle impostazioni locali dell'utente predefinite   del sistema. Controlla la formattazione e il numero di default e   il simile.

CurrentUICulture fa riferimento alla lingua dell'interfaccia utente predefinita, a   impostazione introdotta in Windows 2000. Ciò riguarda principalmente l'interfaccia utente   localizzazione / traduzione parte della tua app.

Qualunque siano le opzioni regionali che il sistema è configurato per avere sarà il   Valori "correnti" nella tua app .NET.

Spesso sono entrambi uguali. Ma sul mio sistema lo sarebbero   diverso: preferisco i miei numeri e le date nel formato tedesco, quindi il   CurrentCulture sarebbe tedesco, ma preferisco anche tutte le mie applicazioni   in inglese, quindi CurrentUICulture sarebbe inglese.


3
2018-04-16 20:36