作成者: Hisham Bin Ateya
この記事では、ASP.NET Core アプリのローカライズの問題を診断する方法について説明します。
ローカライズの構成に関する問題
ローカライズ ミドルウェアの順序
ローカライズ ミドルウェアが想定どおりに並べ替えられていないため、アプリがローカライズされない場合があります。
この問題を解決するには、MVC ミドルウェアの前にローカライズ ミドルウェアが登録されていることを確認します。 それ以外の場合、ローカライズ ミドルウェアは適用されません。
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc();
}
ローカライズ リソースのパスが見つかりません
RequestCultureProvider でサポートされているカルチャが一度登録されたカルチャと一致しない
リソース ファイルの名前付けの問題
ASP.NET Core には、ローカライズ リソース ファイルの名前付けに関する定義済みの規則とガイドラインがあります。詳細については、「 ASP.NET Core のグローバリゼーションとローカリゼーション」を参照してください。
不足しているリソース
リソースが見つからない一般的な原因は次のとおりです。
- .NET XML リソース ファイル (
.resx) またはローカライザー要求でリソース名のスペルが間違っている。 - 一部の言語のリソース ファイルにリソースがありませんが、他の言語に存在します。
- それでも問題が解決しない場合は、ローカリゼーション ログ メッセージ (
Debugログ レベルでログに記録されます) で、不足しているリソースの詳細を確認してください。
ヒント
CookieRequestCultureProviderを使用する場合は、ローカライズcookie値内のカルチャでシングルクォートが使用されていないことを確認します。 たとえば、 c='en-UK'|uic='en-US' は無効な cookie 値ですが、 c=en-UK|uic=en-US は有効です。
リソースとクラス ライブラリの問題
ASP.NET Core には、クラス ライブラリが ResourceLocationAttribute を介してリソース ファイルを検索できるようにする方法が既定で用意されています。
クラス ライブラリに関する一般的な問題は次のとおりです。
- クラス ライブラリに ResourceLocationAttribute がない場合、 ResourceManagerStringLocalizerFactory がリソースを検出できなくなります。
- リソース ファイルの名前付け。 詳細については、「 リソース ファイルの名前付けの問題 」セクションを参照してください。
- クラス ライブラリのルート名前空間を変更する。 詳細については、「 ルート名前空間の問題 」セクションを参照してください。
CustomRequestCultureProvider 期待どおりに動作しない
RequestLocalizationOptions クラスには、次の 3 つの既定のプロバイダーがあります。
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
CustomRequestCultureProviderを使用すると、ローカライズ カルチャの提供方法をカスタマイズできます。 CustomRequestCultureProviderは、既定のプロバイダーが要件を満たしていない場合に使用されます。
カスタム プロバイダーが正常に動作しない一般的な理由は、 RequestCultureProviders 一覧の最初のプロバイダーではないということです。 この問題を解決するには、次の手順を実行します。
RequestCultureProvidersリストの位置 0 にカスタム プロバイダーを挿入します。
options.AddInitialRequestCultureProvider( new CustomRequestCultureProvider(async context => { // My custom request culture logic return new ProviderCultureResult("en"); }));
RequestCultureProvidersリストの位置 0 にカスタム プロバイダーを挿入します。
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context => { // My custom request culture logic return new ProviderCultureResult("en"); }));
- AddInitialRequestCultureProvider拡張メソッドを使用して、カスタム プロバイダーを初期プロバイダーとして設定します。
ルート名前空間の問題
アセンブリのルート名前空間がアセンブリ名と異なる場合、ローカライズは既定では機能しません。 この問題を回避するには、RootNamespaceCore のグローバリゼーションとローカリゼーションに関するページで説明されている属性を使用します。
Warnung
ルート名前空間の問題は、プロジェクトの名前が有効な .NET 識別子でない場合に発生する可能性があります。 たとえば、 my-project-name.csproj はルート名前空間の my_project_name とアセンブリ名 my-project-nameを使用しているため、このエラーが発生します。
リソースとビルド アクション
ローカライズにリソース ファイルを使用する場合は、適切なビルド アクションが必要です。
埋め込みリソースを使用する。それ以外の場合、ResourceStringLocalizerはこれらのリソースを見つけることができません。
開発者ツールの [センサー] ウィンドウを使用した場所のオーバーライド
Google Chrome または Microsoft Edge 開発者ツールの [センサー] ペインを使用して場所のオーバーライドを使用すると、フォールバック言語はプリレンダリング後にリセットされます。 テスト時に [センサー] ペインを使用して言語を設定しないでください。 言語はブラウザーの言語設定を使用して設定します。
詳細については、「Blazorローカライズが InteractiveServer で動作しない (dotnet/aspnetcore #53707)」を参照してください。
役に立つ問題解決のヒントを含む GitHub の問題
ASP.NET Core