I немного боролись и, наконец, удалось составить рабочее решение по этому вопросу. Спасибо @Szymon Sasin за его ответ, хотя он не работает против последней версии, и его конфигурация является частичной, и это помогло мне построить это решение.
Во-первых, настроить локализацию на Startup.cs:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddLocalization(options => options.ResourcesPath = "Resources");
services
.AddMvc(mvcOptions =>
{
IServiceProvider provider = services.BuildServiceProvider();
IStringLocalizer localizer = provider.GetService<IStringLocalizer<DisplayResources>>();
mvcOptions.ModelMetadataDetailsProviders.Add(new DisplayAttributeLocalizationProvider(localizer));
});
//...
}
}
Во-вторых, проверьте структуру папок с сконфигурированной ResourcePath. Важно то, что путь к типу пользовательского ресурса и путь к его файлам resx должен быть относительным. Пример:
<root_proj_dir>/Resources/Resources_Common/DisplayResources.en.resx
<root_proj_dir>/Resources/Resources_Common/DisplayResources.bg.resx
<root_proj_dir>/Resources_Common/DisplayResources.cs
В-третьих, определить пользовательский метаданных поставщика:
public sealed class DisplayAttributeLocalizationProvider : IDisplayMetadataProvider
{
private IStringLocalizer _localizer;
public DisplayAttributeLocalizationProvider(IStringLocalizer localizer)
{
_localizer = localizer;
}
public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
{
context.PropertyAttributes?
.Where(attribute => attribute is DisplayAttribute)
.Cast<DisplayAttribute>().ToList().ForEach(display =>
{
display.Name = _localizer[display.Name].Value;
});
}
}
В-четвертых, использовать все это в вашей модели представления так же, как это:
public class SomeViewModel
{
[Display(Name = "Email")]
public string Email { get; set; }
}
Значение «Email» станет ключом к поиску в файлах DisplayResources.xx.resx.
Надеюсь, что многие другие найдут эту информацию полезной!
Вы должны взглянуть на эту статью: ИСПОЛЬЗОВАНИЕ ДАННЫХ И ЛОКАЛИЗАЦИЯ В ASP.NET 5 MVC 6 annotatiohttp: //damienbod.com/2015/10/24/using-dataannotations-and-localization-in-asp-net -5-mvc-6/ –
Этот пример не работает для меня в веб-приложении MVC. – feradz
У меня такая же проблема. Я решил не использовать DisplayAttribute. И я предоставляю локализацию для метки в представлении. Пример: . Не забудьте добавить LocString: @inject IViewLocalizer LocString –