ASP.NET локализация Core DisplayAttribute

по словам документация:

среда выполнения не ищет локализованные строки для атрибутов без проверки. В приведенном выше коде "электронная почта "(от [Display (Name = "Email")]) не будет локализована.

Я ищу способ локализации текста в DisplayAttribute. Любые предложения, чтобы сделать это правильно(с)?

5 ответов


вы можете установить ResourceType на DisplayAttribute который можно использовать для локализации текста.

добавить ресурс .resx файл в ваш проект, например MyResources.resx, и добавьте ресурс для своего поля:

enter image description here

затем укажите имя поля и MyResources введите DisplayAttribute

[Display(Name = "RememberMe", ResourceType  = typeof(MyResources))]
public bool RememberMe { get; set; }

локализованный ресурс будет вытягиваться автоматически (см. текст box)

enter image description here

Примечание: в настоящее время в RC2 есть ошибка, которая будет бросать NotImplementedException если вы используете нелатинские символы в значениях ресурсов:https://github.com/aspnet/Razor/issues/760


наличие центрального местоположения для всей вашей локализации, будь то в представлении или dataannotations, - лучший подход, который я могу придумать, и вот как я должен работать. В Автозагрузка.cs файл после установки пакетов nuget для локализации добавьте следующий код

services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(options => 
    options.DataAnnotationLocalizerProvider = (type, factory) => new StringLocalizer<Resources>(factory));

services.Configure<RequestLocalizationOptions>(options => {
   var cultures = new[]
   {
       new CultureInfo("en"),
       new CultureInfo("ar")
   };
   options.DefaultRequestCulture = new RequestCulture("en", "en");
   options.SupportedCultures = cultures;
   options.SupportedUICultures = cultures;
});

сюда DataAnnotationLocalizerProvider будет ресурсы.{культура.}Рекс!--4--> -( файл ресурсов должен иметь модификатор доступа из код ген!--4-->)- предполагая, что для языка по умолчанию не потребуются ресурсы, и чтобы иметь доступ к файлу ресурсов, так как код не будет сгенерирован и пустой класс с тем же именем должен быть создан.

и _ViewImports.cshtml по файл ввести следующее

@inject IHtmlLocalizer<Resources> Localizer

делая это, у вас теперь есть глобальная переменная Локализатор для использования в любом из представлений в целях локализации.

This is how a Central Location for String Localization

вы можете найти более подробную информацию о глобализация и локализация в ASP.NET ядро


на самом деле я нашел простое решение для последователей. Отображаемое имя в большинстве случаев используется в метке поля ввода. Так что сделайте это, если хотите:

<label asp-for="Email">@Localizer["Email"]</label>

конечно, вы можете передать имя имущества @Html.DisplayNameFor, но в большинстве случаев это уже работает хорошо.


для тех, кто борется (@lucius, @vladislav) с ошибкой:

не удается получить значение свойства 'имя потому что локализация не удалась. Тип'Xxxx.EmployeeResx 'не является общедоступным или не содержит общедоступного статического строкового свойства с именем' "имя"'.

это вызвано модификатором доступа on .файлы resx, который по умолчанию установлен в внутренние (в моем случае это был код ). Измените его на общественные в модификатор доступа в тулбаре файл ресурсов.

[https://i.imgur.com/q3BK8T5.png]

после этого вы сможете увидеть свойства из типа ресурса:

enter image description here

кроме того, не следует использовать специальные знаки в именах полей, поскольку они являются основой для автоматически генерируемых имен свойств C#. Имена полей преобразуются в понятные имена C#, и именно поэтому в результате может возникнуть несоответствие между именем Поля файла ресурса и именем автоматически сгенерированного свойства. Лучше избегать дефисов - и точки . подчеркивание _ хорошо. Вы всегда можете посмотреть, как выглядят автоматически сгенерированные свойства в resource_file_name.Дизайнер.cs класс в соответствующем файле ресурсов.

enter image description here

большое спасибо Бала Муруган, который написал хорошую статью на эту тему на Дайджест Код.


Я только что создал проект, который демонстрирует локализацию, включая локализацию атрибута отображения для свойств класса, а также перечислений.

проект можно найти здесь https://github.com/feradz/ASPNetCoreLocalization/wiki

атрибут отображения должен быть локализован с помощью подхода до ASP.NET ядро 1.0. Взгляните на DataAnnotations.resx файл в проекте.

на Name собственность Display не может содержать пустые места и специальные символы.

[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))]
public string FirstName { get; set; }

ResourceType должно быть полное имя класса ресурсов (т. е. включая пространство имен).