ASP.NET自定义本地化

时间:2012-03-19 20:00:23

标签: asp.net-mvc localization resourceproviderfactory

我做了很多研究,但我不确定如何继续这样做。

通常的本地化只会在语言发生变化时发生变化,因此法语版的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);
        }
    }
}

我正在寻找使用最少代码实现此功能的最佳方法..

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

public class SomeObject(){

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

}

所以,在我们的视图中,工作必须由htmlhelper完成(假设razor像渲染引擎,模型是“SomeObject”的类型)

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

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