Как система управления ресурсами сопоставляет и выбирает ресурсы

В момент запроса ресурса текущему контексту ресурса может в той или иной степени соответствовать несколько кандидатов. Система управления ресурсами анализирует все кандидаты и выбирает из них лучший, который будет возвращен. Для ранжирования всех кандидатов учитываются все квалификаторы.

В процессе ранжирования разным квалификаторам назначаются разные приоритеты: язык оказывает наибольшее влияние на общее ранжирование, за ним идут контрастность, масштаб и т. д. Для каждого квалификатора потенциальные квалификаторы сравниваются со значением квалификатора контекста, чтобы определить качество соответствия. Способ сравнения зависит от квалификатора.

Дополнительные сведения о том, как выполняется сопоставление языков тегов, см. в разделе Как система управления ресурсами сопоставляет языковые теги.

Для некоторых квалификаторов, например масштаба и контрастности, всегда есть минимальная степень соответствия. Например, кандидат с квалификатором масштаба-100 в небольшой степени соответствует контексту масштаба-400, хотя и не в такой степени, как кандидат с квалификатором масштаба-200 или (идеальное соответствие) масштаба-400.

Для других квалификаторов, таких как язык или домашний регион, возможно несоответствие при сравнении (равно как и соответствие в той или иной степени). Например, кандидат с квалификатором языка, такой как en-US, частично соответствует контексту en-GB, а кандидат с квалификатором fr не соответствует этому контексту вовсе. Аналогичным образом, кандидат, квалифицированный для домашнего региона как "155" (Западная Европа), соответствует контексту для пользователя с параметром домашнего региона "FR" несколько хорошо, но кандидат, квалифицированный как "США", не соответствует вообще.

Если во время оценки кандидата имеется несоответствие при сравнении для какого-либо квалификатора, этот кандидат будет считаться в целом несоответствующим и не будет выбран. Таким образом, квалификаторы с более высоким приоритетом могут оказывать максимальное влияние на выбор наилучшего соответствия, но даже квалификатор с низким приоритетом может стать причиной исключения кандидата из-за несоответствия.

Кандидат нейтрален по отношению к квалификатору, если он не отмечен для этого квалификатора вовсе. Для любого квалификатора нейтральный кандидат всегда соответствует значению квалификатора контекста, но только с более низкой степенью соответствия, чем любой кандидат, отмеченный для данного квалификатора и имеющий некоторую степень соответствия (соответствие точное или частичное). Например, если имеются кандидаты с квалификаторами en-US, en, fr и кандидат, не зависящий от языка, то для контекста со значением квалификатора языка en-GB кандидаты будут ранжированы в следующем порядке: en, en-US, нейтральный и 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

Отвергаются все файлы из-за несоответствия контексту. Поэтому мы входим в процедуру по умолчанию, где параметры по умолчанию (см. раздел Компиляция ресурсов вручную с помощью MakePRI.exe) при создании PRI-файла были следующими:

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