【问题标题】:How can I internationalize strings representing C# enum values?如何国际化表示 C# 枚举值的字符串?
【发布时间】:2010-05-25 14:02:21
【问题描述】:

我已经看到很多关于将字符串映射到枚举以及反之亦然的问题和答案,但是如何将一系列本地化字符串映射到枚举?

我应该只创建一个从资源文件返回正确字符串的extension method like this 吗?有没有办法本地化 solutions like this 中使用的属性(如“描述”)?

这是首选解决方案 - 扩展方法或属性。在我看来,这不是属性的预期目的。事实上,现在我想起来了,如果我要使用扩展方法,一个属性似乎是我用来在资源文件中为我想用来代替枚举值的本地化字符串指定一个键的东西。

编辑 - 示例:

鉴于以下枚举,

public enum TransactionTypes {
    Cheque = 1,
    BankTransfer = 2,
    CreditCard = 3
}

我想要一种将每种类型映射到本地化字符串的方法。我从枚举的扩展方法开始,它使用 switch 语句和对资源文件的强类型引用。

但是,每个枚举的扩展方法似乎并不是一个很好的解决方案。我已经开始关注this 为每个枚举值创建一个自定义属性。该属性具有包含本地化字符串的资源文件的基本名称和键。例如,在上面的枚举中,我有这个:

...
[EnumResourceAttribute("FinancialTransaction", "Cheque")]
Cheque = 1,
...

其中“FinanacialTransaction”是 resx 文件,“Cheque”是字符串键。我正在尝试创建一个实用程序方法,我可以将任何枚举中的任何值传递给该方法,并让它返回该值的本地化字符串表示形式,假设指定了自定义属性。我只是不知道如何动态访问资源文件和其中的键。

【问题讨论】:

    标签: c# enums attributes string internationalization


    【解决方案1】:

    我肯定会建议使用资源文件,可能使用方法(扩展或其他方式)来简化获取相关资源的过程。随着您支持的语言数量的增加,您真的不希望代码充满文本,从而分散您对值本身的注意力。

    同样,翻译公司很可能已经准备好处理 resx 文件 - 他们不会想在你的源代码中乱来,你也不应该让他们这样做 :)

    只需使用以枚举名称和其中的值为键的资源。直截了当,可扩展到多种枚举和多种语言,不会弄乱您的源代码,与翻译工具配合得很好,并且基本上与 .NET 中的 i18n 流程保持一致。

    编辑:为了将枚举值映射到资源名称,我只需执行以下操作:

    public static string ToResourceName<T>(this T value) where T : struct
    {
        return typeof(T).Name + "." + value;
    }
    

    那么你可以这样做:

    string resource = MyEnum.SomeValue.ToResourceName();
    

    显然,这是每次都执行字符串连接 - 如果你愿意,可以缓存它,但除非你有迹象表明这实际上是一个问题,否则我不会打扰。

    当然,这不会阻止您使用非枚举的扩展方法。如果你想这样做,你需要像Unconstrained Melody 这样的东西。

    【讨论】:

    • 我应该更清楚一点——我不会使用资源文件以外的任何东西(我们已经将它们用于需要 i18n 的所有其他东西)。我正在寻找将资源字符串映射到枚举的解决方案。
    • @Duke:好吧,你想要什么还不是很清楚——我已经用一个非常简单的扩展方法更新了我的答案,但我怀疑你追求的不止这些......
    • 我用例子做了一个很大的编辑,到目前为止我想出了什么。
    【解决方案2】:

    我继续使用自定义属性并创建了这个实用方法:

        public static string getEnumResourceString(Enum value)
        {
            System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString());
            EnumResourceAttribute attr = (EnumResourceAttribute)System.Attribute.GetCustomAttribute(fi, typeof(EnumResourceAttribute));
            return (string)HttpContext.GetGlobalResourceObject(attr.BaseName, attr.Key);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2010-09-30
      • 2022-06-22
      • 1970-01-01
      • 2017-05-07
      相关资源
      最近更新 更多