2010-05-25 12 views
5

Ich habe viele Fragen und Antworten zum Zuordnen von Strings zu Enums und umgekehrt gesehen, aber wie kann ich eine Reihe lokalisierter Strings zu Enums zuordnen?Wie kann ich Zeichenfolgen für C# enum-Werte internationalisieren?

Sollte ich nur eine extension method like this erstellen, die die richtige Zeichenfolge aus einer Ressource-Datei zurückgibt? Gibt es eine Möglichkeit, Attribute (wie "Beschreibung") zu lokalisieren, die in solutions like this verwendet werden?

Welche ist die bevorzugte Lösung - Erweiterung Methode oder Attribute. Es scheint mir, dass dies nicht der beabsichtigte Zweck von Attributen ist. In der Tat, jetzt, wo ich darüber nachdenke, wenn ich eine Erweiterungsmethode verwende, scheint ein Attribut etwas zu sein, das ich verwenden würde, um einen Schlüssel in einer Ressourcendatei für die lokalisierte Zeichenfolge anzugeben, die ich anstelle des Aufzählungswerts verwenden möchte.

EDIT - Beispiel:

die folgenden Aufzählungstyp,

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

ich einen Weg möchte jede Art an einen lokalisierten String abzubilden. Ich begann mit einer Erweiterungsmethode für die Enumeration, die eine switch-Anweisung und stark typisierte Verweise auf die Ressourcendatei verwendet.

Eine Erweiterungsmethode für jedes Enum scheint jedoch keine gute Lösung zu sein. Ich habe begonnen, this zu folgen, um ein benutzerdefiniertes Attribut für jeden aufgelisteten Wert zu erstellen. Das Attribut hat einen Basisnamen und einen Schlüssel für die Ressourcendatei, die lokalisierte Zeichenfolgen enthält. In der obigen Aufzählung, zum Beispiel habe ich dies:

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

Wo „FinanacialTransaction“ ist die resx Datei und „Check“ ist die String-Taste. Ich versuche, eine Hilfsmethode zu erstellen, zu der ich einen beliebigen Wert aus einer Aufzählung übergeben und die lokalisierte Zeichenfolgendarstellung dieses Werts zurückgeben könnte, vorausgesetzt, das benutzerdefinierte Attribut wurde angegeben. Ich kann einfach nicht herausfinden, wie man dynamisch auf eine Ressourcendatei und einen darin enthaltenen Schlüssel zugreift.

Antwort

2

ich mit den benutzerdefinierten Attributen fortgesetzt und erstellt diese Dienstprogramm Methode:

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); 
    } 
8

Ich würde definitiv vorschlagen, eine Ressourcendatei zu verwenden, wahrscheinlich mit einer Methode (Erweiterung oder anders), um es einfach zu machen, die relevante Ressource zu ergattern. Wenn die Anzahl der unterstützten Sprachen wächst, möchten Sie nicht, dass der Code voller Text ist und Sie von den Werten selbst ablenkt.

Ebenso Übersetzungsfirmen sind wahrscheinlich resx Dateien zu verarbeiten gerüstet zu sein - sie sind nicht um in Ihrem Quellcode zu verwirren gehen zu wollen, und Sie sollten sie nicht so sowieso tun lassen :)

Nur Verwenden Sie Ressourcen, die auf den Namen der Enumeration und den darin enthaltenen Wert abgestimmt sind. Unkompliziert, skaliert auf mehrere Enums und mehrere Sprachen, verstopft Ihren Quellcode nicht, funktioniert gut mit Übersetzungstools und ist im Grunde mit dem Fluss von i18n innerhalb von .NET kompatibel.

EDIT: die ENUM-Werte zu den Ressourcennamen für die Zuordnung, würde ich nur so etwas wie:

string resource = MyEnum.SomeValue.ToResourceName(); 

Offensichtlich jedes Mal, das ist die Durchführung String-Verkettung:

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

Dann Sie tun können, - Sie könnte Cache, wenn Sie wollten, aber ich würde nicht stören, wenn Sie ein Anzeichen dafür, dass es tatsächlich ein Problem war.

Das hindert Sie natürlich nicht daran, die Erweiterungsmethode für Nicht-Enums zu verwenden. Wenn Sie das tun möchten, benötigen Sie etwas wie Unconstrained Melody.

+0

+1 Ich war 1 min zu spät :) –

+0

ich mehr klar gewesen sein sollte - ich würde nichts anderes verwenden als Ressourcendateien (wir verwenden sie bereits für alles andere, was i18n benötigt). Ich suche nach Lösungen zum Zuordnen der Ressourcenstrings zu der Enumeration. – Matt

+0

@Duke: Okay, es ist nicht ganz klar, was du willst - ich habe meine Antwort mit einer sehr einfachen Erweiterungsmethode aktualisiert, aber ich vermute, dass du nach etwas mehr als dem ... –

Verwandte Themen