example .net internationalization globalization

.net - example - system globalization c#



Diferencia entre CurrentCulture, InvariantCulture, CurrentUICulture e InstalledUICulture (2)

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


Intentaré dar una respuesta más perspicaz que esta .

CurrentCulture debería usarse para formatear. Es decir, los Números, las Monedas, los Porcentajes, las Fechas y los Tiempos siempre se deben formatear 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 (el decimal es la opción correcta).
El otro caso de uso común para CurrentCulture es el análisis sensible a la configuración regional. Su aplicación siempre debe permitir que los usuarios proporcionen 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 supone que es CultureInfo.CurrentCulture . El motivo 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 considera omitir este parámetro como error.

Por otro lado, InvariantCulture se debe usar para convertir confiablemente una de las clases mencionadas anteriormente en su representación textual. Entonces, si quiere, por ejemplo, transmitir DateTime , float , double o un objeto similar a través de la red, almacenarlo en una base de datos o algún tipo de archivo de texto (incluido XML), siempre debe 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 exactamente el mismo que en-US. Aunque es confiable, no es exactamente correcto. Lo que realmente se debe utilizar es el Formato de fecha y hora ISO8601 intercambiable . Por alguna razón, Microsoft ni siquiera proporciona ese patrón (los más cercanos son Patrón ordenable - "s" y Patrón universal - "u" que solo se asemeja al formato ISO8601), necesitaría crear uno propio como este:

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

Nota IFormatProvider bastante importante: IFormatProvider es realmente necesario aquí ya que omitir este parámetro puede provocar errores graves. 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 de letra flotante en el sistema operativo francés (con formato regional francés) se formateó a algo así como 10,5 y la clase de Version requiere entrada invariante de Cultura.

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

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

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

Para entender realmente qué es esta propiedad, debemos 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 (que es la 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 idioma del sistema operativo, mientras que para MUI siempre debe devolver English (United States) alias en-US. ¿Es útil? No sé, nunca necesité tal información. Y personalmente no he visto un programa que haya aprovechado esta propiedad.


Tomado de esta respuesta :

CurrentCulture es la representación .NET de la configuración regional de usuario predeterminada del sistema. Esto controla el número predeterminado y el formato de fecha y similares.

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

Las opciones regionales que configure el sistema tendrán los valores "actuales" en su aplicación .NET.

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