C# ASP.NET Core MVC本地化警告:AcceptLanguageHeaderRequestCultureProvider返回了以下不支持的区域性
我有一个使用资源本地化的ASP.NET核心MVC应用程序。它目前只支持一种区域性(fa-IR),我希望所有本地化都基于这种区域性进行处理。在ASP.NET Core 1.1中,我没有问题,但在从ASP.NET Core 1.1迁移到2.1后,我看到每个HTTP请求都有以下警告: AcceptLanguageHeaderRequestCultureProvider返回了以下不支持的区域性“en-US,en,fa” 这是我的创业:C# ASP.NET Core MVC本地化警告:AcceptLanguageHeaderRequestCultureProvider返回了以下不支持的区域性,c#,asp.net-core,localization,asp.net-core-2.0,C#,Asp.net Core,Localization,Asp.net Core 2.0,我有一个使用资源本地化的ASP.NET核心MVC应用程序。它目前只支持一种区域性(fa-IR),我希望所有本地化都基于这种区域性进行处理。在ASP.NET Core 1.1中,我没有问题,但在从ASP.NET Core 1.1迁移到2.1后,我看到每个HTTP请求都有以下警告: AcceptLanguageHeaderRequestCultureProvider返回了以下不支持的区域性“en-US,en,fa” 这是我的创业: public class Startup { protect
public class Startup
{
protected CultureInfo DefaultCultureInfo { get; private set; } = new CultureInfo("fa-IR");
public void ConfigureServices(IServiceCollection services)
{
CultureInfo.DefaultThreadCurrentCulture = DefaultCultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = DefaultCultureInfo;
services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
services.AddMemoryCache();
services.AddSession();
services.AddMvc()
.AddDataAnnotationsLocalization()
.AddViewLocalization()
.AddControllersAsServices()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddSessionStateTempDataProvider();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { new CultureInfo("fa-IR"), new CultureInfo("en-US") };
options.DefaultRequestCulture = new RequestCulture("fa-IR", "fa-IR");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
return new ProviderCultureResult("fa-IR");
}));
});
}
public void Configure(IApplicationBuilder app)
{
var supportedCultures = new[] { DefaultCultureInfo };
app.UseRequestLocalization(new RequestLocalizationOptions()
{
DefaultRequestCulture = new RequestCulture(DefaultCultureInfo),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures,
FallBackToParentCultures = true,
FallBackToParentUICultures = true,
});
app.UseSession();
app.UseMvc();
app.UseCookiePolicy();
}
}
公共类启动
{
受保护的CultureInfo DefaultCultureInfo{get;private set;}=new CultureInfo(“fa IR”);
public void配置服务(IServiceCollection服务)
{
CultureInfo.DefaultThreadCurrentCulture=DefaultCultureInfo;
CultureInfo.DefaultThreadCurrentUICulture=DefaultCultureInfo;
AddLocalization(options=>{options.ResourcesPath=“Resources”;});
services.AddMemoryCache();
services.AddSession();
services.AddMvc()
.AddDataAnnotationsLocalization()
.AddViewLocalization()
.addControllerAsservices()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddSessionStateTempDataProvider();
配置(选项=>
{
var supportedCultures=new[]{new CultureInfo(“fa-IR”)、new CultureInfo(“en-US”)};
options.DefaultRequestCulture=新的RequestCulture(“fa-IR”、“fa-IR”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
options.RequestCultureProviders.Insert(0,新的CustomRequestCultureProvider(异步上下文=>
{
返回新ProviderCultureResult(“fa IR”);
}));
});
}
公共void配置(IApplicationBuilder应用程序)
{
var-supportedCultures=new[]{DefaultCultureInfo};
app.UseRequestLocalization(新的RequestLocalizationOptions()
{
DefaultRequestCulture=新的RequestCulture(DefaultCultureInfo),
SupportedCultures=SupportedCultures,
支持的教育=支持的文化,
FallBackToParentCultures=true,
fallbacktoparentuctures=true,
});
app.UseSession();
app.UseMvc();
app.UseCookiePolicy();
}
}
事实上,这只是一个警告,我的应用程序工作正常,但我的日志文件中充满了这个警告,所以我正在寻找一种方法,让MVC知道我想要什么
[编辑]:我添加了CustomRequestCultureProvider,但没有效果,在该行中放置断点后,我意识到该行不会被命中
[Edit2]:根据用户2429841的建议,我在supportedCultures中添加了“fa”,警告消失了,但我的资源文件(名为x.fa-IR.resx)不再被拾取。有没有办法对MVC说,如果你得到某种文化,就把它当作另一种文化
services.AddOptions();
将此行添加到配置方法中
app.UseRequestLocalization(
app.ApplicationServices.GetService<IOptions<RequestLocalizationtions>>().Value);
app.UseRequestLocalization(
app.ApplicationServices.GetService().Value);
是您的网络浏览器以Accept Language HTTP头发送“en-US,en,fa”,asp.net core只是告诉您,您不支持任何这种文化
Kakos649的回答没有意义,因为如果您通过options服务解析RequestLocalizations实例,它将导致相同的结果
编辑:如果您支持其中任何一种语言,警告将消失。因为您可以通过指定每个提供程序的最低日志级别来过滤日志记录
在appsettings.jsonLogging
configuration中添加Microsoft.AspNetCore.Localization并将值设置为Error。在这种情况下,消息将不再显示在日志中
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Microsoft.AspNetCore.Localization": "Error" // <-- Disables the warnings
}
},
“日志记录”:{
“包含范围”:错误,
“日志级别”:{
“默认值”:“调试”,
“系统”:“信息”,
“Microsoft”:“信息”,
“Microsoft.AspNetCore.Localization”:“Error”//本地化中间件默认使用3个提供程序来确定请求的区域性
按照以下顺序对其进行评估:
- 查询字符串
- 饼干
- 接受语言标题
如果未设置cookie以获取区域性,本地化中间件将默认为“Accept Language header”
例如:接受语言标题“en-US,en,fa”将首先请求美国英语,然后是任何其他英语语言环境,最后是fa-IR。因此,查找en-locale的警告是有意义的
您可以设置cookie,警告应该消失
更多详细信息以及如何设置区域性cookie
介意…解释一下你的答案吗?这很有效,我意识到甚至删除整个app.UseRequestLocalization()都是可行的删除警告,本地化仍然有效。但这是否有任何副作用?请您解释更多,您不需要以前的应用程序。UseRequestLocalization使用此新应用程序更新它。它没有任何副作用,因为您没有断章取义地做任何事情。您能否澄清您不理解的部分?在as中P Core 1 app.UseRequestLocalization用于配置SupportedCulture、SupportedCultures和其他一些选项。你的意思是ASP Core 2中不需要这样做吗?@HamedH我也有同样的问题,只是删除“UseRequestLocalization”不是一个选项。你找到解决方案了吗?我添加了“fa”对于supportedCultures,警告已消失,但我的资源文件(名为x.fa-IR.resx)不再拾取。有没有办法告诉MVC,如果您获得某种区域性,请将其视为另一种区域性?只需将fa用于您的资源文件,而不是fa IR,因为如果您的浏览器发送fa IR,.net会将其与fa匹配。如果您只有fa IR的特定资源密钥,请创建一个包含此密钥的*.fa-IR.resx文件,其中包含特定的fic location..net将级联它->fa IR->fa->您的默认本地化。它在哪里