asp net core 2 中的 DataAnnotations 本地化

Ser*_*kov 6 c# localization data-annotations asp.net-core

我正在尝试实现此功能:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization ?view=aspnetcore-2.1#dataannotations-localization

我的代码:

启动.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));
    });
...
}
Run Code Online (Sandbox Code Playgroud)

共享资源.cs

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

    }
}
Run Code Online (Sandbox Code Playgroud)

FooViewModel.cs

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

FooPage.cshtml

...
<input asp-for="Email" class="form-control">
<div class="invalid-feedback" style="display:block;">
    <span asp-validation-for="Email"></span>
</div>
...
Run Code Online (Sandbox Code Playgroud)

我有资源文件 Resources\SharedResource.resx

电子邮件 电子邮件
EmailIsNotValid电子邮件字段不是有效的电子邮件地址。
EmailRequired 电子邮件字段为必填项。

不起作用,编译或运行时没有错误。它显示的不是翻译,而是“EmailIsNotValid”或“EmailRequired”。可能会出什么问题?

Ser*_*kov 2

ASP.NET Core 2.0 中的RequiredAttribute 本地化重复但没有标记答案,并且隐藏在注释中。

虚拟 SharedResource 类应与 Web 应用程序 (startup.cs) 位于同一命名空间中。就我而言,我删除了“.classes”。文件不清楚。

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

资源以其类的完整类型名称减去程序集名称来命名。例如,项目中的法语资源(其主程序集是 LocalizationWebsite.Web.Startup 类的 LocalizationWebsite.Web.dll)将被命名为 Startup.fr.resx。LocalizationWebsite.Web.Controllers.HomeController 类的资源将命名为 Controllers.HomeController.fr.resx。如果目标类的命名空间与程序集名称不同,您将需要完整的类型名称。例如,在示例项目中,ExtraNamespace.Tools 类型的资源将被命名为 ExtraNamespace.Tools.fr.resx。

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