Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Класс CultureInfo

 

Опубликовано: Октябрь 2016

Предоставляет сведения о конкретных языка и региональных параметров (называется языкового стандарта для разработки неуправляемого кода). Эти сведения включают имена языков и региональных параметров, систему письма, используемый календарь, порядок сортировки строк и форматы дат и чисел.

Пространство имен:   System.Globalization
Сборка:  mscorlib (в mscorlib.dll)

System.Object
  System.Globalization.CultureInfo

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class CultureInfo : ICloneable, IFormatProvider

ИмяОписание
System_CAPS_pubmethodCultureInfo(Int32)

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

System_CAPS_pubmethodCultureInfo(Int32, Boolean)

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

System_CAPS_pubmethodCultureInfo(String)

Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных именем.

System_CAPS_pubmethodCultureInfo(String, Boolean)

Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных именем, и логического значения, указывающего, нужно ли использовать выбранные пользователем параметры языка и региональных параметров в операционной системе.

ИмяОписание
System_CAPS_pubpropertyCalendar

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

System_CAPS_pubpropertyCompareInfo

Возвращает объект CompareInfo, который определяет способ сравнения строк в данном языке и региональных параметрах.

System_CAPS_pubpropertyCultureTypes

Возвращает типы языков и региональных параметров, относящихся к текущему объекту CultureInfo.

System_CAPS_pubpropertySystem_CAPS_staticCurrentCulture

Возвращает или задает объект CultureInfo, представляющий язык и региональные параметры, используемые текущим потоком.

System_CAPS_pubpropertySystem_CAPS_staticCurrentUICulture

Возвращает или задает объект CultureInfo, представляющий текущий язык и региональные параметры пользовательского интерфейса, используемые диспетчером ресурсов для поиска ресурсов, связанных с конкретным языком и региональными параметрами, во время выполнения.

System_CAPS_pubpropertyDateTimeFormat

Возвращает или задает объект DateTimeFormatInfo, определяющий формат отображения даты и времени, соответствующий языку и региональным параметрам.

System_CAPS_pubpropertySystem_CAPS_staticDefaultThreadCurrentCulture

Возвращает или задает язык и региональные параметры, используемые по умолчанию для потоков в текущем домене приложения.

System_CAPS_pubpropertySystem_CAPS_staticDefaultThreadCurrentUICulture

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

System_CAPS_pubpropertyDisplayName

Возвращает полное локализованное имя языка и региональных параметров.

System_CAPS_pubpropertyEnglishName

Возвращает имя языка и региональных параметров в формате languagefull [country/regionfull] на английском языке.

System_CAPS_pubpropertyIetfLanguageTag

Не рекомендуется. Возвращает идентификацию языка по стандарту RFC 4646.

System_CAPS_pubpropertySystem_CAPS_staticInstalledUICulture

Возвращает объект CultureInfo, представляющий язык и региональные параметры, установленные с операционной системой.

System_CAPS_pubpropertySystem_CAPS_staticInvariantCulture

Возвращает объект CultureInfo, не зависящий от языка и региональных параметров (инвариантный).

System_CAPS_pubpropertyIsNeutralCulture

Возвращает значение, показывающее, представляет ли текущий объект CultureInfo нейтральный язык и региональные параметры.

System_CAPS_pubpropertyIsReadOnly

Возвращает значение, указывающее, является ли текущий объект CultureInfo доступным только для чтения.

System_CAPS_pubpropertyKeyboardLayoutId

Возвращает активный идентификатор языка ввода.

System_CAPS_pubpropertyLCID

Возвращает идентификатор языка и региональных параметров для текущего объекта CultureInfo.

System_CAPS_pubpropertyName

Возвращает имя языка и региональных параметров в формате languagecode2-country/regioncode2.

System_CAPS_pubpropertyNativeName

Возвращает имя языка и региональных параметров, состоящих из языка, страны или региона и дополнительного набора символов, которые свойственны для этого языка.

System_CAPS_pubpropertyNumberFormat

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

System_CAPS_pubpropertyOptionalCalendars

Возвращает список календарей, которые могут использоваться в данном языке и региональных параметров.

System_CAPS_pubpropertyParent

Возвращает объект CultureInfo, представляющий родительский язык и региональные параметры текущего объекта CultureInfo.

System_CAPS_pubpropertyTextInfo

Возвращает объект TextInfo, определяющий систему письма, связанную с данным языком и региональными параметрами.

System_CAPS_pubpropertyThreeLetterISOLanguageName

Возвращает трехбуквенный код ISO 639-2 для языка текущего объекта CultureInfo.

System_CAPS_pubpropertyThreeLetterWindowsLanguageName

Возвращает трехбуквенный код для языка, определенный в формате Windows API.

System_CAPS_pubpropertyTwoLetterISOLanguageName

Возвращает двухбуквенный код ISO 639-1 для языка текущего объекта CultureInfo.

System_CAPS_pubpropertyUseUserOverride

Возвращает значение, указывающее, использует ли текущий объект CultureInfo параметры языка и региональных параметров, выбранные пользователем.

ИмяОписание
System_CAPS_pubmethodClearCachedData()

Обновляет кешированные данные, связанные с языком и региональными параметрами.

System_CAPS_pubmethodClone()

Создает копию текущего поставщика CultureInfo.

System_CAPS_pubmethodSystem_CAPS_staticCreateSpecificCulture(String)

Создает объект CultureInfo, который представляет определенный язык и региональные параметры, соответствующие заданному имени.

System_CAPS_pubmethodEquals(Object)

Определяет, является ли заданный объект тем же языком и региональными параметрами, что и CultureInfo.(Переопределяет Object.Equals(Object).)

System_CAPS_protmethodFinalize()

Позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как он будет уничтожен во время сборки мусора.(Наследуется от Object.)

System_CAPS_pubmethodGetConsoleFallbackUICulture()

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

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfo(Int32)

Служит для получения кешированного доступного только для чтения экземпляра языка и региональных параметров с помощью указанного идентификатора языка и региональных параметров.

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfo(String)

Возвращает кешированный экземпляр языка и региональных параметров с помощью указанного имени.

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfo(String, String)

Служит для получения кешированного экземпляра языка и региональных параметров, доступного только для чтения. В параметрах определяется язык и региональные параметры, которые инициализируются вместе с объектами TextInfo и CompareInfo, заданными другим языком и региональными параметрами.

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfoByIetfLanguageTag(String)

Не рекомендуется. Служит для получения объекта CultureInfo, доступного только для чтения, который имеет языковые характеристики, указываемые определенным языковым тегом RFC 4646.

System_CAPS_pubmethodSystem_CAPS_staticGetCultures(CultureTypes)

Возвращает список поддерживаемых языков и региональных параметров, отфильтрованный по заданному значению параметра CultureTypes.

System_CAPS_pubmethodGetFormat(Type)

Возвращает объект, определяющий способ форматирования заданного типа.

System_CAPS_pubmethodGetHashCode()

Служит хэш-функцией текущего класса CultureInfo для использования в алгоритмах и структурах данных хеширования, например в хэш-таблице.(Переопределяет Object.GetHashCode().)

System_CAPS_pubmethodGetType()

Возвращает объект Type для текущего экземпляра.(Наследуется от Object.)

System_CAPS_protmethodMemberwiseClone()

Создает неполную копию текущего объекта Object.(Наследуется от Object.)

System_CAPS_pubmethodSystem_CAPS_staticReadOnly(CultureInfo)

Возвращает программу-оболочку, доступную только для чтения, для заданного объекта CultureInfo.

System_CAPS_pubmethodToString()

Возвращает строку, содержащую имя текущего объекта CultureInfo в формате languagecode2-country/regioncode2.(Переопределяет Object.ToString().)

System_CAPS_noteПримечание

Исходный код .NET Framework для этого типа см. в разделе Reference Source. Выполнять поиск исходного кода в Интернете, справочник для автономной работы и пошагово источники (включая исправления и обновления) во время отладки; see instructions.

CultureInfo Класс предоставляет сведения культуре, такие как язык, варианта языка, страны или региона, календаря и соглашения, связанные с определенной культуры. Этот класс также предоставляет доступ к экземплярам региональных DateTimeFormatInfo, NumberFormatInfo, CompareInfo, и TextInfo объектов. Эти объекты содержат сведения, необходимые для операций конкретного языка и региональных параметров, например регистр, форматирование дат и чисел и сравнения строк. CultureInfo Класс используется прямо или косвенно с помощью классов, форматирования и синтаксического анализа управления данные, зависящие от языка и региональных параметров, таких как String, DateTime, DateTimeOffsetи числовых типов.

Содержание

Язык и региональные параметры имена и идентификаторы
Неизменяемое, нейтральные и конкретные языки и региональные параметры
Пользовательские языки и региональные параметры
Данные динамического языка и региональных параметров
Текущий язык и региональные параметры текущего пользовательского интерфейса
Получение всех языков и региональных параметров
Язык и региональные параметры и потоков
Язык и региональные параметры и приложения доменов
Язык и региональные параметры и асинхронные операции на основе задач
Сериализация объекта CultureInfo
Переопределяет панели управления
Альтернативный порядок сортировки
Приложения Windows язык и региональные параметры

CultureInfo Класс задает уникальное имя для каждого языка и региональных параметров, в зависимости от RFC 4646. Имя представляет собой сочетание код ISO 639 двух букв нижнего регистра, языка и региональных параметров, связанных с языком и ISO 3166 прописные региона двухбуквенный код страны или региона. Кроме того, для приложений, предназначенных для .NET Framework 4 или более поздней версии и выполняются в Windows 10 или более поздней версии, языка и региональных параметров имена, которые соответствуют допустимым языка BCP-47 теги поддерживаются.

System_CAPS_noteПримечание

Имя языка и региональных параметров — при передаче в конструкторе класса или метода например CreateSpecificCulture или CultureInfo, его регистр не имеет значения.

Недопустимый формат для языка и региональных параметров, именование по стандарту RFC 4646 languagecode2настроек-код_страны_или_региона2, где languagecode2 языка двухбуквенный код и код_страны_или_региона2 региона двухбуквенный код. Например, ja-JP японский (Япония) "и" en US для английского языка (США). В случаях, когда язык двухбуквенный код недоступен используется трехбуквенный код, производный от ISO 639-2.

Обратите внимание, что некоторые имена языка и региональных параметров также стандарту ISO 15924. Например Cyrl означает кириллицу и Latn указывает латинского алфавита. Имя языка и региональных параметров, которое содержит сценарий использует шаблон languagecode2-scripttag-код_страны_или_региона2. Примером этого типа имени языка и региональных параметров является uz-Cyrl-UZ для Узбекский (кириллица, Узбекистан). В операционных системах Windows до Windows Vista, имя языка и региональных параметров, которое содержит сценарий использует шаблон languagecode2-код_страны_или_региона2-scripttag, например uz-UZ-Cyrl для Узбекский (кириллица, Узбекистан).

Только двух букв нижнего регистра кодировку заданным нейтрального языка и региональных параметров. Например fr определяет нейтральный язык и региональные параметры для французского языка, а de определяет нейтральный язык и региональные параметры для немецкого языка.

System_CAPS_noteПримечание

Существуют два имени языка и региональных параметров, которые соответствуют этому правилу. Языки и региональные параметры с именем zh-Hans, китайский (упрощенное письмо) и китайский (традиционный), с именем zh-Hant, являются нейтральными. Имя языка и региональных параметров представляют текущий стандарт и должны использоваться, если у вас нет причин для использования более старые имена zh-CHS и zh-CHT.

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

Определенные стандартные имена языка и региональных параметров, и идентификаторы используются в этом и других классах System.Globalization пространства имен. Язык и региональные параметры подробные сведения отображаются в National Language Support (NLS) API Reference в центре разработчиков Go Global.

Помните, что имена языка и региональных параметров и идентификаторы представляют только подмножества языков и региональных параметров, которые могут находиться на отдельном компьютере. Версии Windows или пакетах обновления можно изменить доступные языки и региональные параметры. Пользовательские языки и региональные параметры с помощью добавления приложений CultureAndRegionInfoBuilder класса. Пользователи добавлять свои собственные пользовательские языки и региональные параметры с помощью средства Microsoft Locale Builder. Microsoft Locale Builder записывается в управляемом коде с помощью CultureAndRegionInfoBuilder класса.

Некоторые особые имена тесно связаны с региональными параметрами, особенно имена, связанные со следующими членами класса:

Языки и региональные параметры делятся на группы по три набора: инвариантные, нейтральные и определенные языки и региональные параметры.

Инвариантный язык и региональные параметры без учета языка и региональных параметров. Приложение указывает инвариантный язык и региональные параметры по имени, используя пустую строку ("») или по его идентификатору. InvariantCultureОпределяет экземпляр инвариантного языка и региональных параметров. Он связан с английским языком, но не с любой страны или региона. Он используется в практически любой метод Globalization пространство имен, которое требуется языка и региональных параметров.

Нейтральный язык и региональные параметры — это культура, связанный с языком, но не с страны или региона. Определенного языка и региональных параметров является язык и региональные параметры, связанные с языком и страны или региона. Например fr определяет нейтральное имя для французского языка и региональных параметров, а fr-FR это имя определенного языка и региональных параметров французский (Франция). Обратите внимание, что китайский (упрощенное письмо) и китайский (традиционный) также считаются нейтральные языки и региональные параметры.

Создание экземпляра CompareInfo класс для нейтрального языка и региональных параметров не рекомендуется из-за произвольных данных он содержит. Для отображения и сортировки данных, укажите язык и регион. Кроме того Name свойство CompareInfo объекта, созданного для нейтрального языка и региональных параметров, возвращает только «Страна» и не включает область.

Определенные языки и региональные параметры имеют иерархию, в котором нейтрального языка и региональных параметров является родительским для определенного языка и региональных параметров и инвариантный язык и региональные параметры является родительским для нейтрального языка и региональных параметров. Parent Свойство содержит нейтральный язык и региональные параметры, связанные с определенной культуры. Пользовательские языки и региональные параметры следует определить Parent свойства в соответствии с этим шаблоном.

Если ресурсы для конкретного языка и региональных параметров не доступны в операционной системе, используются ресурсы для связанного нейтрального языка и региональных параметров. Если недоступны ресурсы для нейтрального языка и региональных параметров, используются ресурсы, встроенные в основную сборку. Дополнительные сведения о процесс использования резервных ресурсов см. в разделе Упаковка и развертывание ресурсов в приложениях для настольных систем.

Список языковых стандартов, в формате Windows API немного отличается от списка языков и региональных параметров, поддерживаемых платформой .NET Framework. Если требуется взаимодействие с Windows, например, через механизм p/invoke, приложение должно использовать конкретную культуру, которая определена для операционной системы. Использование определенного языка и региональных параметров обеспечивает согласование с эквивалентным языком Windows, который определяется идентификатором языкового стандарта, который совпадает со значением LCID.

Объект DateTimeFormatInfo или NumberFormatInfo можно создать только для инвариантного языка и региональных параметров или для конкретных языков и региональных параметров, но не для нейтральной культуры.

Если DateTimeFormatInfo.Calendar является TaiwanCalendar , но Thread.CurrentCulture не равно zh-TW, затем DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraName, и DateTimeFormatInfo.GetAbbreviatedEraName возвращается пустая строка (»»).

Помимо стандартных языков и региональных параметров, поддерживаемых операционной системы Windows и .NET Framework платформа .NET Framework поддерживает три типа пользовательские языки и региональные параметры:

  • Новые языки и региональные параметры иллюстрируются культуры в Windows или .NET Framework. Например, приложение может установить CultureInfo объект, представляющий fj-FJ (или Fijan (Камчатка)) язык и региональные параметры в системе.

  • Языки и региональные параметры замены, свойства которого отличаются от свойств стандартных языков и региональных параметров, поддерживаемых Windows и .NET Framework.

  • Переопределяет стандартные языки и региональные параметры с пользователем. Пользователь может использовать язык и региональные стандарты в панели управления для настройки значений свойств существующего языка и региональных параметров.

System_CAPS_noteПримечание

Можно использовать CultureAndRegionInfoBuilder класса для определения, сохранить и зарегистрировать пользовательские языки и региональные параметры, либо дополнить или заменить существующие языков и региональных параметров. CultureAndRegionInfoBuilder.Save Метод создает файл языка разметки данных языкового стандарта (LDML), который можно использовать для установки пользовательского языка и региональных параметров на целевых системах. Шаг с шага сведения об использовании CultureAndRegionInfoBuilder класса для создания нового или замены языка и региональных параметров, в разделе CultureAndRegionInfoBuilder разделе, посвященном классу.

Так как платформа .NET Framework поддерживает пользовательские языки и региональные параметры, при работе с данными для определенного языка и региональных параметров необходимо учитывать следующее:

  • Пользовательские языки и региональные параметры могут иметь значения, выходить за границы стандартных языков и региональных параметров. Например некоторые языки и региональные параметры имеют слишком длинные названия месяцев, неправильные даты или форматов времени или другие нестандартные данные.

  • При просмотре данных, зависящего от языка и региональных параметров пользовательского интерфейса должны учитывать настройки пользователя; например пользователь может потребоваться 24-часовом формате или в формате ГГГГММДД даты.

  • Помните, что пользовательские языки и региональные параметры переопределяют значения по умолчанию. Таким образом нельзя считать данные языка и региональных параметров для stable. Названия стран, форматы чисел и дат и написание может измениться в будущем. Если необходимо сериализовать данные, зависящие от языка и региональных параметров как строки даты и времени должны быть переданы даты и времени, синтаксический анализ функции, следует использовать инвариантный язык и региональные параметры или конкретного.

CultureTypes Включает значение свойства пользовательских языков и региональных параметров, установленную в системе CultureTypes.UserCustomCulture назначаются флаг и пользовательские языки и региональные параметры LCID значение свойства LOCALE_CUSTOM_UNSPECIFIED (0x1000 или 4096). Обратите внимание, что, начиная с Windows 10, это значение также назначается системные языков, в которых отсутствуют полные данные, культуры.

За исключением инвариантного языка и региональных параметров язык и региональные параметры данных является динамическим. Это справедливо даже для предварительно определенных языков и региональных параметров. Например стран или регионов ввести новые валюты, изменить написание слов или изменить свой основной календарь и изменять определения языка и региональных параметров для отслеживания этого. Пользовательские языки и региональные параметры могут быть изменены без предварительного уведомления и любого конкретного языка и региональных параметров может быть переопределено пользовательских замещающая культура. Кроме того как описано ниже, отдельный пользователь может изменить региональные параметры. Приложения всегда должны получать данные с языком и региональными параметрами, во время выполнения.

System_CAPS_cautionВнимание!

При сохранении данных, приложение должно использовать инвариантный язык и региональные параметры, двоичный формат или определенный формат зависящий от языка и региональных параметров. Данные, сохраненные в соответствии с текущими значениями, связанными с определенного языка и региональных параметров, отличающихся от инвариантных, могут стать нечитаемыми или приобрести другой смысл при изменении этого языка и региональных параметров.

Каждый поток в приложении .NET Framework имеет текущего языка и региональных параметров и текущий язык и региональные параметры пользовательского интерфейса. Текущий язык и региональные параметры определяет правила форматирования для дат, времени, числа и значения валюты, порядок сортировки текста, правила регистра и способы сравнения строк. Текущий язык и региональные параметры пользовательского интерфейса используется для извлечения ресурсов во время выполнения, связанных с языком и региональными параметрами.

System_CAPS_noteПримечание

Сведения об определении текущей и текущей культуры пользовательского интерфейса отдельно для каждого потока см. в разделе Язык и региональные параметры и потоков раздела. Сведения об определении текущей и текущей культуры пользовательского интерфейса в потоках, выполняемых в новый домен приложения и в потоках, пересекающих границы домена приложения, см. Язык и региональные параметры и приложения доменов раздела. Сведения об определении текущей и текущего в потоках выполнения асинхронных операций на основе задач см. в разделе Язык и региональные параметры и асинхронные операции на основе задач раздела.

Более подробные сведения о текущих региональных параметров см. в разделе CultureInfo.CurrentCulture свойства раздела. Более подробные сведения о текущих региональных параметров пользовательского интерфейса см. в разделе CultureInfo.CurrentUICulture свойства раздела.

Вы можете получить CultureInfo , представляющий текущий язык и региональные параметры одним из двух способов:

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

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      CultureInfo culture1 = CultureInfo.CurrentCulture;
      CultureInfo culture2 = Thread.CurrentThread.CurrentCulture;
      Console.WriteLine("The current culture is {0}", culture1.Name);
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        culture1 == culture2);
   }
}
// The example displays output like the following:
//     The current culture is en-US
//     The two CultureInfo objects are equal: True

Вы можете получить CultureInfo , представляющий текущий язык и региональные параметры пользовательского интерфейса в одним из двух способов:

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

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      CultureInfo uiCulture1 = CultureInfo.CurrentUICulture;
      CultureInfo uiCulture2 = Thread.CurrentThread.CurrentUICulture;
      Console.WriteLine("The current UI culture is {0}", uiCulture1.Name);
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        uiCulture1 == uiCulture2);
   }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The two CultureInfo objects are equal: True

Чтобы изменить язык и региональные параметры пользовательского интерфейса потока, выполните следующие действия.

  1. Создать экземпляр CultureInfo объект, представляющий этот язык, вызвав CultureInfo класса конструктор и передает имя языка и региональных параметров. CultureInfo(String) Конструктор создает CultureInfo , отражающий пользователя переопределяет при нового языка и региональных параметров совпадает со значением текущего языка и региональных параметров Windows. CultureInfo(String, Boolean) Конструктор позволяет указать, является ли вновь созданный экземпляр CultureInfo отражает объект пользователя переопределяет при нового языка и региональных параметров совпадает со значением текущего языка и региональных параметров Windows.

  2. Назначьте CultureInfo объект Thread.CurrentCulture илиThread.CurrentUICulture свойства. Кроме того, для приложений, работающих в версии 4.6 или более поздней версии рабочего стола .NET Framework, можно также назначить CultureInfo объект CultureInfo.CurrentCulture или CultureInfo.CurrentUICulture свойства.

В следующем примере извлекается текущего языка и региональных параметров. Если ничего, кроме французский (Франция) языка и региональных параметров, он изменяет текущий язык и региональные параметры на французский (Франция). В противном случае он изменяет текущий язык и региональные параметры на французский (Люксембург).

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo current = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0}", current.Name);
      CultureInfo newCulture;
      if (current.Name.Equals("fr-FR"))
         newCulture = new CultureInfo("fr-LU");
      else   
         newCulture = new CultureInfo("fr-FR");

      CultureInfo.CurrentCulture = newCulture;
      Console.WriteLine("The current culture is now {0}", 
                        CultureInfo.CurrentCulture.Name);   
   }
}
// The example displays output like the following:
//     The current culture is en-US
//     The current culture is now fr-FR

В следующем примере извлекается текущего языка и региональных параметров. Если что-либо других словенский (Словения) язык и региональные параметры, она примет словенский (Словения) текущего языка и региональных параметров. В противном случае он изменяет на Хорватский (Хорватия) текущего языка и региональных параметров.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo current = CultureInfo.CurrentUICulture;
      Console.WriteLine("The current UI culture is {0}", current.Name);
      CultureInfo newUICulture;
      if (current.Name.Equals("sl-SI"))
         newUICulture = new CultureInfo("hr-HR");
      else   
         newUICulture = new CultureInfo("sl-SI");

      CultureInfo.CurrentUICulture = newUICulture;
      Console.WriteLine("The current UI culture is now {0}", 
                        CultureInfo.CurrentUICulture.Name);   
   }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The current UI culture is now sl-SI

Массив определенных языков и региональных параметров или для всех языков, доступных на локальном компьютере можно получить, вызвав GetCultures метод. Например можно получить пользовательские языки и региональные параметры, определенные культуры или нейтральные отдельно или в сочетании.

В следующем примере вызывается GetCultures метод дважды, один со CultureTypes.UserCustomCulture член перечисления, чтобы получить все пользовательские языки и региональные параметры, а затем и в CultureTypes.ReplacementCultures член перечисления для получения всех языков и региональных параметров замены.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Get all custom cultures.
      CultureInfo[] custom = CultureInfo.GetCultures(CultureTypes.UserCustomCulture);
      if (custom.Length == 0) { 
         Console.WriteLine("There are no user-defined custom cultures.");
      }
      else {
         Console.WriteLine("Custom cultures:");
         foreach (var culture in custom) 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);    
      }
      Console.WriteLine();

      // Get all replacement cultures.
      CultureInfo[] replacements = CultureInfo.GetCultures(CultureTypes.ReplacementCultures);
      if (replacements.Length == 0) { 
         Console.WriteLine("There are no replacement cultures.");
      }                                             
      else {
         Console.WriteLine("Replacement cultures:");
         foreach (var culture in replacements) 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);    
      }
      Console.WriteLine();
   }
}
// The example displays output like the following:
//     Custom cultures:
//        x-en-US-sample -- English (United States)
//        fj-FJ -- Boumaa Fijian (Viti)
//     
//     There are no replacement cultures.

При запуске нового потока приложения, его текущего языка и региональных параметров и текущий язык и региональные параметры пользовательского интерфейса определяются с текущей культурой, а не языка и региональных параметров текущего потока. В следующем примере демонстрируется это различие. Французский (Франция), язык и региональные параметры (fr-FR) устанавливается текущий язык и региональные параметры текущего пользовательского интерфейса потока приложения. Если текущий язык и региональные параметры fr-FR, в примере задается английский (США), язык и региональные параметры (en US). Он отображает три случайных чисел как денежных значений, а затем создает новый поток, который в свою очередь, отображает три более случайных чисел как денежных значений. Но в качестве выходных данных в примере значения валюты, отображаемые в новом потоке не отражают соглашения о форматировании французский (Франция) языка и региональных параметров, в отличие от выходные данные из основного потока приложения.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   static Random rnd = new Random();

   public static void Main()
   {
      if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR") {
         // If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
      }
      else {
         // Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
      }
      ThreadProc();

      Thread worker = new Thread(ThreadProc);
      worker.Name = "WorkerThread";
      worker.Start();
   }

   private static void DisplayThreadInfo()
   {
      Console.WriteLine("\nCurrent Thread Name: '{0}'", 
                        Thread.CurrentThread.Name);
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name);                        
   }

   private static void DisplayValues()
   {
      // Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:");
      for (int ctr = 0; ctr <= 3; ctr++)
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);                        
   }

   private static void ThreadProc()
   {
      DisplayThreadInfo();
      DisplayValues();
   }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          8,11 €
//          1,48 €
//          8,99 €
//          9,04 €
//       
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: en-US/en-US
//       Some currency values:
//          $6.72
//          $6.35
//          $2.90
//          $7.72

В версиях .NET Framework перед .NET Framework 4.5, наиболее распространенный способ убедитесь в совпадении того же языка и региональных параметров для основного потока приложения с все рабочие потоки — для передачи имени языка и региональных параметров приложения. или CultureInfo , представляющий язык и региональные параметры уровня приложения для System.Threading.ParameterizedThreadStart делегировать. Следующий пример использует этот подход, чтобы убедиться, что значения валюты с двумя потоками отражают соглашения о форматировании того же языка и региональных параметров.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   static Random rnd = new Random();

   public static void Main()
   {
      if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR") {
         // If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
      }   
      else {
         // Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
      }
      DisplayThreadInfo();
      DisplayValues();

       Thread worker = new Thread(Example.ThreadProc);
       worker.Name = "WorkerThread";
       worker.Start(Thread.CurrentThread.CurrentCulture);
   }

   private static void DisplayThreadInfo()
   {
      Console.WriteLine("\nCurrent Thread Name: '{0}'", 
                        Thread.CurrentThread.Name);
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name);                        
   }

   private static void DisplayValues()
   {
      // Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:");
      for (int ctr = 0; ctr <= 3; ctr++)
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);                        
   }

   private static void ThreadProc(Object obj) 
   {
      Thread.CurrentThread.CurrentCulture = (CultureInfo) obj;
      Thread.CurrentThread.CurrentUICulture = (CultureInfo) obj;
      DisplayThreadInfo();
      DisplayValues();
   }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          6,83 €
//          3,47 €
//          6,07 €
//          1,70 €
//       
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          9,54 €
//          9,50 €
//          0,58 €
//          6,91 €

Можно установить язык и региональные параметры пользовательского интерфейса потока из пула потоков так же, как путем вызова ThreadPool.QueueUserWorkItem(WaitCallback, Object) метод.

Начиная с .NET Framework 4.5, можно задать язык и региональные параметры пользовательского интерфейса всех потоков в домене приложения напрямую путем назначения CultureInfo объект, представляющий этот язык для DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства. В следующем примере эти свойства убедитесь, что все потоки в домене приложения по умолчанию общих же языком и региональными параметрами.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   static Random rnd = new Random();

   public static void Main()
   {
      if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR") {
         // If current culture is not fr-FR, set culture to fr-FR.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
      }   
      else {
         // Set culture to en-US.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
      }
      ThreadProc();

      Thread worker = new Thread(Example.ThreadProc);
      worker.Name = "WorkerThread";
      worker.Start();
   }

   private static void DisplayThreadInfo()
   {
      Console.WriteLine("\nCurrent Thread Name: '{0}'", 
                        Thread.CurrentThread.Name);
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name);                        
   }

   private static void DisplayValues()
   {
      // Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:");
      for (int ctr = 0; ctr <= 3; ctr++)
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);                        
   }

   private static void ThreadProc() 
   {
      DisplayThreadInfo();
      DisplayValues();
   }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          6,83 €
//          3,47 €
//          6,07 €
//          1,70 €
//       
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          9,54 €
//          9,50 €
//          0,58 €
//          6,91 €
System_CAPS_warningПредупреждение

Несмотря на то что DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства являются статическими членами, они определяют по умолчанию язык и региональные параметры по умолчанию пользовательского интерфейса только для домена приложения, которая является текущей во время этих свойств устанавливаются значения. Дополнительные сведения см. следующий раздел, языка и региональных параметров и домены приложений.

При назначении значения для DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства, язык и региональные параметры пользовательского интерфейса потоков в домене приложения также изменить, если они не явно назначены языка и региональных параметров. Однако эти потоки отражают новые параметры языка и региональных параметров, пока они выполняются в текущем домене приложения. Если эти потоки выполняются в другом домене приложения, их язык и региональные параметры становится по умолчанию язык и региональные параметры, определенные для этого домена приложения. Поэтому мы рекомендуем всегда значение языка и региональных параметров из основного потока приложения и не полагаться на DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства, чтобы изменить его.

DefaultThreadCurrentCultureи DefaultThreadCurrentUICulture являются статические свойства, которые явно определить язык и региональные параметры по умолчанию только для домена приложения, которая является текущей, при установке или получить значение свойства. Следующий пример задает по умолчанию язык и региональные параметры по умолчанию пользовательского интерфейса в домене приложения по умолчанию на французский (Франция), а затем использует AppDomainSetup класса и AppDomainInitializer делегат для установки по умолчанию язык и региональные параметры пользовательского интерфейса в новый домен приложения для русского языка (Россия). Затем один поток выполняет два метода в каждом домене приложения. Обратите внимание, что язык и региональные параметры и язык и региональные параметры пользовательского интерфейса потока не заданы явным образом; они являются производными от языка и региональных параметров по умолчанию и языка и региональных параметров пользовательского интерфейса, домена приложения, в котором выполняется поток. Обратите внимание, что DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства возвращают значение по умолчанию CultureInfo значения домена приложения, которая является текущей, при вызове метода.

using System;
using System.Globalization;
using System.Reflection;
using System.Threading;

public class Example
{
   public static void Main()
   {
      // Set the default culture and display the current date in the current application domain.
      Info info1 = new Info();
      SetAppDomainCultures("fr-FR");

      // Create a second application domain.
      AppDomainSetup setup = new AppDomainSetup();
      setup.AppDomainInitializer = SetAppDomainCultures;
      setup.AppDomainInitializerArguments = new string[] { "ru-RU" };
      AppDomain domain = AppDomain.CreateDomain("Domain2", null, setup);
      // Create an Info object in the new application domain.
      Info info2 = (Info) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName, 
                                                         "Info"); 

      // Execute methods in the two application domains.
      info2.DisplayDate();
      info2.DisplayCultures();

      info1.DisplayDate();
      info1.DisplayCultures();            
   }

   public static void SetAppDomainCultures(string[] names)
   {
      SetAppDomainCultures(names[0]);
   }

   public static void SetAppDomainCultures(string name)
   {
       try {
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name);
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name);
      }
      // If an exception occurs, we'll just fall back to the system default.
      catch (CultureNotFoundException) {
         return;
      }   
      catch (ArgumentException) {
         return;
      } 
   }
}

public class Info : MarshalByRefObject
{
   public void DisplayDate()
   {
      Console.WriteLine("Today is {0:D}", DateTime.Now);
   }

   public void DisplayCultures()
   {
      Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id);
      Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture);
      Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture);
   }
}
// The example displays the following output:
//       Today is 14 октября 2011 г.
//       Application domain is 2
//       Default Culture: ru-RU
//       Default UI Culture: ru-RU
//       Today is vendredi 14 octobre 2011
//       Application domain is 1
//       Default Culture: fr-FR
//       Default UI Culture: fr-FR

Дополнительные сведения о языках и региональных параметрах и доменах приложений см. в разделе «Домены приложения и потоки» в разделе.

Асинхронного программирования модель на основе задач использует Task и Task<TResult> объекты для асинхронного выполнения делегаты на поток из пула потоков. Определенного потока, на котором выполняется конкретной задачи не известна заранее, но определяется только во время выполнения.

Для приложений, предназначенных для .NET Framework 4.6 или более поздние версии, языка и региональных параметров является частью контекста асинхронной операции. Другими словами, начиная с приложений, ориентированных на .NET Framework 4.6, асинхронные операции по умолчанию наследует значения CurrentCulture и CurrentUICulture свойства потока, откуда они запускаются. Если для текущего языка и региональных параметров или текущего языка и региональных параметров пользовательского интерфейса, отличается от языка и региональных параметров системы, текущего языка и региональных параметров пересекает границы потоков и становится текущий язык и региональные параметры пула потоков, которая выполняет асинхронную операцию.

Следующий пример иллюстрирует это. Она использует TargetFrameworkAttribute атрибута целевой объект .NET Framework 4.6. В примере определяется Func<TResult> делегировать, formatDelegate, который возвращает некоторые числа в виде значения валюты. В примере изменяется текущий язык и региональные параметры системы на французский (Франция) или, если французский (Франция) уже текущими региональными параметрами, а английский (США). И она затем:

  • Напрямую вызывает делегат, выполняется синхронно в потоке основным приложением.

  • Создает задачу, которая выполняет делегат асинхронно в потоке пула потоков.

  • Создает задачу, которая синхронно выполняет делегат в потоке основным приложением путем вызова Task.RunSynchronously метод.

Как показывают выходные данные примера, при изменении текущего языка и региональных параметров на французский (Франция), текущий язык и региональные параметры потока, из которого асинхронно вызываются задачи становится текущий язык и региональные параметры для этой асинхронной операции.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{

   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:"); 
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);

       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate); 
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//         The example is running on thread 1
//         The current culture is en-US
//         Changed the current culture to fr-FR.
//
//         Executing the delegate synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163�025�412,32 �   18�905�365,59 �
//
//         Executing a task asynchronously:
//         Formatting using the fr-FR culture on thread 3.
//         163�025�412,32 �   18�905�365,59 �
//
//         Executing a task synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163�025�412,32 �   18�905�365,59 �

Для приложений, предназначенных для версий платформы .NET Framework до версии .NET Framework 4.6, или для приложений, не предназначенных для конкретной версии платформы .NET Framework, язык и региональные параметры вызывающего потока не является частью контекста задачи. Вместо этого если он задан явно, язык и региональные параметры новых потоков по умолчанию является культуру системы. В следующем примере идентичен предыдущему примеру, за исключением того, что он не имеет TargetFrameworkAttribute атрибут, это показано. Язык и региональные параметры системы системы, на котором выполняется пример использовался английский (США), язык и региональные параметры задачи, которая выполняется асинхронно в потоке пула потоков является en US, а не fr-FR.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:"); 
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);

       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate); 
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//     
//     Executing the delegate synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163�025�412,32 �   18�905�365,59 �
//     
//     Executing a task asynchronously:
//     Formatting using the en-US culture on thread 3.
//     $163,025,412.32   $18,905,365.59
//     
//     Executing a task synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163�025�412,32 �   18�905�365,59 �

Для приложений, предназначенных для версий платформы .NET Framework из .NET Framework 4.5 и более поздней версии, но до появления .NET Framework 4.6, можно использовать DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства и убедитесь, что используется язык и региональные параметры вызывающего потока в асинхронные задачи, которые выполняются в потоке пула потоков. Следующий пример идентичен предыдущему примеру, за исключением того, что он использует DefaultThreadCurrentCulture языка и региональных параметров, как основного потока приложения имеют свойства, чтобы этот поток из пула потоков.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture;

       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:"); 
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);

       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate); 
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//     
//     Executing the delegate synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163�025�412,32 �   18�905�365,59 �
//     
//     Executing a task asynchronously:
//     Formatting using the fr-FR culture on thread 3.
//     163�025�412,32 �   18�905�365,59 �
//     
//     Executing a task synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163�025�412,32 �   18�905�365,59 �

DefaultThreadCurrentCultureи DefaultThreadCurrentUICulture на приложения, являются свойствами домена; то есть, они определяют культуру по умолчанию для всех потоков не были явно назначить культуру в конкретном домене приложения. Однако для приложений, предназначенных для .NET Framework 4.6 или более поздней версии, языка и региональных параметров вызывающего потока остается частью контекста асинхронной задачи, даже если задача пересекает границы домена приложения.

В следующем примере показано, что язык и региональные параметры вызывающего потока остается текущего языка и региональных параметров асинхронной операции на основе задач, даже если метод, который выполняется задача пересекает границы домена приложения. Определяет класс, DataRetriever, с одним методом GetFormattedNumber, который возвращает случайное число с плавающей запятой двойной точности от 1 до 1000, в формате денежной суммы. Первая задача выполняется, просто создает экземпляр DataRetriever экземпляра и вызывает его GetFormattedNumber метод. Вторая задача сообщает свой текущий домен приложения, создает новый домен приложения, создает DataRetriever экземпляра в новый домен приложения и вызывает его GetFormattedNumber метод. Как показывают выходные данные примера, текущий язык и региональные параметры осталась в вызывающий поток, первая задача и вторая задача обоих совпадают, при его выполнении в домене основного приложения и второй домен приложения.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{
   public static void Main()
   {
       string formatString = "C2";
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:"); 
       var t1 = Task.Run(() => { DataRetriever d = new DataRetriever();
                                 return d.GetFormattedNumber(formatString);
                               });
       Console.WriteLine(t1.Result);
       Console.WriteLine(); 

       Console.WriteLine("Executing a task synchronously in two appdomains:");
       var t2 = Task.Run(() => { Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                                                   Thread.CurrentThread.ManagedThreadId, 
                                                   AppDomain.CurrentDomain.FriendlyName);
                                 AppDomain domain = AppDomain.CreateDomain("Domain2");
                                 DataRetriever d = (DataRetriever) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                   "DataRetriever");
                                 return d.GetFormattedNumber(formatString); 
                               }); 
       Console.WriteLine(t2.Result);
   }
}

public class DataRetriever : MarshalByRefObject
{
   public string GetFormattedNumber(String format)
   {
      Thread thread = Thread.CurrentThread;
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture);
      Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                        thread.ManagedThreadId, 
                        AppDomain.CurrentDomain.FriendlyName);
      Random rnd = new Random();
      Double value = rnd.NextDouble() * 1000;
      return value.ToString(format);
   }
}
// The example displays output like the following:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//     
//     Executing a task asynchronously in a single appdomain:
//     Current culture is fr-FR
//     Thread 3 is running in app domain 'AsyncCulture4.exe'
//     93,48 �
//     
//     Executing a task synchronously in two appdomains:
//     Thread 4 is running in app domain 'AsyncCulture4.exe'
//     Current culture is fr-FR
//     Thread 4 is running in app domain 'Domain2'
//     288,66 �

Когда CultureInfo сериализации объекта, все, что фактически хранятся — Name и UseUserOverride. Это успешно отменяется сериализованный только в среде которой, Name имеет такое же значение. В следующих трех примерах показано, почему это не всегда так:

  • Если CultureTypes значение свойства CultureTypes.WindowsOnlyCultures, и если этот язык и региональные параметры впервые появилась в Windows Vista или более поздней версии операционной системы Windows, это невозможно выполнить десериализацию его в Windows XP. Аналогично Если язык и региональные параметры, появившийся в Windows XP с пакетом обновления 2, не невозможно десериализовать его для системы Windows XP, на котором не установлен язык и региональные параметры.

  • Если CultureTypes значение CultureTypes.UserCustomCultureи компьютер, на котором десериализацию не имеет этого пользователя пользовательский язык и региональные параметры установлены, невозможно выполнить десериализацию его.

  • Если CultureTypes значение — CultureTypes.ReplacementCulturesи компьютер, на котором десериализацию имеет это замещающая культура, десериализуются тем же именем, но не все те же характеристики. Например если замещающая культура на компьютере A, но не на компьютере B en US, а CultureInfo объект ссылается на этот язык и региональные параметры на компьютере A и на компьютере B, а затем передаются ни одна из характеристик пользовательского языка и региональных параметров. Культура десериализуются успешно, но с другим значением.

Пользователь может выбрать переопределить некоторые значения, связанные с текущей культурой Windows путем язык и региональные параметры в панели управления. Например пользователь может выбрать для отображения даты в другом формате или использовать денежные единицы, используемый по умолчанию для региональных параметров. Как правило в приложениях должны учитываться эти переопределенные пользователем параметры.

Если UseUserOverridetrue и указанного языка и региональных параметров совпадает с текущей культурой Windows, CultureInfo использует эти переопределения, включая пользовательские настройки для свойства DateTimeFormatInfo экземпляр, возвращаемый DateTimeFormat свойства и свойства NumberFormatInfo экземпляр, возвращаемый NumberFormat свойство. Если пользователем параметры несовместимы с языком и региональными параметрами, связанные с CultureInfo, например, если выбранный календарь не является одним из OptionalCalendars, результаты методов и значения свойств не определены.

Некоторые культуры поддерживают несколько порядков сортировки. Например:

  • Испанский (Испания) языка и региональных параметров есть два порядка сортировки: по умолчанию международный порядок сортировки и традиционный порядок сортировки. При создании экземпляра CultureInfo объекта с именем язык и региональные параметры es-ES, используется международный порядок сортировки. При создании экземпляра CultureInfo объекта с именем язык и региональные параметры es-ES-tradnl используется традиционный порядок сортировки.

  • Языка и региональных параметров zh-CN (китайский (упрощенное письмо, КНР)) поддерживает два порядка сортировки: по произношению (по умолчанию) и по числу штрихов. При создании экземпляра CultureInfo объекта с именем языка и региональных параметров zh-CN, используется порядок сортировки по умолчанию. При создании экземпляра CultureInfo объекта с локальным идентификатором 0x00020804, строки сортируются по числу штрихов.

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

Имя языка и региональных параметров

Язык и региональные параметры

Имя сортировки по умолчанию и идентификатор

Альтернативного имени сортировки и идентификатор

es-ES

Испанский (Испания)

Международная: 0x00000C0A

Традиционные: 0x0000040A

zh-TW

Китайский (Тайвань)

Количество штрихов: 0x00000404

Bopomofo: 0x00030404

zh-CN

Китайский (КНР)

Произношение: 0x00000804

Количество штрихов: 0x00020804

zh-HK

Китайский (Гонконг)

Количество штрихов: 0x00000c04

Количество штрихов: 0x00020c04

zh-SG

Китайский (Сингапур)

Произношение: 0x00001004

Количество штрихов: 0x00021004

zh-MO

Китайский (МАКАО)

Произношение: 0x00001404

Количество штрихов: 0x00021404

ja-JP

Японский (Япония)

По умолчанию: 0x00000411

Юникод: 0x00010411

ko-KR

Корейский (Корея)

По умолчанию: 0x00000412

Корейский Xwansung - Юникод: 0x00010412

de-DE

Немецкий (Германия)

Словарь: 0x00000407

Сортировка телефонной книги ТЕЛЕФОННОЙ: 0x00010407

hu-HU

Венгерский (Венгрия)

По умолчанию: 0x0000040e

Техническая сортировка: 0x0001040e

Ka GE

Грузинское письмо (Грузия)

Традиционные: 0x00000437

Современная сортировка: 0x00010437

В приложениях Windows CurrentCulture и CurrentUICulture свойства доступны только для чтения. Текущий язык и региональные параметры текущего пользовательского интерфейса можно задать с помощью Windows ResourceContext.Languages свойство. В следующем примере используется его для изменения текущего языка и региональных параметров и текущий язык и региональные параметры пользовательского интерфейса приложения либо английский (США) или, если текущий язык и региональные параметры уже является английский (США), французский (Франция). Значение CurrentCulture и CurrentUICulture свойства отображаются на TextBlock управления с именем block. Как показывают выходные данные примера, оба значения свойства отражают новое значение ResourceContext.Languages свойство.


ResourceContext context = ResourceManager.Current.DefaultContext;
var list = new List<String>();
if (CultureInfo.CurrentCulture.Name == "en-US")
   list.Add("fr-FR");
else
   list.Add("en-US");

context.Languages = list;
block.Text += String.Format("\nThe current culture is {0}\n",
                            CultureInfo.CurrentCulture);
block.Text += String.Format("The current culture UI is {0}\n",
                            CultureInfo.CurrentUICulture);
// The example displays output like the following if run on a system
// whose current culture is English (United States):
// The current culture is fr-FR
// The current UI culture is fr-FR   


Dim context As ResourceContext = ResourceManager.Current.DefaultContext
Dim list As New List(Of String)()
If CultureInfo.CurrentCulture.Name = "en-US" Then
   list.Add("fr-FR")
Else
   list.Add("en-US")
End If
context.Languages = list
block.Text += String.Format("{1}The current culture is {0}{1}",
                            CultureInfo.CurrentCulture, vbCrLf)
block.Text += String.Format("The current culture UI is {0}\n",
                            CultureInfo.CurrentUICulture)
' The example displays output Like the following if run on a system
' whose current culture Is English (United States):
'    The current culture Is fr-FR
'    The current UI culture Is fr-FR   

В следующем примере показано, как создать CultureInfo объекта испанский (Испания) с международным порядком сортировки, а вторая CultureInfo объект с традиционным порядком сортировки.

using System;
using System.Collections;
using System.Globalization;

public class SamplesCultureInfo
{

   public static void Main()
   {

      // Creates and initializes the CultureInfo which uses the international sort.
      CultureInfo myCIintl = new CultureInfo("es-ES", false);

      // Creates and initializes the CultureInfo which uses the traditional sort.
      CultureInfo myCItrad = new CultureInfo(0x040A, false);

      // Displays the properties of each culture.
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL");
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName);
      Console.WriteLine();

      // Compare two strings using myCIintl.
      Console.WriteLine("Comparing \"llegar\" and \"lugar\"");
      Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"));
      Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"));

   }

}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)          
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False                    
IsReadOnly                     False                                          False                    
LCID                           3082                                           1034                     
Name                           es-ES                                          es-ES                    
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es                       
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
ThreeLetterISOLanguageName     spa                                            spa                      
ThreeLetterWindowsLanguageName ESN                                            ESP                      
TwoLetterISOLanguageName       es                                             es                       

Comparing "llegar" and "lugar"
   With myCIintl.CompareInfo.Compare: -1
   With myCItrad.CompareInfo.Compare: 1

*/

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 1.1
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1

Любые открытые статические элементы ( Предоставлен общий доступ в Visual Basic) этого типа являются потокобезопасными. Потокобезопасность элементов экземпляров не гарантируется.

Вернуться в начало
Показ: