Еще один вопрос локализации MVC ...
Я пытаюсь локализовать приложение ASP.Net MVC 3, используя локализованные файлы ресурсов для отображения текстов в представлениях, как рекомендовано.
Проблема, как обычно, при попытке локализовать сообщения об ошибках по умолчанию из аннотаций данных.
Я знаю, что вы можете указать файл ресурса и ключ в каждом атрибуте:
[Required(
ErrorMessageResourceType = typeof(CustomResourceManager),
ErrorMessageResourceName = "ResourceKey")]
public string Username { get; set; }
и даже, что лучше и предпочтительнее, вы можете переопределить сообщение по умолчанию, например: Ресурс по умолчанию для аннотаций данных в ASP.NET MVC , поэтому вы можете оставить такие атрибуты как:
[Required]
public string Username { get; set; }
Этот последний подход - тот, которому я следовал, и он работает, но только когда DataAnnotation, которую вы хотите переопределить, имеет сообщение об ошибке ONE и ONLY ONE, так как он всегда ищет ключ ресурса, называемый тем же атрибутом в пользовательском ресурсефайл (например, «Обязательный» требует записи «RequiredAttribute» в файле ресурсов)
Другие атрибуты, такие как StringLength, имеют более одной ошибкисообщение, в зависимости от необязательных параметров, которые вы используете.Итак, если у вас есть такая модель:
public class Person
{
[Required]
[StringLengthLocalizedAttribute(10, MinimumLength = 5)]
[Display(Name = "User name")]
public string UserName { get; set; }
}
Сообщение об ошибке: « Поле Имя пользователя должно быть строкой с минимальной длиной 5 и максимальной длиной 10 ."
И если вы измените атрибут StringLength на:
[StringLengthLocalizedAttribute(10)]
, сообщение об ошибке изменится на" Поле Имя пользователя должно быть строкой с максимальной длиной 10 ."Таким образом, в этом случае, по крайней мере, есть 2 сообщения об ошибках по умолчанию для переопределения,и решения, заданные @ kim-tranjan, терпят неудачу.
Мое частичное решение этого заключается в реализации моего собственного атрибута StringLength, например:
public class StringLengthLocalizedAttribute : StringLengthAttribute
{
public StringLengthLocalizedAttribute(int maximumLength) : base(maximumLength)
{
ErrorMessageResourceType = typeof(CustomValidationResource);
}
public override string FormatErrorMessage(string name)
{
ErrorMessageResourceName = MinimumLength > 0 ? "StringLengthAttributeMinMax" : "StringLengthAttributeMax";
return base.FormatErrorMessage(name);
}
}
Где у меня есть локализованный ресурс "CustomValidationResource" ссообщения проверки и установите его как ErrorMessageResourceType.Затем, переопределяя функцию FormatErrorMessage, я решаю, какую строку сообщения следует применять в зависимости от необязательных параметров.
Итак, вопрос здесь такой: кто-нибудь знает, где можно найти полный список ключей ресурсов, используемых DataAnnotation?Атрибуты и посмотрите, сколько разных сообщений об ошибках у нас есть в каждом без проверки каждого из них?
Или, что еще лучше, можем ли мы иметь исходный файл RESX, чтобы увидеть строковые шаблоны и локализовать их, используя одни и те жеключи ресурса?Таким образом, изменение только ErrorMessageResourceType должно работать для всех атрибутов DataAnnotations, и мне не нужно угадывать, куда поместить «{1}» или «{2}» в моей локализованной строке.
Спасибо,Sergi