我做了很多研究,但我不确定如何继续这样做。
通常的本地化只会在语言发生变化时发生变化,因此法语版的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);
}
}
}
我正在寻找使用最少代码实现此功能的最佳方法..
谢谢!
答案 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)