ASP.NET локализация Core DisplayAttribute
по словам документация:
среда выполнения не ищет локализованные строки для атрибутов без проверки. В приведенном выше коде "электронная почта "(от [Display (Name = "Email")]) не будет локализована.
Я ищу способ локализации текста в DisplayAttribute. Любые предложения, чтобы сделать это правильно(с)?
5 ответов
вы можете установить ResourceType
на DisplayAttribute
который можно использовать для локализации текста.
добавить ресурс .resx
файл в ваш проект, например MyResources.resx
, и добавьте ресурс для своего поля:
затем укажите имя поля и MyResources
введите DisplayAttribute
[Display(Name = "RememberMe", ResourceType = typeof(MyResources))]
public bool RememberMe { get; set; }
локализованный ресурс будет вытягиваться автоматически (см. текст box)
Примечание: в настоящее время в 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
делая это, у вас теперь есть глобальная переменная Локализатор для использования в любом из представлений в целях локализации.
вы можете найти более подробную информацию о глобализация и локализация в ASP.NET ядро
на самом деле я нашел простое решение для последователей. Отображаемое имя в большинстве случаев используется в метке поля ввода. Так что сделайте это, если хотите:
<label asp-for="Email">@Localizer["Email"]</label>
конечно, вы можете передать имя имущества @Html.DisplayNameFor
, но в большинстве случаев это уже работает хорошо.
для тех, кто борется (@lucius, @vladislav) с ошибкой:
не удается получить значение свойства 'имя потому что локализация не удалась. Тип'Xxxx.EmployeeResx 'не является общедоступным или не содержит общедоступного статического строкового свойства с именем' "имя"'.
это вызвано модификатором доступа on .файлы resx, который по умолчанию установлен в внутренние (в моем случае это был код ). Измените его на общественные в модификатор доступа в тулбаре файл ресурсов.
после этого вы сможете увидеть свойства из типа ресурса:
кроме того, не следует использовать специальные знаки в именах полей, поскольку они являются основой для автоматически генерируемых имен свойств C#. Имена полей преобразуются в понятные имена C#, и именно поэтому в результате может возникнуть несоответствие между именем Поля файла ресурса и именем автоматически сгенерированного свойства. Лучше избегать дефисов -
и точки .
подчеркивание _
хорошо. Вы всегда можете посмотреть, как выглядят автоматически сгенерированные свойства в 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
должно быть полное имя класса ресурсов (т. е. включая пространство имен).