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 つあります。

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. 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 の問題