资源管理系统如何匹配和选择资源

请求资源时,可能有多个候选项在一定程度上匹配当前的资源上下文。 资源管理系统将分析所有这些候选项,并确定要返回的最佳候选项。 这是通过考虑所有资格赛来对所有候选人进行排名来完成的。

在此排名过程中,不同的限定符具有不同的优先级:语言对总体排名影响最大,然后是对比,然后缩放等。 对于每个限定符,候选限定符与上下文限定符值进行比较,以确定匹配的质量。 如何进行比较取决于限定符。

有关如何完成语言标记匹配的特定详细信息,请参阅 资源管理系统如何匹配语言标记

对于某些限定符(如缩放和对比度),始终有一些最小程度的匹配。 例如,限定为“scale-100”的候选项将“scale-400”的上下文与“scale-400”的上下文匹配,尽管没有符合“scale-200”或(对于完美匹配)“scale-400”的候选项。

但是,对于其他限定符(如语言或主区域),可以进行非匹配比较(以及匹配程度)。 例如,限定为“en-US”语言的候选项是“en-GB”上下文的部分匹配项,但限定为“fr”的候选项根本不是匹配项。 同样,有资格获得“155”(西欧)家庭区域的候选人与家庭区域设置为“FR”的用户的上下文稍好匹配,但有资格为“US”的候选人根本不匹配。

评估候选项时,如果有任何限定符存在非匹配比较,则该候选项将获得总体非匹配排名,并且不会被选中。 这样,高优先级限定符在选择最佳匹配时可以具有最大的权重,但即使是低优先级限定符也可以由于不匹配而消除候选项。

如果候选项根本没有为该限定符标记,则候选项与限定符无关。 对于任何限定符,中性候选项始终是上下文限定符值的匹配项,但只有匹配质量低于为该限定符标记的任何候选项,并且具有某种程度的匹配(精确或部分)。 例如,如果候选项限定为“en-US”、“en”、“fr”和“fr”,则对于语言限定符值为“en-GB”的上下文,则候选项将按以下顺序排名:“en”、“en-US”、neutral 和“fr”。 在这种情况下,“fr”根本不匹配,而其他候选项则在某种程度上匹配。

总体排名过程首先评估与最高优先级限定符(即语言)相关的候选项。 消除非匹配项。 其余候选人根据语言匹配质量进行排名。 如果有任何联系,则考虑下一个最高优先级的限定符,对比度,使用匹配的质量来区分关联的候选项。 相反,缩放限定符用于通过任意数量的限定符来区分剩余的关系,以达到有序的排名。

如果由于与上下文不匹配的限定符而从考虑中删除所有候选项,则资源加载程序会经过第二个传递,查找要显示的默认候选项。 默认候选项是在创建 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

资源管理系统消除了三个文件,因为高对比度和德语与设置定义的上下文不匹配。 这让这些候选人无所事事。

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