繁体   English   中英

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

[英]ASP.NET Core MVC Localization Warning: AcceptLanguageHeaderRequestCultureProvider returned the following unsupported cultures

我有一个使用资源本地化的ASP.NET Core 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();
    }
}

实际上,这只是一个警告,我的应用程序运行正常,但此警告填充了我的日志文件,因此我正在寻找一种使MVC知道我想要的方法。

[编辑]:我添加了CustomRequestCultureProvider,但是没有效果,在该行中添加断点后意识到该行未命中。

[Edit2]:正如user2429841所建议的那样,我在supportedCultures中添加了“ fa”警告已消失,但是我的资源文件(名为x.fa-IR.resx)不再被使用。 有什么办法对MVC说,如果您掌握了某种文化,就将其视为另一种文化?

记录所述,您可以通过指定每个提供程序的最低日志级别来过滤日志。

在您的appsettings.json Logging配置中,添加Microsoft.AspNetCore.Localization并将其值设置为Error 在这种情况下,消息将不再出现在日志中。

"Logging": {
  "IncludeScopes": false,
  "LogLevel": {
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information",
    "Microsoft.AspNetCore.Localization": "Error"  // <-- Disables the warnings
  }
},

更新ASP.NET Core 3.0

此问题已在ASP.NET Core 3.0中解决。 如此处所述 (官方文档尚未更新):

问题是,如果不支持所请求的区域性,本地化中间件将记录大量日志(如果不是数百个日志的话),那么您每次请求将收到1条警告日志的图像,随着时间的流逝,这将是嘈杂的麻烦。

为此,我们只是简单地决定将LogLevel.Warning更改为LogLevel.Debug,以至少减少日志数量。

services.AddOptions();            

将此行添加到您的Configure方法

app.UseRequestLocalization(
  app.ApplicationServices.GetService<IOptions<RequestLocalizationtions>>().Value);

是您的Web浏览器在Accept-Language-HTTP-Header和asp.net核心中发送“ en-US,en,fa”,只是告诉您,您不支持任何一种文化。

Kakos649的答案没有道理,因为如果您通过选项服务解决RequestLocalizationtions-instance,它将得到相同的结果。

编辑:如果您支持任何一种语言,警告将消失。

默认情况下,本地化中间件使用3个提供程序来确定请求的区域性。

按以下顺序评估它们:

  • 请求参数
  • 曲奇饼
  • 接受语言标头

如果您未设置Cookie来获取区域性,则本地化中间件将默认为“ Accept-Language header”。

例如:Accept-Language标头“ en-US,en,fa”将首先要求使用美国英语,然后要求使用其他任何英语语言环境,最后要求使用fa-IR。因此,寻找en区域设置的警告很有意义。

您可以设置一个cookie,并且警告会消失。

更多详细信息以及如何设置文化Cookie https://joonasw.net/view/aspnet-core-localization-deep-dive

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM