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

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

Среда выполнения не ищет локализованные строки для атрибутов без проверки. В приведенном выше коде "Электронная почта" (из [Показать (Имя = "Электронная почта")]) не будет локализована.

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

@inject IHtmlLocalizer<Resources> Localizer

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

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

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

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

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

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

Https://i.imgur.com/q3BK8T5.png

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

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

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

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

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

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

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

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

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

В моих проектах asp.net core 7 Razor я добавляю это в program.cs, чтобы автоматически локализовать атрибут отображения:

      builder.Services.AddMvc()
derFormat.Suffix)
.AddViewLocalization()
.AddDataAnnotationsLocalization(options =>
{
    options.DataAnnotationLocalizerProvider = (type, factory) =>
    {
        var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName);
        return factory.Create("SharedResource", assemblyName.Name);
    };
});


[Display(Name = "RememberMe_QuestionMark")]
public bool RememberMe { get; set; }
Другие вопросы по тегам