Класс CultureInfo

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

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

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

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

Примечание.

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Некоторые CultureInfo объекты различаются в зависимости от базовой платформы. В частности, zh-CNв системах Windows доступны языкы и региональные параметры для систем 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 CurrentCultureEx
{
    public static void Main()
    {
        CultureInfo culture1 = CultureInfo.CurrentCulture;
        CultureInfo culture2 = Thread.CurrentThread.CurrentCulture;
        Console.WriteLine("The current culture is {0}", culture1.Name);
        Console.WriteLine("The two CultureInfo objects are equal: {0}",
                          culture1 == culture2);
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The two CultureInfo objects are equal: True

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

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

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

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

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

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

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

  2. Назначьте объект объекту CultureInfo.CurrentCulture или CultureInfo.CurrentUICulture свойству CultureInfo в .NET Core и платформа .NET Framework версии 4.6 и более поздних версий.

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

using System;
using System.Globalization;

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

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

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

using System;
using System.Globalization;

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

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

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

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

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

using System;
using System.Globalization;

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

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

Язык и потоки

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

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

public class DefaultThreadEx
{
    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

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

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

public class SetThreadsEx
{
    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(SetThreadsEx.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 €

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

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

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

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

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

using System;
using System.Globalization;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public class AsyncCultureEx1
{
    public static void Main()
    {
        decimal[] values = { 163025412.32m, 18905365.59m };
        string formatString = "C2";

        string FormatDelegate()
        {
            string output = $"Formatting using the {CultureInfo.CurrentCulture.Name} " +
            "culture on thread {Thread.CurrentThread.ManagedThreadId}.\n";
            foreach (decimal value in values)
                output += $"{value.ToString(formatString)}   ";

            output += Environment.NewLine;
            return output;
        }

        Console.WriteLine($"The example is running on thread {Thread.CurrentThread.ManagedThreadId}");
        // Make the current culture different from the system culture.
        Console.WriteLine($"The current culture is {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 {CultureInfo.CurrentCulture.Name}.\n");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Имя языка и региональных параметров Культура Имя и идентификатор сортировки по умолчанию Альтернативное имя и идентификатор сортировки
es-ES Испанский (Испания) Международный: 0x00000C0A Традиционное: 0x0000040A
zh-TW Китайский (Тайвань) Число штрихов: 0x00000404 Bopomofo: 0x00030404
zh-CN Китайский (КНР) Произношение: 0x00000804 Число штрихов: 0x00020804
zh-HK Китайский (специальный административный регион Гонконг) Число штрихов: 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

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

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