Alamofire генерирует заголовки Accept-Language
используя свойство preferredLanguages
Locale
, которое представляет собой комбинацию языка и региона.
Это хорошо работает для стандартных комбинаций: en-US
, fr-FR
, fr-CA
...
Однако, если пользователь выбирает язык, не соответствующий региону, мы получаем комбинацию, которую нельзя использовать как Accept-Language
.
Например, возьмем устройство, настроенное со следующей комбинацией:
Тогда первым preferredLanguages
будет fr-US
, что не соответствует реальному языку (в США не существует конкретной версии французского языка).
Таким образом, сгенерированный Accept-Language
содержит значение, которое во многих случаях не распознается. Вот список действующих кодов .
На устройстве для Франции / США Alamofire генерирует следующие Accept-Language
: fr-US;q=1.0, en-US;q=0.9
Эта функция PHP не распознает ее должным образом, пытаясь определить наилучшую доступную локаль. Он вернет en
вместо fr
.
Напротив, Safari iOS гарантирует отправку действительного Accept-Language
:
На устройстве из Франции / США отправленное сообщение Accept-Language
равно fr-fr
. (Вот быстрый способ узнать заголовки HTTP, отправленные браузером).
В идеале Alamofire должен генерировать те же Accept-Language
что и Safari.
Спасибо за отчет! Однако я не могу найти в RFC 7231 документации, которая официально заявляет об этих комбинациях. Вы можете указать нам на что-нибудь? В противном случае кажется вероятным, что нам нужно будет поддерживать статическую карту возможных комбинаций для приемлемых, что вряд ли то, что мы хотим делать.
Я тоже не могу найти официального списка. Думаю, у Safari есть свой список допустимых комбинаций. 😕
Привет @simonliotier!
Спасибо за подробный отчет здесь ... очень признателен. Мы все должны помнить, что, хотя ваш вариант использования не хочет получать fr-US
, другие могут. Вы всегда можете преобразовать fr-US
в fr-FR
на стороне сервера, чтобы выполнить правильное сопоставление, но вы никогда не узнаете, как изменить fr-FR
на то, что на самом деле у пользователя есть локаль. установлено значение fr-US
.
Alamofire устанавливает только Accept-Language
по умолчанию, но вы можете изменить его для своего конкретного случая использования. Я не думаю, что было бы правильным сделать локаль пользователя более универсальной.
Ваше здоровье. 🍻
Самый полезный комментарий
Привет @simonliotier!
Спасибо за подробный отчет здесь ... очень признателен. Мы все должны помнить, что, хотя ваш вариант использования не хочет получать
fr-US
, другие могут. Вы всегда можете преобразоватьfr-US
вfr-FR
на стороне сервера, чтобы выполнить правильное сопоставление, но вы никогда не узнаете, как изменитьfr-FR
на то, что на самом деле у пользователя есть локаль. установлено значениеfr-US
.Alamofire устанавливает только
Accept-Language
по умолчанию, но вы можете изменить его для своего конкретного случая использования. Я не думаю, что было бы правильным сделать локаль пользователя более универсальной.Ваше здоровье. 🍻