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

Согласно документации:

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

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


comment
Для обеспокоенных современных читателей, таких как я, которые оказались здесь: это не проблема в более поздних версиях фреймворка. Как заявляет Microsoft, в ASP.NET Core MVC 1.1.0 и более поздних версиях непроверочные атрибуты локализованы.   -  person MarredCheese    schedule 23.10.2020


Ответы (5)


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

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

введите здесь описание изображения

Затем укажите имя поля и тип MyResources в вашем DisplayAttribute

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

Локализованный ресурс будет загружен автоматически (см. текстовое поле).

введите здесь описание изображения

person Sock    schedule 17.06.2016
comment
Кажется странным, что атрибуты без проверки не локализованы в соответствии с этим новым механизмом локализации ядра asp.net. Как вы думаете, возможно ли реализовать это и для атрибутов без проверки, или есть причина, по которой ребята из mvc пропустили атрибуты без проверки? - person David; 18.06.2016
comment
Согласен, немного странно! Я предполагаю, что должна быть причина, по которой они решили этого не делать, но я не уверен, что это пришло мне в голову. Вы всегда можете спросить на GitHub и посмотреть, что они говорят. - person Sock; 19.06.2016
comment
Я получаю The type or namespace 'MyResources' could not be found. Что мне не хватает? - person Lucius; 02.08.2016
comment
Здравствуйте, я использую .NET Core 1.0.0, и эта реализация выдает следующую ошибку: InvalidOperationException: не удается получить свойство «Имя», поскольку локализация не удалась. Тип «‹full_typename›» не является общедоступным или не содержит общедоступного свойства статической строки с именем «RememberMe». У кого-нибудь есть опыт с этой ошибкой? - person Vladislav; 02.09.2016

Наличие центрального местоположения для всей вашей локализации, будь то представление или аннотации данных, — лучший подход, который я могу придумать, и именно так я начал работать. В файле Startup.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 будет из Resources.{culture}.rex -( Файл ресурсов должен иметь модификатор доступа No code gen ) - при условии, что для языка по умолчанию не потребуются никакие ресурсы, и чтобы иметь доступ к файлу ресурсов, поскольку код не будет сгенерирован и должен быть создан пустой класс с тем же именем.

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

@inject IHtmlLocalizer<Resources> Localizer

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

Вот как центральное расположение для локализации строк

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

person Rahma Samaroon    schedule 11.09.2017

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

Не удалось получить свойство "Name", так как не удалось выполнить локализацию. Тип «Xxxx.EmployeeResx» не является общедоступным или не содержит общедоступного статического строкового свойства с именем «FirstName».

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

person Prolog    schedule 24.05.2018

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

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

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

person holmescn    schedule 03.12.2016
comment
Работает, как и ожидалось, спасибо .. после многих часов я вижу ваш ответ, и он работает как шарм !! - person vivek ramasamy; 26.11.2020
comment
Я ищу аналогичное решение даже для объявления Display. Поскольку в большинстве случаев имя свойства является отображаемым именем, мы должны иметь возможность объявить ‹code› [Display] [EmailAddress] public string Email { get; набор; } ‹/code› Это должно автоматически использовать имя свойства «Электронная почта» для перевода - person Nathan; 25.02.2021

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

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

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

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

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

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

person feradz    schedule 11.09.2016