Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

04 Jul 2021

UWP资源管理文档阅读笔记【二】

How the Resource Management System matches and chooses resources

当一个资源被求访的时候,对应当前上下文可能会有多个候选,每个具有不同的匹配程度。RMS决定哪个最适合,具体是根据格量对候选进行分级。

分级过程中,不同的格量有不同的优先级:语言优先级最高,然后是对比度,接着是缩放度,等等。格量值如何对比跟具体的格量类型有关系。

How the Resource Management System matches language tags

对于某些格量,比如缩放和对比度,总有一些最小程度的匹配。例如,scale-100能与scale-400在某种程度上匹配,但显然匹配度不如scale-200和scale-400。

对于其他格量,比u人语言以及本居区域,可以有完全不匹配的情形。比如en-US部分匹配en-GB,但是完全不匹配fr。对于本居区域,115(西欧)可以匹配FR到一定程度,但是完全不匹配US。

完全不匹配的候选会划分为不匹配的分级,并且不会被选用。更高优先级的格量可以有更高的权重,但是低优先级的格量可以消除不匹配的候选。

如果一个候选不具有目标格量,则此候选具有中立性。中立的候选是一个有效匹配,只不过具有的优先级比非中立候选要低。假使有格量为en_US, en, fr的候选以及一个语言中立的候选,在en-GB的情境下,候选会按照以下分级:en, en-US, neutral, fr。此情形下,fr完全不匹配。

整体分级过程从最高优先级格量(也就是语言)开始。不匹配的被消除。剩余的候选按照格量进行分级。如果有扯平的,那么下一级的格量(也就是对比度)会被纳入考量。

如果所有候选都无法匹配格量,那么资源加载器会重来来过,却寻找一个默认的候选来显示。默认的候选在PRI创建的时候就设定好了。如果一个候选不具有任何格量,也不是默认值,那么会被弃之不再使用。

所有格量匹配都比默认值优先级要高。

Example of choosing a resource candidate

对于下列候选:

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

因为de和high-constrast不在情境中,所以相关的候选会被移除,剩下:

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

然后RMS依次根据语言和缩放来判读,最后选出:

en/images/logo.scale-400.jpg

NamedResource.ResolveAll可以列举符合情境的所有候选,也就是上面列出的四条。

Example of producing a fallback choice

假使有下列资源:

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

所有候选都不能满足情境,第一阶段会消除所有候选,然后第二阶段则筛选出当前用户相关或者默认的值:

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

How the Resource Management System matches language tags

Introduction

具有语言标签格量的资源按照应用的运行语言列表进行对比和打分。

Understand user profile languages and app manifest languages

对不同语言的配对是按照语言逐一进行的,基本语言有不同的区域。例如应用运行语言是en-US的时候,en-GB排在fr-CA之前。只有再en没有相对的资源,且默认引用语言不设置为en的情况下才会选中fr-CA。

打分机制采用BCP-47 的subtag register包含的数据,以及其他数据资源。结果是产生一个打分范围,内有不同的格量匹配得上得候选。然后从中选取最合适得。

可以以通用便签,比如en来格量化某些资源,然后再en-US以及en-GB语言下对这些进行自定义。

Language tags

BCP-47语言标签含有以下子标签:

  • 语言子标签(必需)
  • 脚本子标签(有可能推断出来)
  • 区域子标签(可选)
  • 变种子表其(可选)

还有其他一些子标签,不过对语言得配选不会有影响。注意,无法通过通配符定义一众语言。

Matching two languages

某些大情境下,Wndows会对比两种语言。两种语言进行比较时,会采用最近匹配原则:

  • 精确匹配(具有最高打分)例子:en_AU : en_AU
  • 变种匹配,例子:en-AU-variant1; en-AU-variant-t-ja
  • 地域匹配:en-AU : en-AU-variant1
  • 部分匹配:
    • 广地域匹配: en-AU:en-053
    • 地域中性匹配:eu-AU:en
    • 共性匹配:en-AU:en-GB
    • 首选区域匹配:en-AU:en-US
    • 任意地域匹配:en-AU:en-CA
  • 无定夺得语言(任意语言匹配):en-AU:und
  • 不匹配(优先级最低): en-AU:fr-FR

Exact match

标签以及子标签完全匹配。

Variant match

标签中的语言,脚本,地域以及变种子标签完全匹配,其他部分不匹配。

Region match

标签中的语言,脚本,以及地域匹配,其他部分不匹配。

例子:

  • de-DE-1996匹配de-DE
  • en-US-x-Pirate匹配en-US

Partial matches

标签中的语言,以及脚本匹配,其他部分不匹配。

例子:

  • en-US匹配en
  • en-US匹配en-*

Macro region match

标签中的语言,以及脚本匹配;两个标签皆有地域子标签,其中一个地域标签囊括另一个。地域子标签是数字式的,并United Nations Statistics Division M.49 country and area codes而来。更多参考Composition of macro geographic (continental) regions, geographical sub-regions, and selected economic and other groupings

注意:

  • UN代码中的经济体组织以及其他组织在BCP-47中不受支持
  • 编号001的地域即代表该地域本身,也就是说es-001等同于es

Region-neutral match

标签中的语言,以及脚本匹配;两个标签只有一个有地域子标签。

Orthographic affinity match

标签中的语言,以及脚本匹配;两个标签皆有地域子标签,地域间存在附属关系。

例如:

  • en-IE和en-GB

Preferred region match

标签中的语言,以及脚本匹配;两个标签皆有地域子标签,其中一个是该语言的默认子标签。

例如:

  • fr-FR是fr的默认区域,在匹配fr-CA的时候比fr-BE有更好匹配度。

Sibling match

标签中的语言,以及脚本匹配;两个标签皆有地域子标签,无从判定那个地域有更高优先级。此情形下,最后一个出现的地域子标签获胜。

Undetermined language

und表示不指定语言,也就意味着可以匹配任意语言。und-Latn可以匹配任何语言标签,如其拥有Latin脚本。

Script mismatch

如果只是语言匹配,但是脚本不匹配,那么这一对则不被考虑为配对关系,打分在正常配对以下。

No match

zh-Hant不匹配zh-Hans。

Examples

“zh-Hans-CN” 对于以下标签的匹配程度:

  • x zh
    • x zh-Hant
    • 4 zh-Hans
      • 1 zh-Hans-CN
        • 2 zh-Hans-CN-variant1
        • 3 zh-Hans-CN-variant2
      • 5 zh-Hans-SG

1为完全匹配,2&3为地域匹配,4为上级匹配,5为同级匹配

Suppress-Script如果出现在语言子标签,则匹配方式稍有不同,具体略。

Matching a language to a language list

Undetermined language (“und”)

Orthographic regional affinity

Handling languages with many regional variants

(未完待续)