Создание специальных культур

54

В .NET Framework добавляется поддержка все большего количества языков. Тем не менее, пока в .NET доступны не все языки мира, поэтому предоставляется возможность создавать собственные специальные культуры. Это очень полезно, например, когда необходимо обеспечить поддержку какого-то мало употребляемого в пределах того или иного региона языка либо создать подкультуры для различных диалектов.

Для создания специальных культур и регионов в .NET служит класс CultureAndRegionInfoBuilder из пространства имен System.Globalization. Этот класс поставляется в сборке sysglobl.

Поскольку сборка sysglobl в подмножестве .NETFramework 4 Client Profile отсутствует, для ее использования в поле Target Framework (Целевая версия .NET Framework) параметров проекта должно быть установлено .NETFramework 4.

Конструктору класса CultureAndRegionlnfoBuilder передается имя культуры. Во втором аргументе указывается значение перечисления CultureAndRegionModifiers: Neutral для нейтральной культуры, Replacement для замены существующей культуры .NET Framework или None.

После создания экземпляра CultureAndRegionlnfoBuilder можно приступить к конфигурированию культуры, устанавливая различные свойства. С помощью свойств этого класса задается вся информация, связанная с культурой и регионом, такая как имя, календарь, числовой формат, метрики и т.д. Если параметры культуры должны быть основаны на параметрах каких-то существующих культур или регионов, свойства экземпляра можно устанавливать с использованием методов LoadDataFromCultureInfo() и LoadDataFromRegionInfo(), а затем с помощью свойств заменять значения, которые должны отличаться. Вызов метода Register() позволяет регистрировать новую культуру в операционной системе. После этого в каталоге <Windows>\Globalization появится файл с расширением .nlp, описывающий новую культуру:

using System;
using System.Globalization;

namespace CustomCultures
{
    class Program
    {
        static void Main()
        {
            try
            {
                // Create a Styria culture
                var styria = new CultureAndRegionInfoBuilder("de-AT-ST", CultureAndRegionModifiers.None);
                var cultureParent = new CultureInfo("de-AT");
                styria.LoadDataFromCultureInfo(cultureParent);
                styria.LoadDataFromRegionInfo(new RegionInfo("AT"));
                styria.Parent = cultureParent;
                styria.RegionNativeName = "Steiermark";
                styria.RegionEnglishName = "Styria";
                styria.CultureEnglishName = "Styria (Austria)";
                styria.CultureNativeName = "Steirisch";

                styria.Register();
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

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

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

Теперь вновь созданную культуру можно использовать наравне с другими культурами.

Пройди тесты
Лучший чат для C# программистов