多语言网站和cookie:如何记住所选的语言?

问题描述 投票:1回答:1

首先,我必须指出自己是Web开发的新手,但我会尽力而为。

我用英语和法语创建了一个多语言网站。与我在互联网上阅读的大多数建议与每种语言创建不同的php页面的人相反,我创建了一个MySql数组以对网站进行适当的本地化。我发现此解决方案更简洁,更优雅,因为我计划迟早添加更多语言。

我有一个Config.php文件,其中包含MySql的路径。默认情况下,语言是英语,除非您决定显示其他语言,例如法语:

  $_SESSION['lang'] = "en"; 
}
else{
  switch($_GET['lang']){
      case "fr":
      $_SESSION['lang'] = "fr";
      break;
      case "en":
      $_SESSION['lang'] = "en";
      break;
      default :
      $_SESSION['lang'] = "en"; 
      break;
  }
}
switch($_SESSION['lang']){ 
      case "fr":
      $language = "French";
      break;
      case "en":
      $language = "English";
      break;
}

显然,Config.php包含在所有其他php页面中。为了更改语言,我在导航栏中添加了带有标志的图像,这将在URL末尾添加?lang =:

<a href="?lang=fr"><img class="language" src="images/fr.png"></a>
<a href="?lang=en"><img class="language" src="images/en.png"></a>```

因此,如果您选择法语,则会在网址中添加?lang = fr。本地化效果很好,我很高兴。

但是,当我从导航栏导航到另一个页面时,它失去了法语(因为英语是默认语言:]

    <a href="index.php"><?php echo $loc["header_home"] ?></a>

我知道这是有道理的,因为链接只是“ index.php”,而不是“ index.php?lang = fr”。

因此,我尝试使用cookie以保持所选的语言,这就是我遇到的问题。

我编辑了Config.php以进行设置和Cookie如下:

     if ((isset($_GET['lang']) != "")) {
        setcookie("langpref", "".$_GET['lang']  ."", time()+(0), "/", 'domain.com'); //expires at the end of the session//
        $_COOKIE['langpref'] = $_GET['lang'];
    }

到目前为止没有问题,直到我添加这些行:

if (isset($_COOKIE['langpref'])) {
    if (strpos($_SERVER['PHP_SELF'],$_COOKIE['langpref']) === false) {
      header("location: ". basename($_SERVER['PHP_SELF']). "?lang=". $_COOKIE['langpref'] );
    }
}

我假设这是一种幼稚的方法,例如在^^'这样的网址中添加“?lang =“因为当我这样做时,我收到一条错误消息,提示由于不允许cookie或其他原因而无法加载页面。

欢迎任何帮助(或其他方法)!

提前谢谢您!

php html cookies session-cookies setcookie
1个回答
0
投票

之所以写答案,是因为注释中没有足够的空间。

您将Cookie设置为立即失效,我已将其更改为一个小时。

if ((isset($_GET['lang']) != "")) {
    setcookie("langpref", $_GET['lang'], time()+3600, "/"); //expires at the end of the session//
    $_COOKIE['langpref'] = $_GET['lang'];
}

其他:

您只写"".$_GET['lang'] .""时就已经写$_GET['lang']

© www.soinside.com 2019 - 2024. All rights reserved.