我在我的新的.NET Core项目中遇到本地化问题。我有2个项目:
- DataAccess项目,其中包括模型和数据注释(例如RequiredAttribute)
- Web项目,其中包括MVC视图等。
我希望可以将所有验证属性在一个单独的地方全局本地化,以获得类似于MVC 5的相似行为。这是可能的吗?
我不想为Models / Views等单独使用语言文件。
微软的文档在使用具有本地化DataAnnotation消息的SharedResources.resx文件方面并不清晰。
在MVC 5中,我没有关心它。 我只需要将区域设置设置为我的语言即可,一切都很好。
我尝试将ErrorMessageResourceName和ErrorMessageResourceType设置为DataAccess项目中共享资源文件名“Strings.resx”和“Strings.de.resx”:
[Required(ErrorMessageResourceName = "RequiredAttribute_ValidationError", ErrorMessageResourceType = typeof(Strings))]
我还尝试将设置名称设为RequiredAttribute_ValidationError,但它并没有起作用。
我已经在Startup.cs中添加了.AddDataAnnotationsLocalization()
,但似乎没有起到任何作用。
我已经阅读了几篇文章,但是我找不到原因为什么它不起作用。
编辑: 目前为止我所拥有的:
1.) LocService类
public class LocService
{
private readonly IStringLocalizer _localizer;
public LocService(IStringLocalizerFactory factory)
{
_localizer = factory.Create(typeof(Strings));
}
public LocalizedString GetLocalizedHtmlString(string key)
{
return _localizer[key];
}
}
2.) 添加了“Resources”文件夹,其中包含Strings.cs(空类和虚构构造函数)
3.) 添加了Strings.de-DE.resx文件,其中包含一个项目“RequiredAttribute_ValidationError”
4.) 修改了我的Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<MessageService>();
services.AddDbContext<DataContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddSingleton<LocService>();
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver())
.AddDataAnnotationsLocalization(
options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(Strings));
});
services.Configure<RequestLocalizationOptions>(
opts =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("de-DE"),
};
opts.DefaultRequestCulture = new RequestCulture("de-DE");
// Formatting numbers, dates, etc.
opts.SupportedCultures = supportedCultures;
// UI strings that we have localized.
opts.SupportedUICultures = supportedCultures;
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}
我按照这里的指示进行了操作,但它不起作用: https://damienbod.com/2017/11/01/shared-localization-in-asp-net-core-mvc/
请记住我的模型保存在一个单独的项目中。
[Required]
注释。现在我不得不写[Required(ErrorMessage = "RequiredAttribute_ValidationError")]
。 - Sven