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

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

最佳答案

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

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

关于c# - 如何国际化表示 C# 枚举值的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2905342/

相关文章:

sql - PostgreSQL 条件枚举

c# - 如何使用 nameof 获取 C# 属性中类中属性的完全限定名称?

ios - 具有不同 NSMutableParagraphStyle 的 Nsattributedstring

ruby-on-rails - rails : difference between attr_accessor and attr_accessible

vb6 - VB6 中的标志没有返回正确的值

c# - 测试C#代码的软件

c# - 为图像文件或一般文件设置默认构建操作

C# Task Parallel Library 第一次慢

c# - 多重采样在独占模式下不起作用

java - 如何为几个 Java 枚举添加常用方法? (抽象类的祖先?)