Разница между CurrentCulture, InvariantCulture, CurrentUICulture и InstalledUICulture - PullRequest
50 голосов
/ 21 февраля 2011

В чем разница между CurrentCulture, InvariantCulture, CurrentUICulture и InstalledUICulture от System.Globalization.CultureInfo?

Ответы [ 2 ]

106 голосов
/ 17 апреля 2011

Я бы попытался дать более проницательный ответ, чем , этот .

CurrentCulture следует использовать для форматирования.То есть числа, валюты, проценты, даты и время должны всегда быть отформатированы с этой культурой, прежде чем отобразится для пользователя .Вот несколько примеров:

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);

Важно отметить, что вы никогда не должны использовать float или double для хранения информации, связанной с валютой, в первую очередь (decimal - правильный выбор).
Другим распространенным вариантом использования CurrentCulture является анализ с учетом локали.Ваша заявка должна всегда позволять пользователям вводить данные в своем региональном формате:

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

Обратите внимание, что я всегда предоставляю параметр IFormatProvider, хотя он подразумевается и считается CultureInfo.CurrentCulture.Причина в том, что я хочу общаться с коллегами-разработчиками: это то, что будет отображаться для конечных пользователей.Это одна из причин, почему FxCop рассматривает пропуск этого параметра как ошибку.


InvariantCulture , с другой стороны, должен использоваться для надежного преобразования одного из упомянутых выше классов в его текстовыйпредставление.Поэтому, если вы хотите, например, передать DateTime, float, double или подобный объект по сети, сохранить его в базе данных или в каком-либо текстовом файле (включая XML), вы должны всегда использовать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);

Здесь следует отметить, что формат даты / времени, предлагаемый InvariantCulture, фактически совпадает с форматом en-US.Хотя это надежно, это не совсем правильно.Что действительно нужно использовать, так это ISO8601 сменный формат даты и времени .По какой-то причине Microsoft даже не предоставляет такой шаблон (наиболее близкими являются шаблон Sortable - "s" и универсальный шаблон - "u", который напоминает только формат ISO8601), вам необходимо создать свой собственный файл, подобный этому:

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

Весьма важное примечание: IFormatProvider на самом деле требуется здесь, так как пропуск этого параметра может привести к серьезным ошибкам.Однажды мне пришлось исправить дефект на французской ОС.Код был таким:

<del><code>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
</code></del>

Причина была очень простой: форматирование с плавающей точкой во французской ОС (с французским региональным форматированием) было отформатировано примерно как 10,5, а класс Version требует ввода, инвариантного к культуре.


CurrentUICulture отвечает за загрузку соответствующих переводимых ресурсов для вашего приложения.То есть его следует использовать для отображения правильных текстовых сообщений, цветов и изображений.
В приложении Asp.Net, если вы хотите по какой-то причине реализовать механизм локализации CSS (возможность переопределять определения CSS для каждого языка), CurrentUICulture - этохороший путь (при условии, что вы действительно читаете это свойство из веб-браузера).
Аналогично, если вы хотите реализовать механизм переключения языка, CurrentUICulture - это тот, который должен быть переопределен.


InstalledUICulture связан со стандартным языком интерфейса операционной системы ОС.Как MSDN говорит:

Это свойство эквивалентно GetSystemDefaultUILanguage в Windows API.

Чтобы понять, что это свойство, нам нужнокопаться в какой-то теории.Существуют различные линейки продуктов Windows:

  • один язык (т. Е. Английский, французский, немецкий, японский и т. Д.)
  • MUI (то есть многоязычный пользовательский интерфейс - базовая английская ОС и языкPacks)

Для одноязычных продуктовых линеек InstalledUICulture всегда будет возвращать язык операционной системы, тогда как для MUI он всегда должен возвращать английский (США), то есть en-US.Это полезно?Я не знаю, мне никогда не нужна была такая информация.И лично я не видел программу, которая использовала бы это свойство.

3 голосов
/ 17 апреля 2011

Взято из этого ответа :

CurrentCulture - это .NET-представление языка пользователя по умолчанию системы. Это управляет форматом числа и даты по умолчанию и и тому подобное.

CurrentUICulture относится к языку интерфейса пользователя по умолчанию, настройка введена в Windows 2000. Это в первую очередь касается пользовательского интерфейса локализация / перевод части вашего приложения.

Какими бы региональными опциями система не была настроена, «Текущие» значения в вашем приложении .NET.

Часто они оба одинаковы. Но в моей системе они будут разные: я предпочитаю мои цифры и даты в немецком формате, поэтому CurrentCulture будет немецкой, но я также предпочитаю все свои приложения на английском, поэтому CurrentUICulture будет английским.

...