C# ASP.NET Core MVC本地化警告:AcceptLanguageHeaderRequestCultureProvider返回了以下不支持的区域性

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

我有一个使用资源本地化的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
{
    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.json
Logging
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->您的默认本地化。它在哪里