リソース管理システムでのリソースの照合と選択の仕組み

リソースを要求すると、現在のリソース コンテキストにある程度一致するリソース候補がいくつか存在する場合があります。 リソース管理システムはすべての候補を分析して、返すのに最もよい候補を決定します。 これはすべての修飾子を考慮して、すべての候補をランク付けすることで実行されます。

このランク付けプロセスでは、修飾子が異なれば優先順位も異なります。言語は全体のランキングに最大の影響を及ぼし、コントラスト、スケールなどが続きます。 修飾子ごとに、候補修飾子がコンテキスト修飾子の値と比較され、一致の品質が決定されます。 比較の方法は修飾子によって異なります。

言語タグの照合のしくみの詳細については、「リソース管理システムでの言語タグの照合の仕組み」を参照してください。

スケールやコントラストのような修飾子の場合、常に最低限の一致が存在します。 たとえば、"scale-400" というコンテキストに対して、"scale-100" で修飾された候補は、"scale-200" または (完全一致の) "scale-400" で修飾された候補ほどではなくても、ある程度は一致します。

しかし、言語や住んでいる地域のような修飾子の場合、比較してもまったく一致しないことがあります (ある程度の一致の他に)。 たとえば、言語が "en-US" で修飾された候補は、"en-GB" というコンテキストに対して部分的に一致しますが、"fr" で修飾された候補はまったく一致しません。 同様に、"155" (西ヨーロッパ) としてホーム リージョンの資格を持つ候補は、"FR" のホーム リージョン設定を持つユーザーのコンテキストと多少一致しますが、"US" として認定された候補はまったく一致しません。

候補を評価するとき、比較してもまったく一致しない修飾子がある場合、その候補は全体としてのランキングが非一致となり、選ばれることはありません。 このようにして、最適な一致を選ぶときに優先順位の高い修飾子に最大の重みが与えられますが、優先順位が低い修飾子の場合でも、非一致によって候補から除外されることはあります。

ある修飾子でまったくマークされていない場合、候補はその修飾子に関しては中立です。 どの修飾子でも、中立の候補は常にコンテキスト修飾子の値に一致しますが、その修飾子でマークされ、ある程度の一致 (厳密または部分) の候補よりも一致度は低くなります。 たとえば、"en-US"、"en"、"fr" で修飾された候補があり、言語中立のリソースもある場合、言語修飾子の値が "en-GB" のコンテキストでは、各候補は、"en"、"en-US"、中立、"fr" の順にランク付けされます。 この場合、"fr" はまったく一致しませんが、他の候補はある程度一致しています。

全体的なランク付けプロセスは、優先順位の最も高い修飾子である言語に関する候補の評価から始まります。 非一致は除外されます。 残りの候補は、言語の一致度に応じてランク付けされます。 ランクが同じ場合、次に優先順位の高い修飾子であるコントラストが検討され、コントラストの一致度を使って、ランクの同じ候補が区別されます。 これに対し、スケール修飾子は、残りの結びつきを区別するために使用されます。また、適切に順序付けられた順位付けに到達するために必要な数の修飾子を使用します。

コンテキストに一致しない修飾子のためにすべての候補が考慮から削除された場合、リソース ローダーは 2 番目のパスを通過し、表示する既定の候補を探します。 既定の候補は PRI ファイルの作成時に決定され、ランタイム コンテキストに対して選択する候補が常に存在することを確認するために必要です。 候補が持ついずれかの修飾子が一致せず、既定値でない場合、そのリソース候補は完全に検討対象から除外されます。

検討対象として残っているすべてのリソース候補に対し、リソース ローダーは優先順位が最も高いコンテキスト修飾子の値に基づき、最も一致するものまたは既定のスコアが最も一致するものを選びます。 実際に一致する値は、既定のスコアよりも優先されます。

同点がある場合、次に優先度の高いコンテキスト修飾子の値が検査され、最適な一致が見つかるまでプロセスが続行されます。

リソース候補を選択する例

次のようなファイルがあるとします。

en/images/logo.scale-400.jpg
en/images/logo.scale-200.jpg
en/images/logo.scale-100.jpg  
fr/images/logo.scale-100.jpg
fr/images/contrast-high/logo.scale-400.jpg
fr/images/contrast-high/logo.scale-100.jpg
de/images/logo.jpg

また、現在のコンテキストの設定は次のようになっているとします。

Application language: en-US; fr-FR;
Scale: 400
Contrast: Standard

ハイ コントラストとドイツ語が設定で定義されているコンテキストと一致しないため、リソース管理システムでは 3 つのファイルが削除されます。 これによって、次の候補が残ります。

en/images/logo.scale-400.jpg
en/images/logo.scale-200.jpg
en/images/logo.scale-100.jpg  
fr/images/logo.scale-100.jpg

これらの残りの候補について、リソース管理システムは、優先度が最も高いコンテキスト修飾子である言語を使用します。 設定で英語がフランス語よりも先にリストされているため、英語のリソースはフランス語のリソースよりも一致率が高くなります。

en/images/logo.scale-400.jpg
en/images/logo.scale-200.jpg
en/images/logo.scale-100.jpg  

次に、リソース管理システムでは、次に優先順位の高いコンテキスト修飾子であるスケールを使用します。 このため、次のリソースが返されます。

en/images/logo.scale-400.jpg

高度な NamedResource.ResolveAll メソッドを使うと、コンテキスト設定に一致する順にすべての候補を取得できます。 前述の例では、ResolveAll は次の順序で候補を返します。

en/images/logo.scale-400.jpg
en/images/logo.scale-200.jpg
en/images/logo.scale-100.jpg  
fr/images/logo.scale-100.jpg

フォールバック選択肢を生成する例

次のようなファイルがあるとします。

en/images/logo.scale-400.jpg
en/images/logo.scale-200.jpg
en/images/logo.scale-100.jpg  
fr/images/contrast-standard/logo.scale-400.jpg
fr/images/contrast-standard/logo.scale-100.jpg
de/images/contrast-standard/logo.jpg

また、現在のコンテキストの設定は次のようになっているとします。

User language: de-DE;
Scale: 400
Contrast: High

すべてのファイルがコンテキストに一致しないため、除外されます。 そこで、既定のパスが使われます。PRI ファイルの作成時の既定値は次のようになっていました (「MakePri.exe を使用して手動でリソースをコンパイルする」をご覧ください)。

Language: fr-FR;
Scale: 400
Contrast: Standard

これにより、現在のユーザーまたは既定値に一致するすべてのリソースが候補となります。

fr/images/contrast-standard/logo.scale-400.jpg
fr/images/contrast-standard/logo.scale-100.jpg
de/images/contrast-standard/logo.jpg

リソース管理システムは、優先順位が最も高いコンテキスト修飾子である言語を使って、スコアが最も高い名前付きリソースを返します。

de/images/contrast-standard/logo.jpg

重要な API