ASP.NET локализация атрибута Core DisplayAttribute


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

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

Я ищу способ локализации текста в DisplayAttribute. Есть предложения сделать это надлежащим образом?

5 7

5 ответов:

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

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

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

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

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

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

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

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

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

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

@inject IHtmlLocalizer<Resources> Localizer
Таким образом, теперь у вас есть глобальная переменная Localizer, которая будет использоваться в любом из представлений для целей локализации.

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

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

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

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

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

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

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

Это вызвано модификатором доступа on .resx-файлы, которые по умолчанию имеют значение Internal (в моем случае это было No code generation ). Измените его на public в Access Раскрывающийся список модификатора на панели инструментов файл ресурсов.

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

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

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

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

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

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

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

Проект можно найти здесь 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 должно быть полное имя класса ресурсов (т. е. включая пространство имен).