CultureInfo Класс

Определение

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

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

Примеры

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

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

/*
This code produces the following output.

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

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

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

public class SamplesCultureInfo
{

   public static void Main()
   {

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

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

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

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

/*
This code produces the following output.

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

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

*/
Imports System.Collections
Imports System.Globalization

Module Module1

    Public Sub Main()

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

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

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

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

    End Sub



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

End Module

Комментарии

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

Содержание

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

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

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

Примечание

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CultureInfo и региональные данные

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

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

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

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

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

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

Некоторые CultureInfo объекты различаются в зависимости от базовой платформы. В частности , zh-CNили китайский (упрощенное письмо, Китай) и или китайский (традиционное письмо, Тайвань) доступны в системах Windows, но они являются псевдонимами языка и zh-TWрегиональных параметров в системах 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.CurrentCulture или CultureInfo.CurrentUICulture в .NET Core и платформа .NET Framework 4.6 и более поздних версий. (В платформа .NET Framework 4.5.2 и более ранних версий CultureInfo объект можно назначить свойству Thread.CurrentCulture или Thread.CurrentUICulture .)

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

using System;
using System.Globalization;

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

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

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

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

using System;
using System.Globalization;

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

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

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

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

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

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

using System;
using System.Globalization;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Создает задачу, которая синхронно выполняет делегат в основном потоке приложения, вызывая 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 Если свойство имеет CultureTypes.InstalledWin32Culturesзначение и если этот язык и региональные параметры были впервые представлены в определенной версии операционной системы Windows, десериализовать его в более ранней версии Windows невозможно. Например, если язык и региональные параметры были представлены в Windows 10, его нельзя десериализовать на Windows 8.

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

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

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

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

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

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

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

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

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

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

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

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

В приложениях CurrentCulture универсальная платформа Windows (UWP) свойства и CurrentUICulture являются чтением и записью, как и в приложениях платформа .NET Framework и .NET Core. Однако приложения UWP распознают один язык и региональные параметры. Свойства CurrentCulture и CurrentUICulture сопоставляют с первым значением в коллекции 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 или трехбуквенный код ISO 639-3 для языка текущего 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.

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

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