Использование класса CultureInfo

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

Класс CultureInfo определяет уникальное имя для каждого языка и региона. Список имен для языков и регионов см. в описании класса CultureInfo. Для извлечения полного списка языков и регионов в приложении можно использовать метод GetCultures. В приведенном ниже примере кода выводится список всех языков и регионов.

Imports System
Imports System.Globalization

public class printClass
   Public Shared Sub Main()  
      Dim ci As CultureInfo
      For Each ci in _
      CultureInfo.GetCultures(CultureTypes.AllCultures)
         Console.WriteLine(ci)
      Next ci
   End Sub
End Class
using System;
using System.Globalization;

public class printClass
{
   public static void Main()
   {
      foreach (CultureInfo ci in
      CultureInfo.GetCultures(CultureTypes.AllCultures))
      {
         Console.WriteLine(ci);
      }
   }
}

Использование CultureInfo для неуправляемого кода

ПримечаниеПримечание

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

Чтобы инициализировать данные о стране и регионе, в приложении можно передать объект CultureInfo объекту RegionInfo, который соответствует стране или региону. Также в неуправляемом коде в приложении можно передать объект CultureInfo функции Win32 GetLocaleInfo.

Для инициализации объекта RegionInfo с помощью объекта CultureInfo необходимо определить объект CultureInfo, который соответствует определенному языку и региону, например "Ar-DZ" (арабский – Алжир). При попытке инициализировать объект RegionInfo с помощью объекта CultureInfo, который представляет язык с нейтральным регионом, такой как "Ar" (арабский), создается исключение. Нейтральный язык не определяет сведения, необходимые для привязки к стране или региону.

Метод GetLocaleInfo отличается от конструктора RegionInfo тем, что возвращает страну или регион для объекта CultureInfo, который предоставляет либо конкретный, либо нейтральный регион. Например, если передать объект CultureInfo, который предоставляет язык с нейтральным региональным параметром "Ar" (арабский), объекту GetLocaleInfo, этот метод установит нейтральный регион на регион, который устанавливается для данного языка по умолчанию. В этом случае метод GetLocaleInfo возвратит "Саудовская Аравия". Следует соблюдать осторожность при использовании метода GetLocaleInfo, так как страна по умолчанию, которую он возвращает, может оказаться недопустимой для данного приложения. Чтобы избежать этого несоответствия, при взаимодействии с функциями API следует использовать только конкретные региональные параметры.

В следующем примере кода показывается, как конструктор класса RegionInfo и метод GetLocaleInfo могут возвращать различные результаты для одного и того же объекта CultureInfo. Обратите внимание, что, если объект CultureInfo представляет конкретную язык и регион "Ar-DZ" (арабский – Алжир), оба метода вернут "Алжир" как название страны (региона). Если же объект CultureInfo представляет язык с нейтральным регионом "Ar" (арабский), результаты будут различаться. В этом случае конструктор RegionInfo не сможет возвратить страну, тогда как метод GetLocaleInfo возвратит "Алжир".

Imports System
Imports System.Globalization
Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic

Namespace CountryRegionName
   Class CountryRegionName
      ' The name of a country or region in English.
      Private LOCALE_SENGCOUNTRY As Integer = &H1002

      ' Use COM interop to call the Win32 API GetLocalInfo.
      Declare Unicode Function GetLocaleInfoW Lib "Kernel32.dll" _
         (Locale As Integer, LCType As Integer,<[In](), _
          MarshalAs(UnmanagedType.LPWStr)> lpLCData As String, _
          cchData As Integer) As Integer
      
      ' A method to retrieve the .NET Framework Country/Region
      ' that maps to the specified CultureInfo.
      Public Function GetNetCountryRegionName(ci As CultureInfo) As String
         ' If the specified CultureInfo represents a specific culture,
         ' the attempt to create a RegionInfo succeeds.
         Try
            Dim ri As New RegionInfo(ci.LCID)
            Return ri.EnglishName
         ' Otherwise, the specified CultureInfo represents a neutral
         'culture, and the attempt to create a RegionInfo fails.
         Catch
            Return String.Empty
         End Try
      End Function
      
      ' A method to retrieve the Win32 API Country/Region
      ' that maps to the specified CultureInfo.
      Public Function GetWinCountryRegionName(ci As CultureInfo) As String
         Dim size As Integer = GetLocaleInfoW(ci.LCID, _
            LOCALE_SENGCOUNTRY, Nothing, 0)
         Dim str As New String(" "c, size)
         Dim err As Integer = GetLocaleInfoW(ci.LCID, _
            LOCALE_SENGCOUNTRY, str, size)
         ' If the string is not empty, GetLocaleInfoW succeeded.
         ' It will succeed regardless of whether ci represents
         ' a neutral or specific culture.
         If err <> 0 Then
            Return str
         Else
            Return String.Empty
         End If
      End Function

      <STAThread()> _
      Public Shared Sub Main(args() As String)
         Dim crn As New CountryRegionName()
         
         ' Create a CultureInfo initialized to the neutral Arabic culture.
         Dim ci1 As New CultureInfo(&H1)
         Console.WriteLine(ControlChars.NewLine + _
            "The .NET Region name: {0}", _
            crn.GetNetCountryRegionName(ci1))
         Console.WriteLine("The Win32 Region name: {0}", _
            crn.GetWinCountryRegionName(ci1))
         
         ' Create a CultureInfo initialized to the specific 
         ' culture Arabic in Algeria.
         Dim ci2 As New CultureInfo(&H1401)
         Console.WriteLine(ControlChars.NewLine + _
            "The .NET Region name: {0}", _
            crn.GetNetCountryRegionName(ci2))
         Console.WriteLine("The Win32 Region name: {0}", _
            crn.GetWinCountryRegionName(ci2))
      End Sub
   End Class
End Namespace
using System;
using System.Globalization;
using System.Runtime.InteropServices;

namespace CountryRegionName
{
  class CountryRegionName
  {
    // The name of a country or region in English
    int LOCALE_SENGCOUNTRY     = 0x1002;

    // Use COM interop to call the Win32 API GetLocalInfo.
    [DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
    public static extern int GetLocaleInfo(
       // The locale identifier.
       int Locale,
       // The information type.
       int LCType,
       // The buffer size.
       [In, MarshalAs(UnmanagedType.LPWStr)] string lpLCData,int cchData
     );

    // A method to retrieve the .NET Framework Country/Region
    // that maps to the specified CultureInfo.
    public String GetNetCountryRegionName(CultureInfo ci)
    {
      // If the specified CultureInfo represents a specific culture,
      // the attempt to create a RegionInfo succeeds.
      try
      {
        RegionInfo ri = new RegionInfo(ci.LCID);
        return ri.EnglishName;
      }
      // Otherwise, the specified CultureInfo represents a neutral
      // culture, and the attempt to create a RegionInfo fails.
      catch
      {
        return String.Empty;
      }
    }

    // A method to retrieve the Win32 API Country/Region
    // that maps to the specified CultureInfo.
    public String GetWinCountryRegionName(CultureInfo ci)
    {
      int size = GetLocaleInfo(ci.LCID, LOCALE_SENGCOUNTRY, null, 0);
      String str = new String(' ', size);
      int err  = GetLocaleInfo(ci.LCID, LOCALE_SENGCOUNTRY, str, size);
      // If the string is not empty, GetLocaleInfo succeeded.
      // It will succeed regardless of whether ci represents
      // a neutral or specific culture.
      if(err != 0)  
        return str;
      else
        return String.Empty;
    }

    [STAThread]
    static void Main(string[] args)
    {
      CountryRegionName crn = new CountryRegionName();

      // Create a CultureInfo initialized to the neutral Arabic culture.
      CultureInfo ci1 = new CultureInfo(0x1);  
      Console.WriteLine("\nThe .NET Region name: {0}", 
         crn.GetNetCountryRegionName(ci1));
      Console.WriteLine("The Win32 Region name: {0}",
         crn.GetWinCountryRegionName(ci1));

      // Create a CultureInfo initialized to the specific 
      // culture Arabic in Algeria.
      CultureInfo ci2 = new CultureInfo(0x1401);  
      Console.WriteLine("\nThe .NET Region name: {0}", 
         crn.GetNetCountryRegionName(ci2));
      Console.WriteLine("The Win32 Region name: 
         {0}",crn.GetWinCountryRegionName(ci2));
    }
   }
}

Результатом выполнения этого примера являются выходные данные:

The .NET Region name:
The Win32 Region name: Saudi Arabia

The .NET Region name: Algeria
The Win32 Region name: Algeria

См. также

Ссылки

CultureInfo

Основные понятия

Использование свойства CurrentUICulture

Использование свойства CurrentCulture

Использование свойства InvariantCulture

Имена, связанные с объектом CultureInfo

Другие ресурсы

Шифрование и локализация