固有カルチャのリソースの検索と使用

更新 : 2010 年 5 月

共通言語ランタイムでは、サテライト アセンブリでパッケージ化および配置されたカルチャ固有のリソースの取得操作がサポートされています。 サテライト アセンブリには、リソース ファイルや .gif ファイルなどの柔軟なリソースのみが含まれています。 実行可能コードは一切含まれません。

サテライト アセンブリの配置モデルでは、1 つの既定アセンブリ (メイン アセンブリ) といくつかのサテライト アセンブリを使用するアプリケーションを作成します。 既定またはニュートラル カルチャのリソースをメイン アセンブリと共にパッケージ化し、アプリケーションでサポートする各言語についてサテライト アセンブリを個別に作成します。 サテライト アセンブリはメイン アセンブリの一部には含まれないため、アプリケーションのメイン アセンブリを交換しなくても、固有カルチャに対応するリソースだけを簡単に交換または更新できます。

たとえば、単純な "Hello world" アプリケーションでは、既定のカルチャまたはニュートラル カルチャが "en" (英語) の場合、Greeting というリソースを作成して、値 "Hello world!" を持つ HelloString という名前の 1 つの文字列をそのリソースに格納できます。 "en" がアプリケーションの既定のカルチャであることを示すには、アプリケーションの AssemblyInfo ファイルまたはアプリケーションのメイン アセンブリにコンパイルされるいずれかのソース コード ファイルに、次の System.Resources.NeutralResourcesLanguageAttribute 属性を追加する必要があります。

<Assembly: NeutralResourcesLanguageAttribute("en")>

次に、別のカルチャのサポートをアプリケーションに追加します。 たとえば、次に示すように、"en-US"、"fr-FR"、および "ru-RU" の各カルチャをサポートできます。

  • "en-US"、つまり英語 (米国) のカルチャをサポートするには、Greeting.en-US.resx という名前のリソース ファイルを作成して、値 "Hi world!" を持つ HelloString という名前の 1 つの文字列をそのファイルに格納します。

  • "fr-FR"、つまりフランス語 (フランス) のカルチャをサポートするには、Greeting.fr-FR.resx という名前のリソース ファイルを作成して、値 "Salut tout le monde!" を持つ HelloString という名前の 1 つの文字列をそのファイルに格納します。

  • "ru-RU"、つまりロシア語 (ロシア) のカルチャをサポートするには、Greeting.ru-RU.resx という名前のリソース ファイルを作成して、値 "Всем привет!" を持つ HelloString という名前の 1 つの文字列をそのファイルに格納します。

System.Resources.ResourceManager クラスを使用すると、実行時にカルチャ固有のリソースにアクセスしたり、アプリケーションがリソース フォールバック プロセスによってリソースを取得する方法を制御できます。 詳細については、「リソースのパッケージ化と配置」の「リソース フォールバック プロセス」を参照してください。

ResourceManager オブジェクトは、現在のスレッドの CultureInfo.CurrentUICulture プロパティに基づいて、どのリソースを取得するのかを判断します。 たとえば、アプリケーションのコンパイル時に、メイン アセンブリで既定の英語リソースを使用し、2 個のサテライト アセンブリでフランス語 (フランス) とロシア語 (ロシア) のリソースを使用して、さらに CurrentUICulture プロパティを "fr-FR" に設定した場合、ResourceManager オブジェクトはフランス語リソースを取得します。

CurrentUICulture プロパティは、明示的または暗黙的に設定することができます。 このプロパティの設定方法は、ResourceManager オブジェクトがカルチャに基づいてリソースを取得する方法に影響します。

  • アプリケーションで CurrentUICulture プロパティを明示的にアプリケーション コード内の固有カルチャに設定すると、ユーザーのブラウザーやオペレーティング システムの言語に関係なく、設定されたカルチャのリソースが常に取得されます。 たとえば、既定の英語リソースと英語 (米国)、フランス語 (フランス)、ロシア語 (ロシア語) のリソースが含まれている 3 つのサテライト アセンブリを使用してコンパイルされたアプリケーションがあるとします。 CurrentUICulture プロパティが "fr-FR" に設定されている場合、ユーザーのオペレーティング システムの言語がフランス語に設定されていなくても、ResourceManager オブジェクトは必ずフランス語 (フランス) リソースを取得します。 このプロパティを明示的に設定する前に、プロパティ設定が必要であることを確認してください。

    注意

    ASP.NET アプリケーションでは、サーバーの設定と着信クライアント要求が一致することがほとんどないと考えられるため、CurrentUICulture プロパティを明示的に設定する必要があります。ASP.NET アプリケーションでは、CurrentUICulture プロパティをユーザーのブラウザーの受け入れ言語に明示的に設定できます。

  • アプリケーションで CurrentUICulture プロパティが明示的に設定されていない場合、このプロパティは Windows 2000 および Windows XP の GetUserDefaultUILanguage 関数によって暗黙的に設定されます。 この関数は、MUI (Multilingual User Interface) によって提供されます。これにより、ユーザーは既定の言語を設定できます。 ユーザーが UI 言語を設定していない場合、既定の UI 言語はシステム インストール言語になります。システム インストール言語とは、オペレーティング システム リソースの言語です。

CurrentUICulture プロパティを明示的に設定する例を次に示します。 この例では、単純な "Hello world" アプリケーションでサポートされているカルチャの名前を格納する配列を定義します。 これらのカルチャ名のいずれかをランダムに選択し、その名前を使用して CultureInfo オブジェクトをインスタンス化します。さらに、そのカルチャを現在のスレッドの現在のカルチャに指定します。 その後、MessageBox.Show メソッド (C# の例の場合) または Interaction.MsgBox 関数 (Visual Basic の例の場合) の呼び出しにより、HelloString リソースに割り当てられているローカライズされた文字列が表示されます。

Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Module1

   Sub Main()
      ' Create array of supported cultures
      Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
      Dim rnd As New Random()
      Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
      Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture

      Try
         Dim newCulture As New CultureInfo(cultures(cultureNdx))
         Thread.CurrentThread.CurrentCulture = newCulture
         Thread.CurrentThread.CurrentUICulture = newCulture
         Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                Thread.CurrentThread.CurrentUICulture.Name,
                                                vbCrLf, My.Resources.Greetings.HelloString)

         MsgBox(greeting)
      Catch e As CultureNotFoundException
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
      Finally
         Thread.CurrentThread.CurrentCulture = originalCulture
         Thread.CurrentThread.CurrentUICulture = originalCulture
      End Try
   End Sub
End Module
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Windows.Forms;

class Program
{
   static void Main()
   {
      // Create array of supported cultures
      string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
      Random rnd = new Random();
      int cultureNdx = rnd.Next(0, cultures.Length);
      CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;

      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         ResourceManager rm = new ResourceManager("LocatingCS1.Greetings", Assembly.GetExecutingAssembly()); 
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));

         MessageBox.Show(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}

参照

概念

アプリケーションのリソース

サテライト アセンブリに含まれるリソースの取得

Resources in ASP.NET Applications

その他の技術情報

エンコーディングとローカリゼーション

履歴の変更

日付

履歴

理由

2010 年 5 月

全面的に改訂。

カスタマー フィードバック