Каков ожидаемый формат строки языковой локали HTTP Accept-Language?

#http #http-headers #internationalization #http2

#http #http-заголовки #интернационализация #http2

Вопрос:

В браузере Mac OS Chrome (v87), когда я делаю HTTP-запрос, я вижу заголовок Accept-Language следующим образом:

 accept-language: en-US,en;q=0.9,es;q=0.8,es-MX;q=0.7
 

В браузере Mac OS Safari (версия 13.1.3), когда я делаю тот же HTTP-запрос, я вижу заголовок Accept-Language следующим образом:

 Accept-Language: en-us
 

Мой вопрос в том, верны ли оба вышеуказанных формата? Разница между прописными ‘en-US’ и строчными ‘en-us’ фактически привела к ошибке в некотором коде маршрутизации.

Ответ №1:

Да, оба приведенных вами примера соответствуют указанному синтаксису для Accept-Language заголовка.

Этот синтаксис явно изложен в RFC 7231. Проще говоря, значение представляет собой разделенный запятыми список языковых тегов, где за каждым тегом необязательно следует точка с запятой и вес ( ;q=... ), указывающий желательность языка.

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

Языковые теги и, следовательно, языковые диапазоны должны рассматриваться как нечувствительные к регистру: существуют соглашения для заглавных букв некоторых подтегов, но они НЕ ДОЛЖНЫ восприниматься как имеющие значение. Сопоставление языковых тегов с языковыми диапазонами ДОЛЖНО выполняться без учета регистра.

Ответ №2:

В качестве продолжения этого вопроса. Строка языковой локали в нижнем регистре может быть допустимой в соответствии с HTTP. Но это было подтверждено как ошибка в WebKit.

Источник: https://bugs .webkit.org/show_bug.cgi?id=163096

Комментарии:

1. Спасибо за ответ. Чтобы уточнить, ошибка связана не с заголовком HTTP, а с DOM API. В частности, значение window.navigator.language должно использовать код страны в верхнем регистре.