Мне нужен пример кода или библиотека, которые будут анализировать заголовок Accept-Language
и возвращать мне предпочтительный язык. RFC2616 утверждает, что:
Поле заголовка запроса Accept-Language аналогично Accept, но ограничивает набор естественных языков, которые являются предпочтительными в качестве ответа на запрос. Языковые теги определены в разделе 3.10.
- Как получить содержимое в виде строки?
- Ошибка аутентификации с мылом
- Как я могу расшифровать строку пароля в PHP, которая была зашифрована crypt?
- PHP JAXB Эквивалент
- Почему функции в контроллерах и таблицах cakephp 3.x являются общедоступными, но функционируют в защищенных объектах?
Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q" "=" qvalue ] ) language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Каждому языковому диапазону может быть присвоено связанное значение качества, которое представляет собой оценку предпочтения пользователя для языков, указанных в этом диапазоне. Значение качества по умолчанию равно «q = 1».
Дальнейшее чтение показывает, что слишком много «необязательных», «должно», «может» и других поворотов речи, которые мешают мне изобретать колесо – все, что я хочу знать, это то, что предпочитает язык, любой браузер отвечает на этот вопрос в миллиард раз день.
Любой фрагмент кода на любом языке (кроме Lisp и Assembler, пожалуйста) будет полезен.
Спасибо заранее!
Попробуйте это, на PHP, но используя одно и то же регулярное выражение, я уверен, что он адаптируется к любому языку:
$langs = array(); // used to store values if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // break up string into pieces (languages and q factors) preg_match_all('/([az]{1,8}(-[az]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); if (count($lang_parse[1])) { // create a list like "en" => 0.8 $langs = array_combine($lang_parse[1], $lang_parse[4]); // set default to 1 for any without q factor foreach ($langs as $lang => $val) { if ($val === '') $langs[$lang] = 1; } // sort list based on value arsort($langs, SORT_NUMERIC); } }
сначала производит отсортированный массив с предпочтительным языком:
Array ( [en-ca] => 1 [en] => 0.8 [en-us] => 0.6 [de-de] => 0.4 [de] => 0.2 )
Пример: заголовок ACCEPT_LANGUAGE
: en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2
Рабочий пример здесь
Решение:
namespace ConsoleApplication { using System; using System.Linq; using System.Net.Http.Headers; class Program { static void Main(string[] args) { string header = "en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2"; var languages = header.Split(',') .Select(StringWithQualityHeaderValue.Parse) .OrderByDescending(s => s.Quality.GetValueOrDefault(1)); } } }
Результат: