Alamofire: Заголовки Accept-Language неверны для некоторой комбинации языка / региона

Созданный на 7 апр. 2017  ·  3Комментарии  ·  Источник: Alamofire/Alamofire

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.

  • Версия Xcode: 8.2.1
  • Версия iOS: iOS 10
http headers question

Самый полезный комментарий

Привет @simonliotier!

Спасибо за подробный отчет здесь ... очень признателен. Мы все должны помнить, что, хотя ваш вариант использования не хочет получать fr-US , другие могут. Вы всегда можете преобразовать fr-US в fr-FR на стороне сервера, чтобы выполнить правильное сопоставление, но вы никогда не узнаете, как изменить fr-FR на то, что на самом деле у пользователя есть локаль. установлено значение fr-US .

Alamofire устанавливает только Accept-Language по умолчанию, но вы можете изменить его для своего конкретного случая использования. Я не думаю, что было бы правильным сделать локаль пользователя более универсальной.

Ваше здоровье. 🍻

Все 3 Комментарий

Спасибо за отчет! Однако я не могу найти в RFC 7231 документации, которая официально заявляет об этих комбинациях. Вы можете указать нам на что-нибудь? В противном случае кажется вероятным, что нам нужно будет поддерживать статическую карту возможных комбинаций для приемлемых, что вряд ли то, что мы хотим делать.

Я тоже не могу найти официального списка. Думаю, у Safari есть свой список допустимых комбинаций. 😕

Привет @simonliotier!

Спасибо за подробный отчет здесь ... очень признателен. Мы все должны помнить, что, хотя ваш вариант использования не хочет получать fr-US , другие могут. Вы всегда можете преобразовать fr-US в fr-FR на стороне сервера, чтобы выполнить правильное сопоставление, но вы никогда не узнаете, как изменить fr-FR на то, что на самом деле у пользователя есть локаль. установлено значение fr-US .

Alamofire устанавливает только Accept-Language по умолчанию, но вы можете изменить его для своего конкретного случая использования. Я не думаю, что было бы правильным сделать локаль пользователя более универсальной.

Ваше здоровье. 🍻

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

lvandal picture lvandal  ·  3Комментарии

hengchengfei picture hengchengfei  ·  3Комментарии

shivang2902 picture shivang2902  ·  3Комментарии

borek2 picture borek2  ·  3Комментарии

filippovdev picture filippovdev  ·  3Комментарии