6

我正在尝试通过 ISO 3166-1 TwoLetters 国家名称 - “MD”获取区域信息。

var r = new RegionInfo("MD");

但我得到以下异常:

不支持文化名称“MD”。

这很奇怪,因为 Microsoft 支持的国家摩尔多瓦表存在:

http://msdn.microsoft.com/en-us/library/dd374073.aspx

4

3 回答 3

4

根据RegionInfo 上有关文化名称的 MSDN 文档:

Go Global Developer Center 的 National Language Support (NLS) API Reference 中列出了预定义的文化名称。

当您转到National Language Support (NLS) API Reference时,MD在那里找不到。

于 2013-11-05T10:22:01.463 回答
3

您可以创建自己的文化信息

以管理员身份运行 Visual Studio。在您的项目中,添加对sysglobl的引用。

using System;
using System.IO;
using System.Globalization;
using System.Linq;
using System.Xml.Linq;

class Program
{
    public static void Main()
    {
        CultureAndRegionInfoBuilder cib = null;
        try
        {
            // Create a CultureAndRegionInfoBuilder 
            // object named "ro-MD".
            cib = new CultureAndRegionInfoBuilder(
                                    "ro-MD", CultureAndRegionModifiers.None);

            // Populate the new CultureAndRegionInfoBuilder 
            // object with culture information.
            CultureInfo ci = new CultureInfo("ro-RO");
            cib.LoadDataFromCultureInfo(ci);

            // Populate the new CultureAndRegionInfoBuilder 
            // object with region information.
            RegionInfo ri = new RegionInfo("RO");
            cib.LoadDataFromRegionInfo(ri);

            var filePath = "ro-MD.xml";

            if (File.Exists(filePath))
                File.Delete(filePath);

            // Save as XML
            cib.Save(filePath);

            // TODO: modify the XML
            var xDoc = XDocument.Load(filePath);
            var ns = 
                "http://schemas.microsoft.com/globalization/2004/08/carib/ldml";

            xDoc.Descendants(XName.Get("regionEnglishName", ns))
                .FirstOrDefault().Attribute("type").SetValue("Moldova");

            xDoc.Descendants(XName.Get("regionNativeName", ns))
                .FirstOrDefault().Attribute("type").SetValue("Moldova");

            // and so on
            xDoc.Save(filePath);

            var roMd = CultureAndRegionInfoBuilder
                .CreateFromLdml(filePath);

            // this may throw an exception if the culture info exists 
            try
            {
                CultureAndRegionInfoBuilder.Unregister("ro-MD");
            }
            catch (Exception)
            {
                //throw;
            }

            // Register the custom culture.
            roMd.Register();

            // Display some of the properties of the custom culture.
            var riMd = new RegionInfo("ro-MD");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}

您只需要处理 XML 修改。

注意:您似乎也可以在没有管理权限的情况下保存文化。这是一个参考:如何:在没有管理权限的情况下保存自定义文化。我自己没有测试过,但对该文章的唯一评论似乎表明它不起作用。

[更新]

这也是一种有趣的方法(调用本地方法的包装器):

使用 C# 获取 Windows 支持的国家/地区的完整列表

于 2013-11-05T10:41:39.013 回答
0

System.Globalization.RegionInfo 使用文化数据,如果该地区没有文化数据,则不会成功。这也是为什么为该地区的语言创建自定义文化将使其成功的原因。

您可能想要的是使用新的Windows.Globalization.GeographicRegion,它支持所有当前的 ISO-3166 国家。

或者您可以 p/Invoke 到 GetGeoInfo 和 EnumSystemGeoId,因为它们支持摩尔多瓦,如您上面引用的文档中所示。

于 2013-11-05T20:16:42.577 回答