Пользовательская локализация ASP.NET
Я провел немало исследований, и я не уверен, как мне поступить с этим.
Обычная локализация будет меняться только при изменении языка, поэтому 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 ответ
Есть лучший способ, аннотации данных - ваш ответ!
это всего лишь пример, вам нужно углубиться в 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