2

列挙型から入力されるドロップダウンがあります。マイ ソリューション プロジェクトは、ドメイン プロジェクトと UI プロジェクトの 2 つの部分で構成されます。この列挙型はドメイン モデルの一部であるため、ドメイン プロジェクト内に配置されます。

public enum ActivityStatus
    {
        InProgress = 0,
        Completed = 1,
        Freezed = 2,
        NotStarted = 3,
        None = 4
    }

RESX ファイルを使用して、UI のドロップダウン コンテンツをローカライズしたいと考えています。いくつかのソリューションを調べたところ、Enum フィールドにカスタム属性を提供することが提案されました。しかし、ローカリゼーションは私のドメイン モデルの範囲外だと思うので、ここでこれらの属性を持ちたいと思います。UI をローカライズする方法はありますか?

4

2 に答える 2

4

また、プロジェクトでローカライズされたいくつかの列挙を作成したため、列挙で注釈を作成するために、次のようなクラスがあります。

public class LocalizedEnumAttribute : DescriptionAttribute
{
    private PropertyInfo _nameProperty;
    private Type _resourceType;

    public LocalizedEnumAttribute(string displayNameKey)
        : base(displayNameKey)
    {
    }

    public Type NameResourceType
    {
        get
        {
            return _resourceType;
        }
        set
        {
            _resourceType = value;

            _nameProperty = _resourceType.GetProperty(this.Description, BindingFlags.Static | BindingFlags.Public);
        }
    }

    public override string Description
    {
        get
        {
            //check if nameProperty is null and return original display name value
            if (_nameProperty == null)
            {
                return base.Description;
            }

            return (string)_nameProperty.GetValue(_nameProperty.DeclaringType, null);
        }
    }
}

EnumHelperローカライズされた列挙値の辞書を作成するためにプロジェクトで使用するクラスもあります。

public static class EnumHelper
{
    // get description data annotation using RESX files when it has
    public static string GetDescription(Enum @enum)
    {
        if (@enum == null)
            return null;

        string description = @enum.ToString();

        try
        {
            FieldInfo fi = @enum.GetType().GetField(@enum.ToString());

            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Any())
                description = attributes[0].Description;
        }
        catch
        {
        }

        return description;
    }

    public static IDictionary<TKey, string> GetEnumDictionary<T, TKey>()
        where T : struct 
    {
        Type t = typeof (T);

        if (!t.IsEnum)
            throw new InvalidOperationException("The generic type T must be an Enum type.");

        var result = new Dictionary<TKey, string>();

        foreach (Enum r in Enum.GetValues(t))
        {
            var k = Convert.ChangeType(r, typeof(TKey));

            var value = (TKey)k;

            result.Add(value, r.GetDescription());
        }

        return result;
    }
}

public static class EnumExtensions
{
    public static string GetDescription(this Enum @enum)
    {
        return EnumHelper.GetDescription(@enum);
    }
}

このクラスを使用すると、列挙型で使用できます。

public enum ActivityStatus 
{ 
    [LocalizedEnum("InProgress", NameResourceType = typeof(Resources.Messages))]
    InProgress = 0, 

    [LocalizedEnum("Completed", NameResourceType = typeof(Resources.Messages))]
    Completed = 1, 

    [LocalizedEnum("Freezed", NameResourceType = typeof(Resources.Messages))]
    Freezed = 2, 

    [LocalizedEnum("NotStarted", NameResourceType = typeof(Resources.Messages))]
    NotStarted = 3, 

    [LocalizedEnum("None", NameResourceType = typeof(Resources.Messages))]
    None = 4 
}

このコンボ ボックスを作成するには、asp.net mvc のコントローラーで次のように使用できます。

var data = EnumHelper.GetEnumDictionary<ActivityStatus, int>();
于 2013-07-01T19:54:29.503 に答える
2

HttpContext.GetGlobalResourceObject()列挙型名のローカライズされた文字列を取得するために使用できると思います:

// here you get a list of localized strings from `SiteResources.resx` where the keys of strings present by enum names
var names = (Enum.GetNames(typeof(ActivityStatus)).Select(x => HttpContext.GetGlobalResourceObject("SiteResources", x).ToString()).ToList();
于 2013-07-01T19:43:48.173 に答える