PHP:按偏好降序提取一组用户首选语言(不包括区域差异)的最可靠方法是什么?
PHP: What's the most reliable way to extract an array of user preferred languages (excluding regional variations) in descending order of preference?
我有一个非常具体的问题。 Accept-Language:
HTTP header 包含一个语言列表(通常连同此类语言的首选区域变体,恕我直言,在大多数小型到 medium-large 网站的情况下,注意这些语言是多余的,尽管在某些情况下,区域差异可能足以产生差异),以及相对质量因素,这些因素在存在时指定了一种语言在 0 到 1 范围内的偏好程度。这个 [=37 的内容=] 从 Web 浏览器客户端通过 HTTP 发送,它通常根据用户在用户界面中指定的语言列表来组装此类字符串(对于 Firefox,请参见菜单 -> 选项 -> 内容 -> 语言 -> 选择.. .; 对于 Chrome,请参阅菜单 -> 设置 -> 查看高级设置... -> 语言 -> 语言和输入设置;对于 Opera,请参阅应用程序菜单 -> 设置 -> 语言 -> 首选语言;对于 Internet Explorer查看设置 -> Internet 选项 -> 通用 -> 外观 -> 语言),到他们所在的服务器被解读。
据我所见,这些浏览器发送的 Accept-Language:
header 的值由 comma-separated 字段字符串组成,每个字段都包含可选的语言代码,后跟分号后跟相对质量因子子字符串 q=qualityFactorHere
,其中 qualityFactorHere
是介于 0 和 1 之间的数字。实际上,我测试过的所有浏览器都省略了第一个字段的相对质量因子子字符串,并且任意且有些不一致地包含其他字段的相对质量因子,使得质量因子按降序排列。例如,对于用户已指定语言列表 en, zh-cn, zh-hk, es
的浏览器,原始 HTTP header 可能如下所示:
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" }
此致。
我有一个非常具体的问题。 Accept-Language:
HTTP header 包含一个语言列表(通常连同此类语言的首选区域变体,恕我直言,在大多数小型到 medium-large 网站的情况下,注意这些语言是多余的,尽管在某些情况下,区域差异可能足以产生差异),以及相对质量因素,这些因素在存在时指定了一种语言在 0 到 1 范围内的偏好程度。这个 [=37 的内容=] 从 Web 浏览器客户端通过 HTTP 发送,它通常根据用户在用户界面中指定的语言列表来组装此类字符串(对于 Firefox,请参见菜单 -> 选项 -> 内容 -> 语言 -> 选择.. .; 对于 Chrome,请参阅菜单 -> 设置 -> 查看高级设置... -> 语言 -> 语言和输入设置;对于 Opera,请参阅应用程序菜单 -> 设置 -> 语言 -> 首选语言;对于 Internet Explorer查看设置 -> Internet 选项 -> 通用 -> 外观 -> 语言),到他们所在的服务器被解读。
据我所见,这些浏览器发送的 Accept-Language:
header 的值由 comma-separated 字段字符串组成,每个字段都包含可选的语言代码,后跟分号后跟相对质量因子子字符串 q=qualityFactorHere
,其中 qualityFactorHere
是介于 0 和 1 之间的数字。实际上,我测试过的所有浏览器都省略了第一个字段的相对质量因子子字符串,并且任意且有些不一致地包含其他字段的相对质量因子,使得质量因子按降序排列。例如,对于用户已指定语言列表 en, zh-cn, zh-hk, es
的浏览器,原始 HTTP header 可能如下所示:
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" }
此致。