我发现每种语言的代码都有不同的响应,取决于很多因素。
$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $lang;
例如英语:en_EN,en-EN,en_GB,en_US,en-GB,en-US。
法语和其他语言相同。
我正在寻找的是我在哪里可以找到这些lang的同义词,这样我就能为每一个人提供正确的页面语言。
现在我有3种语言,所以我正在寻找的是找到所有英语语言,法语和阿拉伯语的可能性:
if (($lang=="en_EN") OR ($lang=="en-EN") OR ($lang=="en_GB") OR ($lang=="en_US") OR ($lang=="en-GB") OR ($lang=="en-US")) {
echo 'show English version';
}else if (($lang=="fr_FR") ...... ) { // i don't know the other like fr-FR .....
echo 'show French version';
}else if (($lang=="ar_AR") ...... ) { // i don't know the other like ar-AR .....
echo 'show Arabic version';
}else {
echo 'English as default';
}
答案 0 :(得分:4)
根据您的示例,您似乎并不关心语言本地化(例如,如果是英式英语或美式英语)。相反,你只关心语言偏好是英语。
在这种情况下,我建议只从区域设置中获取前两个字符。
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
这将返回en
,fr
,ar
等,无论本地化如何。使用此选项设置返回给用户的内容语言,如果某种语言不存在,则使用默认语言,例如,英。
答案 1 :(得分:1)
如果您只关心语言,请使用区域设置代码的前两个字符,例如:来自en
的{{1}}。这些字符代表用户首选语言的the ISO 639-2 language code。
其余字符代表首选区域,例如en_US
为美国英语,en_US
为英国英语。 (en_GB
没有意义,因为没有国家/地区代码en_EN
。)如果您不关心该地区,则可以忽略此部分。
答案 2 :(得分:1)
switch (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2))
{
case 'ar': break; # Arabic
case 'fr': break; # France
default: break; # English
}
您可以改进此实现:$_SERVER['HTTP_ACCEPT_LANGUAGE']
可能有;
个分隔值,而不是意味着用户每次能够读取一些语言,因此您可以根据需要检查所有这些值从你的名单中了解你可以提供给他的东西。
答案 3 :(得分:1)
尝试以下方法:
$lang = $lang[0].$lang[1];
或者
$lang = substr($lang, 0, 2);
或
$lang = mb_strimwidth($lang, 0, 2);
所有这些都会返回字符串的前2 chars
,其中包括en
,fr
,de
等。
答案 4 :(得分:0)
尝试使用ISO 639-1(https://en.wikipedia.org/wiki/ISO_639-1)获取一系列语言:
$lang_parse="";
preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
if (count($lang_parse[1])) {
$langs = array_combine($lang_parse[1], $lang_parse[4]);
foreach ($langs as $lang => $val) {
if($val === '') {
$rlangs[substr($lang, 0, 2)] = 1;
} else if (isset($rlangs[substr($lang, 0, 2)]) && $rlangs[substr($lang, 0, 2)] < $val) {
$rlangs[substr($lang, 0, 2)] = $val;
}
}
arsort($rlangs, SORT_NUMERIC);
}
在$ rlangs var中,您将获得一个包含所有浏览器接受语言的数组。 如果接受的语言是英语,您将获得:
array(1) {
["en"]=>int(1)
}