Подтвердить что ты не робот

Разница между CurrentCulture, InvariantCulture, CurrentUICulture и InstalledUICulture

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

4b9b3361

Ответ 1

Я попытался бы дать более глубокий ответ, чем этот.

CurrentCulture следует использовать для форматирования. То есть, Numbers, Currencies, Percentages, Dates and Times всегда должны быть отформатированы с этой культурой, прежде чем показывать их пользователю. Немного примеров здесь:

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 является синтаксический анализ, совместимый с Locale. Ваше приложение должно всегда разрешать пользователям вводить данные в их региональном формате:

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, на самом деле точно такой же, как и для США. Хотя он надежен, он не совсем корректен. Что действительно должно быть использовано ISO8601 Сменный формат даты и времени. По какой-то причине Microsoft даже не предоставляет такой шаблон (наиболее близкими являются Sortable pattern - "s" и Universal pattern - "u", которые только напоминают формат ISO8601), вам нужно будет создать свой собственный вот так:

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

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

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

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


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


УстановленаUICulture подключена к языку пользовательского интерфейса ОС по умолчанию. Поскольку MSDN говорит:

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

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

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

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

Ответ 2

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

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

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

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

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