Я сделал другой подход.Вам все еще нужно, чтобы вы унаследовали DataAnnotation
атрибуты, но вы можете получить более гибкое решение для перевода.
Код из моего блога (читайте его подробнее)
Конечный результат
public class User
{
[Required]
[LocalizedDisplayNameAttribute("User_Id")]
public int Id { get; set; }
[Required]
[StringLength(40)]
[LocalizedDisplayNameAttribute("User_FirstName")]
public string FirstName { get; set; }
[Required]
[StringLength(40)]
[LocalizedDisplayNameAttribute("User_LastName")]
public string LastName { get; set; }
}
1 Унаследовать все атрибуты аннотаций данных, подобные этому
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
private string _displayName;
public RequiredAttribute()
{
ErrorMessageResourceName = "Validation_Required";
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
_displayName = validationContext.DisplayName;
return base.IsValid(value, validationContext);
}
public override string FormatErrorMessage(string name)
{
var msg = LanguageService.Instance.Translate(ErrorMessageResourceName);
return string.Format(msg, _displayName);
}
}
2 Унаследовать DisplayNameAttribute
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
private PropertyInfo _nameProperty;
private Type _resourceType;
public LocalizedDisplayNameAttribute(string className, string propertyName)
: base(className + (propertyName == null ? "_Class" : ("_" + propertyName)))
{
}
public override string DisplayName
{
get
{
return LanguageService.Instance.Translate(base.DisplayName) ?? "**" + base.DisplayName + "**";
}
}
}
3.Создайте языковую службу (в ней можно переключиться на любой источник языка)
public class LanguageService
{
private static LanguageService _instance = new LanguageService();
private List<ResourceManager> _resourceManagers = new List<ResourceManager>();
private LanguageService()
{
}
public static LanguageService Instance { get { return _instance; } }
public void Add(ResourceManager mgr)
{
_resourceManagers.Add(mgr);
}
public string Translate(string key)
{
foreach (var item in _resourceManagers)
{
var value = item.GetString(key);
if (value != null)
return value;
}
return null;
}
}
Наконец, вам нужно зарегистрировать таблицы строк, которые вы используете для перевода сообщений проверки и ваших моделей
LanguageService.Instance.Add(MyNameSpace.ModelResource.ResourceManager);
LanguageService.Instance.Add(MyNameSpace.ValidationResources.ResourceManager);