Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a simple PHP cookie language toggle?

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 cookie tutorials and looked at a few similar examples here on StackOverflow, but I must be missing something because it can't get it to work properly.

I'm setting the language by passing it as a URL variable (lang=en or lang=ru). That all seems to be fine. However, the code I have at the moment that sets the cookie seems to be one step behind, so initially it has no value (I'd like it to be 'en' by default), then if the user clicks the 'ENG' button it still has no value, and then if the user clicks Russian the value shows as 'en', and then if I click the 'ENG' button again the value shows as 'ru'.

Here's the code I've cobbled together:

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'];
}

Once I've got this working I intend to use the value of the cookie to display either the English or Russian menu using a bit of conditional PHP.

Thanks.

like image 311
Matt Avatar asked Oct 17 '11 08:10

Matt


People also ask

How do you create a cookie in your PHP code?

A cookie is created with the setcookie() function.

What is PHP $_ cookie?

PHP cookie is a small piece of information which is stored at client browser. It is used to recognize the user. Cookie is created at server side and saved to client browser. Each time when client sends request to the server, cookie is embedded with request. Such way, cookie can be received at the server side.

How can set and read a cookie in PHP?

Setting Cookie In PHP: To set a cookie in PHP, the setcookie() function is used. The setcookie() function needs to be called prior to any output generated by the script otherwise the cookie will not be set. Syntax: setcookie(name, value, expire, path, domain, security);

Can PHP access cookies?

Cookies can be accessed in a variety of ways in PHP. The most straightforward method is to use the $_COOKIE or $HTTP COOKIE VARS variables. It's usually an associative array that's keyed by cookie name and includes a list of all the cookie values sent by the browser in the current request.


3 Answers

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! :)

like image 162
Matt Avatar answered Oct 06 '22 17:10

Matt


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.

like image 23
Mob Avatar answered Oct 06 '22 16:10

Mob


if ( !empty($_GET['language']) ) {
    $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'nl';
} else if ( empty($_COOKIE['language']) ) {
    $_COOKIE['language'] = 'nl';
}
setcookie('language', $_COOKIE['language']);
like image 35
jgroenen Avatar answered Oct 06 '22 18:10

jgroenen