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
文件。
Display
的Name
属性不能包含空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 可以在任何视图中用于本地化目的。
上找到更多信息
对于那些因错误而挣扎的人(@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.
上写了一篇关于这个主题的好文章
根据 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
文件。
Display
的Name
属性不能包含空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 可以在任何视图中用于本地化目的。
对于那些因错误而挣扎的人(@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.
上写了一篇关于这个主题的好文章