PHP语言选择器

时间:2014-01-02 16:22:54

标签: php html translation

我很确定这之前有用,所以我不知道我为一个开发中的网站使用的语言选择器所使用的代码发生了什么。这是php:

<?php
    session_start();
    if(isset($_POST['language'])) {
        $_SESSION['language'] = $_POST['language'];
    }
    $language = (isset($_SESSION['language']) ? $_SESSION['language'] : "english");
    include('/Languages/'.$language.'.php');
?>

HTML:

<form method="post">
    <input type="image" name="language" value="english" src="Images/english.png"/>
    <input type="image" name="language" value="spanish" src="Images/spanish.png"/>
    ...
</form>

每个'词典'文件中的PHP:

<?php
    $content = array(
        "identifier1"=>'content with html to be included',
        "identifier2"=>'more content to be included'
    );
?>

最后,实际页面上的代码调用正确的语言:

<?php echo $content['identifier1']; ?>

因此,这应该通过让用户单击表单中的一个图像来工作。表单发送单击图像的值,该值是应该打开的语言文件的名称。 PHP位于页面的头部,然后获取此值,并包含字典文件(例如,english.php),然后可以在HTML中从上面的echo中引用它。

然而,我无法让它发挥作用。当我点击图片时,页面会重新加载。我尝试过<?php echo 'stuff'; ?>,这样可行,所以我的PHP应该正常工作。这意味着代码必定存在问题。

2 个答案:

答案 0 :(得分:2)

好的,抱歉花了这么长时间才回复。我花了一些时间对此进行了进一步的研究,以及其他人提供的其他链接。在任何情况下,我都找到了一个更好的解决方案,它使用cookie而不是单个会话,如下所示:

在开始HTML之前(或者至少在你的body标签之前),添加以下PHP代码:

<?php
    $lang = "YOUR DEFAULT LANGUAGE";
    $allowedlangs = array(
        "AVAILABLE LANGUAGES 1",
        "AVAILABLE LANGUAGESS 2"
    );
    if (!empty($_GET["lang"])) {
        $rlang = $_GET["lang"];
    } else if (!empty($_COOKIE["lang"])) {
        $rlang = $_COOKIE["lang"];
    }
    if (isset($rlang) && !empty($rlang) && in_array($rlang, $allowedlangs)) {
        $lang = $rlang;
        setcookie("lang", $lang,time()+31536000);
    }
    $langmaps = array(
        "AVAILABLE LANGUAGES 1" => "FILE PATH TO LANGUAGE 1 FILE.php",
        "AVAILABLE LANGUAGES 2" => "FILE PATH TO LANGUAGE 1 FILE.php"
    );
    include($langmaps[$lang]);
?>

所以$ lang是一个变量,最初定义了你想让新访问者看到的语言。也就是默认语言。无论$ lang采用什么值,它必须来自下一行的数组。只要你能为自己识别它们,你所谓的语言并不重要。代码不关心。拨打英语“english”,“en”,“lang1”,“TeaAndCrumpets”或任何你想要的东西。为您想要的每种其他语言创建一个新行。

再向下,你就拥有了$ langmaps这一行。此数组中的行将使您的语言名称与包含语言值的文件路径相匹配。例如,如果您的英语是“TeaAndCrumpets”,则代码为:

"TeaAndCrumpets" => "FILE PATH TO LANGUAGE 1 FILE.php"

然后只需输入英文文件的文件路径,只要指向正确的文件,就可以将其命名为任何内容。

在此之后,您只需要按钮。无需任何表格。只需为您想要的每种语言。在这种情况下,我使用包含在标签中的图像:

<a href="?lang=TeaAndCrumpets"><img src="/images/english.png" title="English" alt="English"></a>
<a href="?lang=vodka"><img src="/images/russian.png" title="Russian" alt="Russian"></a>

这只是将URL变量添加到地址栏,PHP就会启动。确保你对lang变量的href中的任何值与$ allowedlangs数组中的一个名称匹配,并确保你的标题和alt属性对访问者有意义。

答案 1 :(得分:0)

好的,有几件事:

1)为什么你使用一个关联数组来做一个固有的索引系统?为什么不使用常规数组?

2)尝试调试。 Echo $ _SESSION ['language']并确保该值甚至可以通过。

另外,尝试执行var_dump($ content)并查看包含语言文件后的内容。


更新

向表单添加操作。即使它是空的。这可能会产生影响。 你在$ _POST值上尝试了var_dump吗?

另外,试试

var_dump("/Languages".$language.".php");

但是,我会通过基目录指定语言文件的位置。通常在项目中,我有一个全局应用程序对象存储,其值为常量,如下所示:

define("BASEDIR", __DIR__ . "/");

当然,如果需要,您可以在其末尾添加适当数量的“../”或其他文件路径信息。 从那里,我使用它作为ALL文件包含的“基本目录”。因此,如果您的语言文件位于

[base project directory]/Languages/english.php

然后你就像这样包括它:

include(BASEDIR . "Languages/" . $language . ".php");

当然,请确保您的基本目录常量有一个尾部斜杠,或在此处添加一个(我更喜欢使用尾部斜杠终止所有目录名称)。