ASP.NET Core 2中的数据注解本地化

6
我将尝试实现这个功能:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.1#dataannotations-localization 以下是我的代码:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization(options =>
    {
        options.DataAnnotationLocalizerProvider = (type, factory) =>
            factory.Create(typeof(SharedResource));
    });
...
}

SharedResource.cs

namespace MyProj.Classes
{
    /// <summary>
    /// Dummy class to group shared resources
    /// </summary>
    public class SharedResource
    {

    }
}

FooViewModel.cs

public class FooViewModel
{
    [Required(ErrorMessage = "EmailRequired")]
    [EmailAddress(ErrorMessage = "EmailIsNotValid")]
    [Display(Name = "Email")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
}

FooPage.cshtml

...
<input asp-for="Email" class="form-control">
<div class="invalid-feedback" style="display:block;">
    <span asp-validation-for="Email"></span>
</div>
...

我有一个资源文件Resources\SharedResource.resx。

Email 邮箱
EmailIsNotValid 电子邮件字段不是有效的电子邮件地址。
EmailRequired 电子邮件字段是必需的。

代码没有问题,编译和运行时都没有报错,但是它没有翻译,而是显示'EmailIsNotValid'或'EmailRequired'。可能出了什么问题?


你需要使用 ErrorMessageResourceNameErrorMessageResourceType 属性,而不是 ErrorMessage - Camilo Terevinto
可能是如何在DataAnnotation中本地化ErrorMessage?的重复问题。 - Camilo Terevinto
我假设自MVC 5以来有所改变,在官方文档中没有ErrorMessageResourceName/Type信息(在我的链接中)。这可能是https://dev59.com/q1YM5IYBdhLWcg3wfQMa的重复。 - Sergey Zykov
@CamiloTerevinto 这是 .net core。它以不同的方式处理本地化。 - JSON
1个回答

2

这是一个重复的问题,Localization of RequiredAttribute in ASP.NET Core 2.0,但没有标记答案并且隐藏在评论中。

Dummy SharedResource类应该与Web应用程序(startup.cs)在同一命名空间中。在我的情况下,我删除了“ .classes”。文档不清楚。

更新: 对于像我这样的虚拟类,相同的文件名规则适用于文档: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.1#resource-file-naming

资源的名称为其类的完整类型名称减去程序集名称。例如,在主程序集为LocalizationWebsite.Web.dll的项目中,类LocalizationWebsite.Web.Startup的法语资源将命名为Startup.fr.resx。类LocalizationWebsite.Web.Controllers.HomeController的资源将命名为Controllers.HomeController.fr.resx。如果你所针对的类的命名空间不同于程序集名称,则需要完整的类型名称。例如,在示例项目中,类型ExtraNamespace.Tools的资源将命名为ExtraNamespace.Tools.fr.resx。

另一种解决方法是将资源文件命名为“Classes.SharedResource.resx”或将其放在文件夹Resources\Classes中。


也许虚拟的SharedResource类应该与根命名空间在同一个级别,而不是完整的(意思是文件夹名称并不重要)? - Niksr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接