【问题标题】:What's the best way to provide localization for Enums?为枚举提供本地化的最佳方式是什么?
【发布时间】:2010-10-12 12:32:13
【问题描述】:

我正在编写一个使用许多枚举的多语言应用程序,我希望实现以下目标:

  1. 将枚举名称显示为本地化字符串
  2. 使用属性提供本地化描述
  3. 启用语言敏感的枚举解析回 int 值

我热衷于使用属性 + 资源文件来装饰枚举,以便可以从运行时类型信息中获取本地化字符串。在声明一个带有静态成员而不是枚举的静态类之前,我一直在走这条路,但这带来的问题与它解决的问题一样多。

某种基于 TypeDescriptor 的机制是否合适?甚至可能?

此外 - 如何以一种干净、通用、可重复使用的方式实现目标 3?


自从提出这个问题以来,我已经完成了需要可本地化枚举显示的开源库。我采用了实现 TypeConverters 的技术。完整源代码在http://measures.codeplex.com/

【问题讨论】:

  • +1 我喜欢度量库。

标签: c# localization internationalization enums


【解决方案1】:

为你的枚举写TypeConvertor怎么样?

  1. 定义一些自定义属性,用于识别枚举值的资源字符串。
  2. 编写 TypeConvertor,它将查找此属性以获取资源 id,然后将值转换为字符串。 (您可以使用相同的辅助类,但使用 TypeConvertor 和 TypeConvertorAttribute 可以更透明地使用它。
  3. 您可以编写一个通用类/方法来进行反向转换(从字符串到枚举)。该方法类似于Parse<T>(string value),其中 T 将是枚举类型。该实现将(按需)为给定的枚举类型 T 构建一个查找字典,使用反射来查找您的自定义属性。

【讨论】:

    【解决方案2】:

    我刚刚写了一个回答另一个线程,涉及一些东西。查看here 获取一些代码示例。

    【讨论】:

    • 我有一些与您已经发布的内容非常相似的内容,但它没有考虑使用枚举的本地化方面。您对本地化有任何答案吗?
    【解决方案3】:

    我认为你的方向是完全正确的——使用属性来装饰枚举成员。您可能需要做的唯一想法就是忘记System.ComponentModel,并设计您自己的一组属性,以尊重您的要求和整体应用程序架构。

    我们使用了相同的方法,它“以一种干净、通用、可重复使用的方式”按预期工作。我们因为不需要它而没有实现的唯一方面是实际的国际化。但是,这只是一些机制,需要您跟踪当前文化并决定在哪里选择资源文件。基本上,您可能需要在“多个属性”(每种语言一个)或“单个属性”(一个用于封装资源文件选择的所有语言)方法之间进行选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多