Utilizar la clase CultureInfo

La clase CultureInfo contiene información específica de la referencia cultural, como el idioma, el país o región, el calendario y las convenciones culturales asociadas a una referencia cultural específica. Esta clase también proporciona la información necesaria para realizar operaciones específicas de la referencia cultural, como la distinción de mayúsculas y minúsculas, el formato de fechas y números, y la comparación de cadenas.

La clase CultureInfo especifica un nombre único para cada referencia cultural. Para obtener una lista de nombres de referencias culturales, vea la clase CultureInfo. Su aplicación puede utilizar el método CultureInfo.GetCultures para recuperar una lista completa de todas las referencias culturales. En el ejemplo siguiente se presenta una lista de todas las referencias culturales.

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);
      }
   }
}

Utilizar CultureInfo con código no administrado

Las aplicaciones .NET Framework pueden tener acceso a funciones no administradas en las bibliotecas de vínculos dinámicos usando el servicio de invocación de plataforma. Sin embargo, cuando la aplicación pasa un objeto CultureInfo a la función de Win32 GetLocaleInfo, recuerde que el valor devuelto por la función no siempre es coherente con el valor devuelto desde el constructor de clase RegionInfo.

El objeto RegionInfo de .NET Framework corresponde a un país o región. Para inicializar un objeto RegionInfo mediante un objeto CultureInfo, su aplicación debe especificar un objeto CultureInfo que represente una referencia cultural concreta, como ar-DZ para el árabe de Argelia. Si se intenta inicializar un objeto RegionInfo con un objeto CultureInfo que representa una referencia cultural neutra (por ejemplo, "ar" para árabe), se produce una excepción. La referencia cultural neutra no especifica la información de país o región necesaria para la asignación a un país o región.

La función de la API GetLocaleInfo se diferencia del constructor RegionInfo en el hecho de que devuelve un país o región para un objeto CultureInfo que representa una referencia cultural específica o una referencia cultural neutra. Por ejemplo, si la aplicación pasa un objeto CultureInfo que representa la referencia cultural neutra "ar" (árabe) a GetLocaleInfo, la función asigna la referencia cultural neutra al país o región predeterminados a los que se encuentra asociada. En este caso, GetLocaleInfo devuelve Arabia Saudí. Hay que tener cuidado al usar la función GetLocaleInfo, ya que la asignación que proporciona al país o región predeterminados puede ser culturalmente inapropiada para la aplicación. Para eliminar esta diferencia, haga que la aplicación utilice solamente referencias culturales concretas al interoperar con una función de la API.

El ejemplo siguiente muestra cómo el constructor de clase RegionInfo y la función GetLocaleInfo pueden devolver valores diferentes cuando se les pasa el mismo objeto CultureInfo. Observe que, cuando el objeto CultureInfo representa la referencia cultural específica ar-DZ para árabe de Argelia, ambos métodos devuelven Argelia como nombre de país o región. Sin embargo, cuando el objeto CultureInfo representa la referencia cultural neutra ar (árabe), los resultados difieren. El constructor RegionInfo no devuelve ningún país o región, mientras que GetLocaleInfo devuelve Argelia.

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));
    }
   }
}

Este ejemplo produce el siguiente resultado.

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

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

Vea también

Referencia

CultureInfo Class

Conceptos

Utilizar la propiedad CurrentUICulture
Utilizar la propiedad CurrentCulture
Utilizar la propiedad InvariantCulture
Nombres asociados a un objeto CultureInfo

Otros recursos

Codificación y localización