ASP.NET локализация атрибута Core DisplayAttribute
Среда выполнения не ищет локализованные строки для неподтвержденных атрибутов. В приведенном выше коде "Email" (from [Display (Name = "Email")]) не будет локализован.
Я ищу способ локализации текста в DisplayAttribute. Есть предложения сделать это надлежащим образом?
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 файл вводит следующее
Таким образом, теперь у вас есть глобальная переменная Localizer, которая будет использоваться в любом из представлений для целей локализации.@inject IHtmlLocalizer<Resources> 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 Раскрывающийся список модификатора на панели инструментов файл ресурсов.
После этого вы сможете увидеть свойства из типа ресурса:
Кроме того, не следует использовать специальные знаки в именах полей, поскольку они являются основой для автоматически генерируемых имен свойств C#. Имена полей преобразуются в понятные имена C#, поэтому может возникнуть несоответствие между именем Поля файла ресурсов и именем автоматически генерируемого свойства. Лучший чтобы избежать каких-либо дефисов
Большое спасибо Бале Муругану, который написал хорошую статью по этой теме наCode Digest .-
или точек.
, подчеркивания_
хороши. Вы всегда можете посмотреть, как автоматически генерируемые свойства выглядят в resource_file_name.Дизайнер.CS класс в соответствующем файле ресурсов.
Я только что создал проект, который демонстрирует локализацию, включая локализацию атрибута отображения для свойств класса, а также перечислений.
Проект можно найти здесь 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
должно быть полное имя класса ресурсов (т. е. включая пространство имен).