[英]How can I internationalize strings representing C# enum values?
我已經看到很多關於將字符串映射到枚舉的問題和答案,反之亦然,但是如何將一系列本地化字符串映射到枚舉?
我應該只創建一個這樣的擴展方法 ,從資源文件中返回正確的字符串嗎? 有沒有辦法本地化在這樣的解決方案中使用的屬性(如“描述”)?
哪個是首選解決方案 - 擴展方法或屬性。 在我看來,這不是屬性的預期目的。 事實上,現在我考慮一下,如果我使用擴展方法,屬性似乎就像我用來在資源文件中為我想要用來代替枚舉值的本地化字符串指定一個鍵。
編輯 - 示例:
鑒於以下枚舉,
public enum TransactionTypes {
Cheque = 1,
BankTransfer = 2,
CreditCard = 3
}
我想要一種方法將每種類型映射到本地化的字符串。 我開始使用枚舉的擴展方法,該方法使用switch語句和對資源文件的強類型引用。
但是,每個枚舉的擴展方法似乎不是一個很好的解決方案。 我已經開始遵循此操作為每個枚舉值創建自定義屬性。 該屬性具有包含本地化字符串的資源文件的基本名稱和鍵。 例如,在上面的枚舉中,我有:
...
[EnumResourceAttribute("FinancialTransaction", "Cheque")]
Cheque = 1,
...
其中“FinanacialTransaction”是resx文件,“Check”是字符串鍵。 我正在嘗試創建一個實用程序方法,我可以從任何枚舉中傳遞任何值,並讓它返回該值的本地化字符串表示形式,假設指定了自定義屬性。 我無法弄清楚如何動態訪問資源文件及其中的密鑰。
我肯定建議使用資源文件,可能使用方法(擴展名或其他方法),以便輕松獲取相關資源。 隨着您支持的語言數量的增長,您並不希望代碼充滿文本,從而分散您對值本身的注意力。
同樣,翻譯公司很可能已經准備好處理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這樣的東西。
我繼續使用自定義屬性並創建了此實用程序方法:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.