リソースローカリゼーションを使用するASP.NET Core MVCアプリがあります。現在、1つのカルチャ(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を追加しましたが、効果がなく、その行にブレークポイントを置いた後、行がヒットしないことに気付きました。
[編集2]:user2429841が示唆したように、supportedCulturesに "fa"を追加しましたが、警告は出ましたが、リソースファイル(x.fa-IR.resxという名前)はもう取得されません。 MVCに対して、ある文化を取得した場合、それを別の文化として扱うと言う方法はありますか?
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で解決されています。として ここに文書化 (公式文書はまだ更新されていません):
問題は、要求されたカルチャがサポートされていない場合、ローカリゼーションミドルウェアが数百ものログではないにせよ大量のログを記録することでした。イメージごとに、要求ごとに1つの警告ログが表示され、時間の経過とともに騒々しくてトラブルが発生します。
そのため、少なくともログの量を減らすために、LogLevel.WarningをLogLevel.Debugに変更することを決定します。
Accept-Language-HTTP-Headerで 'en-US、en、fa'を送信するのはWebブラウザーであり、asp.netコアは、これらの文化をサポートしていないことを通知するだけです。
Kakos649からの回答は意味がありません。オプションサービスに対してRequestLocalizationtions-instanceを解決すると、同じ結果になります。
編集:この言語のいずれかをサポートしている場合、警告は消えます。
services.AddOptions();
この行をConfigureメソッドに追加します
app.UseRequestLocalization(
app.ApplicationServices.GetService<IOptions<RequestLocalizationtions>>().Value);
ローカリゼーションミドルウェアは、デフォルトで3つのプロバイダーを使用して、要求のカルチャを把握します。
それらは次の順序で評価されます。
文化を取得するためにCookieを設定しない場合、ローカリゼーションミドルウェアはデフォルトで「Accept-Languageヘッダー」になります。
例:Accept-Languageヘッダー "en-US、en、fa"は最初に米国英語を要求し、次に他の英語ロケールを要求し、最後にfa-IRを要求します。したがって、enロケールを探す警告は理にかなっています。
あなたはクッキーを設定することができ、あなたの警告は消えるはずです。
詳細とカルチャーCookieの設定方法 https://joonasw.net/view/aspnet-core-localization-deep-dive