web-dev-qa-db-de.com

MVC-Lokalisierungswarnung für ASP.NET Core: AcceptLanguageHeaderRequestCultureProvider gab die folgenden nicht unterstützten Kulturen zurück

Ich habe eine ASP.NET Core MVC-App, die Ressourcenlokalisierung verwendet. Es unterstützt derzeit nur eine Kultur (fa-IR) und ich möchte, dass alle Lokalisierungen basierend auf dieser Kultur verarbeitet werden. In ASP.NET Core 1.1 habe ich kein Problem, aber nach der Migration von ASP.NET Core 1.1 auf 2.1 sehe ich diese Warnung für jede HTTP-Anforderung:

AcceptLanguageHeaderRequestCultureProvider gab die folgenden nicht unterstützten Kulturen 'en-US, en, fa' zurück.

Dies ist mein Startup:

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();
    }
}

Tatsächlich ist es nur eine Warnung. Meine App funktioniert gut, aber meine Protokolldateien werden durch diese Warnung gefüllt. Ich suche daher nach einer Möglichkeit, MVC wissen zu lassen, was ich will.

[Bearbeiten]: Ich habe CustomRequestCultureProvider hinzugefügt, hat jedoch keine Auswirkungen. Nachdem Sie einen Haltepunkt in diese Zeile gesetzt haben, wurde mir klar, dass die Zeile nicht getroffen wird.

[Edit2]: Wie User2429841 vorschlug, ich habe "fa" zu den unterstütztenKulturen hinzugefügt, die Warnungen sind verschwunden, aber meine Ressourcendateien (x.fa-IR.resx) werden nicht mehr aufgenommen. Gibt es eine Möglichkeit, MVC zu sagen, dass, wenn Sie eine Kultur bekommen, sie als eine andere Kultur behandeln?

5
HamedH

Als dokumentiert können Sie die Protokollierung filtern, indem Sie die Mindestprotokollstufen pro Anbieter angeben.

Fügen Sie in Ihrer appsettings.json Logging-Konfiguration Microsoft.AspNetCore.Localization hinzu und setzen Sie den Wert auf Error. In diesem Fall werden die Meldungen nicht mehr im Protokoll angezeigt.

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

Fügen Sie diese Zeile Ihrer Configure-Methode hinzu

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

Die Lokalisierungs-Middleware verwendet standardmäßig drei Anbieter, um die Anforderungskultur zu ermitteln.

Sie werden in der Reihenfolge ausgewertet:

  • Abfragezeichenfolge
  • Cookie
  • Accept-Language-Header

Wenn Sie kein Cookie setzen, um die Kultur abzurufen, lautet die Standardeinstellung der Lokalisierungs-Middleware "Accept-Language-Header".

Beispiel: Der Accept-Language-Header "en-US, en, fa" fordert zuerst US-Englisch, dann ein beliebiges anderes englisches Gebietsschema und schließlich fa-IR an. Die Warnungen, die nach en locale suchen, sind also sinnvoll.

Sie können ein Cookie setzen und Ihre Warnungen sollten verschwinden.

Weitere Informationen und das Setzen eines Kulturcookies https://joonasw.net/view/aspnet-core-localization-deep-dive

0
Shivam

Es ist Ihr Webbrowser, der 'en-US, en, fa' im Accept-Language-HTTP-Header sendet. Der asp.net-Kern sagt Ihnen nur, dass Sie keine dieser Kulturen unterstützen.

Die Antwort von Kakos649 macht keinen Sinn, denn wenn Sie Ihre RequestLocalizationtions-Instanz über den Optionsdienst auflösen, führt dies zu demselben Ergebnis.

BEARBEITEN: Wenn Sie eine dieser Sprachen unterstützen, verschwindet die Warnung.

0
user2429841