使用GetGeoInfo API多语言获取对应Windows GeoId国家名称的问题
关于GetGeoInfo获取多语言国家名称的问题
我需要获取多语言版本的国家名称列表,同时要将这些名称与Windows的GeoId进行匹配。
我基于一段现有代码修改,期望通过指定语言代码来获取对应语言的国家名称,当前使用Windows API的GetGeoInfo通过GeoId获取国家详情。
用于概念验证的C#代码如下:
using System.Runtime.InteropServices; using System.Text; public class Program { private enum SYSGEOTYPE { GEO_NATION = 0x0001, GEO_LATITUDE = 0x0002, GEO_LONGITUDE = 0x0003, GEO_ISO2 = 0x0004, GEO_ISO3 = 0x0005, GEO_RFC1766 = 0x0006, GEO_LCID = 0x0007, GEO_FRIENDLYNAME = 0x0008, GEO_OFFICIALNAME = 0x0009, GEO_TIMEZONES = 0x000A, GEO_OFFICIALLANGUAGES = 0x000B, GEO_ISO_UN_NUMBER = 0x000C, GEO_PARENT = 0x000D, GEO_DIALINGCODE = 0x000E, GEO_CURRENCYCODE = 0x000F, GEO_CURRENCYSYMBOL = 0x0010, GEO_NAME = 0x0011, GEO_ID = 0x0012 }; [DllImport("kernel32.dll")] private static extern int GetUserDefaultLCID(); [DllImport("kernel32.dll")] private static extern int GetGeoInfo(int geoid, int geoType, StringBuilder lpGeoData, int cchData, int lcid); /// <summary> /// Returns machine current location as specified in Region and Language settings. /// </summary> public static string GetLocationName() { var geoId = 94; var lcid = 94; var locationBuffer = new StringBuilder(100); GetGeoInfo(geoId, (int)SYSGEOTYPE.GEO_FRIENDLYNAME, locationBuffer, locationBuffer.Capacity, lcid); return locationBuffer.ToString().Trim(); } private static void Main(string[] args) { Console.WriteLine(GetLocationName()); } }
测试发现,修改geoId可以正常切换对应国家,但修改lcid无法切换语言(当前系统为英文),只有在虚拟机安装德语语言包并切换系统语言后,GetGeoInfo才会返回德语的国家名称。
我想了解以下内容:
GetGeoInfo最后一个参数的具体作用,是否可以通过该参数直接切换获取语言(即使需要下载安装大量语言包)- 其他可以获取关联Windows GeoId的多语言国家名称的方案(我已经了解Unicode CLDR,但需要先理清数据获取方式并移除当前GeoId依赖才能使用,因此优先考虑基于
GetGeoInfo的解决方案)
内容的提问来源于stack exchange,提问作者Steve Norwood
相关产品推荐
相关产品推荐

