【问题标题】:ASP.NET Core MVC Localization Warning: AcceptLanguageHeaderRequestCultureProvider returned the following unsupported culturesASP.NET Core MVC 本地化警告:AcceptLanguageHeaderRequestCultureProvider 返回了以下不受支持的文化
【发布时间】:2018-08-12 10:25:55
【问题描述】:

我有一个使用资源本地化的 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 说,如果你有某种文化,就把它当作另一种文化吗?

【问题讨论】:

    标签: c# asp.net-core localization asp.net-core-2.0


    【解决方案1】:

    作为documented,您可以通过指定每个提供者的最低日志级别来过滤日志记录。

    在您的 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 中得到解决。如documented here(官方文档尚未更新):

    问题是本地化中间件会记录大量数据,否则 如果请求的文化不受支持,则数百个日志,图像 每个请求您将收到 1 个警告日志,这是嘈杂和麻烦的 随着时间的推移。

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

    【讨论】:

    • 这应该是一个可以接受的答案,因为手头的问题只是日志垃圾,而过滤就是您解决它的方法。当客户端发送您不支持的标头文化时,我认为没有任何警告意义,它正确地使用默认值,但会引起不必要的大惊小怪。
    【解决方案2】:

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

    来自 Kakos649 的答案没有意义,因为如果您通过选项服务解析 RequestLocalizations-instance,结果将相同。

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

    【讨论】:

    • 我在supportedCultures 中添加了“fa”,警告消失了,但我的资源文件(名为x.fa-IR.resx)不再被拾取。有什么方法可以对 MVC 说,如果你有某种文化,就把它当作另一种文化对待?
    • 只需将 fa 用于您的资源文件而不是 fa-IR,因为如果您的浏览器发送 fa-IR,.net 会将其与 fa 匹配。如果您有一个仅用于 fa-IR 的特定资源密钥,请创建一个 *.fa-IR.resx 文件,其中包含具有特定位置的该密钥。 .net 将级联它 -> fa-IR -> fa -> 您的默认本地化。
    • 这个'fa'是从哪里来的?我可以将其更改为“fa-IR”吗?如果我将本地化文件更改为 *.fa.resx,是否有可能某些客户端使用“fa-IR”或任何其他本地化和资源文件发送请求?
    • 如果您只支持“fa”并且浏览器只发送“fa-IR”,ASP.NET 将选择“fa”。
    【解决方案3】:
    services.AddOptions();            
    

    将此行添加到您的配置方法中

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

    【讨论】:

    • 介意...解释一下你的答案吗?
    • 这行得通,我意识到即使删除整个 app.UseRequestLocalization() 也会删除警告,并且本地化仍然有效。但这有副作用吗?你能解释一下吗
    • 是的,您不需要以前的应用程序。UseRequestLocalization 用这个新的应用程序更新它。它没有任何副作用,因为您没有在上下文中做某事。你能澄清一下你不明白的部分吗?
    • 在 ASP Core 1 app.UseRequestLocalization 用于配置 SupportedCultures 、 SupportedUICultures 和其他一些选项。所以你的意思是这在 ASP Core 2 中是不需要的?
    • @HamedH 我有同样的问题,只是删除“UseRequestLocalization”不是一个选项。你找到解决办法了吗?
    【解决方案4】:

    本地化中间件默认使用 3 个提供者来确定请求的文化。

    它们按顺序进行评估:

    • 查询字符串
    • 饼干
    • 接受语言标题

    如果您没有设置 cookie 来获取文化,本地化中间件将默认为“Accept-Language 标头”。

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

    您可以设置一个 cookie,您的警告应该会消失。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2017-09-15
      • 2017-09-02
      • 2021-08-05
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多