Share via


Windows ストア アプリでのリソースの作成と取得

Windows 8 オペレーティング システムでは、Windows ストア アプリに対し、.NET Framework デスクトップ アプリに共通のハブ アンド スポーク モデルに代わる新しいリソース モデルが導入されています。このトピックでは、この新しいリソース モデルについて説明すると共に、Windows ストア アプリでリソースの作成、配置、取得を行う方法について説明します。

Windows ストア アプリのリソース

.NET Framework デスクトップ アプリは、リソースのパッケージ化と配置にハブ アンド スポーク モデルを用います。一般に、アプリのニュートラル カルチャ (ローカライズされたリソースが利用できない場合にこのカルチャのリソースが使われる) のリソースは、アプリのメインの実行可能ファイルに埋め込まれます。各追加カルチャのローカライズされたリソースは、リソースだけが含まれる (実行可能コードは含まれない) スタンドアロンのサテライト アセンブリに埋め込まれます。

一方、Windows ストア アプリは単一のリソース ファイルを使います。このファイルはパッケージ リソース インデックス (PRI) ファイルと呼ばれ、すべての言語、カルチャ、スケール ファクターのリソースを保存します。

重要

リソース フォールバック規則は、特定のカルチャまたは現在のカルチャのローカライズされたリソースが見つからない場合にどのリソースが読み込まれるかを決定します。

デスクトップ アプリでは、テキスト ファイルまたは XML (.resx) ファイルを使ってリソースを作成できます。リソース ファイル ジェネレーター (Resgen.exe) は、これらのファイルをバイナリ リソース (.resources) ファイルにコンパイルするために使います。このコンパイラは、ニュートラル カルチャのリソースをメインのアプリ アセンブリに埋め込むために使います。ローカライズされた他のリソースをサテライト アセンブリに埋め込む場合は、アセンブリ リンカー (AL.exe) を使います。続いて、System.Resources.ResourceManager クラスを使用して個々のリソースを取得することも、ResourceReader クラスを使用してリソースを列挙することもできます。

Windows ストア アプリでは、.resw ファイルを使用してリソースを作成します。ファイル拡張子は異なりますが、.resw ファイルには文字列とファイル パスしか含めることができない点を除いて、.resw ファイル形式は .resx ファイル形式と同じです。Visual Studio リソース エディターは、リソースの作成と編集に使用できます。コンパイル時には、アプリの .resw ファイルがすべて MakePRI ユーティリティによって単一の PRI ファイルとしてパッケージ化され、アプリの配置パッケージに含められます。実行時には、Windows.ApplicationModel.Resources.ResourceLoader クラスと、Windows.ApplicationModel.Resources.Core 名前空間の型によって、アプリ リソースへのアクセスが提供されます。

重要

リソース ファイル ジェネレーター (Resgen.exe) は主にデスクトップ アプリで使用されますが、このツールを使用してサテライト アセンブリを .resw ファイルにデコンパイルすることもできます。デコンパイルされた .resw ファイルは、PRI ファイルにコンパイルできます。

注意

Windows ストア アプリ用 .NET には System.Resources.ResourceManager クラスが含まれていますが、このクラスの使用はお勧めしません。汎用性のあるクラス ライブラリ プロジェクトとして開発されるライブラリと複数のプラットフォームを対象にするライブラリでは、ResourceManager のみを使用してください。

リソース ファイルの作成

.resw ファイルを作成するのに最も便利で最も簡単な方法として、Visual Studio のリソース エディターが用意されています。これらのエディターにより、.resw ファイルの基になる XML ファイル形式を隠すユーザー インターフェイスが用意されます。Visual Studio によるリソース ファイルの作成と編集には、2 つの大きな利点があります。

  • リソース ファイルを手動で作成する必要がなく、その XML 形式が有効であるかどうかを確認する必要もありません。

  • MakePRI ユーティリティを使用してリソースをコンパイルし、コンパイルされたものを PRI ファイルとしてまとめ、このファイルをアプリの配置パッケージに含めるというプロセスを処理します。

デスクトップ アプリでは、開発者は NeutralResourcesLanguageAttribute 属性を使用してアプリのニュートラル カルチャを定義します。Windows ストア アプリでは、PRI ファイルの作成時と、Windows ResourceLoader クラスを使用してリソースを抽出するときには、この属性は無視されます。

Windows ストア アプリでは、サポートされるカルチャのリソースとイメージを格納するフォルダーを作成して、ローカライズされたリソース ファイルの名前を指定します。続いて、カルチャ名 ("ko-kr" など) と、それに続く既定のリソース名とリソース ファイルの拡張子 ("ko-kr\Resources.resw" など) を使用して、リソースを表します。

リソース ファイルの配置

Visual Studio では、Visual Studio プロジェクトの一部であるリソース ファイルのアプリ配置の詳細をすべて処理できます。Visual Studio は、プロジェクトの一部であるすべてのリソースの構成ファイルを自動的に生成し、MakePRI ツールを使用してそれらのリソースを単一の PRI ファイルに含め、その PRI ファイルをアプリの配置パッケージに格納します。

個々のファイルの集まりではなく、単一の PRI ファイルにすべてのリソースが含められるため、既存のリソース ファイルの変更や、リソース ファイルの追加によりローカライズされた新しいカルチャのサポートの追加には、アプリ全体を再度ビルドして再配布する必要があります。

リソース ファイルからのリソースの取得

Windows ストア アプリ内のリソースを取得するには、Windows ランタイム Windows.ApplicationModel.Resources.ResourceLoader オブジェクト、または Windows.ApplicationModel.Resources.Core 名前空間の型の 1 つをインスタンス化します。Windows ストア アプリでは .NET Framework System.Resources.ResourceManager クラスがサポートされますが、このクラスの使用はお勧めしません。複数のプラットフォームを対象にする 汎用性のあるクラス ライブラリ プロジェクトを開発する場合は、ResourceManager のみを使用してください。次の表は、ResourceManager メンバーと、Windows.ApplicationModel.Resources.ResourceLoader クラスにおける同等メンバーまたは Windows.ApplicationModel.Resources.Core 名前空間の型を示しています。

ResourceManager のメンバー

ResourceLoader の同等メンバーまたは他の Windows ランタイム 型

ResourceManager.GetString(String)

Windows.ApplicationModel.Resources.ResourceLoader.GetString(String)

ResourceManager.GetString(String, CultureInfo)

Windows.ApplicationModel.Resources.Core.ResourceMap.GetValue(String, ResourceContext)

ResourceManager.ResourceManager(String, Assembly)

Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader()

または

Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader(String)

シンプルな "Hello World" の例

次に、ローカライズされた文字列を表示する、Windows ストア アプリのシンプルな例を示します。このアプリのニュートラル カルチャはロシア語 (ロシア) ですが、英語 (米国) カルチャとフランス語 (フランス) カルチャも含まれます。現在のカルチャが英語 (米国) であるシステム上でこのアプリを実行するとあいさつ文が英語で表示され、英語 (米国) 以外のシステムでは既定のロシア語のあいさつが表示されます。最後に、現在のカルチャに関係なく、Windows.ApplicationModel.Resources.Core.ResourceContext オブジェクトと Windows.ApplicationModel.Resources.Core.ResourceMap オブジェクトが使用されてフランス語のあいさつが表示されます。

この例で出力を TextBlock コントロールに表示するには、次の <TextBlock> タグを BlankPage.xaml に追加する必要があります。

    <Grid Background="{StaticResource PageBackgroundBrush}"> <TextBlock x:Name="outputBlock" /> </Grid>

すると、次のようにこのアプリケーション コードが BlankPage クラス コンストラクターから呼び出されます。

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Example.Run(outputBlock)
End Sub
public BlankPage()
{

    InitializeComponent();
    Example.Run(outputBlock);
}

この例では、次のリソースを作成する必要があります。

  • 値が "Привет!" である "Greeting" という名前のロシア語リソース。この文字列は、プロジェクトのルート レベルで Resources.resw という名前のリソース ファイルに追加する必要があります。

  • 値が "Hi there!" である "Greeting" という名前の英語リソース。このリソース ファイルを作成するには、en-US という名前のフォルダーをプロジェクトに追加してから Resources.resw という名前のリソース ファイルをこのフォルダーに追加します。

  • 値が "Bonjour!" である "Greeting" という名前のフランス語リソース。このリソース ファイルを作成するには、fr-FR という名前のフォルダーをプロジェクトに追加してから Resources.resw という名前のリソース ファイルをこのフォルダーに追加します。

次の例は、TextBlock コントロール内の適切なローカライズされた文字列を示しています。

Imports System.Globalization
Imports Windows.ApplicationModel.Resources
Imports Windows.ApplicationModel.Resources.Core
Imports Windows.UI.Xaml.Controls

Public Class Example
    Public Shared Sub Run(outputBlock As Windows.UI.Xaml.Controls.TextBlock)
        outputBlock.Text += String.Format("{1}The current culture is {0}.{1}",
                                          CultureInfo.CurrentCulture.Name, vbCrLf)
        Dim rl As ResourceLoader = New ResourceLoader()

        ' Display greeting using the resources of the current culture.
        Dim greeting As String = rl.GetString("Greeting")
        outputBlock.Text += String.Format("{0}{1}",
                                          If(String.IsNullOrEmpty(greeting), "Здрауствуйте", greeting),
                                          vbCrLf)

        ' Display greeting using fr-FR resources.
        Dim ctx As ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
        ctx.Languages = {"fr-FR"}

        Dim rmap As ResourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources")
        Dim newGreeting As String = rmap.GetValue("Greeting", ctx).ToString()

        outputBlock.Text += String.Format("{1}{1}Culture of Current Context: {0}{1}",
                                          ctx.Languages(0), vbCrLf)
        outputBlock.Text += String.Format("{0}{1}", If(String.IsNullOrEmpty(newGreeting),
                                                       greeting, newGreeting), vbCrLf)
    End Sub
End Class
using System;
using System.Globalization;
using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
using Windows.UI.Xaml.Controls;

public class Example
{
    public static void Run(Windows.UI.Xaml.Controls.TextBlock outputBlock)
    {
        outputBlock.Text += String.Format("\nThe current culture is {0}.\n", CultureInfo.CurrentCulture.Name);
        ResourceLoader rl = new ResourceLoader();

        // Display greeting using the resources of the current culture.
        string greeting = rl.GetString("Greeting");
        outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(greeting) ? "Здрауствуйте" :  greeting);


        // Display greeting using fr-FR resources.
        ResourceContext ctx = new Windows.ApplicationModel.Resources.Core.ResourceContext();
        ctx.Languages =  new string[] { "fr-FR" } ;

        ResourceMap rmap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
        string newGreeting = rmap.GetValue("Greeting", ctx).ToString();

        outputBlock.Text += String.Format("\n\nCulture of Current Context: {0}\n", ctx.Languages[0]);
        outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(newGreeting) ? greeting : newGreeting);

    }
}

このアプリケーションをコンパイルして実行すると、カルチャが en-US であるシステムでは次のような出力が表示されます。

The current culture is en-US. Hi there! Culture of Current Context: fr-FR Bonjour!

参照

関連項目

Visual Studio resource editors (Visual Studio のリソース エディター)

概念

デスクトップ アプリケーションのリソース