如何将表示C#枚举值的字符串国际化?

时间:2010-05-25 14:02:21

标签: c# enums attributes string internationalization

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

我应该创建一个从资源文件中返回正确字符串的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文件,“Check”是字符串键。我正在尝试创建一个实用程序方法,我可以从任何枚举中传递任何值,并让它返回该值的本地化字符串表示形式,假设指定了自定义属性。我无法弄清楚如何动态访问资源文件及其中的密钥。

2 个答案:

答案 0 :(得分:8)

我肯定会建议使用资源文件,可能使用方法(扩展名或其他方法),以便轻松获取相关资源。随着您支持的语言数量的增长,您并不希望代码充满文本,从而分散您对值本身的注意力。

同样,翻译公司可能会准备好处理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这样的东西。

答案 1 :(得分: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);
    }