$_SESSION based language selection is not working properly

删除回忆录丶 提交于 2019-12-08 09:31:24

问题


My website has two languages: English and Russian. These languages' database names are EN and RU.

I use an old php+smarty script. This script's default language selection codes like this:

if(!isset($_SESSION)){
    define('LANGUAGE_ID', 'EN');
} else if ($_SESSION['language'] == '')
{
    define('LANGUAGE_ID', 'EN');
} 

When I want to see a page in Russian, I visit any page with language phrase (?language=RU) like this:

http://www.example.com/index.php?language=RU

But these pages doesn't load in Russian firstly. When I clicked another link or refresh the page, then page loading in Russian. After saved the cookies, then I can see the pages in Russian when first visit. But If I delete the cookies in browser, then I couldn't see in Russian when first visit.

I tried lots of combinations but I couldn't find any solution. Do you have any idea?

Thank you very much...

Edit:

I found some codes in main.class.php:

function __construct($dbh,$smartyBuild) {
    $this->dbh = $dbh;
    $this->sitevar = @$smartyBuild->FetchSiteVar();
    $this->smartybuild = @$smartyBuild;

    if($_REQUEST['language'] !='')
    {
        $_SESSION['language'] = $_REQUEST['language'];
    }
    else
    {
        $langaugeAlready = mysql_fetch_array(mysql_query("select value from ".TABLE_PREFIX."sitevars where array_key = 'default_language_feed'"));

    if($_SESSION['language'] == '')
    {

        $_SESSION['language'] = $langaugeAlready['value'];

    }

}
if($_SESSION['language'] !='' )
{
    define('LANGUAGE_ID', $_SESSION['language']);
}
else
{
    define('LANGUAGE_ID', 'EN');
    $_SESSION['language'] = 'EN';
}

}

Is the problem related with these codes?


回答1:


Like I say, without all the code we are guessing a bit at what the problem is but, here goes...

It seems like you're only checking the $_SESSION variable for the language and not the $_GET variable (which gets the language from the URL). Therefore the value only changes after you refresh the page.

Try this. I am assuming your intention is to show English as a default and only Russian if it is defined in the url, but once defined to keep that language until it is put in the URL again.

 //start a session. must be called first on all pages you want it to work on

 session_start();


 //first check if there's a new language coming from the URL

 if(isset($_GET['language']))
     {
     // if we have a new language setting from the URL, check which one and save it in the session.
     // we check it is EN or RO before saving into the session since I don't know what you're using it for later. eg part of a DB query which would be a security risk if it is anything other than EN or RO.

     if($_GET['language'] == 'EN')
           {
           $_SESSION['language'] = 'EN';
           }
     if($_GET['language'] == 'RO')
           {
           $_SESSION['language'] = 'RO';
           }

     } 


 //now check the session variable, which will have been updated above if changed     

 if(isset($_SESSION['language']))
     {
     // already have a language saved, so let's use it

     define('LANGUAGE_ID', $_SESSION['language']);

     }
 else
     {
     // no language from URL and no language saved, so default to english

     define('LANGUAGE_ID', 'EN');
     }


来源:https://stackoverflow.com/questions/27871380/session-based-language-selection-is-not-working-properly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!