ASP.NET Core DisplayAttribute本地化

Dav*_*vid 8 displayattribute asp.net-core asp.net-core-1.0 asp.net-core-localization

根据文件:

运行时不会查找非验证属性的本地化字符串.在上面的代码中,"电子邮件"(来自[显示(名称="电子邮件")])将不会本地化.

我正在寻找一种在DisplayAttribute中本地化文本的方法.有任何建议以适当的方式做到吗?

Soc*_*ock 9

您可以设置ResourceTypeDisplayAttribute,可用于本地化文本.

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

在此输入图像描述

然后引用字段的名称和MyResources您的类型DisplayAttribute

[Display(Name = "RememberMe", ResourceType  = typeof(MyResources))]
public bool RememberMe { get; set; }
Run Code Online (Sandbox Code Playgroud)

本地化资源将自动拉出(参见文本框)

在此输入图像描述

注意:NotImplementedException如果您在资源值中使用非拉丁字符,RC2中当前存在一个错误:https://github.com/aspnet/Razor/issues/760

  • 我收到“找不到类型或命名空间‘MyResources’”。我错过了什么? (3认同)

Rah*_*oon 7

无论是在视图还是数据注释中,所有本地化的中心位置都是我能想到的最佳方法,这就是我的工作方式.在安装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;
});
Run Code Online (Sandbox Code Playgroud)

这样DataAnnotationLocalizerProvider将来自Resources.{culture} .rex - (资源文件必须具有No code gen的访问修饰符) - 假设默认语言不需要任何资源,并且能够访问资源文件,因为不会生成任何代码,必须创建具有相同名称的空类.

并在_ViewImports.cshtml文件中注入以下内容

@inject IHtmlLocalizer<Resources> Localizer
Run Code Online (Sandbox Code Playgroud)

通过这样做,您现在可以在任何视图中使用全局变量Localizer进行本地化.

这是字符串本地化的中心位置

您可以在ASP.NET Core中找到有关全球化和本地化的更多信息


Pro*_*log 7

对于那些因错误而挣扎(@lucius,@vladislav)的人:

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

它是由 .resx 文件上的访问修饰符引起的,默认情况下设置为Internal(在我的情况下它是No code generation)。在资源文件工具栏中的 Access Modifier 下拉列表中将其更改为public

[https://i.imgur.com/q3BK8T5.png]

之后,您应该能够看到资源类型的属性:

在此处输入图片说明

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

在此处输入图片说明

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