code it

Martins Tech Blog

Lokalisierung von Enumerationen

Bei der Entwicklung mehrsprachiger Anwendungen kommt man meist auch an die Stelle, in der Enumerationen lokalisiert werden sollen. In meinem Beispiel ist das der Status eines Artikels. Das Enum ist wir folgt definiert:

public enum ArticleStatus
{
    Active = 0,
    Inactive = 1,
    Deleted = 2
}

Das Objekt Artikel selbst hat eine entsprechende Eigenschaft, in der der Status dargestellt wird.

public ArticleStatus Status
{
    get { return this.status; }
    set { this.status = value; }
}

Was in rein englischsprachigen Anwendungen mit article.Status.ToString() noch recht einfach ist, stellt sich in multilangualen Anwendungen schon schwieriger dar. Wie bekommt man die String-Repräsentation mehrsprachig? Eine sehr elegante und variable Möglichkeit ist die Verwendung von Enumconvertern. Diese bieten als zusätzliches Goodie Design-Time-Support, aber das nur als Randbemerkung. Der erste Schritt ist die Erzeugung einer neuen Konverter-Klasse. Diese erbt von EnumConverter. Die eigentliche Konvertierung nimmt die überschriebene Methode ConvertTo vor.

internal class ArticleStatusConverter : EnumConverter
{
    public ArticleStatusConverter(Type type) : base(type) { }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (value != null && destinationType == typeof(string))
        {
            ArticleStatus objectToConvert = (ArticleStatus)value;
            CultureInfo currentCulture = culture jQuery1520972166896564886_1309626526281 CultureInfo.CurrentCulture;

            return MyResourceManager.getLocalizedText(string.Concat("ArticleStatus_", (int)value), currentCulture)
        }
        else
        {
            return base.ConvertTo(context, culture, value, destinationType);
        }

    }
}

Damit die Methode jetzt verwendet werden kann, muss zunächst dem Enum per Attribut der EnumConverter zugewiesen werden.

[TypeConverter(typeof(ArticleStatusConverter))]
public enum ArticleStatus
{
    ...
}

Nun könnte man davon ausgehen, dass dadurch .ToString()  auch gleich überschreiben wurde. Das ist aber nicht der Fall. Der Code, um auf die eben implementierte Funktionalität zugreifen zu können, ist etwas komplizierter, aber dennoch logisch:

string statusAsString = (string)TypeDescriptor
    .GetConverter(typeof(ArticleStatus))
    .ConvertTo(article.Status, typeof(string));