1

嗨,我想正如标题所说,使用按钮更改网站的语言,但这无需更改 url mywebsite.com(不做mywebsite.com?lang=es),只需更改PHP此代码中的变量:

$xlang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);


if($xlang == "es")
{
$g_lang = "es";
}
else if ($xlang == "en")
{
$g_lang = "en";
}
else
{
$g_lang = "en";
}

然后使用这个按钮

<a class="langx" href="#"></a>

更改语言而不更改网址

有没有办法做到这一点?如果是这样,如何?

提前致谢。

4

3 回答 3

3

单击按钮时,您需要将所需的值发送到服务器,因此您的链接必须具有类似?lang=es.

然后您可以在服务器端处理它并将当前访问者的语言存储在例如数据库(用于登录用户)、会话或 cookie 中。

然后,您可以使用header重定向将用户重定向到没有语言字符串的站点,并在顶部检查是否设置了 db-entry / session / cookie 并使用该语言。

于 2013-06-15T00:49:25.820 回答
2

虽然您可以动态处理请求,但您需要提供另一种方法,这就是原因。根据谷歌的说法,如果你关心SEO,你会想要确保页面语言是显而易见的。您可以即时执行帽子戏法并通过语言偏好切换语言,但如果您希望从搜索引擎获得该语言的任何流量,您还需要提供指向始终使用另一种语言的页面的链接。

如果此页面动态检测到语言,那么 Google 在抓取时看到的任何语言都是它将使页面成为的语言。

http://www.example.com/

如果该站点包含另一种语言的查询字符串标志,则该站点可能会以两种语言进行爬网,如果在您的站点某处存在指向第二种语言的链接。这些是很好的例子(单独的域是最好的选择),用于向 Google 展示西班牙语页面的位置。

http://es.example.com - best for SEO

http://www.example.com/?lang=es

http://www.example.com/es/

在您的 PHP 代码中,您只能捕获浏览器首选语言的初始 2 位代码。有些人实际上用一种以上的语言阅读(基本上任何不是美国人的人)。他们可能在他们的首选语言中使用其他语言,因此虽然来自法国的人可能使用fr他们的首选语言,但他们也可能理解英语 ( en),因此他们的浏览器接受的字符串在 Chrome 中可能看起来像这样:

fr,en-US;q=0.8,en;q=0.6

或者在 IE 中:

fr-FR,en-US;q=0.5

此代码将检查他们是否设置$_GET了语言的标志并覆盖自动翻译。我找到了这段代码,然后对其进行了修改以用于我的目的,因为使用它的站点是欧洲的,大多数人会说多种语言。对于此代码,我已在此处对其进行了修改,因此如果他们的首选语言不是西班牙语,它将默认为英语。这将进入一个文件,该文件lang.php将包含在每个页面上。

<?php
$langs = array();
if (!empty($_GET['lang'])){
    $tempLang = $_GET['lang'];
        //Setup the switch for all of the possible languages.
    switch($tempLang){
        case 'es':
        $pref='es';
        break;
        default:
        //english
        $pref='en'; 
    }

} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    // break up string into pieces (languages and q factors)
    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])) {
        // create a list like "en" => 0.8

         $langs = array_combine($lang_parse[1], $lang_parse[4]);

        // set default to 1 for any without q factor
        foreach ($langs as $lang => $val) {
            if ($val === '') $val = 1;
        $lParse = strtolower(preg_replace('!\-.*$!','',$lang));
            if(!isset($newLangs[$lParse])){
                $newLangs[$lParse] = $val;
            }

        }

        // sort list based on value 
        arsort($newLangs, SORT_NUMERIC);
    }

//Set the preferred languages for the website (available translations)
$preferred = array('en','es');

//Check for overlap keeping the preference order
$intersect = array_values(array_intersect(array_keys($newLangs), $preferred));

//print_r($newLangs);

if(isset($intersect[0])){
    //Set the first preference
    $pref = $intersect[0];  
    if(preg_match('!^es!',$pref)){
        $pref='es';
    }   
} else {
    //default to english
    $pref = 'en';   
}


} else {
    //default to english
    $pref = 'en';   
}

?>

在包括您在内的页面上,lang.php您需要检查$pref变量以显示该语言的正确翻译。

Javascript

您可以使用 Javascript 进行重定向,以使用相同的代码使页面加载其他语言,但是搜索引擎通常只查看 Javascript 的漏洞利用,并且不会跟踪 Javascript 中的链接。根据谷歌网站管理员指南:

使用文本浏览器(例如Lynx)来检查您的网站,因为大多数搜索引擎蜘蛛看到您的网站的方式与 Lynx 一样。如果 JavaScript、cookie、会话 ID、框架、DHTML 或 Flash 等花哨的功能使您无法在文本浏览器中看到您的所有网站,那么搜索引擎蜘蛛可能无法抓取您的网站。

您可以使用 AJAX 通过单击进行更改,但是需要将 AJAX 侦听的 URL 传递给参数,并且这些参数通常通过$_GET变量传递。

IP查询

有些人尝试过的另一种方法是检查IP地址并反向查找位置以查看原产国的位置,然后他们会选择国家语言。这样做的问题是:

  1. 人们旅行
  2. 一些 IP 地址注册给其他国家的所有者(想想公司块),而不是用户浏览器所在的国家。
  3. 某些 IP 地址列表非常不准确。

饼干

并非所有用户都接受 cookie,某些公司防火墙甚至可能会剥离 cookie。

于 2013-06-15T03:14:11.340 回答
0

我不明白您到底需要做什么,但我认为您想在单击按钮时刷新页面以应用更改而不向您的网址添加任何内容!如果我是对的,您可以像这样使用 Jquery location.reload()函数:

// don't forget to add link to jquery file for example : <script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">

  $(document).ready(function(){
   $('.langx').click(function() {

          location.reload();

   });
  });

</script>

我个人使用 gettext 库来翻译我的网站:我制作了一个语言列表,然后我使用 ajax 调用来发送用户选择的语言,如果该选择的翻译可用,我返回 ok,最后我用 js 重新加载页面。您可以在此处了解 gettext lib 或查看文档

如果这不是您想要的,请添加更多详细信息以明确您的问题

于 2013-06-15T01:13:34.873 回答