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 ,, и, относящимся к определенному языку и региональным параметрам NumberFormatInfo CompareInfo TextInfo . Эти объекты содержат сведения, необходимые для операций, связанных с культурой, таких как регистр, форматирование дат и чисел, а также сравнение строк. CultureInfoКласс используется либо напрямую, либо косвенно в классах, которые отформатируют, анализируют или управляют данными, связанными с языком и региональными параметрами, такими как String ,, DateTime DateTimeOffset и числовые типы.

Содержание

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

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

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

Примечание

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

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

Некоторые имена языков и региональных параметров также указывают скрипт ISO 15924. Например, Цирл задает кириллицу script, а ЛАТН — Латинский скрипт. Имя языка и региональных параметров, включающее сценарий, использует шаблон languagecode2 - scripttag - country/regioncode2 . Примером такого типа имени языка и региональных параметров является uz-Cyrl-UZ узбекский (кириллица, Узбекистан). в операционных системах Windows, предшествующих Windows Vista, имя языка и региональных параметров, включающее сценарий, использует шаблон languagecode2 - country/regioncode2 - scripttag , например uz-UZ-Cyrl для узбекский (кириллица, узбекистан).

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

Примечание

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

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

В этом и других классах пространства имен используются определенные стандартные имена и идентификаторы языка и региональных параметров System.Globalization . подробные сведения о культуре для Windows systems см. в столбце тег языка в списке имен языков и регионов, поддерживаемых Windows. Теги языков указаны в соответствии со стандартом BCP 47.

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

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

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

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

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

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

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

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

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

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

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

Если параметр DateTimeFormatInfo.Calendar имеет значение TaiwanCalendar , но Thread.CurrentCulture не имеет значение zh-TW , то DateTimeFormatInfo.NativeCalendarName , DateTimeFormatInfo.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-Ханс-CN", а "zh-TW" — псевдоним для языка и региональных параметров "zh-Hant-TW". языки и региональные параметры не возвращаются вызовами GetCultures метода и могут иметь разные значения свойств, в том числе разные Parent языки и региональные параметры, а не их Windows аналоги. Для zh-CN языков и zh-TW региональных параметров и эти дифференес включают следующее:

  • в Windows systems родительским языком и региональными параметрами "zh-CN" является "zh-ханс", а родительский язык и региональные параметры языка "zh-TW" — "zh-Hant". Родительский язык и региональные параметры обоих языков — zh. В системах UNIX родительскими для обоих языков являются "zh". это означает, что если вы не предложии ресурсы для языка и региональных параметров "zh-CN" или "zh-TW", но предоставляете ресурсы для нейтрального языка и региональных параметров "zh-ханс" или "zh-Hant", приложение загрузит ресурсы для нейтрального языка и региональных параметров в Windows, но не в Unix. В системах UNIX необходимо явно задать для потока значение CurrentUICulture "zh-Ханс" или "zh-Hant".

  • в Windows systems вызов CultureInfo.Equals в экземпляре, который представляет язык и региональные параметры "zh-cn" и передает его экземпляр "zh-ханс-CN", возвращает true . В системах UNIX вызов метода возвращает false . Это поведение также применяется для вызова Equals в экземпляре «zh-TW» CultureInfo и передачи ему экземпляра «zh-Hant-TW».

Динамические данные о культуре

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

Внимание!

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

Текущий и текущий язык и региональные параметры пользовательского интерфейса

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

Примечание

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

Дополнительные сведения о текущем языке и региональных параметрах см 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
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Объект, представляющий текущий язык и региональные параметры пользовательского интерфейса, можно получить одним из двух способов:

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

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

Задать текущий и текущий язык и региональные параметры пользовательского интерфейса

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

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

  2. назначьте CultureInfo объект CultureInfo.CurrentCulture CultureInfo.CurrentUICulture свойству или в .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 до 1 000 в формате денежного значения. Выполняется первая задача, которая просто создает 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 значение свойства равно CultureTypes.InstalledWin32Cultures , а если этот язык и региональные параметры впервые появились в определенной версии операционной системы Windows, ее невозможно десериализовать в более ранней версии Windows. например, если язык и региональные параметры были введены в Windows 10, то ее нельзя десериализовать в Windows 8.

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

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

Переопределения панели управления

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

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

Альтернативные порядки сортировки

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

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

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

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

Название языка и региональных параметров culture Имя и идентификатор сортировки по умолчанию Альтернативное имя и идентификатор сортировки
es-ES испанский (Испания) Международная связь: 0x00000C0A Традиционный: 0x0000040A
zh-TW Китайский (Тайвань) Число штрихов: 0x00000404 Бопомофо: 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 Корейский Ксвансунг-Unicode: 0x00010412
de-DE Немецкий (Германия) Словарь: 0x00000407 Телефон сортировка книги DIN: 0x00010407
hu-HU Венгерский (Венгрия) По умолчанию: 0x0000040e Техническая сортировка: 0x0001040e
ka-GE Грузинский (Грузия) Традиционный: 0x00000437 Современная сортировка: 0x00010437

Текущие язык и региональные параметры и приложения UWP

в приложениях универсальная платформа Windows (UWP) CurrentCulture CurrentUICulture свойства и доступны для чтения и записи так же, как и в платформа .NET Framework и в приложениях .net Core. Однако приложения UWP распознают один язык и региональные параметры. CurrentCultureСвойства и CurrentUICulture сопоставляются с первым значением в Windows. Коллекция ApplicationModel. Resources. Core. ResourceManager. Дефаултконтекст. Languages .

в платформа .NET Framework и приложениях .net Core текущий язык и региональные параметры — это параметр для каждого потока, а CurrentCulture CurrentUICulture свойства и соответствуют культуре и языку и региональным параметрам пользовательского интерфейса текущего потока. В приложениях UWP текущий язык и региональные параметры сопоставлены с Windows. Коллекция ApplicationModel. Resources. Core. ResourceManager. Дефаултконтекст. 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.

Применяется к

См. также раздел