【问题标题】:PHP language selectorPHP 语言选择器
【发布时间】:2023-03-05 18:22:01
【问题描述】:

我很确定这在以前是有效的,所以我不知道我为开发中的网站使用的语言选择器的代码发生了什么变化。这是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),然后可以从上面的 echo 在 HTML 中引用该文件。

但是,我无法让它工作。当我单击图像时,页面会重新加载。我试过做一个&lt;?php echo 'stuff'; ?&gt;,这很有效,所以我的PHP应该可以工作。这意味着代码一定有问题。

【问题讨论】:

  • 您是否尝试过调试问题出现在哪一点?
  • 我认为所有内容都包含在同一页面中,因为您使用 &lt;form method="post"&gt; 没有任何操作。默认情况下,没有任何操作就像发帖给自己一样。
  • 另外 &lt;?php echo $content['index1']; ?&gt; 不应该是 &lt;?php echo $content['identifier1']; ?&gt; 吗?并且您的表单元素(如果它们是输入)可能需要不同的名称。两者都设置为name="language"
  • 如示例中所示,$content 不包含“index1”条目。应该是'indentifier1',不是吗?
  • 这段代码非常危险,它允许用户在您的服务器上包含他们知道路径的ANY php 文件。

标签: php html translation


【解决方案1】:

好的,抱歉这么久才回复。我花了一些时间对此进行了进一步的研究,以及其他人在此处提供的其他链接。无论如何,我找到了一个更好的解决方案,它使用 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 属性对您的访问者有意义。

【讨论】:

    【解决方案2】:

    好的,有几件事:

    1) 你为什么要对本质上是索引系统的东西使用关联数组?为什么不使用常规数组?

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

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


    更新:

    向您的表单添加操作。即使它是空的。那可能会产生影响。 您是否尝试过对您的 $_POST 值使用 var_dump?

    也可以试试

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

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

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

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

    [base project directory]/Languages/english.php
    

    然后你会像这样包含它:

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

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

    【讨论】:

    • 我的编辑丢失了,因为有人同时在编辑我的帖子。我的文件上的值是相同的,但我在这里更改了它们以更易于阅读。至于数组的事情,不知道。我对不同的数组不太熟悉,但它以前工作得很好。我只是不知道为什么它突然停止工作。
    • 是的,它给了我一些回声:注意:未定义的索引:第 10 行的 D:\xampp\htdocs\index.php 中的语言。所以看起来它不知道 $_SESSION 是什么['language'] 应该是。
    • 附带说明,如果您不在生产服务器上,我会出于调试目的打开通知。它会让你的生活变得更轻松,并迫使你编写更好的代码!
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多