【问题标题】:How to create a simple PHP cookie language toggle?如何创建一个简单的 PHP cookie 语言切换?
【发布时间】:2011-10-17 08:26:02
【问题描述】:

我正在尝试设置一个简单的语言切换。我以为我会使用 PHP cookie,但它们的行为不符合预期。

我已经阅读了一些 cookie 教程,并在 StackOverflow 上查看了一些类似的示例,但我一定遗漏了一些东西,因为它无法使其正常工作。

我通过将语言作为 URL 变量(lang=en 或 lang=ru)传递来设置语言。这一切似乎都很好。但是,我目前设置cookie的代码似乎落后了一步,所以最初它没有任何价值(我希望它默认为'en'),然后如果用户点击'ENG'按钮它仍然没有值,然后如果用户单击俄语,则该值显示为“en”,然后如果我再次单击“ENG”按钮,则该值显示为“ru”。

这是我拼凑的代码:

if( $_GET['lang'] ) {
    $lang = (string)$_GET['lang'];
    setcookie( 'lang', $lang, time() + 60*60*24*30 );
} elseif( !isset($_COOKIE['lang']) ) {
    $lang = 'en';
} else {
    $lang = $_COOKIE['lang'];
}

一旦我完成了这项工作,我打算使用 cookie 的值通过一些条件 PHP 来显示英语或俄语菜单。

谢谢。

【问题讨论】:

  • 使用 cookie 来确定语言不是一个好主意。单独的 URL 是更好的选择,人们可以直接链接到他们在放置链接的页面上使用的相同语言的内容,并且搜索引擎会看到两个单独的页面。
  • @Quentin 说得很好。但是,我的预算很紧,所以需要一个快速简单的解决方案。基本上有(或将会有)两个主菜单,一个是英文的,一个是俄文的。站点编辑器将以两种语言创建文章,然后将它们分配到相关菜单。根据用户的选择和使用条件语句,只会显示这些菜单之一。这是我能想到的最简单的方法......
  • @Quentin 如果创建了单独的 url,网站应该如何记住法语页面也只能链接到网站上的另一个法语页面?
  • @Quentin,因为在这个模型上,所有语言的文本应该是相同的,所以链接只指向内容,可以通过多种不同的方式添加语言。

标签: php cookies toggle


【解决方案1】:

感谢所有建议 - @Mob 为我指明了正确的方向,即在另一个页面上处理 cookie,然后将您送回第一个页面。

我做了更多的思考和试验,终于解决了。我会在下面发布代码,以防其他人想使用它。

在你的主页上放这个:

<form action="language_switcher.php" method="post">
    <select name="lang">
        <option value="en"<?php if( $_COOKIE["language"] == "en" ) { echo " selected"; } ?>>English</option>
        <option value="ru"<?php if( $_COOKIE["language"] == "ru" ) { echo " selected"; } ?>>Russian</option>
    </select>
    <input type="submit" value="Select Language">
</form>

<p>Language: <?php if( isset( $_COOKIE["language"] ) ) { echo $_COOKIE["language"]; } else { echo "<em>not set</em>"; } ?></p>

然后在另一个名为“language_switcher.php”的文件中放入以下代码:

$lang = "en";
if( isset( $_POST["lang"] ) ) {
    $lang = $_POST["lang"];
    setcookie ( 'language', $lang, time() + 60*60*24*30, '/', 'mydomain.com');
    header( "Location: /previous_page_url.php" );
}

用户选择一种语言并点击“选择语言”。然后表单将表单值发送到“language_switcher.php”,它会设置 cookie,然后将用户返回到上一页。

完成! :)

【讨论】:

    【解决方案2】:

    在重新加载设置页面或访问另一个页面之前,无法访问 cookie(换句话说,您无法在同一页面中设置和访问 cookie)。

    检查此代码:

    if( $_GET['lang'] ) {
        $lang = (string)$_GET['lang'];
        setcookie( 'lang', $lang, time() + 60*60*24*30,'/' );
    } elseif(  !$_GET['lang']) ) {
        $lang = 'en';
    } else {
        $lang = $_GET['lang'];
    }
    header("Location: redirect_file.php")
    

    然后在redirect_file.php 中,您重定向回cookie 页面。如果您想避免重定向循环,请执行一些检查。

    【讨论】:

    • 我明白这一点,但我试图做的事是不可能的吗?流程如下:用户点击“ENG”按钮,页面重新加载发送 URL 变量“lang=en”并设置 cookie 值。
    【解决方案3】:
    if ( !empty($_GET['language']) ) {
        $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'nl';
    } else if ( empty($_COOKIE['language']) ) {
        $_COOKIE['language'] = 'nl';
    }
    setcookie('language', $_COOKIE['language']);
    

    【讨论】:

      【解决方案4】:

      试试这个,

      if ( !isset( $_GET['lang'] ) ) { 
          if ( isset( $_COOKIE['lang'] ) ) { 
              $lang = $_COOKIE['lang']; 
          } 
          else { 
              $lang = 'en'; 
          } 
      } 
      else { 
          $lang = (string)$_GET['lang']; 
          setcookie( 'lang', $lang, time() + 60*60*24*30 ); 
      }
      

      如果 GET 中没有设置 lang 指令,请检查是否设置了 cookie。

      如果是使用它的值,或者默认使用'en'。 如果设置了 lang 指令,则设置一个 cookie。

      它的代码几乎相同,但经过了一些优化。 (最好将出现最多的条件放在 if 之上。

      【讨论】:

      • 谢谢你,但它似乎做同样的事情,即它落后了一步。我在这里更正了几个错别字:if ( !isset( $_GET['lang'] ) ) { if ( isset( $_COOKIE['lang'] ) ) { $lang = $_COOKIE['lang']; } else { $lang = 'en'; } } else { $lang = (string)$_GET['lang']; setcookie( 'lang', $lang, time() + 60*60*24*30 ); }
      • 确实,我漏掉了几个括号
      【解决方案5】:

      我使用 PHP 的 $_SERVER['PHP_SELF'] 刷新当前页面并考虑选择的语言。

      附上示例代码。文件名:language_switcher.php

      <?php
      
          error_reporting(E_ERROR);
      
          $lang = "en";
      
          if( isset( $_COOKIE["language"] ) ) { 
             $lang = $_COOKIE["language"]; 
          }
      
          if( isset( $_POST["lang"] ) ) {
             $lang = $_POST["lang"];
             setcookie ( 'language', $lang, time() + 60*60*24*30, '/','localhost');
             $refresh = $_SERVER['PHP_SELF'];
             header( "Location: $refresh");
          }
      ?>
      
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <title>Test Page Language Toggle</title>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      </head>
      
      <body>
      
          <?php 
            // Text definitions
            $text = array(
            'en' => array(
                  'selectlang' => 'Select Language',
                  'lingua' => 'Language: ',
                  'filename' => 'You are in this location: '
                ),
            'fr' => array(
                  'selectlang' => 'Séléctionner',
                  'lingua' => 'Langue: ',
                  'filename' => 'Vous lisez ce fichier: '
                )
            );
      
          ?>
      
          <form action="language_switcher.php" method="post">
              <select name="lang">
                  <option value="en"<?php if( $_COOKIE["language"] == "en" ) { echo "selected"; } ?>>English</option>
                  <option value="fr"<?php if( $_COOKIE["language"] == "fr" ) { echo " selected"; } ?>>Français</option>
              </select>
              <input type="submit" value="<?php echo $text[$lang][selectlang]; ?>">
          </form>
      
          <p><?php echo $text[$lang][lingua]; if( isset( $_COOKIE["language"] ) ) { echo $_COOKIE["language"]; } else { echo "<em>not set</em>"; } ?></p>
      
          <br>
          <p><?php echo $text[$lang][filename] . $_SERVER['PHP_SELF']; ?></p>
      
      </body>
      </html>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2011-11-02
        相关资源
        最近更新 更多