ASP.NET Core のローカライズに関するトラブルシューティング
作成者: 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 拡張メソッドを使用して、カスタム プロバイダーを初期プロバイダーとして設定します。
ルート名前空間に関する問題
アセンブリのルート名前空間がアセンブリ名と異なる場合、既定ではローカライズは動作しません。 この問題を回避するには RootNamespace
属性を使用します。これについては、「ASP.NET Core のグローバリゼーションとローカライズ」で説明されています。
警告
ルート名前空間に関する問題は、プロジェクトの名前が有効な .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