我正在寻找一种在DisplayAttribute中本地化文本的方法。有什么适合的建议吗?运行时不会查找非验证属性的本地化字符串。在上述代码中,“Email”(来自[Display(Name =“Email”)])将不会被本地化。
我正在寻找一种在DisplayAttribute中本地化文本的方法。有什么适合的建议吗?运行时不会查找非验证属性的本地化字符串。在上述代码中,“Email”(来自[Display(Name =“Email”)])将不会被本地化。
我认为将所有本地化放在一个中心位置,无论是视图还是数据注释,是最好的方法,这也是我的做法。 在Startup.cs文件中,在安装了本地化的NuGet软件包后,请添加以下代码。
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}.resx (资源文件必须有一个访问修饰符为 No code gen)- 假设默认语言不需要任何资源,并且要能够访问资源文件,由于不会生成任何代码,必须创建一个同名的空类。
并且在 _ViewImports.cshtml 文件中注入以下内容:
@inject IHtmlLocalizer<Resources> Localizer
通过这样做,您现在拥有一个全局变量 Localizer ,可用于任何视图进行本地化。
您可以在 ASP.NET Core中的全球化和本地化 中找到更多信息
对于那些遇到错误(@lucius,@vladislav)的人:
无法检索属性“Name”,因为本地化失败。类型“Xxxx.EmployeeResx”不是公共的,或者不包含具有名称“FirstName”的公共静态字符串属性。
这是由.resx文件上的访问修饰符引起的,默认情况下设置为Internal(在我的情况下是无代码生成)。在资源文件工具栏中的访问修饰符下拉菜单中将其更改为public。
之后,您应该能够查看资源类型的属性:
此外,考虑不在字段名称中使用特殊符号,因为它们是自动生成的C#属性名称的基础。字段名称会转换为C#友好的名称,这就是为什么资源文件字段名称和自动生成的属性名称之间可能存在不一致的原因。最好避免任何连字符-
或点 .
下划线 _
是可以的。您始终可以查看相关资源文件下的resource_file_name.Designer.cs类中自动生成的属性的外观。
非常感谢Bala Murugan在Code Digest上写了一篇关于这个主题的好文章。
实际上,我为追随者找到了一个简单的解决方案。大多数情况下,显示名称用于输入字段的标签中。因此,如果您喜欢,请执行以下操作:
<label asp-for="Email">@Localizer["Email"]</label>
@Html.DisplayNameFor
来传递属性名称,但大多数情况下,这个已经很有效了。[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))]
public string FirstName { get; set; }
ResourceType
应该是完全限定的资源类名称(即包括命名空间)。
builder.Services.AddMvc()
derFormat.Suffix)
.AddViewLocalization()
.AddDataAnnotationsLocalization(options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) =>
{
var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName);
return factory.Create("SharedResource", assemblyName.Name);
};
});
[Display(Name = "RememberMe_QuestionMark")]
public bool RememberMe { get; set; }
options.DataAnnotationLocalizerProvider = (_, factory) => factory.Create(typeof(SharedResouce));
- undefined