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 では、ローカライズ リソース ファイルの名前付けに対するルールとガイドラインがあらかじめ定義されています。詳細については、こちらをご覧ください。
リソースの不足
リソースが見つからない一般的な原因は次のとおりです。
resx
ファイルまたはローカライズ ツールの要求のいずれかで、ファイル名のスペルが間違っています。- 一部の言語の
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.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
AddInitialRequestCultureProvider
拡張メソッドを使用して、初期プロバイダーとしてカスタム プロバイダーを設定します。
ルート名前空間に関する問題
アセンブリのルート名前空間がアセンブリ名と異なる場合、既定ではローカライズは動作しません。 RootNamespace を使用するこの問題を回避する方法は、ここで説明されています。
警告
これは、プロジェクト名が有効な .NET 識別子でない場合に発生する可能性があります。 たとえば、my-project-name.csproj
ではルート名前空間 my_project_name
が使用されるので、アセンブリ名 my-project-name
はこのエラーにつながります。
リソースとビルド アクション
ローカライズのためにリソース ファイルを使用する場合、適切なビルド アクションが存在することが重要です。 これらは埋め込みリソースである必要があり、それ以外の場合、ResourceStringLocalizer
でこれらのリソースを見つけることはできません。
役に立つ問題解決のヒントを含む GitHub の問題
ASP.NET Core
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示