この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
ResourceManager(Type) コンストラクタ
このセクションは、ResourceManager(Type) コンストラクターのオーバーロードに関連します。
デスクトップ アプリ
デスクトップ アプリでは、リソース マネージャーは resourceSource パラメーターを使用して、次のように特定のリソース ファイルを読み込みます。
-
NeutralResourcesLanguageAttribute 属性を使用して、既定のカルチャのリソースがサテライト アセンブリに存在することを示さない場合、リソース マネージャーは、既定のカルチャのリソース ファイルが、
resourceSourceパラメーターで指定された型と同じアセンブリ内にあると見なします。 - リソース マネージャーは、既定のリソース ファイルのベース名が、
resourceSourceパラメーターで指定された型と同じであることを前提としています。 - リソース マネージャーは、既定の ResourceSet クラスを使用してリソース ファイルを操作します。
たとえば、MyCompany.MyProduct.MyTypeという名前の型を指定すると、リソース マネージャーは、を定義するアセンブリ MyCompany.MyProduct.MyType.resources という名前の MyType ファイルを検索します。
Visual Studio では、リソース デザイナーによって、既定のカルチャの internal ファイルの基本名と同じ名前の Friend (C# の場合) または (Visual Basic) クラスを定義するコードが自動的に生成されます。 これにより、リソースの名前に対応する型オブジェクトを取得することで、ResourceManager オブジェクトをインスタンス化し、特定のリソース セットと結合することができます。これは、クラスがコンパイラに表示されている限り、リソースも同様である必要があるためです。 たとえば、.resources ファイルに Resource1 という名前が付けられている場合、次のステートメントは、Resource1 という名前の ResourceManager ファイルを管理する オブジェクトをインスタンス化します。
ResourceManager rm = new ResourceManager(typeof(Resource1));
Visual Studio を使用していない場合は、名前空間と名前が既定の .resources ファイルと同じ名前のメンバーを持たないクラス 作成できます。 この例では、図を示します。
Windows 8.x アプリ
重要
ResourceManager クラスは Windows 8.x アプリでサポートされていますが、その使用はお勧めしません。 このクラスは、Windows 8.x アプリで使用できるポータブル クラス ライブラリ プロジェクトを開発する場合にのみ使用します。 Windows 8.x アプリからリソースを取得するには、代わりに Windows.ApplicationModel.Resources.ResourceLoader クラスを使用します。
Windows 8.x アプリでは、ResourceManager は、resourceSource パラメーターを使用して、アプリのパッケージ リソース インデックス (PRI) ファイル内にリソース項目を配置できるアセンブリ、ベース名、名前空間を推測します。 たとえば、MyCompany.MyProduct.MyTypeで定義されている MyAssembly という名前の型を指定すると、リソース マネージャーは MyAssembly という名前のリソース セット識別子を検索し、そのリソース セット内のスコープ MyCompany.MyProduct.MyType を検索します。 リソース マネージャーは、このスコープ内の既定のコンテキスト (現在のカルチャ、現在のハイ コントラスト設定など) でリソース項目を検索します。
例
次の例では、ResourceManager(Type) コンストラクターを使用して、ResourceManager オブジェクトをインスタンス化します。 英語 (en)、フランス語 (フランス) (fr-FR)、ロシア語 (ロシア) (ru-RU) カルチャの .txt ファイルからコンパイルされたリソースで構成されます。 この例では、現在のカルチャと現在の UI カルチャを英語 (米国)、フランス語 (フランス)、ロシア語 (ロシア)、スウェーデン語 (スウェーデン) に変更します。 次に、GetString(String) メソッドを呼び出してローカライズされた文字列を取得します。これにより、時刻に応じてあいさつが表示されます。
この例では、次の表に示すように、3 つのテキスト ベースのリソース ファイルが必要です。 各ファイルには、Morning、Afternoon、および Eveningという名前の文字列リソースが含まれています。
| 文化 | ファイル名 | リソース名 | リソースの値 |
|---|---|---|---|
| 英語の表記: en-US 日本語の表記: ja-JP | GreetingResources.txt | Morning |
おはようございます |
| 英語の表記: en-US 日本語の表記: ja-JP | GreetingResources.txt | Afternoon |
こんにちは |
| 英語の表記: en-US 日本語の表記: ja-JP | GreetingResources.txt | Evening |
こんばんは |
| fr-FR | GreetingResources.fr-FR.txt | Morning |
Bonjour |
| fr-FR | GreetingResources.fr-FR.txt | Afternoon |
Bonjour |
| fr-FR | GreetingResources.fr-FR.txt | Evening |
Bonsoir |
| ロシア語 (ru-RU) | GreetingResources.ru-RU.txt | Morning |
Доброе утро |
| ロシア語 (ru-RU) | GreetingResources.ru-RU.txt | Afternoon |
Добрый день |
| ロシア語 (ru-RU) | GreetingResources.ru-RU.txt | Evening |
Добрый вечер |
次のバッチ ファイルを使用して、Visual Basic の例をコンパイルし、Greet.exeという名前の実行可能ファイルを作成できます。 C# でコンパイルするには、コンパイラ名を vbc から csc に変更し、ファイル拡張子を .vb から .csに変更します。
resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources
md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources
md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources
この例のソース コードを次に示します (Visual Basic バージョンのShowDate.vb、または C# バージョンのコードのShowDate.cs)。
using System;
using System.Resources;
using System.Globalization;
using System.Threading;
[assembly: NeutralResourcesLanguage("en")]
public class Example2
{
public static void Main()
{
string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.Now.Day, 12, 0, 0);
DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.Now.Day, 18, 0, 0);
ResourceManager rm = new ResourceManager(typeof(GreetingResources));
foreach (var cultureName in cultureNames)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
Console.WriteLine($"The current UI culture is {CultureInfo.CurrentUICulture.Name}");
if (DateTime.Now < noon)
Console.WriteLine($"{rm.GetString("Morning")}!");
else if (DateTime.Now < evening)
Console.WriteLine($"{rm.GetString("Afternoon")}!");
else
Console.WriteLine($"{rm.GetString("Evening")}!");
Console.WriteLine();
}
}
internal class GreetingResources
{
}
}
// The example displays output like the following:
// The current UI culture is en-US
// Good afternoon!
//
// The current UI culture is fr-FR
// Bonjour!
//
// The current UI culture is ru-RU
// Добрый день!
//
// The current UI culture is sv-SE
// Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading
<Assembly:NeutralResourcesLanguage("en")>
Module Example
Public Sub Main()
Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
Dim noon As New Date(Date.Now.Year, Date.Now.Month,
Date.Now.Day, 12,0,0)
Dim evening As New Date(Date.Now.Year, Date.Now.Month,
Date.Now.Day, 18, 0, 0)
Dim rm As New ResourceManager(GetType(GreetingResources))
For Each cultureName In cultureNames
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
Console.WriteLine("The current UI culture is {0}",
CultureInfo.CurrentUICulture.Name)
If Date.Now < noon Then
Console.WriteLine("{0}!", rm.GetString("Morning"))
ElseIf Date.Now < evening Then
Console.WriteLine("{0}!", rm.GetString("Afternoon"))
Else
Console.WriteLine("{0}!", rm.GetString("Evening"))
End If
Console.WriteLine()
Next
End Sub
End Module
Friend Class GreetingResources
End Class
' The example displays output like the following:
' The current UI culture is en-US
' Good afternoon!
'
' The current UI culture is fr-FR
' Bonjour!
'
' The current UI culture is ru-RU
' Добрый день!
'
' The current UI culture is sv-SE
' Good afternoon!
ソース コードは、Exampleという名前のアプリ クラスを定義するだけでなく、リソース ファイルの基本名と同じ名前の GreetingResources内部クラスを定義します。 これにより、ResourceManager コンストラクターを呼び出すことによって、ResourceManager(Type) オブジェクトを正常にインスタンス化できます。
現在の UI カルチャがスウェーデン語 (スウェーデン) の場合を除き、出力には適切なローカライズされた文字列が表示されます。この場合は、英語リソースが使用されます。 スウェーデン語の言語リソースは使用できないため、NeutralResourcesLanguageAttribute 属性で定義されている既定のカルチャのリソースが代わりに使用されます。
ResourceManager(String, Assembly) コンストラクタ
このセクションは、ResourceManager(String, Assembly) コンストラクターのオーバーロードに関連します。
デスクトップ アプリ
デスクトップ アプリでは、個々のカルチャ固有のリソース ファイルをサテライト アセンブリに格納し、既定のカルチャのリソース ファイルをメイン アセンブリに含める必要があります。 サテライト アセンブリには、そのアセンブリのマニフェストで指定された 1 つのカルチャのリソースが含まれていると見なされ、必要に応じて読み込まれます。
注
アセンブリから取得するのではなく、.resources ファイルから直接リソースを取得するには、代わりに CreateFileBasedResourceManager メソッドを呼び出して ResourceManager オブジェクトをインスタンス化する必要があります。
baseName によって識別されたリソース ファイルが assemblyで見つからない場合、メソッドは ResourceManager オブジェクトをインスタンス化しますが、特定のリソースを取得しようとすると、通常は MissingManifestResourceException例外がスローされます。 例外の原因の診断については、ResourceManager クラス トピックの「MissingManifestResourceException 例外の処理」セクションを参照してください。
Windows 8.x アプリ
重要
ResourceManager クラスは Windows 8.x アプリでサポートされていますが、その使用はお勧めしません。 このクラスは、Windows 8.x アプリで使用できるポータブル クラス ライブラリ プロジェクトを開発する場合にのみ使用します。 Windows 8.x アプリからリソースを取得するには、代わりに Windows.ApplicationModel.Resources.ResourceLoader クラスを使用します。
Windows 8.x アプリでは、リソース マネージャーは assembly パラメーターの単純な名前を使用して、アプリのパッケージ リソース インデックス (PRI) ファイル内の一致するリソース セットを検索します。
baseName パラメーターは、リソース セット内のリソース項目を検索するために使用されます。 たとえば、PortableLibrary1.Resource1 のルート名です。de-DE.resources は PortableLibrary1.Resource1 です。
例
次の例では、ローカライズされていない単純な "Hello World" アプリを使用して、ResourceManager(String, Assembly) コンストラクターを示します。
ExampleResources.txt という名前のテキスト ファイルの内容が Greeting=Hello。 アプリがコンパイルされると、リソースはメイン アプリ アセンブリに埋め込まれます。
テキスト ファイルは、コマンド プロンプトで次のように リソース ファイル ジェネレーター (ResGen.exe) を使用してバイナリ リソース ファイルに変換できます。
resgen ExampleResources.txt
次の例では、ResourceManager オブジェクトをインスタンス化し、ユーザーに名前の入力を求め、あいさつを表示する実行可能コードを示します。
using System;
using System.Reflection;
using System.Resources;
public class Example1
{
public static void Main()
{
// 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($"{greeting} {name}!");
}
}
// The example produces output similar to the following:
// Enter your name: John
// Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Module Example1
Public Sub Main()
' 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
' The example produces output similar to the following:
' Enter your name: John
' Hello John!
これは、C# で次のコマンドを使用してコンパイルできます。
csc Example.cs /resource:ExampleResources.resources
この例では、リソース ファイルを含むアセンブリへの参照を取得します。そのアセンブリで定義されている型を (C# の場合) typeof 関数または GetType 関数 (Visual Basic) に渡し、その Type.Assembly プロパティの値を取得します。
.NET