我有这个PHP代码设置cookie时,?setLang
参数是在URL
if (isSet($_GET["setLang"])) {
setcookie("lang",$_GET["setLang"]);
}
if (!isSet($_COOKIE["lang"])) {
//negociate language and set locale
}else{
//set locale to cookie
}
//translate with gettex
当我访问website.com/?setLand=en时,它完全按照预期工作。
问题是当我从website.com链接到这个表单中的URL:
<a href="?setLang=en">en</a>
当我点击它时,通过链接(而不是直接进入)gettext翻译不起作用,但除此之外,它按预期工作。
我的第一个想法是我必须强制某种刷新,所以我这样做了:
<a href="?setLang=en" onClick="window.location.reload( true );">en</a>
但是行不通。
我检查了代码,当你点击链接时,cookie实际上是设置的,所以它使我更加困惑。
完整的代码如下:
<?php
if (isSet($_GET["setLang"])) {
setcookie("lang",$_GET["setLang"]);
}
if (!isSet($_COOKIE["lang"])) {
$langs = array(
'en-US',// default
'fr',
'fr-FR',
'de',
'de-DE',
'de-AT',
'de-CH',
);
$locale = substr(http_negotiate_language($langs), 0, 2);
}else{
$locale = $_COOKIE["lang"];
}
//if (isSet($_GET["locale"])) $locale = $_GET["locale"];
if($locale == "en")
$locale = "en_US.utf8";
if($locale == "de")
$locale = "de_DE.utf8";
if($locale == "fr")
$locale = "fr_FR.utf8";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
// Specify location of translation tables
bindtextdomain("translation", "locale");
// Choose domain
textdomain("translation");
// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now
// Print a test message
//echo _("title");
?>
和链接:
...
<a href="?setLang=en" onClick="window.location.reload( true );">en</a>
...
setcookie()
在输出中增加了一个标题,并且不改变$_COOKIE
的超全局。
if (isSet($_GET['setLang'])) {
$locale = $_GET['setLang'];
setcookie('lang', $locale);
} elseif (isSet($_COOKIE['lang'])) {
$locale = $_COOKIE['lang'];
} else {
$langs = array('en-US', 'fr', 'fr-FR', 'de', 'de-DE', 'de-AT', 'de-CH');
$locale = substr(http_negotiate_language($langs), 0, 2);
}
当你有一个链接时,你不需要重新加载任何东西,因为链接将默认(如果你不说不要)引导到另一个页面。
你确定你指向正确的文件吗?尝试一些调试,比如在URL中发送您正在处理的确切文件,例如:
<a href="home.php?setLang=en">en</a>
对于调试建议,您可以使用PHP print_r,它将帮助您了解在$_GET中得到的内容。
只需在PHP代码的开头这样做:
<?php
print_r($_GET);
//the rest of your code
?>