gpt4 book ai didi

c# - ASP.NET MVC6 可本地化的 DisplayAttribute

转载 作者:行者123 更新时间:2023-11-30 17:41:06 24 4
gpt4 key购买 nike

我想知道是否可以将 ASP.NET MVC6 中的 IHtmlLocalizer 直接与 POCO 类一起使用?目前我有几个 View 模型使用 DisplayAttribute 来在 View 和验证器中显示翻译后的字符串,但它需要创建额外的静态类并定义每个静态属性(不幸的是静态索引器在 C# 中是不可能的) .有没有更好的方法来完成这项工作?

我当前的代码:

[Display(Name = "TrackingDevice", ResourceType = typeof(TestResource))]
public string TrackingDevice { get; set; }

public class TestResource
{
public static string TrackingDevice
{
get
{
//Here I call IHtmlLocalizer via IServiceLocator
return "Field name";
}
}
}

最佳答案

我费了一番功夫,终于成功地为这个问题编写了一个可行的解决方案。感谢@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;
});
}
}

第四,像这样在你的 View 模型中使用所有这些:

public class SomeViewModel
{
[Display(Name = "Email")]
public string Email { get; set; }
}

“电子邮件”值将是要在 DisplayResources.xx.resx 文件中查找的键。

希望很多其他人会觉得此信息有用!

关于c# - ASP.NET MVC6 可本地化的 DisplayAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com