[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Язык интерфейса
Uchenik
Подскажите как можно сохранить данные о языках.
Ну допустим пользователь на какой-то из страниц решил сменить язык, он нажимает кнопку, допустим En, вся текущая страница переводится на английский, а если он с этой страницы уйдёт то всё опять станет на русском. =(



Спустя 5 минут, 56 секунд (13.01.2012 - 14:46) Uchenik написал(а):
Можно ли "на лету" изменять данные в сесии пользователя?
Ну если он сменил язык, сохранить новый язык в сессии и дальше везде ориентироваться по сессии.

Спустя 9 минут, 29 секунд (13.01.2012 - 14:55) Winston написал(а):
Цитата (Uchenik @ 13.01.2012 - 13:46)
Можно ли "на лету" изменять данные в сесии пользователя?

Можно.
Цитата (Uchenik @ 13.01.2012 - 13:46)
Ну если он сменил язык, сохранить новый язык в сессии и дальше везде ориентироваться по сессии

Вот так и делай.

Спустя 3 минуты, 4 секунды (13.01.2012 - 14:58) VELIK505 написал(а):
Языки в куки кидай лучше

Спустя 3 минуты, 22 секунды (13.01.2012 - 15:02) Uchenik написал(а):
Всё-равно не получается, по любому переводит на русский.
Я сделал так:

$_SESSION['lang']=$_GET['lang'];

//проверяем выбран ли язык пользователя
if (!isset($_SESSION['lang']))
{require('langs/ru/main.lang.php');}
else
{require ("langs/{$_SESSION['lang']}/main.lang.php");}
//создаём переменную для языковой панели
$slang='<a href="?lang=en"><img src="system/img/gb.png"></a> <a href="?lang=kz"><img src="system/img/kz.png"></a> <a href="?lang=ru"><img src="system/img/ru.png"></a>';

Спустя 48 минут, 8 секунд (13.01.2012 - 15:50) Uchenik написал(а):
Вот как выглядит вся страница целиком
<?PHP session_start();
header( 'Content-Type: text/html; charset=UTF-8');

//подключаем все необходимые файлы
require ('/system/config.php');
require ('/system/classes/lang.class.php');
require ('/system/classes/template.class.php');
require ('/system/functions.php');
require ('/system/functions.db.php');
$_SESSION['uid']='1'; //это для проверки, потому-что пока нет ни регистрации, ни авторизации.
$_SESSION['access']='1';
//кстати id пользователя и access сохраняются в сессиях, а вот язык почему-то нет.

//подключаемся к БД

connect($cfg['mysqlhost'],$cfg['mysqluser'],$cfg['mysqlpassword'],$cfg['mysqldb']);

//проверяем который час.
$h = date("H");
$m = date("i");
if (($h>0)and ($h<7))
{$t = "1";}
if ($h>18)
{$t = "2";}
if (($h>6)and ($h<18))
{$t = "3";}

//подбираем нужное сообщение
switch ($t)
{
case "1":$timemsg = '{time.early}';break;//типа вы пришли слишком рано
case "2":$timemsg = '{time.late}';break; //типа рабочий день закончен
case "3":$timemsg = '{time.checked}';break;
}

//проверяем выбран ли язык пользователя
if (!isset($_GET['lang']))
{require('langs/ru/main.lang.php');}
else
{require ("langs/{$_GET['lang']}/main.lang.php");}

//создаём переменную для языковой панели
$slang='<a href="?lang=en"><img src="system/img/gb.png"></a>
<a href="?lang=kz"><img src="system/img/kz.png"></a>
<a href="?lang=ru"><img src="system/img/ru.png"></a>'
;

//проверяем выбран ли у пользователя свой скин
if (isset($user['skin']))
{$userskin=$user['skin'];}
else
{$userskin="default";}

//создаём новый экземпляр класса Template
$tpl = new Template('/templates/{$userskin}/header.tpl');

//подключаем новый экземпляр языкового класса
$timer = Lang::evaluate($timemsg,$L);

//создаём массив переменных интерфейса.
$arr = array
(
'TIME' => $timer,
'LANG' => $slang,
);


//эту строку лучше не трогать =)
$s="173/No*n\АС.lbp-1]2ВC1[Фe{г5т}5шт3п'10.";
//она используется при регистрации и авторизации пользователей
//$time=time();
//$password=md5(md5($pass.$time.$s))

//проверяем авторизован ли пользователь, и строим страницу.

//если в сессии нет id

if (empty($_SESSION['uid']))
{ $block="guest";
$tpl->assign('HEADER', $arr);
$tpl->parse($block);
$tpl->out($block);
}
else
{

//если id есть, но нет меню
if (empty($_SESSION['headmenu']))
{$sql1=mysql_query("SELECT `Menu`,`PersonalMenu` FROM ".$db_core." WHERE `Access`='{$_SESSION['access']}'");
$res=mysql_fetch_assoc($sql1);

//перевести меню на нужный язык
$HeadMenu=Lang::evaluate($res['Menu'],$L);
$LeftMenu=Lang::evaluate($res['PersonalMenu'],$L);

//создаём ещё один массив для передачи в класс
$arr2 = array
(
'LeftMenu' => $LeftMenu,
'HeadMenu' => $HeadMenu,
);
}

//объясняем классу, какой блок нужно подключить
$block="member";

//вытягиваем информацию о правах пользователя по ID его группы
$sql=mysql_query("SELECT * FROM ".$db_access." WHERE aID='".$_SESSION['access']."'");
$res=mysql_fetch_assoc($sql);

$group=$res['aName'];//имя основной группы, например Administrators (Администраторы)
$sGroup=$res['saName'];//имя подгруппы, например Core (Администратор ядра)

//берём оба массива и строим страницу

$tpl->assign('HEADER', $arr);
$tpl->assign('MENU', $arr2);

//так как шаблон разворвачивается изнутри, сначала парсим внутренний блок
$tpl->parse($block.'.'.$group); //этот блок зависит от группы пользователя

//теперь "под нож" попадает основной блок

$tpl->parse($block); //этот блок зависит от страницы, на которой находится юзер
$tpl->out($block);//выводим.
}

дальше планируется что все запросы и обработка всех запросов будут проходить в другом скрипте, но это позже, сейчас нужно решить проблему с языком, не могу понять как сохранить язык, в сессии пользователя почему-то не сохраняет, может я что-то упустил?
Подскажите плз.

Спустя 30 минут, 39 секунд (13.01.2012 - 16:21) Winston написал(а):
Напиши print_r($_SESSION); и попробуй языки по переключать, появится ли, что-то в сессии?

Спустя 7 минут, 49 секунд (13.01.2012 - 16:28) Uchenik написал(а):
Array ( [uid] => 1 [access] => 1 [lang] => en )
Значение [lang] меняется, а вот вывод всё-равно правильный только для текущей страницы, а дальше если куда-то шагнул, то опять на русском, а в массиве значение от этого не меняется.

Спустя 5 минут, 24 секунды (13.01.2012 - 16:34) Uchenik написал(а):
Вообще бред какой-то
Допустим я выбрал английский, перешёл на страницу Форум, в сессии висит английский, а сама страница на русском, здесь на этой странице выбираю Казахский, в результате форум становится на казахском, но только для сессии. Т.е. если снова куда-нибудь уйти и вернуться она будет на русском, но в сессии для именно этой страницы будет определён казахский.

Получается что сессия сохраняет язык индивидуально для каждой страницы, но если уйти и вернуться язык в сессию тоже вернётся, а страница останется на русском, потому-что он по дефолту. БРЕДОКОД!!! =(

Спустя 1 минута, 28 секунд (13.01.2012 - 16:35) Uchenik написал(а):
Ну неужели никто не знает в чём проблема?! =(

Спустя 15 минут, 36 секунд (13.01.2012 - 16:51) killer8080 написал(а):

$langs = array('ru', 'en', 'de', 'fr'); // массив с поддерживаемыми языками

if(!empty($_GET['lang']) && in_array($_GET['lang'], $langs)){
$_SESSION['lang'] = $_GET['lang'];
}

if(empty($_SESSION['lang']))
$_SESSION['lang'] = 'ru';

require 'langs/'.$_SESSION['lang'].'/main.lang.php';

Спустя 2 дня, 13 часов, 16 минут, 36 секунд (16.01.2012 - 06:07) McLotos написал(а):
killer8080
Спасибо. В принципе, предложенный тобой вариант логически то же самое что уже есть. кстати я чуть-чуть переделал твой вариант
$langs = array('ru', 'en', 'de', 'fr'); // массив с поддерживаемыми языками
if(!empty($_GET['lang']) && in_array($_GET['lang'], $langs)){
$_SESSION['lang'] = $_GET['lang'];
require 'langs/'.$_SESSION['lang'].'/main.lang.php';}

if(empty($_SESSION['lang']))
{$_SESSION['lang'] = 'ru';require 'langs/ru/main.lang.php';}

но результат всё-равно тот же. Я вот думаю может мы где-то забыли объяснить этому xTemplate что нужно брать данные из сессии?

Спустя 2 минуты, 40 секунд (16.01.2012 - 06:10) McLotos написал(а):
Меня посетила умная мысль, если отключить кэширование, и кроме сессиий подключить ещё и кук, то может сработать. В принципе мы же можем хранить всё в сессии, а в кук записывать только язык пользователя. =)

Спустя 17 минут, 29 секунд (16.01.2012 - 06:28) Uchenik написал(а):
Всем огромное спасибо!
Мы разобрались!
Как говорит Серёга "а ларчик просто открывался..."
Всё элементарно, строчки, которые определяли какой язык подключать, т.е. блок
	if (!isset($_GET['lang']))
{require('langs/ru/main.lang.php');}
else
{require ("langs/{$_GET['lang']}/main.lang.php");}

был прописан 2 раза =)
Поэтому когда он встречался второй раз, естественно GET переменную он уже не видел, но зато видел сессию, которую и переназначал обратно на русский типа (если GET пустой, тогда поставить русский =))

Спустя 3 часа, 11 минут, 55 секунд (16.01.2012 - 09:40) killer8080 написал(а):
McLotos
я тебе дал рабочий вариант, зачем было его портить?
Цитата (McLotos @ 16.01.2012 - 05:07)
$langs = array('ru', 'en', 'de', 'fr'); // массив с поддерживаемыми языками
if(!empty($_GET['lang']) && in_array($_GET['lang'], $langs)){
$_SESSION['lang'] = $_GET['lang'];
require 'langs/'.$_SESSION['lang'].'/main.lang.php';}

как этот код должен работать? Если я зашел в первый раз, в сессии ничего нет, в гет то же. Естественно будет ошибка.

Цитата (McLotos @ 16.01.2012 - 05:10)
Меня посетила умная мысль, если отключить кэширование, и кроме сессиий подключить ещё и кук, то может сработать. В принципе мы же можем хранить всё в сессии, а в кук записывать только язык пользователя. =)

Без разницы куда записывать, главное правильно инициализировать переменные. ;)

Спустя 12 минут, 21 секунда (16.01.2012 - 09:52) killer8080 написал(а):
Цитата (Uchenik @ 16.01.2012 - 05:28)
Всем огромное спасибо!
Мы разобрались!
Как говорит Серёга "а ларчик просто открывался..."
Всё элементарно, строчки, которые определяли какой язык подключать, т.е. блок
	if (!isset($_GET['lang']))
  {require('langs/ru/main.lang.php');}
else
  {require ("langs/{$_GET['lang']}/main.lang.php");}

был прописан 2 раза =)
Поэтому когда он встречался второй раз, естественно GET переменную он уже не видел, но зато видел сессию, которую и переназначал обратно на русский типа (если GET пустой, тогда поставить русский =))

А этот код вообще нужно выбросить.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.