How to create a simple PHP cookie language toggle?

前端 未结 5 1331
我寻月下人不归
我寻月下人不归 2020-12-14 04:56

I\'m trying to set up, what I thought would be, a simple language switch. I thought I\'d use PHP cookies, but they\'re not behaving as intended.

I\'ve read a few coo

相关标签:
5条回答
  • 2020-12-14 05:13

    Thanks for all the suggestions - @Mob set me in the right direction, i.e. processing the cookie on another page and then sending you back to the first.

    I did a bit more thinking and experimenting and I've finally solved it. I'll post the code below incase anyone else wants to use this.

    On your main page put this:

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

    Then in another file called 'language_switcher.php' put the following code:

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

    The user chooses a language and clicks 'Select Language'. The form then sends the form value to 'language_switcher.php', which sets the cookie and then sends the user back to the previous page.

    Done! :)

    0 讨论(0)
  • 2020-12-14 05:19

    I used PHP's $_SERVER['PHP_SELF'] to refresh current page and take into account the language selected.

    Sample code enclosed. file name : 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>
    
    0 讨论(0)
  • 2020-12-14 05:33
    if ( !empty($_GET['language']) ) {
        $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'nl';
    } else if ( empty($_COOKIE['language']) ) {
        $_COOKIE['language'] = 'nl';
    }
    setcookie('language', $_COOKIE['language']);
    
    0 讨论(0)
  • 2020-12-14 05:33

    Try this one,

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

    If the lang directive is not set in GET, check if there is a cookie set.

    If it is use its value, or use 'en' by default. If the lang directive is set, set a cookie.

    It's pretty much the same code, but a bit optimized. (It's better to put conditions that appear the most on top of ifs.

    0 讨论(0)
  • 2020-12-14 05:35

    A cookie is not accessible until the setting page has been reloaded or another page has been accessed (in other words, you cannot set and access a cookie in the same page).

    Check this code out :

    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")
    

    Then in redirect_file.php, you redirect back to the cookie page. Perform some checks if you want to avoid redirect loops.

    0 讨论(0)
提交回复
热议问题