Diferencia entre CurrentCulture, InvariantCulture, CurrentUICulture y InstalledUICulture


¿Cuál es la diferencia entre CurrentCulture, InvariantCulture, CurrentUICulture y InstalledUICulture de System.Globalization.CultureInfo?

Author: Pooven, 2011-02-21

2 answers

Trataría de dar una respuesta un poco más perspicaz que esta.

CurrentCulture debe usarse para formatear. Es decir, los Números, Monedas, Porcentajes, Fechas y Horas deben siempre ser formateados con esta cultura antes de mostrarlos al usuario. Algunos ejemplos aquí:

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 a tener en cuenta es que nunca debe usar float ni double para almacenar información relacionada con la moneda en primer lugar (decimal es el elección correcta).
El otro caso de uso común para CurrentCulture es el análisis basado en la configuración regional. Su aplicación debe siempre permitir a los usuarios proporcionar información en su formato regional:

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

Tenga en cuenta que siempre proporciono el parámetro IFormatProvider, aunque está implícito y se asume que es CultureInfo.CurrentCulture. La razón es que quiero comunicarme con otros desarrolladores: esto es algo que se mostrará a los usuarios finales. Esta es una de las razones por las que FxCop trata de omitir este parámetro como error.


InvariantCulture por otro lado, debe usarse para convertir de manera confiable una de las clases mencionadas anteriormente a su representación textual. Así que si quieres, por ejemplo, transmitir DateTime, float, double u objeto similar a través de la red, almacenarlo en una base de datos o algún tipo de archivo de texto (incluido XML), debe siempre usar 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 a tener en cuenta aquí es que el formato de fecha/hora ofrecido por InvariantCulture es en realidad exactamente el mismo que en-US. Aunque es confiable, no es exactamente correcto. Lo que realmente se debe usar es Formato intercambiable de Fecha y Hora ISO8601 . Por alguna razón Microsoft ni siquiera proporciona tal patrón (los más cercanos son patrón clasificable - " s "y Patrón Universal - "u" que solo se asemeja al formato ISO8601), necesitaría crear el suyo propio de esta manera:

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

Nota al margen bastante importante: IFormatProvider es en realidad requerido aquí ya que omitir este parámetro puede resultar en graves error. Una vez tuve que arreglar un defecto en el sistema operativo francés. El código era así:

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

La razón era muy simple: el formato float en el sistema operativo francés (con formato regional francés) fue formateado a algo así como 10,5 y Version la clase requiere una entrada invariante de Cultura.


CurrentUICulture es responsable de cargar los recursos traducibles apropiados para su aplicación. Es decir, debe usarse para mostrar mensajes de texto, colores e imágenes correctos.
En Asp.Net aplicación si por alguna razón desea implementar el Mecanismo de Localización CSS (capacidad para anular las definiciones CSS por idioma), CurrentUICulture es un buen camino a seguir (siempre que realmente lea esta propiedad desde el navegador web).
Del mismo modo, si desea implementar el mecanismo de cambio de idioma, CurrentUICulture es el que debe ser anulado.


InstalledUICulture está conectado a la configuración regional predeterminada de la interfaz de usuario del sistema operativo. Como MSDN dice:

Esta propiedad es el equivalente de GetSystemDefaultUILanguage en la API de Windows.

Para entender realmente qué es esta propiedad, necesitamos profundizar en alguna teoría. Hay diferentes líneas de productos de Windows:

  • un solo idioma (es decir, Inglés, Francés, Alemán, Japonés, etc.)
  • MUI (es decir, Interfaz de usuario multilingüe - Sistema operativo base en inglés y Paquetes de idiomas)

Para las líneas de productos de un solo idioma, InstalledUICulture siempre devolverá el Sistema operativo idioma, mientras que para MUI siempre debe devolver inglés (Estados Unidos) aka en-US. Es útil? No lo sé, nunca necesité tal información. Y personalmente no he visto un programa que se aprovechara de esta propiedad.

 101
Author: Paweł Dyda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:24

Tomado de esta respuesta:

CurrentCulture es la representación. NET de la configuración regional predeterminada del usuario del sistema. Esto controla el formato predeterminado de números y fechas y algo así.

CurrentUICulture se refiere al lenguaje de interfaz de usuario predeterminado, un configuración introducida en Windows 2000. Esto se refiere principalmente a la interfaz de usuario localización / traducción parte de su aplicación.

Cualquier opción regional que el sistema esté configurado para tener será la Valores "actuales" en su aplicación.NET.

Muchas veces ambos son iguales. Pero en mi sistema estarían diferente: Prefiero mis números y fechas en el formato alemán, por lo que el CurrentCulture sería alemán, pero también prefiero todas mis aplicaciones en inglés, por lo que la CurrentUICulture sería inglés.

 3
Author: Shahin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:50