System.Resources.NeutralResourcesLanguageAttribute クラス

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

デスクトップ アプリでは、この属性は NeutralResourcesLanguageAttribute 、アプリの既定のカルチャとそのリソースの場所をリソース マネージャーに通知します。 既定では、リソースは メイン アプリ アセンブリに埋め込まれており、次のように属性を使用できます。 このステートメントは、英語 (米国) がアプリの既定のカルチャであることを指定します。

[assembly: NeutralResourcesLanguage("en-US")]
<Assembly:NeutralResourcesLanguage("en-US")>

属性ステートメントに列挙値をNeutralResourcesLanguageAttribute指定することで、この属性を使用して、既定のカルチャのリソースをUltimateResourceFallbackLocation検索できる場所ResourceManagerを示すこともできます。 これは、リソースがサテライト アセンブリ内に存在することを示すために最も一般的に行われます。 たとえば、次のステートメントは、英語 (米国) がアプリの既定のカルチャまたはニュートラル カルチャであり、そのリソースがサテライト アセンブリに存在することを指定します。 オブジェクトは ResourceManager 、en-US という名前のサブディレクトリでそれらを検索します。

[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
<Assembly:NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)>

ヒント

常に属性を NeutralResourcesLanguageAttribute 使用して、アプリの既定のカルチャを定義することをお勧めします。

この属性は、次の 2 つのロールを実行します。

  • 既定のカルチャのリソースがアプリのメイン アセンブリに埋め込まれており、既定のカルチャとResourceManager同じカルチャに属するリソースを取得する必要がある場合、ResourceManagerサテライト アセンブリを検索する代わりに、メイン アセンブリ内にあるリソースが自動的に使用されます。 これにより、通常のアセンブリ プローブがバイパスされ、読み込んだ最初のリソースに対する検索パフォーマンスが向上し、ワーキング セットを縮小できます。 リソース ファイルのプローブに使用するプロセスResourceManagerについては、「リソースのパッケージ化とデプロイ」を参照してください

  • 既定のカルチャのリソースが、メイン アプリ アセンブリではなくサテライト アセンブリにある場合、この属性は、NeutralResourcesLanguageAttributeランタイムがリソースを読み込むことができるカルチャとディレクトリを指定します。

Windows 8.x ストア アプリ

クラスを使用して ResourceManager リソースが読み込まれて取得される Windows 8.x ストア アプリでは、この属性は、 NeutralResourcesLanguageAttribute プローブが失敗した場合にリソースが使用されるニュートラル カルチャを定義します。 リソースの場所は指定されません。 既定では、 ResourceManager アプリのパッケージ リソース インデックス (PRI) ファイルを使用して、既定のカルチャのリソースを検索します。 この効果をシミュレートするために、属性によって NeutralResourcesLanguageAttribute 定義されたニュートラル カルチャが UI 言語リストの末尾に追加されます。

Windows ランタイムWindows.ApplicationModel.Resources.ResourceLoader クラスまたは Windows.ApplicationModel.Resources.Core 名前空間の型を使用してリソースを読み込んで取得する場合、NeutralResourcesLanguageAttributeこの属性は無視されます。

次の例では、単純な "Hello World" アプリを使用して、属性を NeutralResourcesLanguageAttribute 使用して既定のカルチャまたはフォールバック カルチャを定義する方法を示します。 英語 (en)、英語 (米国) (en-US)、フランス語 (フランス) (fr-FR) カルチャ用に個別のリソース ファイルを作成する必要があります。 英語のカルチャにExampleResources.txtという名前のテキスト ファイルの内容を次に示します。

# Resources for the default (en) culture.
Greeting=Hello

アプリでリソース ファイルを使用するには、リソース ファイル ジェネレーター (Resgen.exe) を使用して、次のようにファイルをテキスト (.txt) 形式からバイナリ (.resources) 形式に変換する必要があります。

resgen ExampleResources.txt

アプリがコンパイルされると、バイナリ リソース ファイルが メイン アプリ アセンブリに埋め込まれます。

英語 (米国) カルチャのリソースを提供する ExampleResources.en-US.txt という名前のテキスト ファイルの内容を次に示します。

# Resources for the en-US culture.
Greeting=Hi

テキスト ファイルは、次のようにコマンド ラインでリソース ファイル ジェネレーター (ResGen.exe) を使用してバイナリ リソース ファイルに変換できます。

resgen ExampleResources.en-US.txt ExampleResources.en-US.resources

バイナリ リソース ファイルは、アセンブリ リンカー (Al.exe) を使用してアセンブリにコンパイルし、次のコマンドを発行してアプリ ディレクトリの en-US サブディレクトリに配置する必要があります。

al /t:lib /embed:ExampleResources.en-US.resources /culture:en-US /out:en-us\Example.resources.dll

フランス語 (フランス) カルチャのリソースを提供するExampleResources.fr-FR.txtという名前のテキスト ファイルの内容を次に示します。

# Resources for the fr-FR culture.
Greeting=Bonjour

テキスト ファイルは、コマンド ラインで次のようにResGen.exeを使用してバイナリ リソース ファイルに変換できます。

resgen ExampleResources.fr-FR.txt ExampleResources.fr-FR.resources

バイナリ リソース ファイルは、アセンブリ リンカーを使用してアセンブリにコンパイルし、次のコマンドを発行してアプリ ディレクトリの fr-FR サブディレクトリに配置する必要があります。

al /t:lib /embed:ExampleResources.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll

次の例では、現在のカルチャを設定し、ユーザーの名前を求め、ローカライズされた文字列を表示する実行可能コードを提供します。

using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;

[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example
{
    public static void Main()
    {
        // Select the current culture randomly to test resource fallback.
        string[] cultures = { "de-DE", "en-us", "fr-FR" };
        Random rnd = new Random();
        int index = rnd.Next(0, cultures.Length);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultures[index]);
        Console.WriteLine("The current culture is {0}",
                          CultureInfo.CurrentUICulture.Name);

        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine("{0} {1}!", greeting, name);
    }
}
Imports System.Globalization
Imports System.Resources
Imports System.Threading 

<Assembly:NeutralResourcesLanguageAttribute("en")>

Module Example
   Public Sub Main()
      ' Select the current culture randomly to test resource fallback.
      Dim cultures() As String = { "de-DE", "en-us", "fr-FR" }
      Dim rnd As New Random()
      Dim index As Integer = rnd.Next(0, cultures.Length)
      Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultures(index))      
      Console.WriteLine("The current culture is {0}", 
                        CultureInfo.CurrentUICulture.Name)       

      ' Retrieve the resource.
      Dim rm As New ResourceManager("ExampleResources" , GetType(Example).Assembly)
      Dim greeting As String = rm.GetString("Greeting")
      
      Console.Write("Enter your name: ")
      Dim name As String = Console.ReadLine()
      Console.WriteLine("{0} {1}", greeting, name)
   End Sub
End Module

これは、Visual Basic で次のコマンドを使用してコンパイルできます。

vbc Example.vb /resource:ExampleResources.resources

または C# で次のコマンドを使用します。

csc Example.cs /resource:ExampleResources.resources