0

我有这个 PHP 代码,当?setLang参数在 URL 中时,它会设置一个 cookie

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>
...
4

2 回答 2

1

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);
}

会做你想做的。

于 2013-04-16T19:33:26.077 回答
0

当你有一个链接时,你不需要重新加载任何东西,因为链接将是默认的(如果你不说不这样做)会导致另一个页面。

您确定将其指向正确的文件吗?尝试一些调试,例如在 URL 中发送您正在处理它的确切文件,例如:

<a href="home.php?setLang=en">en</a>

对于调试 propuses,您可以使用 PHP print_r,它可以帮助您了解在 $_GET 中得到了什么。

只需在 PHP 代码的开头执行此操作:

<?php
print_r($_GET);
//the rest of your code
?>
于 2013-04-16T18:43:43.187 回答