要获得 .Net 或多或少支持的国家/地区列表,您可以像这样使用 CultureInfo 和 RegionInfo:
List<RegionInfo> allRegions = new List<RegionInfo>();
var specificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo culture in specificCultures)
{
var info = new RegionInfo(culture.LCID);
allRegions.Add(info);
}
这将为您提供所有国家/地区,其中一些国家/地区多次(因为使用不同的语言)。
RegionInfo 有几个有趣的属性:
-
NativeName 将为您提供国家/地区的翻译名称,但不幸的是与给定的区域设置标识符 (LCID) 相对应的名称,即波兰的“Polska”,德国的“Deutschland”等等;有些会被翻译成几种语言(这很有趣,因为美国既可以作为美国也可以作为 Estados Unidos 看到)
-
DisplayName 应该是你要找的东西,但不幸的是不是——微软“忘记”在 .Net 框架中翻译它(也许没关系,因为它不应该是属性)
- 与名称不同的名称将为您提供两个字母的国家/地区代码。
那么你可以用这些信息做什么?从理论上讲,您可以使用翻译后的国家/地区名称——在这种情况下,您只需创建一个字典 (Dictionary<int, string>) 并添加具有相应 NativeName 字符串的 LCID,并将其用作下拉菜单的来源。
理论上,一个出生在这个国家的人应该能够理解至少一种语言(至少大多数情况下都是这样)。
但实际上,您可能希望将唯一的国家/地区列表翻译成您的应用程序当前显示的任何语言。您可以使用上述方法获取国家/地区列表并使用例如DisplayName(或EnglishName)。在运行时,您可以将其解析为翻译后的名称,就像任何其他字符串一样。由于这需要在后端发生,您将添加另一个资源文件(可以放在 App_GlobalResources 中,没关系)并在您的代码隐藏中读取它。没有更多的理论,需要一些代码示例:
const string RESOURCE_FILE = "Countries";
Dictionary<string, string> countryNames = new Dictionary<string, string>();
var specificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
foreach (CultureInfo culture in specificCultures)
{
var info = new RegionInfo(culture.LCID);
var name = info.EnglishName;
var translated = GetGlobalResourceObject(RESOURCE_FILE, name).ToString();
countryNames[name] = translated;
}
如果您想以特定语言(CurrentUICulture 除外)读取名称,请将 CultureInfo 对象作为第三个参数传递给 GetGlobalResourceObject()。