ASP.NET 核心 DisplayAttribute 本地化

ASP.NET Core DisplayAttribute Localization

根据 documentation:

The runtime doesn’t look up localized strings for non-validation attributes. In the code above, “Email” (from [Display(Name = "Email")]) will not be localized.

我正在寻找一种在 DisplayAttribute 中本地化文本的方法。有什么建议可以以正确的方式做到这一点吗?

您可以在 DisplayAttribute 上设置 ResourceType,这可用于本地化您的文本。

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

然后在 DisplayAttribute

中引用字段名称和 MyResources 类型
[Display(Name = "RememberMe", ResourceType  = typeof(MyResources))]
public bool RememberMe { get; set; }

自动拉取本地化资源(见文本框)

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

项目可以在这里找到https://github.com/feradz/ASPNetCoreLocalization/wiki

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

DisplayName属性不能包含空space和特殊字符。

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

ResourceType 应该是完全限定的资源 class 名称(即包括名称 space)。

其实我为随从找到了一个简单的解决方案。大多数情况下,显示名称用于输入字段的标签中。如果您愿意,可以这样做:

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

当然,您可以通过 @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;
});

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

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

@inject IHtmlLocalizer<Resources> Localizer

通过这样做,您现在有一个全局变量 Localizer 可以在任何视图中用于本地化目的。

您可以在 Globalization and localization in ASP.NET Core

上找到更多信息

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

Cannot retrieve property 'Name' because localization failed. Type 'Xxxx.EmployeeResx' is not public or does not contain a public static string property with the name 'FirstName'.

这是由 .resx 文件的访问修饰符引起的,默认设置为 Internal(在我的例子中是 没有代码生成).在资源文件工具栏的访问修饰符下拉列表中将其更改为 public

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

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

非常感谢 Bala Murugan,他在 Code Digest.

上写了一篇关于这个主题的好文章