Поделиться через


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

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

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

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

Для некоторых квалификаторов, таких как масштабирование и контрастность, всегда существует некоторая минимальная степень соответствия. Например, кандидат, подходящий для "scale-100", соответствует контексту "scale-400" на некоторую небольшую степень, хотя и не так же, как кандидат, квалифицированный для "масштабирования-200" или (для идеального соответствия) "scale-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