В чем разница между культурой и UICulture?

126

Может ли кто-нибудь дать мне немного больше информации о разнице между .NET framework Cultureи UICultureвнутри нее? Что они делают и когда что использовать?

Никлас
источник

Ответы:

148

Cultureвлияет на то, как представлены данные, зависящие от языка и региональных параметров (даты, валюты, числа и т. д.). Вот несколько примеров:

var date = new DateTime(2000, 1, 2);
var number = 12345.6789;

Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Console.WriteLine(date); // 02.01.2000 00:00:00
Console.WriteLine(number.ToString("C")); // 12.345,68 €

Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-CA");
Console.WriteLine(date); // 2000-01-02 00:00:00
Console.WriteLine(number.ToString("C")); // 12 345,68 $

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine(date); // 1/2/2000 12:00:00 AM
Console.WriteLine(number.ToString("C")); // $12,345.68

Культура также влияет на синтаксический анализ пользовательского ввода таким же образом:

const string numberString = "12.345,68";
decimal money;

Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
money = decimal.Parse(numberString); // OK!

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
money = decimal.Parse(numberString); // FormatException is thrown, TryParse would return false

Остерегайтесь случаев, когда синтаксический анализ успешен, но результат не такой, как вы ожидаете.

const string numberString = "12.345";
decimal money;

Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
money = decimal.Parse(numberString); // 12345

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
money = decimal.Parse(numberString); // 12.345, where the . is a decimal point

UICultureвлияет на то, какой файл ресурсов (Resources. lang .resx) будет загружен вашим приложением.

Таким образом, для загрузки немецких ресурсов (предположительно локализованного текста) вы должны установить UICultureнемецкую культуру и отображать немецкое форматирование (без какого-либо влияния на то, какие ресурсы загружаются), которые вы должны установить Culture.

Ди-см
источник
39
Это означает, что у вас могут быть английские метки и пользовательский интерфейс (английская культура UIC), а также норвежская валюта, дата, время и форматирование чисел (норвежская культура). В терминах Windows это можно представить как наличие установленного языкового пакета для меню и диалоговых окон. (UICulture), но работает с норвежскими региональными настройками (Culture.)
Лассе В. Карлсен
2
Чтобы подчеркнуть последствия этого: даже если вы не поддерживаете язык пользователя, убедитесь, что вы поддерживаете его культуру для форматирования! Я встречал ошибки, когда приложение возвращалось к «en-US» как по культуре, так и по языку, когда требовалось только откатиться по языку.
ToolmakerSteve
1
Какой смысл в использовании всего CultureInfoобъекта только для определения файла ресурсов, где stringбудет достаточно? (Например, Languageсобственность FrameworkElement)
Воутер
2

Culture and UICulture

Значения представляют собой пары двухбуквенных строк, первая предназначена для определения языка, а вторая - для определения региона. Пример:

en-GBздесь enпредставляет Englishи GBпредставляетGreat Briton

en-USздесь enпредставляет Englishи USпредставляетUnited States

Используйте Cultureдля функций, зависящих от языка и региональных параметров, таких как дата, время. и UICultureпредназначен для правильной загрузки файла ресурсов.

Оружие X
источник
0

Это небольшой вопрос, который следует рассмотреть в дополнение к удивительному объяснению @ Vache: вы можете установить UICulture и Culture на (уровне страницы и уровне приложения).

Чтобы установить их на уровне приложения, просто добавьте сеанс глобализации в web.config

например <globalization uiCulture="es" culture="es-MX" />

А чтобы установить их на уровне страницы, что хорошо для конкретной (отдельной) страницы, установите атрибуты Culture и UICulture в директиве @ page.

например <%@ Page UICulture="es" Culture="es-MX" %>

Hooman
источник
-4

Свойство UICulture может изменяться для каждого веб-браузера, тогда как культура остается неизменной.

Значение культуры можно установить только для определенных культур, например en-US или en-GB. Это препятствует требованию определять правильный символ валюты для использования в en, где en-US и en-GB имеют разные символы валюты. Пользователи могут установить культуру и культуру пользовательского интерфейса в своих браузерах.

Мохаммед Назер
источник