根据文档:
运行时不会查找非验证属性的本地化字符串。在上面的代码中,“电子邮件”(来自 [Display(Name = "Email")])将不会被本地化。
我正在寻找一种方法来本地化 DisplayAttribute 中的文本。有什么建议可以以正确的方式进行吗?
根据文档:
运行时不会查找非验证属性的本地化字符串。在上面的代码中,“电子邮件”(来自 [Display(Name = "Email")])将不会被本地化。
我正在寻找一种方法来本地化 DisplayAttribute 中的文本。有什么建议可以以正确的方式进行吗?
无论是视图还是数据注释,为您的所有本地化提供一个中心位置是我能想到的最佳方法,这也是我开始工作的方式。在安装 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 -(资源文件必须具有No code gen的访问修饰符)-假设默认语言不需要资源,并且能够访问资源文件,因为不会生成代码并且必须创建具有相同名称的空类。
并在_ViewImports.cshtml文件中注入以下内容
@inject IHtmlLocalizer<Resources> Localizer
通过这样做,您现在有一个全局变量Localizer可在任何视图中用于本地化目的。
您可以在 ASP.NET Core中找到有关全球化和本地化的更多信息
对于那些因错误而挣扎的人(@lucius,@vladislav):
无法检索属性“名称”,因为本地化失败。类型“ Xxxx.EmployeeResx ”不是公共的或不包含名为“ FirstName ”的公共静态字符串属性。
这是由默认设置为Internal的 .resx 文件上的访问修饰符引起的(在我的情况下,它是No code generation)。在资源文件工具栏中的访问修饰符下拉列表中将其更改为公共。
之后,您应该能够从资源类型中看到属性:
此外,请考虑不要在字段名称中使用特殊符号,因为它们是自动生成的 C# 属性名称的基础。字段名称被转换为 C# 友好名称,这就是为什么资源文件字段的名称和自动生成的属性名称之间可能出现不一致的原因。最好避免任何连字符-
或点.
下划线_
很好。您始终可以在相关资源文件下的resource_file_name.Designer.cs类中查找自动生成的属性的外观。
非常感谢 Bala Murugan,他在Code Digest上写了一篇关于这个主题的好文章。
实际上,我为追随者找到了一个简单的解决方案。大多数时候,显示名称用于输入字段的标签。如果您愿意,请执行以下操作:
<label asp-for="Email">@Localizer["Email"]</label>
当然,您可以通过 传递属性名称@Html.DisplayNameFor
,但大多数时候,这个已经很好了。
我刚刚创建了一个演示本地化的项目,包括类属性的 Display 属性以及枚举的本地化。
该项目可以在这里找到https://github.com/feradz/ASPNetCoreLocalization/wiki
Display 属性必须使用 ASP.NET Core 1.0 之前的方法进行本地化。查看DataAnnotations.resx
项目中的文件。
的Name
属性Display
不能包含空格和特殊字符。
[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))]
public string FirstName { get; set; }
ResourceType
应该是完全限定的资源类名称(即包括名称空间)。