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

StackOverflow https://stackoverflow.com/questions/2301850

  •  21-09-2019
  •  | 
  •  

Question

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?

Was it helpful?

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.

OTHER TIPS

You will want to learn about storing information in sessions.

http://learnitscreencasts.net/2009/07/18/beginners/beginners-guide-php-sessions/

You might want to look into sessions and store the persistent options there. It has the advantage of allowing people to copy links to others without forcing their settings upon them, if you so desire such.

You could use the output_add_rewrite_var to add that argument to the URLs. Just call the following before you output your contents:

output_add_rewrite_var('lang', $language);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top