【问题标题】:How to represent countries and languages in C#?如何在 C# 中表示国家和语言?
【发布时间】:2010-12-30 13:20:07
【问题描述】:

我将从一个 xml 中检索这些数据,以便为数千个对象初始化它。

所以如果MyObjectCountryLanguage 属性,它们应该是什么,以及它们应该如何在代码和xml 中表示。

我正在考虑在代码中使用Enum

我只是在寻找其他人的意见,以找到最好的方法。是否所有语言和国家都在 BCL 中,所以我可以使用 min 而不是编写一个?

此外,CountryLanguage 不应组合使用。 Language 将不代表指定的Country 所使用的语言。

如何在代码和 Xml 中最好地实现这一点。

我应该这样做吗?:

<Language>English</Language>

【问题讨论】:

    标签: c# .net xml enums base-class-library


    【解决方案1】:

    考虑查看 CultureInfo's constructor that takes a string 的示例(例如“en-us”)

    提供有关特定的信息 文化(称为“语言环境”) 非托管代码开发)。这 信息包括名称 文化、书写系统、 使用的日历和格式 日期和排序字符串。

    它与现实世界中实际使用的内容相当具体(例如,国家/语言对是有意义的)。你也可以create your own cultures

    您指定该语言可能不是该国家/地区使用的语言。你能澄清一下你将使用它吗?如果没有更多信息,您似乎正在尝试定义类似于 CultureInfo 的内容。

    或者,您也可以定义一个简单的对象,它只有两个属性(Country 和 Language),其中 Country 是 ISO 3166-2 字符串,Language 是 ISO 639-1 string,如 Edward Loper suggests below

    您可以将 ISO 代码列表存储在 XML 文件中,并使用 traditional techniques 解析它们。我建议 CultureInfo 是因为您指定要查找 BCL 中已有的内容。

    使用枚举,一般来说,discouraged by the Framework Design Guidelines 用于开放集:

    不要对开集使用枚举(例如 作为操作系统版本,名称 你的朋友等等)。

    您可以采用混合方法,定义两个静态类,其中包含一堆静态readonly 字符串,如

    // ISO-3166-2 codes
    public static Countries
    {
       public static readonly string France = "FR";
       ...
    }
    
    // CultureInfo style codes
    public static Languages
    {
       public static readonly string BritishEnglish = "en-GB";
    }
    

    更新:根据您的评论,这是专门针对电影的,您仍然可以将 CultureInfo 用于制作它的文化和内容的文化。除此之外的任何事情对于微软来说都可能过于政治化,无法参与使其成为操作系统的一部分(c.f. this)。因此,您必须自己定义。

    【讨论】:

    • 谢谢,它有所有语言。除了拥有国家和语言之外,CultureInfo 会给我带来什么优势?我也认为这会给我更多的语言,对吧?比如新西兰英语、英国英语等?
    • +1 - 使用现有的。重新发明轮子是没有意义的。
    • 谢谢,但这是用于电影的。所以这部电影可以来自法国,但可以是英文的。
    • @Joan Venge - 啊,对不起。我只是略读了这个问题并错过了那一点。
    • 谢谢,不用担心。我不知道 CultureInfo,所以我向你学习,哈哈。
    【解决方案2】:

    ISO 639-2(语言名称表示代码)提供了一份相当完整的人类语言列表,以及可用于这些语言的标准代码:

    http://www.loc.gov/standards/iso639-2/php/code_list.php

    同样,ISO 3166-1 为所有国家/地区提供标准代码:

    http://en.wikipedia.org/wiki/ISO_3166-1

    【讨论】:

      【解决方案3】:

      我会使用预构建的序列化库(例如this tutorial)从 xml 中保存和检索。另外,我会避免使用枚举,而只使用字符串或 CultureInfo 之类的东西。

      【讨论】:

      • 但是我可以在 xml 中使用字符串并在代码中使用枚举,对吗?或者你的意思是你也不会在代码中使用枚举?
      • 我不会在代码中使用枚举。一般来说,如果有超过 3 或 4 种可能性,则枚举不是正确的方法。
      • 谢谢。你认为对于这种情况,这是一个不好的方法?对我来说,这似乎是最简单的。
      【解决方案4】:

      这可能是您可以使用元素的 xml:lang 属性的情况,如下所述:http://docs.oasis-open.org/dita/v1.1/OS/archspec/xmllang.html

      正如它所建议的那样,您可以使用“country-LANGUAGE”标识符作为语言环境。这可用于在反序列化时创建 CultureInfo 对象,即我将在我的代码中使用 CultureInfo 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多