PHP:检测用户语言并能够更改语言

时间:2018-02-18 19:02:27

标签: php cookies browser-detection

我有一个能够选择语言的网站。当用户第一次进入网站时,我想做到这一点,php获取他的系统语言并写入cookie(因此,每次进入时间时,用户默认使用相同的语言)。但是当用户想要更改网站语言时,他会按下一个选定语言的按钮(例如俄语),然后将为俄语设置网站语言,当他再次进入网站时,他将使用俄语。

到目前为止,我有这段代码,但它真的很混乱,而且无法正常运行。

HTML:

FieldB
if (Left(A2,1)="#", A2, B1)

PHP:

<a href="index.php?language=en">
<a href="index.php?language=ru">

3 个答案:

答案 0 :(得分:1)

这里可以采用一个简单的逻辑 -

当用户登陆您的网站时,您应该跟踪他/她的IP地址,我们可以轻松地使用该IP获取他们的国家/地区。然后,您可以轻松地为他们提供语言。

答案 1 :(得分:1)

首先应该查找用户首选语言的是Accept-Language标头。地理IP查找是一种危险且昂贵的浪费时间(至少对于确定语言而言)。除此之外,您可以设置一个cookie来覆盖浏览器提供的选项,但对于欧洲的网站来说,这会产生法律影响。

 $avail_lang=array(
            'en'=>1,
            'fr'=>1,
            'de'=>1,
            'ru'=>1
            );
 define("DEFAULT_LANG", 'en');
 ...
 if ($_COOKIE['language'] && isset($avail_lang[$_COOKIE['language']]) {
    $use_lang=$_COOKIE['language'];
 }
 // override with GET if provided
 if ($_GET['language'] && isset($avail_lang[$_GET['language']]) {
    $use_lang=$_GET['language'];
 }
 // no language? check browser
 if (!$use_lang) {
    $request_lang=explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    foreach($request_lang as $i) {
            list($lang, $pref)=explode("=", trim($i));
            $pref=$pref ? 0.0+$pref : 1.0;
            list($lang, $country)=explode("-", $lang);
            $pref_lang[$lang]=$pref;
    }
    rsort($pref_lang);
    $use_lang=array_shift(array_intersect_key($pref_lang, $avail_lang));
    if (!$use_lang) $use_lang=DEFAULT_LANGUAGE;
}
if (user_accepts_cookies() && $use_lang!=$_COOKIE['language']) {
    set_lang_cookie($use_lang);
}

答案 2 :(得分:0)

找到了如何做到这一点的方法:

function display_star($rating){
    $output="";
    $step = calculate_stars($rating);
    $output ='<ul class="c-rating">';
    for ($i=0;$i<10;$i++)
    {
        $class = '';
        if($i<=$step)  $class = ' is-active';
        if($i%2 == 0) $class .= ' left';
        $output .= '<li class="c-rating__item'. $class.'" data-index="'.$i.'"></li>';
    }

    $output .='</ul>';
    return $output;

}

echo display_star(0.5);