代码之家  ›  专栏  ›  技术社区  ›  Hauge

在多语言应用程序中使用的类库中表示性别的最佳方法

  •  3
  • Hauge  · 技术社区  · 14 年前

    我正在创建一个类库,其中包含一些常用的类,如人、地址等。这个类库将在多语言应用程序中使用,我正在寻找最方便的方法来表示人的性别。

    理想情况下,我希望能够这样编码:

    Person person = new Person { Gender = Genders.Male, 
                                 FirstName = "Nice", 
                                 LastName = "Dude" }
    
    if (person.Gender == Genders.Male)
      Console.WriteLine("person is Male");
    
    Console.WriteLine(person.Gender); //Should output: Male
    
    Console.WriteLine(person.Gender.ToString("da-DK")); 
    //Should output the name of the gender in the language provided
    
    List<Gender> genders = Genders.GetAll();
    foreach(Gender gender in genders)
    {
      Console.WriteLine(gender.ToString());
      Console.WriteLine(gender.ToString("da-DK"));
    }
    

    你会怎么做?列举和专门的性别分类?那么本地化呢?


    编辑:我想指出的是,这个问题至少是关于如何对一些类进行编码,这些类可以像上面那样编写代码,我没有性别类或性别枚举,我正在试图找出如何编写能够启用上述代码的代码。性别班会是什么样子?你会对性别使用枚举吗?

    当做
    杰斯帕·豪格

    4 回复  |  直到 14 年前
        1
  •  2
  •   João Angelo    14 年前

    我不会使用枚举,可能会选择创建 Gender 使用内部构造函数和 Genders 静态类以包含可用选项作为属性。这基本上与.NET中使用的方法相同,例如 System.Drawing.Color 它是相关联的 Colors 班级。

    在我看来,如果你有一个类而不是枚举,那么处理全球化就更容易了。

        2
  •  4
  •   Frederik Gheysels    14 年前

    您可以使用资源字符串来解决本地化问题。 您可以为每个性别值创建一个资源字符串,并为您支持的每个文化翻译它。

        3
  •  1
  •   Adam Robinson    14 年前

    您的业务和数据类不应该关心您正在进行本地化的事实,因为 本地化是(应该是)一个完全显示端操作 . 使用你所拥有的,因为它是可读和可维护的。

    要本地化这些值,.NET已经有一个内置的资源管理器,它根据 CurrentUICulture 值。对于这个特定的场景,您可以使用 ToString() 枚举中的值作为资源文件中的键。这将允许您为不同的区域性(如约定和资源管理器所期望的)创建不同的文件,每个文件都具有不同的值 "Male" "Female" .

    http://msdn.microsoft.com/en-us/magazine/cc163609.aspx

    http://msdn.microsoft.com/en-us/library/aa309421%28VS.71%29.aspx

        4
  •  -1
  •   Tejs    14 年前

    另一个选项是在枚举类型上创建扩展方法。例如:

    public static class GenderExtensions
    {
        public static string ToLocalizedText(this Gender gender)
        {
             // Lookup Localized content based on state of 'gender'
             return "This person is male";
        }
    }
    

    然后你可以简单地写

    gender.ToLocalizedText()
    

    而不是

    gender.ToString()