gpt4 book ai didi

php - 使用 PHP HTTP_ACCEPT_LANGUAGE 服务器变量

转载 作者:IT王子 更新时间:2023-10-29 01:22:01 25 4
gpt4 key购买 nike

我创建了一个 PHP 脚本来检查 HTTP_ACCEPT_LANGUAGE并从第一个两个字符开始使用适当的语言加载网站:

          $http_lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
switch ($http_lang) {
case 'en':
$SESSION->conf['language'] = 'english';
break;
case 'es':
$SESSION->conf['language'] = 'spanish';
break;
default:
$SESSION->conf['language'] = $PREFS->conf['languages'][$SESSION->conf['language_id']];
}

如果我在 Firefox 中将语言更改为西类牙语,则网站可以正常加载西类牙语。然而,我收到了几份报告,说哥伦比亚人看到的是英文网站。

详细信息:“es-co”LCID = 9226 西类牙语(哥伦比亚)

有人知道为什么会这样吗?我认为这是检查用户支持哪种语言的最佳方式。

最佳答案

一个更现代的方法是使用 http_negotiate_language() :

 $map = array("en" => "english", "es" => "spanish");
$conf_language= $map[ http_negotiate_language(array_keys($map)) ];

如果您没有安装 http extension ( and not the intl one as well ),评论中还有另一种解决方法 ( user-note #86787 (Nov 2008; by Anonymous) ):

<?php 
/*
determine which language out of an available set the user prefers most

$available_languages array with language-tag-strings (must be lowercase) that are available
$http_accept_language a HTTP_ACCEPT_LANGUAGE string (read from $_SERVER['HTTP_ACCEPT_LANGUAGE'] if left out)
*/
function prefered_language ($available_languages,$http_accept_language="auto") {
// if $http_accept_language was left out, read it from the HTTP-Header
if ($http_accept_language == "auto") $http_accept_language = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';

// standard for HTTP_ACCEPT_LANGUAGE is defined under
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
// pattern to find is therefore something like this:
// 1#( language-range [ ";" "q" "=" qvalue ] )
// where:
// language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
// qvalue = ( "0" [ "." 0*3DIGIT ] )
// | ( "1" [ "." 0*3("0") ] )
preg_match_all("/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?" .
"(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i",
$http_accept_language, $hits, PREG_SET_ORDER);

// default language (in case of no hits) is the first in the array
$bestlang = $available_languages[0];
$bestqval = 0;

foreach ($hits as $arr) {
// read data from the array of this hit
$langprefix = strtolower ($arr[1]);
if (!empty($arr[3])) {
$langrange = strtolower ($arr[3]);
$language = $langprefix . "-" . $langrange;
}
else $language = $langprefix;
$qvalue = 1.0;
if (!empty($arr[5])) $qvalue = floatval($arr[5]);

// find q-maximal language
if (in_array($language,$available_languages) && ($qvalue > $bestqval)) {
$bestlang = $language;
$bestqval = $qvalue;
}
// if no direct hit, try the prefix only but decrease q-value by 10% (as http_negotiate_language does)
else if (in_array($langprefix,$available_languages) && (($qvalue*0.9) > $bestqval)) {
$bestlang = $langprefix;
$bestqval = $qvalue*0.9;
}
}
return $bestlang;
}
?>

关于php - 使用 PHP HTTP_ACCEPT_LANGUAGE 服务器变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com