2010-09-07 26 views
15

Utilicé el siguiente código para obtener la lista del tipo de cultura, ¿es una forma de obtener solo el nombre del país?Cómo obtener el nombre del país

Gracias

 static void Main(string[] args) 
     { 

     StringBuilder sb = new StringBuilder(); 

     foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
     { 
      sb.Append(ci.DisplayName); 
      sb.AppendLine(); 
     } 
     Console.WriteLine(sb.ToString()); 
     Console.ReadLine(); 


    } 

Ejemplo de salida:

español (Puerto Rico)

Español (Estados Unidos)

Respuesta

4

Bueno, esta expresión regular parece hacer el trabajo en la mayoría de los casos:

 var regex = new System.Text.RegularExpressions.Regex(@"([\w+\s*\.*]+\))"); 
     foreach (var item in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
     { 
      var match = regex.Match(item.DisplayName); 
      string countryName = match.Value.Length == 0 ? "NA" : match.Value.Substring(0, match.Value.Length - 1); 
      Console.WriteLine(countryName); 
     } 
+1

DisplayName da nombres como "alemán", "catalán", "finlandés", etc. Estos no son exactamente los nombres de los países. De lo contrario, podemos usar DisplayName o EnglishName. –

+0

En la mayoría de los casos, DisplayName incluye el nombre del país/región rodeado de paréntesis, es la última porción que estamos obteniendo con la expresión regular. Un poco de hack, pero funciona :-) –

48

Puede usar la propiedad Name de CultureInfo para construir una RegionInfo. Luego puede usar la propiedad DisplayName. Probar:

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
{ 
      var ri = new RegionInfo(ci.Name); 
      Console.WriteLine(ri.DisplayName); 
} 
+2

Deberías usar ** 'new RegionInfo (ci.LCID)' **, es más rápido. Fuente: descompilador. Enlaces en MSDN: [CultureInfo.LCID] (http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.lcid (v = vs.80) .aspx) y [constructor de RegionInfo] (http://msdn.microsoft.com/en-us/library/3ftdh74h(v=vs.110).aspx). –

+5

Tenga en cuenta el uso de LCID si tiene cultivos personalizados: todos tienen LCID = 4096. – nom

0

esto sería lo que busca:

 foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
     { 
      sb.Append(ci.EnglishName); 
      sb.AppendLine(); 
     } 
1
// Build your normal dictionary as container 
Dictionary<string, string> countryNames = new Dictionary<string, string>(); 
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
{ 
    RegionInfo ri = new RegionInfo(ci.Name); 
    // Check if the ISO language code is already in your collection 
    // Because you don't want double entries in a country box because we had to use the culture info 
    if (!countryNames.ContainsKey(ri.TwoLetterISORegionName)) 
    { 
     countryNames.Add(ri.TwoLetterISORegionName.ToUpper(), ri.EnglishName); 
    } 
} 
// Code for dictionary to dropdownlist transform can be written with your personal preference for symantics 
SelectList countryDropdown = new SelectList(countryNames.OrderBy(o => o.Value), "Key", "Value"); 

o listos para su uso sin comentarios:

Dictionary<string, string> countryNames = new Dictionary<string, string>(); 
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 
{ 
    RegionInfo ri = new RegionInfo(ci.Name); 
    if (!countryNames.ContainsKey(ri.TwoLetterISORegionName)) countryNames.Add(ri.TwoLetterISORegionName.ToUpper(), ri.EnglishName); 
} 
SelectList countryDropdown = new SelectList(countryNames.OrderBy(o => o.Value), "Key", "Value"); 
+2

Usando 'Keys.ToList(). Contains()' es una mala idea ya que hace que el algoritmo O (n^2). ¿Por qué no usar 'containsKey()'? – jbindel

+0

Thx @jbindel, he actualizado el recorte :) – Lesage

0
 You will need to use following namespaces 

    using System.Configuration; 
    using System.Globalization;  

///

/// populate country name 

    /// </summary> 

    /// <param name="dropDown"></param> 

    public static void GetCountryNames(DropDownList dropDown) 

    { 

     Hashtable h = new Hashtable(); 



     Dictionary<string, string> objDic = new Dictionary<string, string>(); 

     foreach (CultureInfo ObjCultureInfo in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) 

     { 

      RegionInfo objRegionInfo = new RegionInfo(ObjCultureInfo.Name); 

      if (!objDic.ContainsKey(objRegionInfo.EnglishName)) 

      { 

       objDic.Add(objRegionInfo.EnglishName, objRegionInfo.TwoLetterISORegionName.ToLower()); 

      } 

     } 



     SortedList<string, string> sortedList = new SortedList<string, string>(objDic); 



     foreach (KeyValuePair<string, string> val in sortedList) 

     { 

      dropDown.Items.Add(new ListItem(val.Key, val.Key)); 

     } 



     dropDown.Items.Insert(0, new ListItem("Select", "Select")); 

     dropDown.Items.Insert(1, new ListItem("Other Country", "Other")); 

    } 

} 
Cuestiones relacionadas