CultureInfo Класс

Определение

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

public ref class CultureInfo : IFormatProvider
public ref class CultureInfo : ICloneable, IFormatProvider
public class CultureInfo : IFormatProvider
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class CultureInfo : ICloneable, IFormatProvider
type CultureInfo = class
    interface IFormatProvider
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
Public Class CultureInfo
Implements IFormatProvider
Public Class CultureInfo
Implements ICloneable, IFormatProvider
Наследование
CultureInfo
Атрибуты
Реализации

Примеры

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

using namespace System;
using namespace System::Collections;
using namespace System::Globalization;
int main()
{
   
   // Creates and initializes the CultureInfo which uses the international sort.
   CultureInfo^ myCIintl = gcnew CultureInfo( "es-ES",false );
   
   // Creates and initializes the CultureInfo which uses the traditional sort.
   CultureInfo^ myCItrad = gcnew CultureInfo( 0x040A,false );
   
   // Displays the properties of each culture.
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL" );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl->CompareInfo, myCItrad->CompareInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl->DisplayName, myCItrad->DisplayName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl->EnglishName, myCItrad->EnglishName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl->IsNeutralCulture, myCItrad->IsNeutralCulture );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl->IsReadOnly, myCItrad->IsReadOnly );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "LCID", myCIintl->LCID, myCItrad->LCID );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Name", myCIintl->Name, myCItrad->Name );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl->NativeName, myCItrad->NativeName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Parent", myCIintl->Parent, myCItrad->Parent );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl->TextInfo, myCItrad->TextInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl->ThreeLetterISOLanguageName, myCItrad->ThreeLetterISOLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl->ThreeLetterWindowsLanguageName, myCItrad->ThreeLetterWindowsLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl->TwoLetterISOLanguageName, myCItrad->TwoLetterISOLanguageName );
   Console::WriteLine();
   
   // Compare two strings using myCIintl -> 
   Console::WriteLine( "Comparing \"llegar\" and \"lugar\"" );
   Console::WriteLine( "   With myCIintl -> CompareInfo -> Compare: {0}", myCIintl->CompareInfo->Compare( "llegar", "lugar" ) );
   Console::WriteLine( "   With myCItrad -> CompareInfo -> Compare: {0}", myCItrad->CompareInfo->Compare( "llegar", "lugar" ) );
}

/*
This code produces the following output.

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

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

*/
using System;
using System.Collections;
using System.Globalization;

public class SamplesCultureInfo
{

   public static void Main()
   {

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

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

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

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

/*
This code produces the following output.

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

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

*/
Imports System.Collections
Imports System.Globalization

Module Module1

    Public Sub Main()

        ' Creates and initializes the CultureInfo which uses the international sort.
        Dim myCIintl As New CultureInfo("es-ES", False)

        ' Creates and initializes the CultureInfo which uses the traditional sort.
        Dim myCItrad As New CultureInfo(&H40A, False)

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

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

    End Sub



'This code produces the following output.
'
'PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
'CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
'DisplayName                    Spanish (Spain)                                Spanish (Spain)          
'EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
'IsNeutralCulture               False                                          False                    
'IsReadOnly                     False                                          False                    
'LCID                           3082                                           1034                     
'Name                           es-ES                                          es-ES                    
'NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
'Parent                         es                                             es                       
'TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
'ThreeLetterISOLanguageName     spa                                            spa                      
'ThreeLetterWindowsLanguageName ESN                                            ESP                      
'TwoLetterISOLanguageName       es                                             es                       
'
'Comparing "llegar" and "lugar"
'   With myCIintl.CompareInfo.Compare: -1
'   With myCItrad.CompareInfo.Compare: 1

End Module

Комментарии

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

Содержание

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

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

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

Примечание

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если DateTimeFormatInfo.Calendar значение Thread.CurrentCulture TaiwanCalendar не заданоzh-TW, то DateTimeFormatInfo.NativeCalendarNameDateTimeFormatInfo.GetEraNameи DateTimeFormatInfo.GetAbbreviatedEraName возвращает пустую строку ("").

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

На Windows можно создавать пользовательские языковые параметры. Дополнительные сведения см. в разделе "Настраиваемые языковые параметры".

CultureInfo и культурные данные

.NET получает свои культурные данные из одного из различных источников в зависимости от реализации, платформы и версии:

  • В платформа .NET Framework версии 3.5 и более ранних версий культурные данные предоставляются операционной системой Windows и платформа .NET Framework.

  • В платформа .NET Framework 4 и более поздних версиях культурные данные предоставляются операционной системой Windows.

  • Во всех версиях .NET Core, работающих на Windows, культурные данные предоставляются операционной системой Windows.

  • Во всех версиях .NET Core, работающих на платформах Unix, культурные данные предоставляются библиотекой международных компонентов для Юникода (ICU). Конкретная версия библиотеки ICU зависит от отдельной операционной системы.

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

Некоторые CultureInfo объекты различаются в зависимости от базовой платформы. В частности, zh-CNили китайский (упрощенное письмо, Китай) и zh-TWкитайский (традиционное письмо, Тайвань) доступны культуры в системах Windows, но они являются псевдонимами культур в системах Unix. "zh-CN" — это псевдоним для культуры "zh-Hans-CN", а "zh-TW" — псевдоним для культуры "zh-Hant-TW". Псевдонимные языки и региональные параметры не возвращаются вызовами GetCultures метода и могут иметь разные значения свойств, включая разные Parent языки и региональные параметры, чем их Windows аналоги. zh-CN Для языков и zh-TW региональных параметров эти различия включают в себя следующее:

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

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

Динамические данные языка и региональных параметров

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

Внимание!

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

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

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

Примечание

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

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

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

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

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

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.CurrentUICulture свойству CultureInfo.CurrentCulture .NET Core и платформа .NET Framework версии 4.6 и более поздних версий. (В платформа .NET Framework версии 4.5.2 и более ранних версий можно назначить CultureInfo объект объекту Thread.CurrentCulture или Thread.CurrentUICulture свойству.)

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

using System;
using System.Globalization;

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

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

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentCulture
      Console.WriteLine("The current culture is {0}", current.Name)
      Dim newCulture As CultureInfo
      If current.Name.Equals("fr-FR") Then
         newCulture = New CultureInfo("fr-LU")
      Else   
         newCulture = new CultureInfo("fr-FR")
      End If
      
      CultureInfo.CurrentCulture = newCulture
      Console.WriteLine("The current culture is now {0}", 
                        CultureInfo.CurrentCulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current culture is en-US
'     The current culture is now fr-FR

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

using System;
using System.Globalization;

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

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

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", current.Name)
      Dim newUICulture As CultureInfo
      If current.Name.Equals("sl-SI") Then
         newUICulture = New CultureInfo("hr-HR")
      Else   
         newUICulture = new CultureInfo("sl-SI")
      End If
      
      CultureInfo.CurrentUICulture = newUICulture
      Console.WriteLine("The current UI culture is now {0}", 
                        CultureInfo.CurrentUICulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current UI culture is en-US
'     The current UI culture is now sl-SI

Получение всех языков и региональных параметров

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

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

using System;
using System.Globalization;

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

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

Module Example
   Public Sub Main()
      ' Get all custom cultures.
      Dim custom() As CultureInfo = CultureInfo.GetCultures(CultureTypes.UserCustomCulture)
      If custom.Length = 0 Then 
         Console.WriteLine("There are no user-defined custom cultures.")
      Else
         Console.WriteLine("Custom cultures:")
         For Each culture In custom 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)
         Next       
      End If
      Console.WriteLine()
      
      ' Get all replacement cultures.
      Dim replacements() As CultureInfo = CultureInfo.GetCultures(CultureTypes.ReplacementCultures)
      If replacements.Length = 0 Then 
         Console.WriteLine("There are no replacement cultures.")
      Else 
         Console.WriteLine("Replacement cultures:")
         For Each culture in replacements 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)    
         Next
      End If
      Console.WriteLine()
   End Sub
End Module
' The example displays output like the following:
'     Custom cultures:
'        x-en-US-sample -- English (United States)
'        fj-FJ -- Boumaa Fijian (Viti)
'     
'     There are no replacement cultures.

Язык и потоки

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

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

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

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

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

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

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

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

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
      Else
         ' Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US")
      End If
      ThreadProc()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' The example displays output similar to the following:
'       Current Thread Name: ''
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          8,11 €
'          1,48 €
'          8,99 €
'          9,04 €
'       
'       Current Thread Name: 'WorkerThread'
'       Current Thread Culture/UI Culture: en-US/en-US
'       Some currency values:
'          $6.72
'          $6.35
'          $2.90
'          $7.72

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

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

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

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

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

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

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

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

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' If current culture is not fr-FR, set culture to fr-FR.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
      Else
         ' Set culture to en-US.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US")
      End If
      DisplayThreadInfo()
      DisplayValues()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start(Thread.CurrentThread.CurrentCulture)
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc(obj As Object)
      Thread.CurrentThread.CurrentCulture = CType(obj, CultureInfo)
      Thread.CurrentThread.CurrentUICulture = CType(obj, CultureInfo)
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' The example displays output similar to the following:
'       Current Thread Name: ''
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          6,83 €
'          3,47 €
'          6,07 €
'          1,70 €
'       
'       Current Thread Name: 'WorkerThread'
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          9,54 €
'          9,50 €
'          0,58 €
'          6,91 €

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

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

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

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

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

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

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

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

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

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' If current culture is not fr-FR, set culture to fr-FR.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR")
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR")
      Else
         ' Set culture to en-US.
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US")
      End If
      ThreadProc()

       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' The example displays output similar to the following:
'       Current Thread Name: ''
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          6,83 €
'          3,47 €
'          6,07 €
'          1,70 €
'       
'       Current Thread Name: 'WorkerThread'
'       Current Thread Culture/UI Culture: fr-FR/fr-FR
'       Some currency values:
'          9,54 €
'          9,50 €
'          0,58 €
'          6,91 €

Предупреждение

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

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

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

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

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

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

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

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

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

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

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

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

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

Module Example
   Public Sub Main()
      ' Set the default culture and display the current date in the current application domain.
      Dim info1 As New Info()
      SetAppDomainCultures("fr-FR")
      
      ' Create a second application domain.
      Dim setup As New AppDomainSetup()
      setup.AppDomainInitializer = AddressOf SetAppDomainCultures
      setup.AppDomainInitializerArguments = { "ru-RU" }
      Dim domain As AppDomain = AppDomain.CreateDomain("Domain2", Nothing, setup)
      ' Create an Info object in the new application domain.
      Dim info2 As Info = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName, 
                                                               "Info"), Info) 

      ' Execute methods in the two application domains.
      info2.DisplayDate()
      info2.DisplayCultures()
      
      info1.DisplayDate()
      info1.DisplayCultures()            
   End Sub
   
   Public Sub SetAppDomainCultures(names() As String)
      SetAppDomainCultures(names(0))
   End Sub
   
   Public Sub SetAppDomainCultures(name As String)
       Try
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name)
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name)
      ' If an exception occurs, we'll just fall back to the system default.
      Catch e As CultureNotFoundException
         Return
      Catch e As ArgumentException
         Return
      End Try      
   End Sub
End Module

Public Class Info : Inherits MarshalByRefObject
   Public Sub DisplayDate()
      Console.WriteLine("Today is {0:D}", Date.Now)
   End Sub
   
   Public Sub DisplayCultures()
      Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id)
      Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture)
      Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture)
   End Sub
End Class
' The example displays the following output:
'       Today is 14 октября 2011 г.
'       Application domain is 2
'       Default Culture: ru-RU
'       Default UI Culture: ru-RU
'       Today is vendredi 14 octobre 2011
'       Application domain is 1
'       Default Culture: fr-FR
'       Default UI Culture: fr-FR

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

Асинхронные операции на основе языка и региональных параметров и задач

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

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

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

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

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

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

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

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

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

public class Example
{

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

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

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

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

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

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

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

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:")
       Console.WriteLine(formatDelegate())
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' The example displays the following output:
'          The example is running on thread 1
'          The current culture is en-US
'          Changed the current culture to fr-FR.
'
'          Executing the delegate synchronously:
'          Formatting Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task asynchronously:
'          Formatting Imports the fr-FR culture on thread 3.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task synchronously:
'          Formatting Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €

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

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

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

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

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

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

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

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

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

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:")
       Console.WriteLine(formatDelegate())
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' The example displays the following output:
'     The example is running on thread 1
'     The current culture is en-US
'     Changed the current culture to fr-FR.
'     
'     Executing the delegate synchronously:
'     Formatting using the fr-FR culture on thread 1.
'     163 025 412,32 €   18 905 365,59 €
'     
'     Executing a task asynchronously:
'     Formatting using the en-US culture on thread 3.
'     $163,025,412.32   $18,905,365.59
'     
'     Executing a task synchronously:
'     Formatting using the fr-FR culture on thread 1.
'     163 025 412,32 €   18 905 365,59 €

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

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

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

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

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

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

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

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

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

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture
       Console.WriteLine()                  
       
       ' Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:")
       Console.WriteLine(formatDelegate())
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' The example displays the following output:
'       The example is running on thread 1
'       The current culture is en-US
'       Changed the current culture to fr-FR.
'       
'       Executing the delegate synchronously:
'       Formatting using the fr-FR culture on thread 1.
'       163 025 412,32 €   18 905 365,59 €
'       
'       Executing a task asynchronously:
'       Formatting using the fr-FR culture on thread 3.
'       163 025 412,32 €   18 905 365,59 €
'       
'       Executing a task synchronously:
'       Formatting using the fr-FR culture on thread 1.
'       163 025 412,32 €   18 905 365,59 €

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

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

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

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

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

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

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

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

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

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim formatString As String = "C2"
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If

       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:") 
       Dim t1 = Task.Run(Function()
                            Dim d As New DataRetriever()
                            Return d.GetFormattedNumber(formatString)
                         End Function)
       Console.WriteLine(t1.Result)
       Console.WriteLine() 
       
       Console.WriteLine("Executing a task synchronously in two appdomains:")
       Dim t2 = Task.Run(Function()
                            Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                                              Thread.CurrentThread.ManagedThreadId, 
                                              AppDomain.CurrentDomain.FriendlyName)
                            Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
                            Dim d As DataRetriever = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
                                                                                          "DataRetriever"), DataRetriever)
                            Return d.GetFormattedNumber(formatString) 
                         End Function) 
       Console.WriteLine(t2.Result)
   End Sub
End Module

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

Сериализация объектов CultureInfo

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

  • Если значение свойства равноCultureTypes.InstalledWin32Cultures, а если этот CultureTypes язык и региональные параметры были впервые введены в определенной версии операционной системы Windows, ее невозможно десериализировать в более ранней версии Windows. Например, если язык и региональные параметры были введены в Windows 10, его нельзя десериализовать в Windows 8.

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

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

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

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

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

Альтернативные заказы сортировки

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

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

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

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

Название языка и региональных параметров culture Имя и идентификатор сортировки по умолчанию Альтернативное имя и идентификатор сортировки
es-ES испанский (Испания) Международный: 0x00000C0A Традиционное: 0x0000040A
zh-TW Китайский (Тайвань) Число росчерков: 0x00000404 Bopomofo: 0x00030404
zh-CN Китайский (КНР) Произношение: 0x00000804 Число росчерков: 0x00020804
zh-HK китайский (Гонконг, CАР) Число росчерков: 0x00000c04 Число росчерков: 0x00020c04
zh-SG Chinese (Singapore) Произношение: 0x00001004 Число росчерков: 0x00021004
zh-MO Chinese (Macao SAR) Произношение: 0x00001404 Число росчерков: 0x00021404
ja-JP Японский (Япония) Значение по умолчанию: 0x00000411 Юникод: 0x00010411
ko-KR корейский (Корея) По умолчанию: 0x00000412 Корейский Xwansung - Юникод: 0x00010412
de-DE Немецкий (Германия) Словарь: 0x00000407 Телефон Book Sort DIN: 0x00010407
hu-HU Венгерский (Венгрия) Значение по умолчанию: 0x0000040e Техническая сортировка: 0x0001040e
ka-GE Грузинский (Грузия) Традиционное: 0x00000437 Современная сортировка: 0x00010437

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

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

В приложениях платформа .NET Framework и .NET Core текущий язык и региональные параметры — это параметр потока, а CurrentCulture CurrentUICulture свойства отражают язык и региональные параметры и региональные параметры текущего потока. В приложениях UWP текущий язык и региональные параметры сопоставляется с Windows. Коллекция ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages, которая является глобальным параметром. CurrentCulture Задание языка или CurrentUICulture свойства изменяет язык и региональные параметры всего приложения; язык и региональные параметры нельзя задать для каждого потока.

Конструкторы

CultureInfo(Int32)

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

CultureInfo(Int32, Boolean)

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

CultureInfo(String)

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

CultureInfo(String, Boolean)

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

Свойства

Calendar

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

CompareInfo

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

CultureTypes

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

CurrentCulture

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

CurrentUICulture

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

DateTimeFormat

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

DefaultThreadCurrentCulture

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

DefaultThreadCurrentUICulture

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

DisplayName

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

EnglishName

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

IetfLanguageTag

Не рекомендуется. Получает идентификацию языка по стандарту RFC 4646.

InstalledUICulture

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

InvariantCulture

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

IsNeutralCulture

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

IsReadOnly

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

KeyboardLayoutId

Получает активный идентификатор языка ввода.

LCID

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

Name

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

NativeName

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

NumberFormat

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

OptionalCalendars

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

Parent

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

TextInfo

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

ThreeLetterISOLanguageName

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

ThreeLetterWindowsLanguageName

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

TwoLetterISOLanguageName

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

UseUserOverride

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

Методы

ClearCachedData()

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

Clone()

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

CreateSpecificCulture(String)

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

Equals(Object)

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

GetConsoleFallbackUICulture()

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

GetCultureInfo(Int32)

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

GetCultureInfo(String)

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

GetCultureInfo(String, Boolean)

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

GetCultureInfo(String, String)

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

GetCultureInfoByIetfLanguageTag(String)

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

GetCultures(CultureTypes)

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

GetFormat(Type)

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

GetHashCode()

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

GetType()

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

(Унаследовано от Object)
MemberwiseClone()

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

(Унаследовано от Object)
ReadOnly(CultureInfo)

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

ToString()

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

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

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