CultureInfo Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет сведения об определенном языке и региональных параметрах (которые в совокупности называются языковым стандартом для разработки неуправляемого кода). Эти сведения включают имена языков и региональных параметров, систему письма, используемый календарь, порядок сортировки строк и форматы дат и чисел.
public ref class CultureInfo : IFormatProvider
public ref class CultureInfo : ICloneable, IFormatProvider
public class CultureInfo : IFormatProvider
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class CultureInfo : ICloneable, IFormatProvider
type CultureInfo = class
interface IFormatProvider
type CultureInfo = class
interface ICloneable
interface IFormatProvider
[<System.Serializable>]
type CultureInfo = class
interface ICloneable
interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CultureInfo = class
interface ICloneable
interface IFormatProvider
Public Class CultureInfo
Implements IFormatProvider
Public Class CultureInfo
Implements ICloneable, IFormatProvider
- Наследование
-
CultureInfo
- Атрибуты
- Реализации
Примеры
В следующем примере показано, как создать CultureInfo объект для испанского языка (Испания) с международной сортировкой и другим CultureInfo объектом с традиционной сортировкой.
using namespace System;
using namespace System::Collections;
using namespace System::Globalization;
int main()
{
// Creates and initializes the CultureInfo which uses the international sort.
CultureInfo^ myCIintl = gcnew CultureInfo( "es-ES",false );
// Creates and initializes the CultureInfo which uses the traditional sort.
CultureInfo^ myCItrad = gcnew 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
*/
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
*/
Imports System.Collections
Imports System.Globalization
Module Module1
Public Sub Main()
' Creates and initializes the CultureInfo which uses the international sort.
Dim myCIintl As New CultureInfo("es-ES", False)
' Creates and initializes the CultureInfo which uses the traditional sort.
Dim myCItrad As New CultureInfo(&H40A, 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"))
End Sub
'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
End Module
Комментарии
Класс CultureInfo предоставляет сведения, относящиеся к языку и региональным параметрам, такие как язык, подлангуаж, страна или регион, календарь и соглашения, связанные с определенным языком и региональными параметрами. Этот класс также предоставляет доступ к экземплярам, зависящим от языка и региональных параметровDateTimeFormatInfo, NumberFormatInfoCompareInfoи TextInfo к объектам. Эти объекты содержат сведения, необходимые для операций, зависящих от языка и региональных параметров, таких как регистр, форматирование дат и чисел, а также сравнение строк. Класс CultureInfo используется напрямую или косвенно классами, которые форматируют, анализируют или управляют данными, зависящими от языка и региональных параметров, такими как String, DateTimeDateTimeOffsetи числовыми типами.
Содержание
Имена и идентификаторы языка и региональных параметров
Инвариантные, нейтральные и конкретные языки и региональные параметры
Пользовательские языки и региональные параметры
Динамические данные языка и региональных параметров
CultureInfo и культурные данные
Текущий язык и региональные параметры и текущие язык и региональные параметры пользовательского интерфейса
Получение всех языков и региональных параметров
Язык и региональные параметры и потоки
Язык и региональные параметры и домены приложений
Асинхронные операции на основе языка и региональных параметров и задач
Сериализация объектов CultureInfo
переопределения панель управления
Альтернативные заказы сортировки
Приложения и региональные параметры и Windows\
Имена и идентификаторы языка и региональных параметров
Класс CultureInfo задает уникальное имя для каждого языка и региональных параметров на основе RFC 4646. Имя представляет собой сочетание двухбуквенный код языка и региональных параметров ISO 639, связанный с языком, и двухбуквенный код подкультуры ISO 3166, связанный с страной или регионом. Кроме того, для приложений, предназначенных для платформа .NET Framework 4 или более поздней версии и работающих в Windows 10 или более поздних версиях, поддерживаются имена языков и региональных параметров, соответствующие допустимым тегам языка BCP-47.
Примечание
Если имя языка и региональных параметров передается конструктору класса или методу, CreateSpecificCulture например или CultureInfo, его регистр не имеет значения.
Формат имени языка и региональных параметров на основе RFC 4646 — languagecode2
**languagecode2
-country/regioncode2
это двухбуквенный код языка и country/regioncode2
двухбуквенный код субкультуры. Примеры: ja-JP
японский (Япония) и en-US
английский (США). В случаях, когда двухбуквенный код языка недоступен, используется трехбуквенный код на основе ISO 639-2.
Некоторые имена языков и региональных параметров также указывают скрипт ISO 15924. Например, Cyrl указывает кириллический скрипт, а латн — латинский. Имя языка и региональных параметров, включающее скрипт, использует шаблон languagecode2
**country/regioncode2
-scripttag
-. Примером такого названия культуры является uz-Cyrl-UZ
узбекистанский (кириллица, Узбекистан). На Windows операционных системах до Windows Vista имя языка и региональных параметров, включающее сценарий, использует шаблон languagecode2
-scripttag
-country/regioncode2
, например для узбекистана (кириллица, Узбекистан). uz-UZ-Cyrl
Нейтральный язык и региональные параметры задаются только двухбуквенный код языка в нижнем регистре. Например, fr
задает нейтральный язык и региональные параметры для французского языка и de
задает нейтральный язык и региональные параметры для немецкого языка.
Примечание
Существует два имени языка и региональных параметров, которые противоречат этому правилу. Языки и региональные параметры китайского языка (упрощенное письмо), именованные zh-Hans``zh-Hant
и китайский (традиционное письмо), являются нейтральными языками и региональными параметрами. Имена языка и региональных параметров представляют текущий стандарт и должны использоваться, если у вас нет причины использования старых имен zh-CHS
и zh-CHT
.
Идентификатор языка и региональных параметров — это стандартное международное числовое сокращение и содержит компоненты, необходимые для уникальной идентификации одного из установленных языков и региональных параметров. Приложение может использовать предопределенные идентификаторы языка и региональных параметров или определять пользовательские идентификаторы.
Некоторые предопределенные имена и идентификаторы языка и региональных параметров используются этим и другими классами в System.Globalization пространстве имен. Подробные сведения о языке и региональных параметрах для систем Windows см. в столбце тегов language в списке имен языков и регионов, поддерживаемых Windows. Теги языков указаны в соответствии со стандартом BCP 47.
Имена и идентификаторы языка и региональных параметров представляют только подмножество языков и региональных параметров, которые можно найти на определенном компьютере. Windows версии или пакеты обновления могут изменять доступные язык и региональные параметры. Приложения могут добавлять пользовательские язык и региональные параметры с помощью CultureAndRegionInfoBuilder класса. Пользователи могут добавлять собственные пользовательские языки и региональные параметры с помощью средства Microsoft Locale Builder . Microsoft Locale Builder написан в управляемом коде CultureAndRegionInfoBuilder
с помощью класса.
Несколько уникальных имен тесно связаны с языком и региональными параметрами, в частности именами, связанными со следующими членами класса:
Инвариантные, нейтральные и конкретные языки и региональные параметры
Языки и региональные параметры обычно группируются в три набора: инвариантные языки и региональные параметры, нейтральные языки и региональные параметры.
Инвариантный язык и региональные параметры не учитываются. Приложение определяет инвариантный язык и региональные параметры по имени с помощью пустой строки ("") или по его идентификатору. InvariantCulture определяет экземпляр инвариантного языка и региональных параметров. Он связан с английским языком, но не с какой-либо страной или регионом. Он используется практически в любом методе Globalization
в пространстве имен, требующего языка и региональных параметров.
Нейтральный язык и региональные параметры — это язык, связанный с языком, но не с страной или регионом. Определенный язык и региональные параметры — это язык и региональные параметры, связанные с языком и страной или регионом. Например, fr
это нейтральное имя для французского языка и региональных параметров и fr-FR
имя конкретного французского языка (Франция). Обратите внимание, что китайский (упрощенное письмо) и китайский (традиционное письмо) также считаются нейтральными языками и региональными параметрами.
Создание экземпляра класса для нейтрального CompareInfo языка и региональных параметров не рекомендуется, так как содержащиеся в нем данные являются произвольными. Чтобы отобразить и отсортировать данные, укажите язык и регион. Кроме того, свойство объекта, созданного для нейтрального CompareInfo языка и региональных параметров, Name возвращает только страну и не включает регион.
Определенные языки и региональные параметры имеют иерархию, в которой родительский элемент конкретного языка и региональных параметров является нейтральным языком и региональными параметрами, а родительский элемент нейтрального языка и региональных параметров является инвариантным языком и региональными параметрами. Свойство Parent содержит нейтральный язык и региональные параметры, связанные с конкретным языком и региональными параметрами. Пользовательские региональные параметры должны определять Parent свойство в соответствии с этим шаблоном.
Если ресурсы для определенного языка и региональных параметров недоступны в операционной системе, используются ресурсы для связанного нейтрального языка и региональных параметров. Если ресурсы для нейтрального языка и региональных параметров недоступны, используются ресурсы, внедренные в основную сборку. Дополнительные сведения о резервном процессе ресурсов см. в разделе "Упаковка и развертывание ресурсов".
Список языковых стандартов в API Windows немного отличается от списка языков и региональных параметров, поддерживаемых .NET. Если требуется взаимодействие с Windows, например с помощью механизма p/invoke, приложение должно использовать определенный язык и региональные параметры, определенные для операционной системы. Использование конкретного языка и региональных параметров обеспечивает согласованность с эквивалентным языковым стандартом Windows, который идентифицируется с идентификатором языкового стандарта, который LCIDсовпадает с языком.
A или a DateTimeFormatInfo NumberFormatInfo можно создать только для инвариантного языка и региональных параметров или для конкретных языков и региональных параметров, а не для нейтральных языков и региональных параметров.
Если DateTimeFormatInfo.Calendar значение Thread.CurrentCulture TaiwanCalendar не заданоzh-TW
, то DateTimeFormatInfo.NativeCalendarNameDateTimeFormatInfo.GetEraNameи DateTimeFormatInfo.GetAbbreviatedEraName возвращает пустую строку ("").
Пользовательские языки и региональные параметры
На Windows можно создавать пользовательские языковые параметры. Дополнительные сведения см. в разделе "Настраиваемые языковые параметры".
CultureInfo и культурные данные
.NET получает свои культурные данные из одного из различных источников в зависимости от реализации, платформы и версии:
В платформа .NET Framework версии 3.5 и более ранних версий культурные данные предоставляются операционной системой Windows и платформа .NET Framework.
В платформа .NET Framework 4 и более поздних версиях культурные данные предоставляются операционной системой Windows.
Во всех версиях .NET Core, работающих на Windows, культурные данные предоставляются операционной системой Windows.
Во всех версиях .NET Core, работающих на платформах Unix, культурные данные предоставляются библиотекой международных компонентов для Юникода (ICU). Конкретная версия библиотеки ICU зависит от отдельной операционной системы.
Из-за этого язык и региональные параметры, доступные в определенной реализации, платформе или версии .NET, могут быть недоступны в другой реализации, платформе или версии .NET.
Некоторые CultureInfo
объекты различаются в зависимости от базовой платформы. В частности, zh-CN
или китайский (упрощенное письмо, Китай) и zh-TW
китайский (традиционное письмо, Тайвань) доступны культуры в системах Windows, но они являются псевдонимами культур в системах Unix. "zh-CN" — это псевдоним для культуры "zh-Hans-CN", а "zh-TW" — псевдоним для культуры "zh-Hant-TW". Псевдонимные языки и региональные параметры не возвращаются вызовами GetCultures метода и могут иметь разные значения свойств, включая разные Parent языки и региональные параметры, чем их Windows аналоги. zh-CN
Для языков и zh-TW
региональных параметров эти различия включают в себя следующее:
На Windows системах родительская культура культуры «zh-CN» — «zh-Hans», а родительская культура «zh-TW» — «zh-Hant». Родительская культура обоих этих культур — "zh". В системах Unix родители обоих языков и региональных параметров являются "zh". Это означает, что если вы не предоставляете ресурсы для языка и региональных параметров "zh-CN" или "zh-TW", но предоставляете ресурсы для нейтрального языка и региональных параметров "zh-Hans" или "zh-Hant", ваше приложение загрузит ресурсы для нейтрального языка и региональных параметров в Windows но не в Unix. В системах Unix необходимо явно задать для потока CurrentUICulture значение "zh-Hans" или "zh-Hant".
В системах Windows вызов CultureInfo.Equals экземпляра, представляющего язык и региональные параметры "zh-CN", и передавая его экземпляр "zh-Hans-CN", возвращается
true
. В системах Unix вызов метода возвращаетсяfalse
. Это поведение также применяется к вызову Equals экземпляра "zh-TW" CultureInfo и передаче его экземпляру "zh-Hant-Tw".
Динамические данные языка и региональных параметров
За исключением инвариантного языка и региональных параметров, данные языка и региональных параметров являются динамическими. Это верно даже для предопределенных языков и региональных параметров. Например, страны или регионы принимают новые валюты, изменяют орфографию слов или изменяют предпочитаемый календарь, а определения языка и региональных параметров изменяются для отслеживания этого. Пользовательские языки и региональные параметры могут изменяться без уведомления, и любые определенные региональные параметры могут быть переопределены пользовательскими параметрами и региональными параметрами замены. Кроме того, как описано ниже, отдельный пользователь может переопределить культурные предпочтения. Приложения всегда должны получать данные языка и региональных параметров во время выполнения.
Внимание!
При сохранении данных приложение должно использовать инвариантный язык и региональные параметры, двоичный формат или конкретный формат, зависящий от языка и региональных параметров. Данные, сохраненные в соответствии с текущими значениями, связанными с определенным языком и региональными параметрами, кроме инвариантного языка и региональных параметров, могут стать непрочитаемыми или могут измениться в случае изменения этого языка и региональных параметров.
Текущий язык и региональные параметры и региональные параметры пользовательского интерфейса
Каждый поток в приложении .NET имеет текущий язык и региональные параметры и региональные параметры пользовательского интерфейса. Текущий язык и региональные параметры определяют соглашения о форматировании дат, времени, чисел и денежных значений, порядок сортировки текста, соглашения регистра и способы сравнения строк. Текущий язык и региональные параметры пользовательского интерфейса используются для получения ресурсов, зависящих от языка и региональных параметров во время выполнения.
Примечание
Сведения о том, как определяется текущий и текущий язык и региональные параметры пользовательского интерфейса для каждого потока, см. в разделе " Язык и региональные параметры" и "Потоки ". Сведения о том, как определяется текущий и текущий язык и региональные параметры пользовательского интерфейса для потоков, выполняемых в новом домене приложения, а также в потоках, пересекающих границы домена приложения, см. в разделе " Язык и региональные параметры" и "Домены приложений ". Сведения о том, как определяется текущий и текущий потоки, выполняющие асинхронные операции на основе задач, см. в разделе " Язык и региональные параметры" и асинхронные операции на основе задач .
Дополнительные сведения о текущем языке и региональных параметрах см. в CultureInfo.CurrentCulture разделе свойств. Дополнительные сведения о текущем языке и региональных параметрах пользовательского интерфейса см. в CultureInfo.CurrentUICulture разделе свойств.
Получение текущих и текущих языков и региональных параметров пользовательского интерфейса
Вы можете получить CultureInfo объект, представляющий текущий язык и региональные параметры двумя способами:
Извлекая значение CultureInfo.CurrentCulture свойства.
Извлекая значение свойства Thread.CurrentThread.CurrentCulture .
В следующем примере извлекаются оба значения свойств, сравниваются, чтобы показать, что они равны, и отображается имя текущего языка и региональных параметров.
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
Imports System.Globalization
Imports System.Threading
Module Example
Public Sub Main()
Dim culture1 As CultureInfo = CultureInfo.CurrentCulture
Dim culture2 As CultureInfo = Thread.CurrentThread.CurrentCulture
Console.WriteLine("The current culture is {0}", culture1.Name)
Console.WriteLine("The two CultureInfo objects are equal: {0}",
culture1.Equals(culture2))
End Sub
End Module
' The example displays output like the following:
' The current culture is en-US
' The two CultureInfo objects are equal: True
Объект, представляющий текущий язык и региональные CultureInfo параметры пользовательского интерфейса, можно получить двумя способами:
Извлекая значение CultureInfo.CurrentUICulture свойства.
Извлекая значение свойства Thread.CurrentThread.CurrentUICulture .
В следующем примере извлекаются оба значения свойств, сравниваются, чтобы показать, что они равны, и отображается имя текущего языка и региональных параметров пользовательского интерфейса.
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
Imports System.Globalization
Imports System.Threading
Module Example
Public Sub Main()
Dim uiCulture1 As CultureInfo = CultureInfo.CurrentUICulture
Dim uiCulture2 As CultureInfo = Thread.CurrentThread.CurrentUICulture
Console.WriteLine("The current UI culture is {0}", uiCulture1.Name)
Console.WriteLine("The two CultureInfo objects are equal: {0}",
uiCulture1.Equals(uiCulture2))
End Sub
End Module
' The example displays output like the following:
' The current UI culture is en-US
' The two CultureInfo objects are equal: True
Настройка текущих и текущих региональных параметров пользовательского интерфейса
Чтобы изменить язык и региональные параметры и региональные параметры пользовательского интерфейса потока, выполните следующие действия.
Создайте CultureInfo экземпляр объекта, представляющего этот язык и региональные параметры, вызвав CultureInfo конструктор класса и передав его имя языка и региональных параметров. Конструктор CultureInfo(String) создает экземпляр CultureInfo объекта, который отражает переопределения пользователей, если новый язык и региональные параметры совпадают с текущим языком и региональными параметрами Windows. Конструктор CultureInfo(String, Boolean) позволяет указать, отражает ли новый экземпляр CultureInfo объекта переопределения пользователей, если новый язык и региональные параметры совпадают с текущим языком и региональными параметрами Windows.
CultureInfo Назначьте объекту или CultureInfo.CurrentUICulture свойству CultureInfo.CurrentCulture .NET Core и платформа .NET Framework версии 4.6 и более поздних версий. (В платформа .NET Framework версии 4.5.2 и более ранних версий можно назначить
CultureInfo
объект объекту Thread.CurrentCulture или Thread.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
Imports System.Globalization
Module Example
Public Sub Main()
Dim current As CultureInfo = CultureInfo.CurrentCulture
Console.WriteLine("The current culture is {0}", current.Name)
Dim newCulture As CultureInfo
If current.Name.Equals("fr-FR") Then
newCulture = New CultureInfo("fr-LU")
Else
newCulture = new CultureInfo("fr-FR")
End If
CultureInfo.CurrentCulture = newCulture
Console.WriteLine("The current culture is now {0}",
CultureInfo.CurrentCulture.Name)
End Sub
End Module
' 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
Imports System.Globalization
Module Example
Public Sub Main()
Dim current As CultureInfo = CultureInfo.CurrentUICulture
Console.WriteLine("The current UI culture is {0}", current.Name)
Dim newUICulture As CultureInfo
If current.Name.Equals("sl-SI") Then
newUICulture = New CultureInfo("hr-HR")
Else
newUICulture = new CultureInfo("sl-SI")
End If
CultureInfo.CurrentUICulture = newUICulture
Console.WriteLine("The current UI culture is now {0}",
CultureInfo.CurrentUICulture.Name)
End Sub
End Module
' The example displays output like the following:
' The current UI culture is en-US
' The current UI culture is now sl-SI
Получение всех языков и региональных параметров
Вы можете получить массив определенных категорий языков и региональных параметров или всех языков и региональных параметров, доступных на локальном компьютере, вызвав GetCultures метод. Например, можно получить пользовательские язык и региональные параметры, определенные региональные параметры или нейтральные региональные параметры либо отдельно, либо в сочетании.
В следующем примере метод вызывается GetCultures дважды, сначала с элементом System.Globalization.CultureTypes перечисления для получения всех пользовательских языков и региональных параметров, а затем с элементом System.Globalization.CultureTypes перечисления для получения всех языков и региональных параметров замены.
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.
Imports System.Globalization
Module Example
Public Sub Main()
' Get all custom cultures.
Dim custom() As CultureInfo = CultureInfo.GetCultures(CultureTypes.UserCustomCulture)
If custom.Length = 0 Then
Console.WriteLine("There are no user-defined custom cultures.")
Else
Console.WriteLine("Custom cultures:")
For Each culture In custom
Console.WriteLine(" {0} -- {1}", culture.Name, culture.DisplayName)
Next
End If
Console.WriteLine()
' Get all replacement cultures.
Dim replacements() As CultureInfo = CultureInfo.GetCultures(CultureTypes.ReplacementCultures)
If replacements.Length = 0 Then
Console.WriteLine("There are no replacement cultures.")
Else
Console.WriteLine("Replacement cultures:")
For Each culture in replacements
Console.WriteLine(" {0} -- {1}", culture.Name, culture.DisplayName)
Next
End If
Console.WriteLine()
End Sub
End Module
' 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
Imports System.Globalization
Imports System.Threading
Module Example
Dim rnd As New Random()
Public Sub Main()
If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
' 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")
End If
ThreadProc()
Dim worker As New Thread(AddressOf ThreadProc)
worker.Name = "WorkerThread"
worker.Start()
End Sub
Private Sub DisplayThreadInfo()
Console.WriteLine()
Console.WriteLine("Current Thread Name: '{0}'",
Thread.CurrentThread.Name)
Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentUICulture.Name)
End Sub
Private Sub DisplayValues()
' Create new thread and display three random numbers.
Console.WriteLine("Some currency values:")
For ctr As Integer = 0 To 3
Console.WriteLine(" {0:C2}", rnd.NextDouble() * 10)
Next
End Sub
Private Sub ThreadProc()
DisplayThreadInfo()
DisplayValues()
End Sub
End Module
' 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 €
Imports System.Globalization
Imports System.Threading
Module Example
Dim rnd As New Random()
Public Sub Main()
If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
' 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")
End If
DisplayThreadInfo()
DisplayValues()
Dim worker As New Thread(AddressOf ThreadProc)
worker.Name = "WorkerThread"
worker.Start(Thread.CurrentThread.CurrentCulture)
End Sub
Private Sub DisplayThreadInfo()
Console.WriteLine()
Console.WriteLine("Current Thread Name: '{0}'",
Thread.CurrentThread.Name)
Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentUICulture.Name)
End Sub
Private Sub DisplayValues()
' Create new thread and display three random numbers.
Console.WriteLine("Some currency values:")
For ctr As Integer = 0 To 3
Console.WriteLine(" {0:C2}", rnd.NextDouble() * 10)
Next
End Sub
Private Sub ThreadProc(obj As Object)
Thread.CurrentThread.CurrentCulture = CType(obj, CultureInfo)
Thread.CurrentThread.CurrentUICulture = CType(obj, CultureInfo)
DisplayThreadInfo()
DisplayValues()
End Sub
End Module
' 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 €
Imports System.Globalization
Imports System.Threading
Module Example
Dim rnd As New Random()
Public Sub Main()
If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
' 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")
End If
ThreadProc()
Dim worker As New Thread(AddressOf ThreadProc)
worker.Name = "WorkerThread"
worker.Start()
End Sub
Private Sub DisplayThreadInfo()
Console.WriteLine()
Console.WriteLine("Current Thread Name: '{0}'",
Thread.CurrentThread.Name)
Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentUICulture.Name)
End Sub
Private Sub DisplayValues()
' Create new thread and display three random numbers.
Console.WriteLine("Some currency values:")
For ctr As Integer = 0 To 3
Console.WriteLine(" {0:C2}", rnd.NextDouble() * 10)
Next
End Sub
Private Sub ThreadProc()
DisplayThreadInfo()
DisplayValues()
End Sub
End Module
' 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 €
Предупреждение
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
Imports System.Globalization
Imports System.Reflection
Imports System.Threading
Module Example
Public Sub Main()
' Set the default culture and display the current date in the current application domain.
Dim info1 As New Info()
SetAppDomainCultures("fr-FR")
' Create a second application domain.
Dim setup As New AppDomainSetup()
setup.AppDomainInitializer = AddressOf SetAppDomainCultures
setup.AppDomainInitializerArguments = { "ru-RU" }
Dim domain As AppDomain = AppDomain.CreateDomain("Domain2", Nothing, setup)
' Create an Info object in the new application domain.
Dim info2 As Info = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
"Info"), Info)
' Execute methods in the two application domains.
info2.DisplayDate()
info2.DisplayCultures()
info1.DisplayDate()
info1.DisplayCultures()
End Sub
Public Sub SetAppDomainCultures(names() As String)
SetAppDomainCultures(names(0))
End Sub
Public Sub SetAppDomainCultures(name As String)
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 e As CultureNotFoundException
Return
Catch e As ArgumentException
Return
End Try
End Sub
End Module
Public Class Info : Inherits MarshalByRefObject
Public Sub DisplayDate()
Console.WriteLine("Today is {0:D}", Date.Now)
End Sub
Public Sub 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)
End Sub
End Class
' 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks
<Assembly:TargetFramework(".NETFramework,Version=v4.6")>
Module Example
Public Sub Main()
Dim values() As Decimal = { 163025412.32d, 18905365.59d }
Dim formatString As String = "C2"
Dim formatDelegate As Func(Of String) = Function()
Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
CultureInfo.CurrentCulture.Name,
Thread.CurrentThread.ManagedThreadId)
output += Environment.NewLine
For Each value In values
output += String.Format("{0} ", value.ToString(formatString))
Next
output += Environment.NewLine
Return output
End Function
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" Then
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
Else
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
End If
Console.WriteLine("Changed the current culture to {0}.",
CultureInfo.CurrentCulture.Name)
Console.WriteLine()
' 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:")
Dim t1 = Task.Run(formatDelegate)
Console.WriteLine(t1.Result)
Console.WriteLine("Executing a task synchronously:")
Dim t2 = New Task(Of String)(formatDelegate)
t2.RunSynchronously()
Console.WriteLine(t2.Result)
End Sub
End Module
' 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 Imports the fr-FR culture on thread 1.
' 163 025 412,32 € 18 905 365,59 €
'
' Executing a task asynchronously:
' Formatting Imports the fr-FR culture on thread 3.
' 163 025 412,32 € 18 905 365,59 €
'
' Executing a task synchronously:
' Formatting Imports 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim values() As Decimal = { 163025412.32d, 18905365.59d }
Dim formatString As String = "C2"
Dim formatDelegate As Func(Of String) = Function()
Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
CultureInfo.CurrentCulture.Name,
Thread.CurrentThread.ManagedThreadId)
output += Environment.NewLine
For Each value In values
output += String.Format("{0} ", value.ToString(formatString))
Next
output += Environment.NewLine
Return output
End Function
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" Then
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
Else
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
End If
Console.WriteLine("Changed the current culture to {0}.",
CultureInfo.CurrentCulture.Name)
Console.WriteLine()
' 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:")
Dim t1 = Task.Run(formatDelegate)
Console.WriteLine(t1.Result)
Console.WriteLine("Executing a task synchronously:")
Dim t2 = New Task(Of String)(formatDelegate)
t2.RunSynchronously()
Console.WriteLine(t2.Result)
End Sub
End Module
' 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim values() As Decimal = { 163025412.32d, 18905365.59d }
Dim formatString As String = "C2"
Dim formatDelegate As Func(Of String) = Function()
Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
CultureInfo.CurrentCulture.Name,
Thread.CurrentThread.ManagedThreadId)
output += Environment.NewLine
For Each value In values
output += String.Format("{0} ", value.ToString(formatString))
Next
output += Environment.NewLine
Return output
End Function
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" Then
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
Else
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
End If
Console.WriteLine("Changed the current culture to {0}.",
CultureInfo.CurrentCulture.Name)
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture
Console.WriteLine()
' 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:")
Dim t1 = Task.Run(formatDelegate)
Console.WriteLine(t1.Result)
Console.WriteLine("Executing a task synchronously:")
Dim t2 = New Task(Of String)(formatDelegate)
t2.RunSynchronously()
Console.WriteLine(t2.Result)
End Sub
End Module
' 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks
<Assembly:TargetFramework(".NETFramework,Version=v4.6")>
Module Example
Public Sub Main()
Dim formatString As String = "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" Then
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
Else
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
End If
Console.WriteLine("Changed the current culture to {0}.",
CultureInfo.CurrentCulture.Name)
Console.WriteLine()
' Call an async delegate to format the values using one format string.
Console.WriteLine("Executing a task asynchronously in the main appdomain:")
Dim t1 = Task.Run(Function()
Dim d As New DataRetriever()
Return d.GetFormattedNumber(formatString)
End Function)
Console.WriteLine(t1.Result)
Console.WriteLine()
Console.WriteLine("Executing a task synchronously in two appdomains:")
Dim t2 = Task.Run(Function()
Console.WriteLine("Thread {0} is running in app domain '{1}'",
Thread.CurrentThread.ManagedThreadId,
AppDomain.CurrentDomain.FriendlyName)
Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
Dim d As DataRetriever = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
"DataRetriever"), DataRetriever)
Return d.GetFormattedNumber(formatString)
End Function)
Console.WriteLine(t2.Result)
End Sub
End Module
Public Class DataRetriever : Inherits MarshalByRefObject
Public Function GetFormattedNumber(format As String) As String
Dim thread As 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)
Dim rnd As New Random()
Dim value As Double = rnd.NextDouble() * 1000
Return value.ToString(format)
End Function
End Class
' 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
CultureInfo При сериализации объекта все, что фактически хранится, и Name UseUserOverride. Он успешно десериализирован только в среде, где это Name имеет то же значение. В следующих трех примерах показано, почему это не всегда так:
Если значение свойства равноCultureTypes.InstalledWin32Cultures, а если этот CultureTypes язык и региональные параметры были впервые введены в определенной версии операционной системы Windows, ее невозможно десериализировать в более ранней версии Windows. Например, если язык и региональные параметры были введены в Windows 10, его нельзя десериализовать в Windows 8.
CultureTypes Если значение равноCultureTypes.UserCustomCulture, а компьютер, на котором он десериализуется, не установлен этот пользовательский язык и региональные параметры, его невозможно десериализировать.
CultureTypes Если значение равноCultureTypes.ReplacementCultures, а компьютер, на котором он десериализирован, не имеет этого языка и региональных параметров замены, он десериализует в то же имя, но не все одинаковые характеристики. Например, если
en-US
это язык и региональные параметры замены на компьютере А, но не на компьютере B, а CultureInfo если объект, ссылающийся на этот язык и региональные параметры, сериализуется на компьютере А и десериализуется на компьютере Б, то никакие пользовательские характеристики языка и региональных параметров не передаются. Язык и региональные параметры успешно десериализуются, но с другим смыслом.
панель управления переопределения
Пользователь может переопределить некоторые значения, связанные с текущим языком и региональными параметрами Windows, с помощью части региональных и языковых параметров панель управления. Например, пользователь может выбрать отображение даты в другом формате или использовать валюту, отличную от используемой по умолчанию для языка и региональных параметров. Как правило, приложения должны учитывать эти переопределения пользователей.
Если UseUserOverride параметр is true
и указанный язык и региональные параметры соответствуют текущему языку и региональным параметрам Windows, CultureInfo использует эти переопределения, включая пользовательские параметры для свойств DateTimeFormatInfo экземпляра, возвращаемого свойствомDateTimeFormat, и свойства NumberFormatInfo экземпляра, возвращаемого свойствомNumberFormat. Если параметры пользователя несовместимы с языком и региональными параметрами, связанными с CultureInfoвыбранным календарем, например, если выбранный календарь не является одним из OptionalCalendarsних, результаты методов и значения свойств не определены.
Альтернативные заказы сортировки
Некоторые язык и региональные параметры поддерживают несколько порядка сортировки. Пример:
Язык и региональные параметры испанского языка (Испания) имеют два порядка сортировки: международный порядок сортировки по умолчанию и традиционный порядок сортировки. При создании экземпляра CultureInfo объекта с
es-ES
именем языка и региональных параметров используется международный порядок сортировки. При создании экземпляра CultureInfo объекта сes-ES-tradnl
именем языка и региональных параметров используется традиционный порядок сортировки.Язык и региональные
zh-CN
параметры (китайский (упрощенное письмо, PRC)) поддерживают два порядка сортировки: по произношению (по умолчанию) и по количеству росчерков. При создании экземпляра CultureInfo объекта сzh-CN
именем языка и региональных параметров используется порядок сортировки по умолчанию. При создании экземпляра CultureInfo объекта с локальным идентификатором 0x00020804 строки сортируются по количеству росчерков.
В следующей таблице перечислены языкы и региональные параметры, поддерживающие альтернативные заказы сортировки и идентификаторы по умолчанию и альтернативные заказы сортировки.
Название языка и региональных параметров | culture | Имя и идентификатор сортировки по умолчанию | Альтернативное имя и идентификатор сортировки |
---|---|---|---|
es-ES | испанский (Испания) | Международный: 0x00000C0A | Традиционное: 0x0000040A |
zh-TW | Китайский (Тайвань) | Число росчерков: 0x00000404 | Bopomofo: 0x00030404 |
zh-CN | Китайский (КНР) | Произношение: 0x00000804 | Число росчерков: 0x00020804 |
zh-HK | китайский (Гонконг, CАР) | Число росчерков: 0x00000c04 | Число росчерков: 0x00020c04 |
zh-SG | Chinese (Singapore) | Произношение: 0x00001004 | Число росчерков: 0x00021004 |
zh-MO | Chinese (Macao SAR) | Произношение: 0x00001404 | Число росчерков: 0x00021404 |
ja-JP | Японский (Япония) | Значение по умолчанию: 0x00000411 | Юникод: 0x00010411 |
ko-KR | корейский (Корея) | По умолчанию: 0x00000412 | Корейский Xwansung - Юникод: 0x00010412 |
de-DE | Немецкий (Германия) | Словарь: 0x00000407 | Телефон Book Sort DIN: 0x00010407 |
hu-HU | Венгерский (Венгрия) | Значение по умолчанию: 0x0000040e | Техническая сортировка: 0x0001040e |
ka-GE | Грузинский (Грузия) | Традиционное: 0x00000437 | Современная сортировка: 0x00010437 |
Текущие региональные параметры и приложения UWP
В приложениях CurrentCulture универсальная платформа Windows (UWP) свойства и CurrentUICulture свойства доступны для чтения и записи, как и в приложениях платформа .NET Framework и .NET Core. Однако приложения UWP распознают один язык и региональные параметры. CurrentUICulture Свойства CurrentCulture сопоставляют первое значение в Windows. Коллекция ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages.
В приложениях платформа .NET Framework и .NET Core текущий язык и региональные параметры — это параметр потока, а CurrentCulture CurrentUICulture свойства отражают язык и региональные параметры и региональные параметры текущего потока. В приложениях UWP текущий язык и региональные параметры сопоставляется с Windows. Коллекция ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages, которая является глобальным параметром. CurrentCulture Задание языка или CurrentUICulture свойства изменяет язык и региональные параметры всего приложения; язык и региональные параметры нельзя задать для каждого потока.
Конструкторы
CultureInfo(Int32) |
Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных идентификатором. |
CultureInfo(Int32, Boolean) |
Инициализирует новый экземпляр CultureInfo класса на основе языка и региональных параметров, заданных идентификатором языка и региональных параметров, а также значения, указывающего, следует ли использовать параметры языка и региональных параметров, выбранных пользователем, из Windows. |
CultureInfo(String) |
Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных именем. |
CultureInfo(String, Boolean) |
Инициализирует новый экземпляр CultureInfo класса на основе языка и региональных параметров, заданных по имени, и значения, указывающего, следует ли использовать параметры языка и региональных параметров, выбранных пользователем, из Windows. |
Свойства
Calendar |
Возвращает календарь, используемый по умолчанию для языка и региональных параметров. |
CompareInfo |
Возвращает объект CompareInfo, который определяет способ сравнения строк в данном языке и региональных параметрах. |
CultureTypes |
Возвращает типы языков и региональных параметров, относящихся к текущему объекту CultureInfo. |
CurrentCulture |
Возвращает или задает CultureInfo объект, представляющий язык и региональные параметры, используемые текущим потоком и асинхронными операциями на основе задач. |
CurrentUICulture |
Возвращает или задает объект CultureInfo, представляющий текущий язык и региональные параметры пользовательского интерфейса, используемые диспетчером ресурсов для поиска ресурсов, связанных с конкретным языком и региональными параметрами, во время выполнения. |
DateTimeFormat |
Возвращает или задает DateTimeFormatInfo, определяющий формат отображения даты и времени, соответствующий языку и региональным параметрам. |
DefaultThreadCurrentCulture |
Возвращает или задает язык и региональные параметры, используемые по умолчанию для потоков в текущем домене приложения. |
DefaultThreadCurrentUICulture |
Возвращает или задает язык и региональные параметры пользовательского интерфейса, используемые по умолчанию для потоков в текущем домене приложения. |
DisplayName |
Возвращает полное локализованное имя языка и региональных параметров. |
EnglishName |
Возвращает имя языка и региональных параметров в формате languagefull [country/regionfull] на английском языке. |
IetfLanguageTag |
Не рекомендуется. Получает идентификацию языка по стандарту RFC 4646. |
InstalledUICulture |
Возвращает объект CultureInfo, представляющий язык и региональные параметры, установленные с операционной системой. |
InvariantCulture |
Возвращает объект CultureInfo, не зависящий от языка и региональных параметров (инвариантный). |
IsNeutralCulture |
Возвращает значение, показывающее, представляет ли текущий объект CultureInfo нейтральный язык и региональные параметры. |
IsReadOnly |
Возвращает значение, указывающее, является ли текущий объект CultureInfo доступным только для чтения. |
KeyboardLayoutId |
Получает активный идентификатор языка ввода. |
LCID |
Возвращает идентификатор языка и региональных параметров для текущего объекта CultureInfo. |
Name |
Возвращает имя языка и региональных параметров в формате languagecode2-country/regioncode2. |
NativeName |
Получает имя языка и региональных параметров, состоящих из языка, страны или региона и дополнительного набора символов, которые свойственны для этого языка. |
NumberFormat |
Возвращает или задает объект NumberFormatInfo, определяющий формат отображения чисел, денежной единицы и процентов, соответствующий языку и региональным параметрам. |
OptionalCalendars |
Возвращает список календарей, которые могут использоваться в данном языке и региональных параметров. |
Parent |
Возвращает объект CultureInfo, представляющий родительский язык и региональные параметры текущего объекта CultureInfo. |
TextInfo |
Возвращает значение TextInfo, определяющее систему письма, связанную с данным языком и региональными параметрами. |
ThreeLetterISOLanguageName |
Возвращает трехбуквенный код ISO 639-2 для языка текущего объекта CultureInfo. |
ThreeLetterWindowsLanguageName |
Возвращает трехбуквенный код для языка, определенный в формате Windows API. |
TwoLetterISOLanguageName |
Возвращает двухбуквенный код ISO 639-1 для языка текущего объекта CultureInfo. |
UseUserOverride |
Получает значение, которое указывает, использует ли текущий объект CultureInfo параметры языка и региональных параметров, выбранные пользователем. |
Методы
ClearCachedData() |
Обновляет кешированные данные, связанные с языком и региональными параметрами. |
Clone() |
Создает копию текущего поставщика CultureInfo. |
CreateSpecificCulture(String) |
Создает объект CultureInfo, который представляет определенный язык и региональные параметры, соответствующие заданному имени. |
Equals(Object) |
Определяет, является ли заданный объект тем же языком и региональными параметрами, что и текущий CultureInfo. |
GetConsoleFallbackUICulture() |
Получает язык и региональные стандарты интерфейса пользователя, подходящие для приложений консоли, если при этом неприменим язык и региональные стандарты графического пользовательского интерфейса по умолчанию. |
GetCultureInfo(Int32) |
Служит для получения кэшированного доступного только для чтения экземпляра языка и региональных параметров с помощью указанного идентификатора языка и региональных параметров. |
GetCultureInfo(String) |
Служит для получения кэшированного экземпляра языка и региональных параметров с помощью указанного имени. |
GetCultureInfo(String, Boolean) |
Служит для получения кешированного экземпляра языка и региональных параметров, доступного только для чтения. |
GetCultureInfo(String, String) |
Служит для получения кешированного экземпляра языка и региональных параметров, доступного только для чтения. В параметрах определяется язык и региональные параметры, которые инициализируются вместе с объектами TextInfo и CompareInfo. |
GetCultureInfoByIetfLanguageTag(String) |
Не рекомендуется. Служит для получения объекта CultureInfo, доступного только для чтения, который имеет языковые характеристики, указываемые определенным языковым тегом RFC 4646. |
GetCultures(CultureTypes) |
Возвращает список поддерживаемых языков и региональных параметров, отфильтрованный по заданным значениям параметра CultureTypes. |
GetFormat(Type) |
Возвращает объект, определяющий способ форматирования заданного типа. |
GetHashCode() |
Служит хэш-функцией текущего класса CultureInfo для использования в алгоритмах и структурах данных хеширования, например в хэш-таблице. |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ReadOnly(CultureInfo) |
Возвращает доступную только для чтения программу-оболочку для заданного объекта CultureInfo. |
ToString() |
Возвращает строку, содержащую имя текущего объекта CultureInfo в формате languagecode2-country/regioncode2. |