-
Notifications
You must be signed in to change notification settings - Fork 13
/
ValidationLocalizer.cs
112 lines (92 loc) · 3.49 KB
/
ValidationLocalizer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Resources;
using System.Web.Mvc;
using DA = System.ComponentModel.DataAnnotations;
namespace Knoema.Localization.Mvc
{
public class ValidationLocalizer : DataAnnotationsModelValidatorProvider
{
private ResourceManager _resourceManager;
public ValidationLocalizer()
{
var resourceStringType = typeof(RequiredAttribute).Assembly.GetType("System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources");
if (resourceStringType != null)
_resourceManager = new ResourceManager(resourceStringType);
}
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
if (metadata.ContainerType == null)
return base.GetValidators(metadata, context, attributes);
if (CultureInfo.CurrentCulture.IsDefault())
return base.GetValidators(metadata, context, attributes);
if (metadata.ContainerType.GetCustomAttributes(typeof(LocalizedAttribute), true).Length == 0)
return base.GetValidators(metadata, context, attributes);
var attrs = attributes.OfType<ValidationAttribute>();
if (attrs.Count() > 0)
{
var list = new List<Attribute>();
foreach (var a in attrs)
{
var attr = CopyAttribute(a);
var text = metadata.PropertyName + "_" + attr.GetType().Name;
var obj = LocalizationManager.Instance.FormatScope(metadata.ContainerType);
attr.ErrorMessage = LocalizationManager.Instance.Translate(obj, text);
if (string.IsNullOrEmpty(attr.ErrorMessage))
attr.ErrorMessage = a.ErrorMessage ?? GetValidationString(attr.GetType());
list.Add(attr);
}
return base.GetValidators(metadata, context, list);
}
return base.GetValidators(metadata, context, attributes);
}
private ValidationAttribute CopyAttribute(ValidationAttribute attribute)
{
ValidationAttribute result = null;
if (attribute is RangeAttribute)
{
var attr = (RangeAttribute)attribute;
result = (attr.Minimum is double)
? new RangeAttribute((double)attr.Minimum, (double)attr.Maximum)
: new RangeAttribute((int)attr.Minimum, (int)attr.Maximum);
}
if (attribute is RegularExpressionAttribute)
{
var attr = (RegularExpressionAttribute)attribute;
result = new RegularExpressionAttribute(attr.Pattern);
}
if (attribute is RequiredAttribute)
result = new RequiredAttribute();
if (attribute is StringLengthAttribute)
{
var attr = (StringLengthAttribute)attribute;
result = new StringLengthAttribute(attr.MaximumLength)
{
MinimumLength = attr.MinimumLength
};
}
if (attribute is DA.CompareAttribute)
{
var attr = (DA.CompareAttribute)attribute;
result = new DA.CompareAttribute(attr.OtherProperty);
}
if (attribute is DataTypeAttribute)
{
var attr = (DataTypeAttribute)attribute;
result = new DataTypeAttribute(attr.DataType);
}
if (result == null && attribute.GetType().GetInterfaces().Contains(typeof(ICloneable)))
result = ((ICloneable)attribute).Clone() as ValidationAttribute;
return result;
}
private string GetValidationString(Type type)
{
return _resourceManager == null
? null
: _resourceManager.GetString(string.Format("{0}_ValidationError", type.Name));
}
}
}