我终于找到了解决这个问题的方法。
在这里,我将把我的解决方案分享给遇到同样问题的其他人。
将此类添加到您的 asp.net 核心应用程序中:
using System;
using Microsoft.Extensions.Localization;
namespace App.Utilities
{
public static class StringLocalizerFactoryExtensions
{
public static IStringLocalizer CreateConventional<T>(this IStringLocalizerFactory factory)
{
return factory.CreateConventional(typeof(T));
}
public static IStringLocalizer CreateConventional(this IStringLocalizerFactory factory, Type type)
{
if (type.Module.ScopeName != "CommonLanguageRuntimeLibrary")
{
string[] parts = type.FullName.Split(new[] { type.Assembly.FullName.Split(',')[0] }, StringSplitOptions.None);
string name = parts[parts.Length - 1].Trim('.');
return factory.CreateConventional(name);
}
else
{
return factory.Create(type);
}
}
public static IStringLocalizer CreateConventional(this IStringLocalizerFactory factory, string resourceName)
{
return factory.Create(resourceName, null);
}
public static IStringLocalizer CreateDataAnnotation(this IStringLocalizerFactory factory)
{
if (type.Module.ScopeName != "CommonLanguageRuntimeLibrary")
{
return factory.Create("DataAnnotation.Localization", "App_LocalResources");
}
else
{
return factory.Create(type);
}
}
}
}
...并在您的 Startup.cs 文件中替换以下部分:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
...使用此代码:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
//The following part includes the change:
.AddDataAnnotationsLocalization(options => options.DataAnnotationLocalizerProvider = (type, factory) => factory.CreateConventional(type));
代码将您的视图模型本地化资源视为用于视图的资源或任何其他可以使用默认 IStringLocalizerFactory 的地方。
因此,不再需要DataAnnotation.Localization.de-DE.resx 资源和App_LocalResources 文件夹。
只是,创建一系列具有常规命名的资源文件(Models.AccountViewModels.RegisterViewModel.en-US.resx或Models/AccountViewModels/RegisterViewModel.sv-SE.resx在通过调用services.AddLocalization(options => options.ResourcesPath = "Resources")设置的Resources文件夹中)然后你准备好了。 TagHelpers 和 HtmlHelpers 将开始工作并翻译错误消息。
另外,这将适用于开箱即用的 DisplayAttribute.Name。 (v1.1.0-preview1-final + .net v4.6.2)
更新 1:
这是我的project.json:
{
"userSecretsId": "...",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0-preview1-*",
"Microsoft.AspNetCore.Authentication.Cookies": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Diagnostics": "1.1.0-preview1-final",
"Microsoft.AspNetCore.DataProtection": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Mvc": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview3-final",
"Microsoft.ApplicationInsights.AspNetCore": "1.0.2",
"Microsoft.AspNetCore.Mvc.Localization": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Mvc.Razor": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Mvc.DataAnnotations": "1.1.0-preview1-final",
"Microsoft.Extensions.Configuration.CommandLine": "1.1.0-preview1-final",
"Microsoft.Extensions.Configuration.FileExtensions": "1.1.0-preview1-final",
"Microsoft.AspNet.WebApi.Client": "5.2.3",
"Microsoft.AspNetCore.Routing": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0-preview1-final",
"Microsoft.AspNetCore.StaticFiles": "1.1.0-preview1-final",
"Microsoft.EntityFrameworkCore": "1.1.0-preview1-final",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.1.0-preview1-final",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0-preview1-final",
"Microsoft.Extensions.Configuration.Json": "1.1.0-preview1-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.1.0-preview1-final",
"Microsoft.Extensions.Logging": "1.1.0-preview1-final",
"Microsoft.Extensions.Logging.Console": "1.1.0-preview1-final",
"Microsoft.Extensions.Logging.Debug": "1.1.0-preview1-final",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0-preview1-final",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview3-final",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "1.0.0-preview3-final",
"Microsoft.AspNetCore.Hosting": "1.1.0-preview1-final",
"Microsoft.AspNetCore.Hosting.WindowsServices": "1.1.0-preview1-final",
"Loggr.Extensions.Logging": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer": "1.1.0-preview1-final",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview3-final",
"BundlerMinifier.Core": "2.2.296"
},
"tools": {
"Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview3-final",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview3-final",
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final",
"Microsoft.Extensions.SecretManager.Tools": "1.0.0-preview3-final",
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
"version": "1.0.0-preview3-final",
"imports": [
"portable-net45+win8"
]
}
},
"frameworks": {
"net462": {}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"publishOptions": {
"include": [
"wwwroot",
"**/*.cshtml",
"appsettings.json",
"web.config"
]
},
"scripts": {
"prepublish": [ "bower install", "dotnet bundle" ],
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
更新 2: 如果有人希望代码与 App_LocalResourses 文件夹中的 DataAnnotation.Localization 一起工作,我已经更新了 StringLocalizerFactoryExtensions 代码。改用 Startup.cs 类中的更新类和以下代码,它应该可以工作。
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
//The following part includes the change:
.AddDataAnnotationsLocalization(options => options.DataAnnotationLocalizerProvider = (type, factory) => factory.CreateDataAnnotation());