Monk25
Monk25

Reputation: 25

How to set session in php according to the language selected?

I've got the following main function in the start of my Site Engine main class. This is used to create all pages on my website. So, before that I use this below:

$language = @$_GET['language'];
switch ($language) {
    case 'en':
    $_SESSION['lang'] = 'en';
    break;
    case 'tr':
    $_SESSION['lang'] = 'tr';
    break;
    default:
    $_SESSION['lang'] = 'en';
    break;

}

        Template::SetLanguage($_SESSION['lang']);

It works, however, if I just refresh the page without the /?language=LANG_HERE it just reverts back to the default en. How to edit it, so upon first time visit the page, it will use default ENGLISH, if later it's set by accessing /?language=LANG_HERE and load any other page, it won't revert back to english as default?

Upvotes: 1

Views: 8422

Answers (3)

DrRoach
DrRoach

Reputation: 1356

That's because you have a default and as $language is NULL when you load the page without /?language=LANG_HERE the default is being selected in the switch. Wrap it in a if(!is_null())

$language = @$_GET['language'];
if(!is_null($laguage)) {
    switch ($language) {
        case 'en':
            $_SESSION['lang'] = 'en';
        break;
        case 'tr':
            $_SESSION['lang'] = 'tr';
        break;
        default:
            $_SESSION['lang'] = 'en';
        break;
    }
}

Upvotes: 1

Mark
Mark

Reputation: 1872

Use cookies.

setcookie('lang', 'en', time()+3600*24*7*4);

Will remember your selection for a month, if you want it to remember it for longer, add a bigger number to time().

Also, you don't need case 'en' in your switch, if it's not found in the other cases it will go with the default.

$language = $_GET['lang'];
if(!is_null(($language))) {
    switch ($language) {
        case 'tr':
        setcookie('lansg', 'tr', time()+3600*24*7*4);
        break;
        default:
        setcookie('lang', 'en', time()+3600*24*7*4);
        break;
    }
}

Template::SetLanguage($_COOKIE['lang']);

Upvotes: 1

vaso123
vaso123

Reputation: 12391

because, if you do not have $_GET['language'], the case default will happens.

//Starting the session
session_start();
//This is the default language. We will use it 2 places, so i am put it 
//into a varaible.
$defaultLang = 'en';

//Checking, if the $_GET["language"] has any value
//if the $_GET["language"] is not empty
if (!empty($_GET["language"])) { //<!-- see this line. checks 
    //Based on the lowecase $_GET['language'] value, we will decide,
    //what lanuage do we use
    switch (strtolower($_GET["language"])) {
        case "en":
            //If the string is en or EN
            $_SESSION['lang'] = 'en';
            break;
        case "tr":
            //If the string is tr or TR
            $_SESSION['lang'] = 'tr';
            break;
        default:
            //IN ALL OTHER CASES your default langauge code will set
            //Invalid languages
            $_SESSION['lang'] = $defaultLang;
            break;
    }
}

//If there was no language initialized, (empty $_SESSION['lang']) then
if (empty($_SESSION["lang"])) {
    //Set default lang if there was no language
    $_SESSION["lang"] = $defaultLang;
}

Upvotes: 5

Related Questions