with - c# enum string



Wie kann ich Zeichenfolgen für C#enum-Werte internationalisieren? (2)

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?

Soll ich einfach eine Erweiterungsmethode wie diese erstellen, die die richtige Zeichenfolge aus einer Ressourcendatei zurückgibt? Gibt es eine Möglichkeit, Attribute (wie "Beschreibung") zu lokalisieren, die in solchen Lösungen verwendet werden ?

Welches ist die bevorzugte Lösung - Erweiterungsmethode 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.

BEARBEITEN - Beispiel:

Angesichts der folgenden Enum,

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

Ich möchte einen Weg, um jeden Typ einer lokalisierten Zeichenkette zuzuordnen. 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 beginne damit, ein benutzerdefiniertes Attribut für jeden aufgezählten Wert zu erstellen. Das Attribut hat einen Basisnamen und einen Schlüssel für die Ressourcendatei, die lokalisierte Zeichenfolgen enthält. In der obigen enum, zum Beispiel, habe ich das:

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

Wobei "FinanacialTransaction" die Resx-Datei ist und "Check" der String-Schlüssel ist. 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.


Answer #1

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 bekommen. 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 werden Übersetzungsunternehmen wahrscheinlich darauf vorbereitet sein, mit Resx-Dateien umzugehen - sie werden sich nicht in Ihrem Quellcode herumärgern wollen, und Sie sollten es ihnen sowieso nicht erlauben :)

Verwenden Sie nur 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.

BEARBEITEN: Um die enum-Werte den Ressourcennamen zuzuordnen, würde ich einfach so etwas tun:

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

Dann könnten Sie tun:

string resource = MyEnum.SomeValue.ToResourceName();

Offensichtlich führt dies jedes Mal eine Kettenverkettung durch - Sie könnten diese Zwischenspeicherung durchführen, wenn Sie das möchten, aber ich würde mich nicht darum kümmern, wenn Sie nicht Anzeichen dafür hätten, dass es sich tatsächlich um ein Problem handelt.

Das hindert Sie natürlich nicht daran, die Erweiterungsmethode für Nicht-Enums zu verwenden. Wenn du das willst, brauchst du etwas wie Unconstrained Melody .


Answer #2

Ich fuhr mit den benutzerdefinierten Attributen fort und erstellte diese Hilfsmethode:

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




internationalization