У меня очень специфический вопрос. Accept-Language:
Заголовок HTTP содержит список языков (часто вместе с предпочтительными региональными вариантами для таких языков, на которые ИМХО было бы излишне обращать внимание в большинстве случаев от малых до средних веб-сайтов, хотя в некоторых случаях региональные различия могут быть достаточно значительными, чтобы разницу), а также относительные показатели качества, которые, когда они присутствуют, определяют степень предпочтения языка по шкале от 0 до 1. Содержимое этого заголовка отправляется по HTTP от клиента веб-браузера, который обычно собирает такие строка, основанная на списке языков, указанных его пользователем в пользовательском интерфейсе (для Firefox см. Меню -> Параметры -> Содержимое -> Языки -> Выбрать …; для Chrome см. Меню -> Настройки -> Просмотреть дополнительные настройки .. . -> Языки -> Язык и настройки ввода; для Opera см. Меню приложения -> Настройки -> Языки -> Предпочтительные языки; для Internet Explorer см. Настройки -> Свойства обозревателя -> Общие -> Внешний вид -> Языки) на сервер. где они я nterpreted.
Из того, что я видел, ценность Accept-Language:
Заголовок, отправляемый этими браузерами, состоит из строки полей, разделенных запятыми, каждое из которых состоит из кода языка, за которым может следовать точка с запятой, за которой следует относительная подстрока фактора качества. q=qualityFactorHere
где qualityFactorHere
это число от нуля до единицы. На практике все браузеры, которые я тестировал, опускают подстроку относительного коэффициента качества для первого поля и произвольно и несколько непоследовательно включают в себя относительные коэффициенты качества для других полей, так что коэффициенты качества находятся в порядке убывания. Например, для браузера, в котором пользователь указал список языков en, zh-cn, zh-hk, es
необработанный HTTP-заголовок может выглядеть следующим образом:
Accept-Language: en,zh-cn;q=0.8,zh-hk;q=0.5,es;q=0.3
или следующим образом:
Accept-Language: en,zh-cn;q=0.8,zh-hk;q=0.6,es;q=0.4
Для большинства практических целей обе строки передают одну и ту же информацию.
Итак, мой вопрос, учитывая, что содержимое значения этой строки доступно для PHP-кодеров через $_SERVER['HTTP_ACCEPT_LANGUAGE']
Переменная PHP, какой самый надежный способ извлечь массив PHP предпочтительных браузером языков (способом, который не зависит от региональных вариаций) в порядке убывания предпочтений?
Спасибо!!!
Как оказалось, задача на самом деле довольно проста. Вот код решения:
function getLangArray() {
$fields = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
for ($i = 0; $i < count($fields); $i++) {
$fields[$i] = substr($fields[$i], 0, 2);
}
return array_unique($fields);
}
var_dump(getLangArray()); // for debugging purposes only
// sample output: array(3) { [0]=> string(2) "en" [1]=> string(2) "zh" [3]=> string(2) "fr" }
С уважением.
Других решений пока нет …