Hice otro enfoque. Todavía necesita que herede los atributos DataAnnotation
, pero puede obtener una solución de traducción más flexible.
Código de my blog post (leerlo Para mayor detalles)
El resultado final
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 Heredar todos los atributos de anotación de datos como éste
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 Heredar 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. Crear el servicio lingüístico (se puede cambiar a cualquier idioma de origen en ella)
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;
}
}
Por último es necesario registrar las tablas de cadenas que se utiliza para traducir los mensajes de validación y sus modelos
LanguageService.Instance.Add(MyNameSpace.ModelResource.ResourceManager);
LanguageService.Instance.Add(MyNameSpace.ValidationResources.ResourceManager);
¿Alguien puede arrojar luz sobre si esto es posible y cómo? para acercarse a esto Gracias. –
eche un vistazo a http://adamyan.blogspot.be/2010/02/aspnet-mvc-2-localization-complete.html Puede encontrar la lista de mensajes predeterminados aquí: http://stackoverflow.com/a/24186038/187650 – juFo