Ниже приводится содержание, если они решат удалить его когда-нибудь:
дин вопрос локализации 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, так как он всегда ищет ключ ресурса, называемый так же, как атрибут в файле пользовательских ресурсов. (например, «Required» требуется запись «RequiredAttribute» в файле ресурсов)
Другие атрибуты, такие как StringLength, имеют более одного сообщения об ошибке, в зависимости от используемых необязательных параметров. Итак, если у вас есть модель вроде:
public class Person
{
[Required]
[StringLengthLocalizedAttribute(10, MinimumLength = 5)]
[Display(Name = "User name")]
public string UserName { get; set; }
}
Сообщение об ошибке "ПолеИмя пользователя$12Ресурс по умолчанию для аннотаций данных в ASP.NET MVC13$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}» в моей локализованной строке.
Спасибо серги