リソース パックではなくアプリ パッケージにリソースをビルドする
一部の種類のアプリ (多言語辞書、翻訳ツールなど) では、アプリ バンドルの既定の動作をオーバーライドし、リソースを個別のリソース パッケージ (またはリソース パック) に含めるのではなく、アプリ パッケージにリソースをビルドする必要があります。 このトピックでは、その方法について説明します。
既定では、 app bundle (.appxbundle)をビルドすると、言語、スケール、DirectX 機能レベルの既定のリソースのみがアプリ パッケージに組み込まれます。 翻訳されたリソースと、既定以外のスケールや DirectX 機能レベルに合わせて調整されたリソースはリソース パッケージに組み込まれており、必要なデバイスにのみダウンロードされます。 顧客が言語設定がスペイン語に設定されたデバイスを使用して Microsoft Store からアプリを購入している場合は、アプリとスペイン語のリソース パッケージのみがダウンロードされてインストールされます。 同じユーザーが後で Settings で言語設定をフランス語に変更した場合、アプリのフランス語リソース パッケージがダウンロードされてインストールされます。 スケールと DirectX 機能レベルで修飾されたリソースでも同様のことが起こります。 ほとんどのアプリでは、この動作は貴重な効率を構成し、ユーザーと顧客が起こる必要があります。
ただし、アプリで ( Settings ではなく) アプリ内からその場で言語を変更できる場合、その既定の動作は適切ではありません。 実際には、すべての言語リソースを無条件にダウンロードしてアプリと一緒にインストールし、デバイスに残す必要があります。 これらのリソースはすべて、個別のリソース パッケージではなく、アプリ パッケージに組み込む必要があります。
注 アプリ パッケージにリソースを含めると、基本的にアプリのサイズが大きくなります。 そのため、アプリの性質によって要求される場合にのみ実行する価値があります。 そうでない場合は、通常のアプリ バンドルを通常どおりにビルドする以外は何もする必要はありません。
Visual Studio を構成して、2 つの方法のいずれかでアプリ パッケージにリソースをビルドできます。 構成ファイルをプロジェクトに追加することも、プロジェクト ファイルを直接編集することもできます。 これらのオプションのうち、最も使い慣れているオプション、またはビルド システムで最適に動作するオプションを使用します。
オプション 1. priconfig.packaging.xmlを使用してアプリ パッケージにリソースをビルドする
- Visual Studio で、新しい項目をプロジェクトに追加します。 XML ファイルを選択し、ファイルに
priconfig.packaging.xml
という名前を付けます。 - ソリューション エクスプ ローラーで、
priconfig.packaging.xml
を選択し、[プロパティ] ウィンドウを確認します。 ファイルの [ビルド アクション] を [なし] に設定し、[出力ディレクトリにコピー] を [コピーしない] に設定します。 - ファイルの内容をこの XML に置き換えます。
<packaging> <autoResourcePackage qualifier="Language" /> <autoResourcePackage qualifier="Scale" /> <autoResourcePackage qualifier="DXFeatureLevel" /> </packaging>
- 各
<autoResourcePackage>
要素は、指定された修飾子名のリソースを個別のリソース パッケージに自動的に分割するように Visual Studio に指示します。 これは、 自動分割と呼ばれます。 ファイルの内容はこれまでのものであり、Visual Studio の動作を実際には変更していません。 言い換えると、Visual Studio already は、既定値であるため このファイルはこれらの内容と共に存在していました。 修飾子名で Visual Studio を自動分割しない場合は、その<autoResourcePackage>
要素をファイルから削除します。 すべての言語リソースを個別のリソース パッケージに自動分割するのではなく、アプリ パッケージに組み込む必要がある場合のファイルの外観を次に示します。<packaging> <autoResourcePackage qualifier="Scale" /> <autoResourcePackage qualifier="DXFeatureLevel" /> </packaging>
- ファイルを保存して閉じ、プロジェクトをリビルドします。
自動分割の選択肢が考慮されていることを確認するには、ファイル <ProjectFolder>\obj\<ReleaseConfiguration folder>\split.priconfig.xml
を探し、その内容が選択内容と一致することを確認します。 その場合は、選択したリソースをアプリ パッケージにビルドするように Visual Studio が正常に構成されました。
実行する必要がある最後の手順が 1 つあります。 ただし、 Language
修飾子名を削除した場合にのみ。 アプリでサポートされているすべての言語の和集合をアプリの既定の言語として指定する必要があります。 詳細については、「 アプリが使用する既定のリソースを指定するを参照してください。 これは、アプリ パッケージに英語、スペイン語、フランス語のリソースを含めた場合に priconfig.default.xml
に含まれるものです。
<default>
<qualifier name="Language" value="en;es;fr" />
...
</default>
この処理のしくみ
Visual Studio では、バックグラウンドで MakePri.exe
という名前のツールが起動され、パッケージ リソース インデックスと呼ばれるファイルが生成されます。これにより、自動分割するリソース修飾子名の指定など、アプリのすべてのリソースが記述されます。 このツールの詳細については、「MakePri.exe を使用して手動でリソースをコンパイルする」を参照してください。 Visual Studio は、構成ファイルを MakePri.exe
に渡します。 priconfig.packaging.xml
ファイルの内容は、その構成ファイルの<packaging>
要素として使用されます。これは、自動分割を決定する部分です。 そのため、 priconfig.packaging.xml
の追加と編集は、最終的には、Visual Studio がアプリ用に生成するパッケージ リソース インデックス ファイルの内容と、アプリ バンドル内のパッケージの内容に影響します。
priconfig.packaging.xml
とは異なるファイル名の使用
ファイルに priconfig.packaging.xml
という名前を付けると、Visual Studio はそれを自動的に認識して使用します。 異なる名前を付けた場合、Visual Studio がそれを認識できるようにする必要があります。 プロジェクト ファイルで、<PropertyGroup>
要素の開始タグと終了タグの間にこの XML を追加します。
<AppxPriConfigXmlPackagingSnippetPath>FILE-PATH-AND-NAME</AppxPriConfigXmlPackagingSnippetPath>
FILE-PATH-AND-NAME
をファイルのパスと名前に置き換えます。
オプション 2. プロジェクト ファイルを使用してアプリ パッケージにリソースをビルドする
これは、オプション 1 に代わる方法です。 オプション 1 のしくみを理解したら、開発やビルドのワークフローに適している場合は、代わりにオプション 2 を選択できます。
プロジェクト ファイルで、<PropertyGroup>
要素の開始タグと終了タグの間にこの XML を追加します。
<AppxBundleAutoResourcePackageQualifiers>Language|Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>
最初の修飾子名を削除した後の外観を次に示します。
<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>
ファイルを保存して閉じ、プロジェクトをリビルドします。
実行する必要がある最後の手順が 1 つあります。 ただし、 Language
修飾子名を削除した場合にのみ。 アプリでサポートされているすべての言語の和集合をアプリの既定の言語として指定する必要があります。 詳細については、「 アプリが使用する既定のリソースを指定するを参照してください。 これは、アプリ パッケージに英語、スペイン語、フランス語のリソースを含める場合にプロジェクト ファイルに含まれるものです。
<AppxDefaultResourceQualifiers>Language=en;es;fr</AppxDefaultResourceQualifiers>