3

我已经做了很多研究,但我不确定我应该如何进行。

通常的本地化只会在语言发生变化时发生变化,因此法语的 Hello 将是 Bonjour,但我的应用程序需要为某些用户提供特殊关键字,因此 UserX 可能会说“Hello”需要是“Allo”。

我想拥有带有IdentityName_resourceKey的资源密钥,如果该密钥存在,则将其退回到resourceKey

我在想我需要一个自定义 ResourceProvider 但我的实现是一个简单的 if 语句,所以我不想编写一个完整的资源提供程序。

我写了一个 DisplayName 属性的扩展,它工作得很好,但这不是很好,因为我需要每个数据注释属性中的一个,如果我直接在页面或控制器中使用资源,这将不起作用......

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private readonly PropertyInfo _propertyInfo;

    public LocalizedDisplayNameAttribute(string resourceKey, Type resourceType) : base(resourceKey)
    {
        var clientName = CustomMembership.Instance.CurrentUser.Client.Name;

        _propertyInfo = resourceType.GetProperty(clientName + "_" + base.DisplayName, BindingFlags.Static | BindingFlags.Public) 
                            ?? resourceType.GetProperty(base.DisplayName, BindingFlags.Static | BindingFlags.Public);
    }

    public override string DisplayName
    {
        get
        {
            if (_propertyInfo == null)
            {
                return base.DisplayName;
            }

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

我正在寻找用最少的代码实现这一点的最佳方法..

谢谢!

4

1 回答 1

0

有更好的方法,数据注释就是你的答案!

这只是一个示例,您需要更深入地了解 System.Globalization.CultureInfo 和数据注释 (System.ComponentModel.DataAnnotations)

你可以像这样定义你的模型类(假设我们有一个名为 CustomResourceValues 的资源文件,其值为“strHello”)

public class SomeObject(){

    <Display(Name:="strHello", ResourceType:=GetType(My.Resources.CustomResourceValues))>
    public string HelloMessage{ get; set; }

}

所以,在我们看来,工作必须由 htmlhelper 完成(假设像渲染引擎一样剃须刀,模型是“SomeObject”的类型)

@Html.LabelFor(Function(x) x.HelloMessage)

基本信息http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayattribute.resourcetype(v=vs.95).aspx

于 2012-05-29T17:04:17.767 回答