2014-10-20 2 views
0

У меня есть следующая основная функция в начале основного класса Site Engine. Это используется для создания всех страниц на моем веб-сайте. Таким образом, до этого я использую это ниже:Как установить сеанс в php в соответствии с выбранным языком?

$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']); 

Это работает, однако, если я просто обновите страницу без /?language=LANG_HERE он просто возвращается назад к невыполнению en. Как отредактировать его, поэтому при первом посещении страницы он будет использовать по умолчанию АНГЛИЙСКИЙ, если позже он будет установлен путем доступа к /?language=LANG_HERE и загрузит любую другую страницу, он не вернется обратно на английский язык по умолчанию?

+0

Вы назовешь ['session_start()'] (http://php.net/manual/en/function.session-start.php) где-то перед этим кодом? –

+0

Да, я знаю. Я использую сеансы для хранения другой информации. Оно работает. Я говорю, что он работает правильно, если я удаляю 'default' и вручную устанавливаю свой язык, обращаясь к' /? Language = LANG_HERE' .., но 'default:' должен существовать, поэтому это проблема где-то в моих проверках ... – Monk25

+0

http : //stackoverflow.com/questions/8004276/php-multilanguage-how-to-switch-languages ​​ –

ответ

1

потому что, если у вас нет $_GET['language'], дело будет default.

//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; 
} 
+0

Удивительный, извините за неприятности. Могу ли я задать последние 2 вопроса, прежде чем я полностью соглашусь с вопросом и повышением. '1.' Возможно ли это каким-то образом эксплуатироваться, если кто-то загружает некоторые недопустимые или неверные данные. В принципе, это можно использовать для вредоносного поведения? Как 'domain.com/? Language = TEXT_HERE'? А также, '2.' будет ли этот сеанс каким-то образом повлиять на мои другие сеансы, которые я храню при успешном входе на сайт (учетная запись, пароль, электронная почта), или он не имеет к этому никакого отношения, и он полностью независим? Извините за глупые вопросы, но я все еще участвую. =) – Monk25

+0

1. Нет. Если кто-то попытается добавить какой-либо еще код языка, то, что находится в ваших случаях с коммутатором, произойдет случай с дефолтом. – vaso123

+0

2. нет. $ _SESSION - это массив с парами ключ/значение, если я понял ваш вопрос. – vaso123

0

Это потому, что у вас есть по умолчанию и в качестве $ языка NULL при загрузке страницы без /?language=LANG_HERE по умолчанию выбран в переключателе. Оберните его в 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; 
    } 
} 
0

Используйте куки.

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

запомнит ваш выбор в течение месяца, если вы хотите, чтобы запомнить его дольше, добавьте большее количество времени().

Кроме того, вам не нужен случай 'en' в вашем коммутаторе, если он не найден в других случаях, он пойдет по умолчанию.

$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']); 
+0

Может ли «Cookies» каким-то образом вмешиваться в мои «переменные сеанса», которые я сохраняю при успешном входе в веб-сайт, например, «ИДЕНТИФИКАТОР АККАУНТА, ПАРОЛЬ и электронная почта»? Или он полностью независим, и он не может создавать проблемы, поскольку, поскольку я заявил, что в настоящее время храню 3 сеансовых переменные для учетной записи, пароля и электронной почты.? – Monk25

+0

Cookies не будут вмешиваться вообще в сеансы, в большинстве случаев я буду делать то же самое, что и вы, и использовать сеансы, я стараюсь избегать использования файлов cookie только потому, что сеансы являются моими личными предпочтениями, но в такой ситуации, как ваши файлы cookie является наиболее логичным путем, чтобы спуститься. –

Смежные вопросы