Asp.net core ASP.NET核心显示属性本地化

Asp.net core ASP.NET核心显示属性本地化,asp.net-core,asp.net-core-1.0,displayattribute,asp.net-core-localization,Asp.net Core,Asp.net Core 1.0,Displayattribute,Asp.net Core Localization,根据报告: 运行时不会查找非验证属性的本地化字符串。在上面的代码中,“电子邮件”(来自[Display(Name=“Email”)])将不会本地化 我正在寻找一种在DisplayAttribute中本地化文本的方法。您可以在DisplayAttribute上设置ResourceType,该属性可用于对文本进行本地化 将资源.resx文件添加到项目中,例如MyResources.resx,并为您的字段添加资源: 然后在DisplayAttribute [Display(Name=“Remembe

根据报告:

运行时不会查找非验证属性的本地化字符串。在上面的代码中,“电子邮件”(来自[Display(Name=“Email”)])将不会本地化


我正在寻找一种在DisplayAttribute中本地化文本的方法。您可以在
DisplayAttribute
上设置
ResourceType
,该属性可用于对文本进行本地化

将资源
.resx
文件添加到项目中,例如
MyResources.resx
,并为您的字段添加资源:

然后在
DisplayAttribute

[Display(Name=“RememberMe”,ResourceType=typeof(MyResources))]
公共布尔记忆{get;set;}
本地化资源将自动通过(请参见文本框)


我刚刚创建了一个项目,该项目演示了本地化,包括类属性和枚举的显示属性的本地化

项目可以在这里找到

必须使用ASP.NET Core 1.0之前的方法本地化显示属性。查看项目中的
DataAnnotations.resx
文件

Display
Name
属性不能包含空格和特殊字符

[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))]
public string FirstName { get; set; }

ResourceType
应该是完全限定的资源类名(即包括名称空间)。

事实上,我为追随者找到了一个简单的解决方案。大多数情况下,显示名称用于输入字段的标签中。因此,如果您愿意,请执行以下操作:

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

当然,您可以通过
@Html.DisplayNameFor
传递属性名,但大多数情况下,这个方法已经很好地工作了。

在视图或数据注释中为所有本地化设置一个中心位置是我能想到的最佳方法,我就是这样开始工作的。 在安装用于本地化的nuget软件包后,在Startup.cs文件中添加以下代码

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;
});
services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(选项=>
options.DataAnnotationLocalizerProvider=(类型,工厂)=>new StringLocalizer(工厂));
配置(选项=>{
var cultures=new[]
{
新文化信息(“en”),
新文化信息(“ar”)
};
options.DefaultRequestCulture=新的RequestCulture(“en”、“en”);
options.SupportedCultures=文化;
options.supporteducultures=文化;
});
这样,DataAnnotationLocalizerProvider将来自资源{culture}.rex-(资源文件必须具有访问修饰符无代码生成)-假设默认语言不需要任何资源,并且能够访问资源文件,因为不会生成代码,并且必须创建具有相同名称的空类

并在\u ViewImports.cshtml文件中插入以下内容

@inject IHtmlLocalizer<Resources> Localizer
@inject IHtmlLocalizer定位器
通过执行此操作,您现在有了一个全局变量定位器,可在任何视图中用于本地化目的

你可以在

上找到更多关于那些与错误作斗争的人(@lucius,@vladislav)的信息:

无法检索属性“Name”,因为本地化失败。类型“Xxxx.EmployeeResx”不是公共的或不包含名为“FirstName”的公共静态字符串属性

它是由.resx文件上的访问修饰符引起的,默认情况下,该修饰符设置为内部(在我的例子中,它不是代码生成)。在资源文件工具栏的“访问修改器”下拉列表中将其更改为“公共”

之后,您应该能够从资源类型中查看属性:

也不要考虑在字段名中使用特殊符号,因为它们是自动生成的C属性名的基础。字段名被转换为C#友好的名称,这就是为什么资源文件字段名和自动生成属性名之间可能会出现不一致。最好避免任何连字符
-
或点
下划线
.
都可以。您始终可以在相关资源文件下的资源文件\u name.Designer.cs类中查找自动生成的属性的外观


非常感谢Bala Murugan,他在上写了一篇关于此主题的好文章。

根据新的asp.net核心本地化机制,未对非验证属性进行本地化似乎有些奇怪。你认为它也可以为非验证属性实现吗,或者mvc的人跳过非验证属性有什么原因吗?我同意,这有点奇怪!我想他们决定不这样做一定有原因,但我不太清楚。你可以随时在GitHub上询问,看看他们怎么说。我得到的
是找不到类型或命名空间“MyResources”
。我缺少什么?您好,我正在使用.NET Core 1.0.0,此实现引发以下错误:InvalidOperationException:无法检索属性“Name”,因为本地化失败。类型“”不是公共的或不包含名为“RememberMe”的公共静态字符串属性。有人有过这种错误的经验吗?对于像我这样碰巧来到这里的现代读者来说:在框架的后续版本中,这不是一个问题。正如Microsoft所说,“在ASP.NET Core MVC 1.1.0及更高版本中,非验证属性是本地化的。”工作正常,谢谢。。花了好几个小时后,我看到了你的答案,它就像一个符咒!!我正在寻找类似的解决方案,甚至声明显示。因为大多数时候,属性名是display name,所以我们应该能够声明
[display][EmailAddress]公共字符串Email{get;set;}