Search code examples
phparrayslang

How to maintain the previously selected language (I used php arrays and ?lang=) after clicking a link?


I have the following code:

  <html>
        <head>
            <title><?php echo $GLOBALS['L']['title']; ?></title>
        </head>
        <body>
            <ul id="language-selection">
                <li><a href="index.php?lang=english">English</a></li>
                <li><a href="index.php?lang=french">French</a></li>
            </ul>
            <h1><?php echo $GLOBALS['L']['h1']; ?></h1>
            <p><?php echo $GLOBALS['L']['p1']; ?></p>
            <ul id="language-selection">
                <li><a href="about.php">About Page</a></li>
                <li><a href="contact.php">Contact Page</a></li>
            </ul>
        </body>
    </html>

set_locale.php:

<?php
/*
 * File: set_locale.php
 */

// Get the language from the query string, or set a default.
($language = @$_GET['lang']) or $language = 'english';

// Set up a list of possible values, and make sure the
// selected language is valid.
$allowed_locales = array('english', 'french');
if(!in_array($language, $allowed_locales)) 
    $language = 'english'; // Set default if it is invalid.


// Inlclude the selected language
include "locale/$language.php";

// Make it global, so it is accessible everywhere in the code.
$GLOBALS['L'] = $locale;
?>

It works OK, but if I click the about.php and contact.php link. The page returns to the default language: English. What can I do so that when I click about.php or contact.php ends up like this:

about.php?lang=english
contact.php?lang=french

respectively, in other words I want the URL to remember the ?lang= ending. What's the best way of doing it?


Solution

  • You'll have to append it to every outgoing link:

     <li><a href="about.php<?php echo "?lang=".$GLOBALS['L']; ?>">About Page</a></li>
    

    a nice way of dealing with multi-language sites in general is, if your server supports it, mod_rewrite to rewrite "virtual" URLs like

    www.example.com/en/about.php
    

    and map them internally to

    www.example.com/about.php?lang=en
    

    there's a beginner's guide on that here and official documentation here.

    I'm no mod_rewrite guru but this works for me:

     RewriteEngine on
     Options +FollowSymlinks
    
     RewriteCond %{REQUEST_URI} ^/([a-z][a-z])(/.*)?$      
     RewriteRule (.*) %2?lang=%1&%{QUERY_STRING}
    

    it maps

    • www.domain.com/en/about.php to /about.php?lang=en

    • www.domain.com/fr/about.php to /about.php?lang=fr

    • www.domain.com/es/ to /?lang=es = usually index.php

    It maps any occurrence of a two-letter, lowercase www.example.com/xy, so you shouldn't have any directories with two letters on your root level to work with this.