.NET アプリでのリソースのパッケージ化と配置Packaging and Deploying Resources in .NET Apps

アプリケーションは、ResourceManager クラスによって表される .NET Framework リソース マネージャーに依存して、ローカライズされたリソースを取得します。Applications rely on the .NET Framework Resource Manager, represented by the ResourceManager class, to retrieve localized resources. リソース マネージャーでは、リソースのパッケージ化と配置にハブ アンド スポーク モデルを使うことが想定されています。The Resource Manager assumes that a hub and spoke model is used to package and deploy resources. ハブは、ローカライズできない実行可能コードと、ニュートラル カルチャまたは既定のカルチャと呼ばれる単一カルチャ用のリソースを含む、メイン アセンブリです。The hub is the main assembly that contains the nonlocalizable executable code and the resources for a single culture, called the neutral or default culture. 既定のカルチャはアプリケーション用のフォールバック カルチャです。つまり、ローカライズされたリソースが見つからない場合に使われるリソースのカルチャです。The default culture is the fallback culture for the application; it is the culture whose resources are used if localized resources cannot be found. 各スポークは、単一のカルチャ用のリソースを含むがコードは含まないサテライト アセンブリに接続します。Each spoke connects to a satellite assembly that contains the resources for a single culture, but does not contain any code.

このモデルにいくつかの利点があります。There are several advantages to this model:

  • アプリケーションを配置した後で、段階的に新しいカルチャのリソースを追加できます。You can incrementally add resources for new cultures after you have deployed an application. カルチャに固有のリソースを後で開発するには多くの時間を必要とすることがあるため、後から追加できれば、メイン アプリケーションを最初にリリースしておき、カルチャ固有のリソースを後で配布できます。Because subsequent development of culture-specific resources can require a significant amount of time, this allows you to release your main application first, and deliver culture-specific resources at a later date.

  • アプリケーションを再コンパイルすることなく、アプリケーションのサテライト アセンブリを更新および変更することができます。You can update and change an application's satellite assemblies without recompiling the application.

  • アプリケーションで読み込む必要があるのは、特定のカルチャに必要なリソースを含むサテライト アセンブリだけです。An application needs to load only those satellite assemblies that contain the resources needed for a particular culture. このようにすると、システム リソースの使用を大幅に減らすことができます。This can significantly reduce the use of system resources.

ただし、このモデルにも短所はあります。However, there are also disadvantages to this model:

  • 複数のリソース セットを管理する必要があります。You must manage multiple sets of resources.

  • 複数の構成をテストする必要があるため、アプリケーションのテストの初期コストが増えます。The initial cost of testing an application increases, because you must test several configurations. 長期的に見れば、複数の各国語バージョンを並列にテストして管理するより、複数のサテライトを持つ 1 つの中核アプリケーションをテストする方が簡単かつ安価であることに注意してください。Note that in the long term it will be easier and less expensive to test one core application with several satellites, than to test and maintain several parallel international versions.

リソースの名前付け規則Resource Naming Conventions

アプリケーションのリソースをパッケージ化するときは、共通言語ランタイムで想定されているリソース名前付け規則を使って、リソースに名前を付ける必要があります。When you package your application's resources, you must name them using the resource naming conventions that the common language runtime expects. ランタイムは、そのカルチャ名でリソースを識別します。The runtime identifies a resource by its culture name. 各カルチャには一意の名前が指定されています。通常は、言語に関連付けられた小文字 2 文字のカルチャ名と、必要に応じて、国または地域に関連付けられた大文字 2 文字のサブカルチャ名を組み合わせたものです。Each culture is given a unique name, which is usually a combination of a two-letter, lowercase culture name associated with a language and, if required, a two-letter, uppercase subculture name associated with a country or region. カルチャ名の後にダッシュ (-) で区切ってサブカルチャ名は記述します。The subculture name follows the culture name, separated by a dash (-). 日本で話される日本語は ja-JP、米国で話される英語は en-US、ドイツで話されるドイツ語は de-DE、オーストリアで話されるドイツ語は de-AT などとなります。Examples include ja-JP for Japanese as spoken in Japan, en-US for English as spoken in the United States, de-DE for German as spoken in Germany, or de-AT for German as spoken in Austria. Windows でサポートされている言語/地域名の一覧の「Language tag (言語タグ) 」列をご覧ください。See the Language tag column in the list of language/region names supported by Windows. カルチャ名は、BCP 47 によって定義されている標準に準拠します。Culture names follow the standard defined by BCP 47.

注意

リソース ファイルの作成については、「リソース ファイルの作成」および「サテライト アセンブリの作成」をご覧ください。For information about creating resource files, see Creating Resource Files and Creating Satellite Assemblies.

リソース フォールバック プロセスThe Resource Fallback Process

リソースのパッケージ化と配置のハブ アンド スポーク モデルでは、適切なリソースを見つけるためにフォールバック プロセスが使われます。The hub and spoke model for packaging and deploying resources uses a fallback process to locate appropriate resources. アプリケーションが使用できないローカライズされたリソースを要求した場合、共通言語ランタイムは、カルチャの階層で、ユーザーのアプリケーションの要求と最もよく一致する適切なフォールバック リソースを検索し、例外がスローされるのは最終的な手段としてのみです。If an application requests a localized resource that is unavailable, the common language runtime searches the hierarchy of cultures for an appropriate fallback resource that most closely matches the user's application's request, and throws an exception only as a last resort. 階層の各レベルで適切なリソースが見つかった場合、ランタイムはそれを使います。At each level of the hierarchy, if an appropriate resource is found, the runtime uses it. リソースが見つからない場合、次のレベルで検索が続けられます。If the resource is not found, the search continues at the next level.

検索のパフォーマンスを向上させるには、NeutralResourcesLanguageAttribute 属性をメイン アセンブリに適用し、メイン アセンブリで動作するニュートラル言語の名前をそれに渡します。To improve lookup performance, apply the NeutralResourcesLanguageAttribute attribute to your main assembly, and pass it the name of the neutral language that will work with your main assembly.

.NET Framework のリソース フォールバック プロセス.NET Framework resource fallback process

.NET Framework のリソース フォールバック プロセスには次の手順が含まれます。The .NET Framework resource fallback process involves the following steps:

ヒント

<relativeBindForResources> 構成要素を使うことで、リソース フォールバック プロセスおよびランタイムがリソース アセンブリをプローブするプロセスを、最適化できる場合があります。You may be able to use the <relativeBindForResources> configuration element to optimize the resource fallback process and the process by which the runtime probes for resource assemblies. 詳しくは、「リソース フォールバック プロセスの最適化」セクションをご覧ください。For more information, see the Optimizing the Resource Fallback Process section.

  1. ランタイムは最初に、グローバル アセンブリ キャッシュで、アプリケーションに対して要求されたカルチャと一致するアセンブリを調べます。The runtime first checks the global assembly cache for an assembly that matches the requested culture for your application.

    グローバル アセンブリ キャッシュには、多くのアプリケーションで共有されるリソース アセンブリを格納できます。The global assembly cache can store resource assemblies that are shared by many applications. これにより、作成するすべてのアプリケーションのディレクトリ構造に特定のリソース セットを含める必要がなくなります。This frees you from having to include specific sets of resources in the directory structure of every application you create. アセンブリへの参照が見つかると、ランタイムは要求されたリソースのアセンブリを検索します。If the runtime finds a reference to the assembly, it searches the assembly for the requested resource. アセンブリでエントリが見つかると、ランタイムは要求されたリソースを使います。If it finds the entry in the assembly, it uses the requested resource. エントリが見つからない場合は、検索を続けます。If it doesn't find the entry, it continues the search.

  2. 次に、ランタイムは、現在実行中のアセンブリのサブディレクトリで、要求されたカルチャと一致するディレクトリを調べます。The runtime next checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. サブディレクトリが見つかった場合、要求されたカルチャの有効なサテライト アセンブリをそのサブディレクトリで検索します。If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture. ランタイムはその後、要求されたリソースのサテライト アセンブリを検索します。The runtime then searches the satellite assembly for the requested resource. アセンブリでリソースが見つかると、それを使用します。If it finds the resource in the assembly, it uses it. リソースが見つからない場合は、検索を続けます。If it doesn't find the resource, it continues the search.

  3. ランタイムは次に、Windows インストーラーに問い合わせて、サテライト アセンブリをオンデマンドでインストールする必要があるかどうかを確認します。The runtime next queries the Windows Installer to determine whether the satellite assembly is to be installed on demand. 必要がある場合は、インストールを処理し、アセンブリを読み込んで要求されたリソースを検索します。If so, it handles the installation, loads the assembly, and searches it or the requested resource. アセンブリでリソースが見つかると、それを使用します。If it finds the resource in the assembly, it uses it. リソースが見つからない場合は、検索を続けます。If it doesn't find the resource, it continues the search.

  4. ランタイムは AppDomain.AssemblyResolve イベントを生成し、サテライト アセンブリが見つからないことを示します。The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. イベントを処理することを選択した場合、イベント ハンドラーはリソースを検索に使用するサテライト アセンブリへの参照を返すことができます。If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. それ以外の場合、イベント ハンドラーは null を返し、検索が続けられます。Otherwise, the event handler returns null and the search continues.

  5. ランタイムは次に、再びグローバル アセンブリ キャッシュで、今度は要求されたカルチャの親アセンブリを検索します。The runtime next searches the global assembly cache again, this time for the parent assembly of the requested culture. 親アセンブリがグローバル アセンブリ キャッシュに存在する場合、ランタイムはそのアセンブリで要求されたリソースを検索します。If the parent assembly exists in the global assembly cache, the runtime searches the assembly for the requested resource.

    親カルチャは、適切なフォールバック カルチャとして定義されます。The parent culture is defined as the appropriate fallback culture. 例外をスローするよりは何らかのリソースを提供する方がよいので、親をフォールバック候補として考えます。Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. このプロセスでは、リソースを再利用することもできます。This process also allows you to reuse resources. 子カルチャが要求されたリソースをローカライズする必要がない場合にのみ、親レベルで特定のリソースを含める必要があります。You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. たとえば、en (ニュートラル英語)、en-GB (イギリスで話される英語)、および en-US (米国で話される英語) のサテライト アセンブリを提供する場合、en サテライトには一般的な用語が含まれます。また、en-GB および en-US サテライトに異なる用語のみのオーバーライドを用意することができます。For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite would contain the common terminology, and the en-GB and en-US satellites could provide overrides for only those terms that differ.

  6. 次に、ランタイムは、現在実行中のアセンブリのディレクトリが親ディレクトリを含むかどうかを調べます。The runtime next checks the directory of the currently executing assembly to see if it contains a parent directory. 親ディレクトリが存在する場合、ランタイムはそのディレクトリで、親カルチャの有効なサテライト アセンブリを検索します。If a parent directory exists, the runtime searches the directory for a valid satellite assembly for the parent culture. アセンブリが見つかると、ランタイムは要求されたリソースのアセンブリを検索します。If it finds the assembly, the runtime searches the assembly for the requested resource. リソースが見つかった場合は、それを使用します。If it finds the resource, it uses it. リソースが見つからない場合は、検索を続けます。If it doesn't find the resource, it continues the search.

  7. ランタイムは次に、Windows インストーラーに問い合わせて、親サテライト アセンブリをオンデマンドでインストールする必要があるかどうかを確認します。The runtime next queries the Windows Installer to determine whether the parent satellite assembly is to be installed on demand. 必要がある場合は、インストールを処理し、アセンブリを読み込んで要求されたリソースを検索します。If so, it handles the installation, loads the assembly, and searches it or the requested resource. アセンブリでリソースが見つかると、それを使用します。If it finds the resource in the assembly, it uses it. リソースが見つからない場合は、検索を続けます。If it doesn't find the resource, it continues the search.

  8. ランタイムは AppDomain.AssemblyResolve イベントを生成し、適切なフォールバック リソースが見つからないことを示します。The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find an appropriate fallback resource. イベントを処理することを選択した場合、イベント ハンドラーはリソースを検索に使用するサテライト アセンブリへの参照を返すことができます。If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. それ以外の場合、イベント ハンドラーは null を返し、検索が続けられます。Otherwise, the event handler returns null and the search continues.

  9. ランタイムは次に、前の 3 つの手順と同じように、可能性のある多くのレベルで親アセンブリを検索します。The runtime next searches parent assemblies, as in the previous three steps, through many potential levels. 各カルチャの親は 1 つだけで、CultureInfo.Parent プロパティによって定義されていますが、親がそれ自身の親を持つ可能性があります。Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. 親カルチャの検索は、Parent プロパティが CultureInfo.InvariantCulture を返した時点で停止します。リソース フォールバックでは、インバリアント カルチャは、親カルチャまたはリソースを持つことができるカルチャと見なされません。The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture; for resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  10. もともと指定されていたカルチャおよびすべての親を検索してもリソースが見つからない場合は、既定の (フォールバック) カルチャのリソースが使われます。If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. 通常、既定のカルチャのリソースは、メイン アプリケーション アセンブリに格納されています。Typically, the resources for the default culture are included in the main application assembly. ただし、NeutralResourcesLanguageAttribute 属性の Location プロパティに値 Satellite を指定することで、リソースの最終的なフォールバックの場所が、メイン アセンブリではなくサテライト アセンブリであることを示すことができます。However, you can specify a value of Satellite for the Location property of the NeutralResourcesLanguageAttribute attribute to indicate that the ultimate fallback location for resources is a satellite assembly, rather than the main assembly.

    注意

    既定のリソースは、メイン アセンブリでコンパイルできる唯一のリソースです。The default resource is the only resource that can be compiled with the main assembly. NeutralResourcesLanguageAttribute 属性を使ってサテライト アセンブリを指定していない場合、最終的なフォールバック (最後の親) になります。Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). したがって、常に既定のリソース セットをメイン アセンブリに含めることをお勧めします。Therefore, we recommend that you always include a default set of resources in your main assembly. これは、例外がスローされるのを防ぐのに役立ちます。This helps prevent exceptions from being thrown. 既定のリソース ファイルを含めることにより、すべてのリソースに対してフォールバックが提供され、固有のカルチャではなくても、常に少なくとも 1 つのリソースがユーザーに存在することが保証されます。By including a default resource, file you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  11. 最後に、既定の (フォールバック) カルチャのリソースが見つからない場合は、MissingManifestResourceException または MissingSatelliteAssemblyException 例外がスローされて、リソースが見つからなかったことが示されます。Finally, if the runtime doesn't find a resource for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found.

たとえば、アプリケーションがスペイン語 (メキシコ) (es-MX カルチャ) にローカライズされたリソースを要求しているものとします。For example, suppose the application requests a resource localized for Spanish (Mexico) (the es-MX culture). ランタイムは最初に、グローバル アセンブリ キャッシュで es-MX と一致するアセンブリを検索しますが、見つかりません。The runtime first searches the global assembly cache for the assembly that matches es-MX, but doesn't find it. ランタイムは、現在実行中のアセンブリのディレクトリで es-MX のディレクトリを検索します。The runtime then searches the directory of the currently executing assembly for an es-MX directory. 見つからない場合、ランタイムは再びグローバル アセンブリ キャッシュで、適切なフォールバック カルチャ (この場合は es (スペイン語)) を反映する親アセンブリを検索します。Failing that, the runtime searches the global assembly cache again for a parent assembly that reflects the appropriate fallback culture — in this case, es (Spanish). 親アセンブリが見つからない場合、ランタイムは、対応するリソースが見つかるまで、親アセンブリのすべての可能性のあるレベルで、es-MX カルチャを検索します。If the parent assembly is not found, the runtime searches all potential levels of parent assemblies for the es-MX culture until it finds a corresponding resource. それでもリソースが見つからない場合、ランタイムは、既定のカルチャのリソースを使います。If a resource isn't found, the runtime uses the resource for the default culture.

.NET Framework のリソース フォールバック プロセスの最適化Optimizing the .NET Framework Resource Fallback Process

次の条件が満たされていれば、ランタイムがサテライト アセンブリでリソースを検索するプロセスを最適化することができます。Under the following conditions, you can optimize the process by which the runtime searches for resources in satellite assemblies

  • サテライト アセンブリが、コード アセンブリと同じ場所に配置されていること。Satellite assemblies are deployed in the same location as the code assembly. コード アセンブリがグローバル アセンブリ キャッシュにインストールされている場合、サテライト アセンブリもグローバル アセンブリ キャッシュにインストールされます。If the code assembly is installed in the Global Assembly Cache, satellite assemblies are also installed in the global assembly cache. コード アセンブリがディレクトリにインストールされている場合、サテライト アセンブリはそのディレクトリのカルチャ固有のフォルダーにインストールされます。If the code assembly is installed in a directory, satellite assemblies are installed in culture-specific folders of that directory.

  • サテライト アセンブリは、オンデマンドではインストールされません。Satellite assemblies are not installed on demand.

  • アプリケーションのコードは、AppDomain.AssemblyResolve イベントを処理しません。Application code does not handle the AppDomain.AssemblyResolve event.

次の例に示すように、アプリケーション構成ファイルで <relativeBindForResources> 要素を指定し、その enabled 属性を true に設定することにより、サテライト アセンブリのプローブを最適化します。You optimize the probe for satellite assemblies by including the <relativeBindForResources> element and setting its enabled attribute to true in the application configuration file, as shown in the following example.

<configuration>
   <runtime>
      <relativeBindForResources enabled="true" />
   </runtime>
</configuration>

サテライト アセンブリの最適化されたプローブは、オプトイン機能です。The optimized probe for satellite assemblies is an opt-in feature. つまり、アプリケーションの構成ファイルに enabled 属性が true に設定されている <relativeBindForResources> 要素が存在しない限り、ランタイムは「リソース フォールバック プロセス」で説明されている手順に従います。That is, the runtime follows the steps documented in The Resource Fallback Process unless the <relativeBindForResources> element is present in the application's configuration file and its enabled attribute is set to true. その場合、サテライト アセンブリをプローブするプロセスは次のように変更されます。If this is the case, the process of probing for a satellite assembly is modified as follows:

  • ランタイムは、親コード アセンブリの場所を使って、サテライト アセンブリをプローブします。The runtime uses the location of the parent code assembly to probe for the satellite assembly. 親アセンブリがグローバル アセンブリ キャッシュにインストールされている場合、ランタイムはアプリケーションのディレクトリではなくキャッシュ内をプローブします。If the parent assembly is installed in the global assembly cache, the runtime probes in the cache but not in the application's directory. 親アセンブリがアプリケーション ディレクトリにインストールされている場合、ランタイムはグローバル アセンブリ キャッシュではなくアプリケーション ディレクトリをプローブします。If the parent assembly is installed in an application directory, the runtime probes in the application directory but not in the global assembly cache.

  • ランタイムは、Windows インストーラーでサテライト アセンブリのオンデマンド インストールを照会しません。The runtime doesn't query the Windows Installer for on-demand installation of satellite assemblies.

  • 特定のリソース アセンブリのプローブが失敗した場合、ランタイムは AppDomain.AssemblyResolve イベントを生成しません。If the probe for a particular resource assembly fails, the runtime does not raise the AppDomain.AssemblyResolve event.

.NET Core リソース フォールバック プロセス.NET Core resource fallback process

.NET Core リソース フォールバック プロセスには次の手順が含まれます。The .NET Core resource fallback process involves the following steps:

  1. 要求されたカルチャのサテライト アセンブリの読み込みがランタイムで試行されます。The runtime attempts to load a satellite assembly for the requested culture.

    • 現在実行中のアセンブリのサブディレクトリで、要求されたカルチャと一致するディレクトリを調べます。Checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. サブディレクトリが見つかった場合、要求されたカルチャの有効なサテライト アセンブリがそのサブディレクトリで検索され、読み込まれます。If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture and loads it.

      注意

      大文字と小文字を区別するファイル システム (つまり Linux と macOS) を持つオペレーティング システムでは、カルチャ名のサブディレクトリ検索では大文字と小文字が区別されます。On operating systems with case-sensitive file systems (that is, Linux and macOS), the culture name subdirectory search is case-sensitive. サブディレクトリ名は、CultureInfo.Name の大文字と小文字が完全に一致する必要があります (たとえば eses-MX)。The subdirectory name must exactly match the case of the CultureInfo.Name (for example, es or es-MX).

      注意

      プログラマーが AssemblyLoadContext からカスタム アセンブリの読み込みコンテキストを派生させた場合、状況は複雑になります。If the programmer has derived a custom assembly load context from AssemblyLoadContext, the situation is complicated. 実行中のアセンブリがカスタム コンテキストに読み込まれた場合、ランタイムによってサテライト アセンブリがカスタム コンテキストに読み込まれます。If the executing assembly was loaded into the custom context, the runtime loads the satellite assembly into the custom context. このドキュメントでは詳細について説明しません。The details are out of scope for this document. AssemblyLoadContext」を参照してください。See AssemblyLoadContext.

    • サテライト アセンブリが見つからない場合、AssemblyLoadContextAssemblyLoadContext.Resolving イベントを発生させ、サテライト アセンブリが見つからないことを示します。If a satellite assemble has not been found, the AssemblyLoadContext raises the AssemblyLoadContext.Resolving event to indicate that it is unable to find the satellite assembly. イベントを処理することを選択した場合、イベント ハンドラーでサテライト アセンブリの参照を読み込んで返すことができます。If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

    • まだサテライト アセンブリが見つからない場合は、AssemblyLoadContext は AppDomain に AppDomain.AssemblyResolve イベントをトリガーさせて、サテライト アセンブリが見つからないことを示します。If a satellite assembly still has not been found, the AssemblyLoadContext causes the AppDomain to trigger an AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. イベントを処理することを選択した場合、イベント ハンドラーでサテライト アセンブリの参照を読み込んで返すことができます。If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

  2. サテライト アセンブリが見つかった場合、要求されたリソースのサテライト アセンブリがランタイムによって検索されます。If a satellite assembly is found, the runtime searches it for the requested resource. アセンブリでリソースが見つかると、それを使用します。If it finds the resource in the assembly, it uses it. リソースが見つからない場合は、検索を続けます。If it doesn't find the resource, it continues the search.

    注意

    サテライト アセンブリ内のリソースを見つけるために、ランタイムでは現在の CultureInfo.NameResourceManager によって要求されたリソース ファイルが検索されます。To find a resource within the satellite assembly, the runtime searches for the resource file requested by the ResourceManager for the current CultureInfo.Name. リソース ファイル内で、要求されたリソース名が検索されます。Within the resource file it searches for the requested resource name. いずれかが見つからない場合、リソースは見つからなかったものとして扱われます。If either is not found, the resource is treated as not found.

  3. 次に、ランタイムでは、手順 1 および 2 を繰り返す度に、考えられる多数のレベルについて親カルチャ アセンブリが検索されます。The runtime next searches the parent culture assemblies through many potential levels, each time repeating steps 1 & 2.

    親カルチャは、適切なフォールバック カルチャとして定義されます。The parent culture is defined as an appropriate fallback culture. 例外をスローするよりは何らかのリソースを提供する方がよいので、親をフォールバック候補として考えます。Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. このプロセスでは、リソースを再利用することもできます。This process also allows you to reuse resources. 子カルチャが要求されたリソースをローカライズする必要がない場合にのみ、親レベルで特定のリソースを含める必要があります。You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. たとえば、en (ニュートラル英語)、en-GB (イギリスで話される英語)、および en-US (米国で話される英語) のサテライト アセンブリを提供する場合、en サテライトには一般的な用語が含まれます。また、en-GB および en-US サテライトには異なる用語のみのオーバーライドが用意されます。For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite contains the common terminology, and the en-GB and en-US satellites provides overrides for only those terms that differ.

    各カルチャの親は 1 つだけで、CultureInfo.Parent プロパティによって定義されていますが、親がそれ自身の親を持つ可能性があります。Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. カルチャの Parent プロパティから CultureInfo.InvariantCulture が返されると、親カルチャの検索は停止します。The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture. リソースのフォールバックの場合、インバリアント カルチャは、親カルチャ (つまりリソースを持つことができるカルチャ) と見なされません。For resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  4. もともと指定されていたカルチャおよびすべての親を検索してもリソースが見つからない場合は、既定の (フォールバック) カルチャのリソースが使われます。If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. 通常、既定のカルチャのリソースは、メイン アプリケーション アセンブリに格納されています。Typically, the resources for the default culture are included in the main application assembly. ただし、Location プロパティに値 Satellite を指定することで、リソースの最終的なフォールバックの場所が、メイン アセンブリではなくサテライト アセンブリであることを示すことができます。However, you can specify a value of Satellite for the Location property to indicate that the ultimate fallback location for resources is a satellite assembly rather than the main assembly.

    注意

    既定のリソースは、メイン アセンブリでコンパイルできる唯一のリソースです。The default resource is the only resource that can be compiled with the main assembly. NeutralResourcesLanguageAttribute 属性を使ってサテライト アセンブリを指定していない場合、最終的なフォールバック (最後の親) になります。Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). したがって、常に既定のリソース セットをメイン アセンブリに含めることをお勧めします。Therefore, we recommend that you always include a default set of resources in your main assembly. これは、例外がスローされるのを防ぐのに役立ちます。This helps prevent exceptions from being thrown. 既定のリソース ファイルを含めることにより、すべてのリソースに対してフォールバックが提供され、固有のカルチャではなくても、常に少なくとも 1 つのリソースがユーザーに存在することが保証されます。By including a default resource file, you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  5. 最後に、既定の (フォールバック) カルチャのリソース ファイルが見つからない場合は、MissingManifestResourceException または MissingSatelliteAssemblyException 例外がスローされて、リソースが見つからなかったことが示されます。Finally, if the runtime doesn't find a resource file for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found. リソース ファイルが見つかり、要求されたリソースが存在しない場合は、要求から null が返されます。If the resource file is found but the requested resource is not present the request returns null.

サテライト アセンブリへの最終的なフォールバックUltimate Fallback to Satellite Assembly

必要に応じて、メイン アセンブリからリソースを削除し、特定のカルチャに対応するサテライト アセンブリから最終的なフォールバック リソースを読み込む必要があることをランタイムに指定できます。You can optionally remove resources from the main assembly and specify that the runtime should load the ultimate fallback resources from a satellite assembly that corresponds to a specific culture. フォールバック プロセスを制御するには、NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) コンストラクターを使用し、リソース マネージャーがメイン アセンブリまたはサテライト アセンブリからフォールバック リソースを抽出する必要があるかどうかを指定する UltimateResourceFallbackLocation パラメーターの値を指定します。To control the fallback process, you use the NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) constructor and supply a value for the UltimateResourceFallbackLocation parameter that specifies whether Resource Manager should extract the fallback resources from the main assembly or from a satellite assembly.

次の .NET Framework の例では、NeutralResourcesLanguageAttribute 属性を使って、フランス語 (fr) のサテライト アセンブリにアプリケーションのフォールバック リソースを格納しています。The following .NET Framework example uses the NeutralResourcesLanguageAttribute attribute to store an application's fallback resources in a satellite assembly for the French (fr) language. この例には、Greeting という名前の 1 つの文字列リソースを定義するテキスト ベースのリソース ファイルが 2 つあります。The example has two text-based resource files that define a single string resource named Greeting. 1 番目の resources.fr.txt には、フランス語の言語リソースが含まれています。The first, resources.fr.txt, contains a French language resource.

Greeting=Bon jour!

2 番目の resources,ru.txt には、ロシア語の言語リソースが含まれています。The second, resources,ru.txt, contains a Russian language resource.

Greeting=Добрый день

コマンド ラインからリソース ファイル ジェネレーター (Resgen.exe) を実行することで、これら 2 つのファイルを .resources にコンパイルします。These two files are compiled to .resources files by running the resource file generator (Resgen.exe) from the command line. フランス語リソースの場合、コマンドは次のようになります。For the French language resource, the command is:

resgen.exe resources.fr.txtresgen.exe resources.fr.txt

ロシア語リソースの場合、コマンドは次のようになります。For the Russian language resource, the command is:

resgen.exe resources.ru.txtresgen.exe resources.ru.txt

コマンド ラインからアセンブリ リンカー (Al.exe) を実行することにより、.resources ファイルをダイナミック リンク ライブラリに埋め込みます。フランス語リソースの場合のコマンドは次のとおりです。The .resources files are embedded into dynamic link libraries by running assembly linker (Al.exe) from the command line for the French language resource as follows:

al /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dllal /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dll

ロシア語リソースの場合のコマンドは次のとおりです。and for the Russian language resource as follows:

al /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dllal /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dll

アプリケーションのソース コードは、Example1.cs または Example1.vb という名前のファイルに存在します。The application source code resides in a file named Example1.cs or Example1.vb. このファイルには、既定のアプリケーション リソースが fr サブディレクトリにあることを示す NeutralResourcesLanguageAttribute 属性が含まれます。It includes the NeutralResourcesLanguageAttribute attribute to indicate that the default application resource is in the fr subdirectory. リソース マネージャーをインスタンス化し、Greeting リソースの値を取得して、コンソールに表示します。It instantiates the Resource Manager, retrieves the value of the Greeting resource, and displays it to the console.

using System;
using System.Reflection;
using System.Resources;

[assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)]

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("resources", 
                                               typeof(Example).Assembly);
      string greeting = rm.GetString("Greeting");
      Console.WriteLine(greeting); 
   }
}
Imports System.Reflection
Imports System.Resources

<Assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)>
Module Example
   Public Sub Main()
      Dim rm As New ResourceManager("resources", GetType(Example).Assembly)
      Dim greeting As String = rm.GetString("Greeting")
      Console.WriteLine(greeting) 
   End Sub
End Module

その後、次のようにコマンド ラインから C# のソース コードをコンパイルできます。You can then compile C# source code from the command line as follows:

csc Example1.cs

Visual Basic コンパイラのコマンドは次のとおりです。The command for the Visual Basic compiler is very similar:

vbc Example1.vb

メイン アセンブリにはリソースが埋め込まれていないため、/resource スイッチを使ってコンパイルする必要はありません。Because there are no resources embedded in the main assembly, you do not have to compile by using the /resource switch.

言語がロシア語以外のシステムから例を実行すると、次の出力が表示されます。When you run the example from a system whose language is anything other than Russian, it displays the following output:

Bon jour!

推奨されるパッケージ化の代替方法Suggested Packaging Alternative

時間や予算の制約により、アプリケーションがサポートするすべてのサブカルチャのリソース セットを作成できない場合があります。Time or budget constraints might prevent you from creating a set of resources for every subculture that your application supports. そのような場合は、関連のあるすべてのサブカルチャで使うことができる親カルチャ用の単一のサテライト アセンブリを作成できます。Instead, you can create a single satellite assembly for a parent culture that all related subcultures can use. たとえば、地域固有の英語リソースを要求するユーザーによって取得される単一の英語サテライト アセンブリ (en) と、地域固有のドイツ語リソースを要求するユーザー用の単一のドイツ語サテライト アセンブリ (de) を提供することができます。For example, you can provide a single English satellite assembly (en) that is retrieved by users who request region-specific English resources, and a single German satellite assembly (de) for users who request region-specific German resources. たとえば、ドイツ (de-DE)、オーストリア (de-AT)、スイス (de-CH) で話されるドイツ語の要求は、ドイツ語のサテライト アセンブリ (de) にフォールバックします。For example, requests for German as spoken in Germany (de-DE), Austria (de-AT), and Switzerland (de-CH) would fall back to the German satellite assembly (de). 既定のリソースは最終的なフォールバックであり、アプリケーションのほとんどのユーザーによって要求されるリソースであるため、これらのリソースは慎重に選択する必要があります。The default resources are the final fallback and therefore should be the resources that will be requested by the majority of your application's users, so choose these resources carefully. この方法では、カルチャ固有性の低いリソースが配置されますが、アプリケーションのローカライズ費用を大幅に削減できます。This approach deploys resources that are less culturally specific, but can significantly reduce your application's localization costs.

関連項目See also