Локализация

jay

Новичок
Локализация

У нас есть небольшой сайт где публикуются объявления. Сообщения вводятся через php скрипт в специальной области и сохраняются в базе данных (что бы не надо было редактировать HTML каждый раз). Потом на странице для просмотра объявлений выбираются последние 13 объявлений из базы данных. Пока что можно вводить объявления (и просматривать соответственно) только на одном языке.

Как добавить возможность что бы можно было вводить объявления на нескольких языках и отображать их в соответствии с выбором пользователя? Как лучше внести изменения в структуру базы данных? Вообще есть идея сделать вместо одной таблицы messages, несколько: messages для английского, messages_ru для русского, messages_fr, etc. Но насколько это хорошая идея не знаю. Поделитесь опытом plz. Может ссылка есть про это, а то в гугле ниче не нашел по теме.
 

SiMM

Новичок
> Вообще есть идея сделать вместо одной таблицы messages, несколько: messages для английского, messages_ru для русского, messages_fr, etc. Но насколько это хорошая идея не знаю.
Лучше бы у тебя появилась идея добавить столбец lang_id к таблице + таблицу соответствия lang_id => lang
Остальное читай по ссылке выше.
 

jay

Новичок
Ниже приводится код. Идея такая. Вверху перечислены все языки и ссылки вида "./index.php?lang=en". Впервый раз когда загружается страница все нормально. Но если нажать на ссылку $_SESSION['lang'] почему то превращается в Array и var_dump показывает что он содержит все элементы из $lang_arr. Но я то присваиваю только $lang_arr['lang_id']. Так что тут происходит?

Код:
if (isset($_GET['lang'])) {
    $lang_code = addslashes($_GET['lang']);
    $q = $db_conn->query("SELECT * FROM languages WHERE lang_id='$lang_code'");
    if ($q->numRows()) {
        $lang_arr = $q->fetchRow(MDB2_FETCHMODE_ASSOC, 0);
        $_SESSION['lang'] = $lang_arr['lang_id'];
        $locale = setlocale(LC_ALL, $lang_arr['locale1'], $lang_arr['locale2'],
                                $lang_arr['locale3']);
    }
} elseif (isset($_COOKIE['ITNEWS_LANG'])) {
    $lang_code = addslashes($_COOKIE['ITNEWS_LANG']);
    $q = $db_conn->query("SELECT * FROM languages WHERE lang_id='$lang_code'");
    if ($q->numRows()) {
        $lang_arr = $q->fetchRow(MDB2_FETCHMODE_ASSOC, 0);
        $_SESSION['lang'] = $lang_arr['lang_id'];
        $locale = setlocale(LC_ALL, $lang_arr['locale1'], $lang_arr['locale2'],
                                $lang_arr['locale3']);
    }
}

if (!isset($_SESSION['lang'])) {
    $_SESSION['lang'] = 'en';
    $locale = setlocale(LC_ALL, 'en', 'en_US', 'en_US.UTF-8');
}
setcookie('ITNEWS_LANG', $_SESSION['lang'], 0);
-~{}~ 10.05.06 18:12:

Понял в чем проблема, не в этом коде. В другом месте использовалась переменная $lang и глобальные переменные были включены. В смысле я думал она отдельно а она была эквивалентна $_SESSION['lang']
 

SiMM

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

jay

Новичок
спасибо за совет, только вот теперь придется ко всем ссылкам приписывать "?lang={$smarty.get.lang}". целесообразно ли вобще оставлять ссылки в smarty template или лучше их присваивать smarty variables в php файле? только тогда слишком много переменных будет но удобно модифицировать в будущем.
 

zerkms

TDD infected
Команда форума
jay
напиши класс или функцию, которая будет тебе генерировать ссылки
 

jay

Новичок
вообще то я обнаружил что если поставить output_add_rewrite_var('lang', 'en') в начале файла перед $smarty->display('index.tpl') в smarty templates в ссылках ?lang=en тоже прибавляется.
 
Сверху