次の方法で共有


System.Resources.ResourceManager.GetString メソッド

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

IgnoreCase プロパティは、リソース名とnameの比較で大文字と小文字が区別されるか (既定) か、大文字と小文字が区別されるかを決定します。

GetStringメソッドは、一覧よりも多くの例外をスローする可能性があります。 これが発生する理由の 1 つは、このメソッドが呼び出すメソッドが例外をスローした場合です。 たとえば、サテライト アセンブリの配置またはインストール中にエラーが発生した場合、 FileLoadException 例外がスローされる場合や、型が逆シリアル化されたときにユーザー定義型がユーザー定義例外をスローした場合に SerializationException 例外がスローされる場合があります。

GetString(String) メソッド

デスクトップ アプリ

デスクトップ アプリでは、返されるリソースは、 CultureInfo.CurrentUICulture プロパティで定義されているように、現在のスレッドの UI カルチャ用にローカライズされます。 リソースがそのカルチャにローカライズされていない場合、リソース マネージャーは、リソースの パッケージ化とデプロイ に関する記事の「リソース フォールバック プロセス」セクションで説明されている手順に従って、リソースをプローブします。 ローカライズされたリソースの使用可能なセットが見つからない場合、リソース マネージャーは既定のカルチャのリソースにフォールバックします。 リソース マネージャーが既定のカルチャのリソース セットを読み込めない場合、メソッドは MissingManifestResourceException 例外をスローするか、リソース セットがサテライト アセンブリ内に存在することが予想される場合は、 MissingSatelliteAssemblyException 例外をスローします。 リソース マネージャーが適切なリソース セットを読み込むことができるが、 nameという名前のリソースが見つからない場合、メソッドは nullを返します。

Windows 8.x アプリ

Von Bedeutung

ResourceManager クラスは Windows 8.x アプリでサポートされていますが、その使用はお勧めしません。 このクラスは、Windows 8.x アプリで使用できるポータブル クラス ライブラリ プロジェクトを開発する場合にのみ使用します。 Windows 8.x アプリからリソースを取得するには、代わりに Windows.ApplicationModel.Resources.ResourceLoader クラスを使用します。

Windows 8.x アプリでは、 GetString(String) メソッドは、呼び出し元の現在の UI カルチャ設定用にローカライズされた name 文字列リソースの値を返します。 カルチャの一覧は、オペレーティング システムの優先 UI 言語リストから派生します。 リソース マネージャーが nameと一致できない場合、メソッドは nullを返します。

次の例では、 GetString メソッドを使用してカルチャ固有のリソースを取得します。 英語 (en)、フランス語 (フランス) (fr-FR)、ロシア語 (ロシア) (ru-RU) カルチャの .txt ファイルからコンパイルされたリソースで構成されます。 この例では、現在のカルチャと現在の UI カルチャを英語 (米国)、フランス語 (フランス)、ロシア語 (ロシア)、スウェーデン語 (スウェーデン) に変更します。 次に、 GetString メソッドを呼び出してローカライズされた文字列を取得します。この文字列は、現在の日と月と共に表示されます。 現在の UI カルチャがスウェーデン語 (スウェーデン) の場合を除き、出力には適切なローカライズされた文字列が表示されます。 スウェーデン語の言語リソースは使用できないため、アプリは代わりに既定のカルチャ (英語) のリソースを使用します。 この例では、次の表に示すテキスト ベースのリソース ファイルが必要です。 それぞれに、 DateStartという名前の 1 つの文字列リソースがあります。

文化 ファイル名 リソース名 リソースの値
英語の表記: en-US 日本語の表記: ja-JP DateStrings.txt DateStart 今日は
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ロシア語 (ru-RU) DateStrings.ru-RU.txt DateStart Сегодня

次のバッチ ファイルを使用して、C# の例をコンパイルできます。 Visual Basic の場合は、 cscvbc に変更し、ソース コード ファイルの拡張子を .cs から .vb に変更します。

resgen DateStrings.txt
csc showdate.cs /resource:DateStrings.resources

md fr-FR
resgen DateStrings.fr-FR.txt
al /out:fr-FR\Showdate.resources.dll /culture:fr-FR /embed:DateStrings.fr-FR.resources

md ru-RU
resgen DateStrings.ru-RU.txt
al /out:ru-RU\Showdate.resources.dll /culture:ru-RU /embed:DateStrings.ru-RU.resources

この例のソース コードを次に示します (Visual Basic バージョンのShowDate.vbまたは C# バージョンのShowDate.cs)。

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

public class Example
{
   public static void Main()
   {
      string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
      ResourceManager rm = new ResourceManager("DateStrings",
                                               typeof(Example).Assembly);

      foreach (var cultureName in cultureNames) {
         CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
         Thread.CurrentThread.CurrentCulture = culture;
         Thread.CurrentThread.CurrentUICulture = culture;

         Console.WriteLine($"Current UI Culture: {CultureInfo.CurrentUICulture.Name}");
         string dateString = rm.GetString("DateStart");
         Console.WriteLine($"{dateString} {DateTime.Now:M}.\n");
      }
   }
}
// The example displays output similar to the following:
//       Current UI Culture: en-US
//       Today is February 03.
//
//       Current UI Culture: fr-FR
//       Aujourd'hui, c'est le 3 février
//
//       Current UI Culture: ru-RU
//       Сегодня февраля 03.
//
//       Current UI Culture: sv-SE
//       Today is den 3 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example).Assembly)
      
      For Each cultureName In cultureNames
         Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
         Thread.CurrentThread.CurrentCulture = culture 
         Thread.CurrentThread.CurrentUICulture = culture

         Console.WriteLine("Current UI Culture: {0}", 
                           CultureInfo.CurrentUICulture.Name)
         Dim dateString As String = rm.GetString("DateStart")
         Console.WriteLine("{0} {1:M}.", dateString, Date.Now)                           
         Console.WriteLine()
      Next                                           
   End Sub
End Module
' The example displays output similar to the following:
'       Current UI Culture: en-US
'       Today is February 03.
'       
'       Current UI Culture: fr-FR
'       Aujourd'hui, c'est le 3 février
'       
'       Current UI Culture: ru-RU
'       Сегодня февраля 03.
'       
'       Current UI Culture: sv-SE
'       Today is den 3 februari.

GetString(String, CultureInfo) メソッド

デスクトップ アプリ

デスクトップ アプリでは、 culturenullされている場合、 GetString(String, CultureInfo) メソッドは、 CultureInfo.CurrentUICulture プロパティから取得した現在の UI カルチャを使用します。

返されるリソースは、 culture パラメーターで指定されたカルチャ用にローカライズされます。 リソースが culture用にローカライズされていない場合、リソース マネージャーは、リソースの パッケージ化とデプロイ に関するトピックの「リソース フォールバック プロセス」セクションで説明されている手順に従って、リソースをプローブします。 使用可能なリソースのセットが見つからない場合、リソース マネージャーは既定のカルチャのリソースにフォールバックします。 リソース マネージャーが既定のカルチャのリソース セットを読み込めない場合、メソッドは MissingManifestResourceException 例外をスローするか、リソース セットがサテライト アセンブリ内に存在することが予想される場合は、 MissingSatelliteAssemblyException 例外をスローします。 リソース マネージャーが適切なリソース セットを読み込むことができるが、 nameという名前のリソースが見つからない場合、メソッドは nullを返します。

Windows 8.x アプリ

Von Bedeutung

ResourceManager クラスは Windows 8.x アプリでサポートされていますが、その使用はお勧めしません。 このクラスは、Windows 8.x アプリで使用できるポータブル クラス ライブラリ プロジェクトを開発する場合にのみ使用します。 Windows 8.x アプリからリソースを取得するには、代わりに Windows.ApplicationModel.Resources.ResourceLoader クラスを使用します。

Windows 8.x アプリでは、GetString(String, CultureInfo) メソッドは、culture パラメーターで指定されたカルチャにローカライズされたname文字列リソースの値を返します。 リソースが culture カルチャ用にローカライズされていない場合、検索では Windows 8 言語フォールバック リスト全体が使用され、既定のカルチャを調べてから停止します。 リソース マネージャーが nameと一致できない場合、メソッドは nullを返します。

次の例では、 GetString(String, CultureInfo) メソッドを使用してカルチャ固有のリソースを取得します。 この例の既定のカルチャは英語 (en) で、フランス語 (フランス) (fr-FR) およびロシア語 (ロシア) (ru-RU) カルチャのサテライト アセンブリが含まれています。 この例では、 GetString(String, CultureInfo)を呼び出す前に、現在のカルチャと現在の UI カルチャをロシア語 (ロシア) に変更します。 次に、 GetString メソッドと DateTime.ToString(String, IFormatProvider) メソッドを呼び出し、フランス語 (フランス) カルチャとスウェーデン語 (スウェーデン) カルチャを表す CultureInfo オブジェクトを各メソッドに渡します。 GetString メソッドはフランス語の言語リソースを取得できるため、出力では、月の月と日と、その前の文字列がフランス語で表示されます。 ただし、スウェーデン語 (スウェーデン) カルチャを使用すると、月と日がスウェーデン語で表示されますが、その前の文字列は英語です。 これは、リソース マネージャーがローカライズされたスウェーデン語のリソースを見つけられないため、代わりに既定の英語カルチャのリソースが返されるためです。

この例では、次の表に示すテキスト ベースのリソース ファイルが必要です。 それぞれに、 DateStartという名前の 1 つの文字列リソースがあります。

文化 ファイル名 リソース名 リソースの値
英語の表記: en-US 日本語の表記: ja-JP DateStrings.txt DateStart 今日は
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ロシア語 (ru-RU) DateStrings.ru-RU.txt DateStart Сегодня

次のバッチ ファイルを使用して、Visual Basic の例をコンパイルできます。 C# でコンパイルするには、 vbccsc に変更し、ソース コード ファイルの拡張子を .vb から .cs に変更します。

resgen DateStrings.txt
vbc showdate.vb /resource:DateStrings.resources

md fr-FR
resgen DateStrings.fr-FR.txt
al /out:fr-FR\Showdate.resources.dll /culture:fr-FR /embed:DateStrings.fr-FR.resources

md ru-RU
resgen DateStrings.ru-RU.txt
al /out:ru-RU\Showdate.resources.dll /culture:ru-RU /embed:DateStrings.ru-RU.resources

この例のソース コードを次に示します (Visual Basic バージョンのShowDate.vbまたは C# バージョンのShowDate.cs)。

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

public class Example2
{
    public static void Main()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru-RU");
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("ru-RU");

        string[] cultureNames = [ "fr-FR", "sv-SE" ];
        ResourceManager rm = new ResourceManager("DateStrings",
                                                 typeof(Example).Assembly);

        foreach (var cultureName in cultureNames)
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
            string dateString = rm.GetString("DateStart", culture);
            Console.WriteLine($"{culture.DisplayName}: {dateString} {DateTime.Now.ToString("M", culture)}.");
            Console.WriteLine();
        }
    }
}
// The example displays output similar to the following:
//       French (France): Aujourd'hui, c'est le 7 février.
//
//       Swedish (Sweden): Today is den 7 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example2
    Public Sub Main()
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru-RU")
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("ru-RU")

        Dim cultureNames() As String = {"fr-FR", "sv-SE"}
        Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example).Assembly)

        For Each cultureName In cultureNames
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
            Dim dateString As String = rm.GetString("DateStart", culture)
            Console.WriteLine("{0}: {1} {2}.", culture.DisplayName, dateString,
                                            Date.Now.ToString("M", culture))
            Console.WriteLine()
        Next
    End Sub
End Module
' The example displays output similar to the following:
'       French (France): Aujourd'hui, c'est le 7 février.
'       
'       Swedish (Sweden): Today is den 7 februari.