Мультиязычность

Magnat

Guest
Мультиязычность

Всем привет :)
Вобщем такая вот трабла... Есть у меня табличка с ньюсами...
Есть табличка для линкования контента... т.е. табличка в которой записуются айдишники при добавлении через админку новой языковой версии какого-либо контента...

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

Вот получается такая загвоздка... Есть страничка news.php которой передаются следущий параметр ?id=NEWS_ID. При клтке на линк для перехода к другому языку, движок сайта переключает язык, и при перезагрузки страницы мы соответственно выбираем нужную запись с таблички ньюсов (всмысле языковую). Вот структура таблицы для линкования:
id | type | id_def_lang | id_trans | language

Во выборка нужного нам айдишника:
PHP:
$SQL = "SELECT id_trans FROM language WHERE type='news' AND id_def_lang='".$news_id."' AND language='".$_SESSION['lang']."';";
        $fetch_news_lang = $Db->fetchArray($Db->query($SQL));
всё замечательно работает, вот только бы не запарка с языком... Поле language указует язык на который переведена запись id_def_lang в записе с айдишником id_trans.

Допустим у нас есть два языка.. Русский и английский.. Мы перевели одну новостную статью на английский, этот перевод зафиксировался в таблички линкования: 1|1|2|English

После при переходе на английскую версию с русской нормально всё, т.к. в этой табличке есть запись с данным language и id_def_lang, но вот при переходе обратно на русский, в запросе $_SESSION['lang'] меняет значение с English на Russian и поля id_def_lang не совпадает с NEWS_ID_NOW (Т.е. с просматриваемым адйдишником)...

Может стоит в табличке линковании фиксировать всевозможные изменения, т.е. добавили новую языковую версию ньюсов, после чего мы кроме того, что добавляем линк на новую версию, ещё и ставим на дефолтовую версию языка... или так награмождений много будет?

Смысл таких мохинаций - обеспечить на любой странички сайта переход на другую версию языка. Т.е. смотрим статью с ньюсов под айдишником 2 и при клике на другой язык, мы должны получить эту же статью, только уже на выбранном языке... А в табличке с ньюсами она лежит под айдишником допустим 3.

Может кто что подскажет полегче? :) Бо мне что-то это не совсем нравиться :(
 

matross

Новичок
Re: Мультиязычность

У меня тоже такая проблема была, но я решил ее в такое способ:
Во первіх в начале страниці определял текущий язык так:
if (get('lang')){
$lang = get('lang');
$_SESSION['lang'] = $lang;
}
if (isset($_SESSION['lang'])) $lang = $_SESSION['lang'];
else{
$lang = 'u';
$_SESSION['lang'] = $lang;
}

Функция get, возвращает переменную из гета...

Ну и не парился со всякими линкованиями, а просто делал две записи на новость( если два языка ).... Прсто было еще одно поле lang.... Вот и все, прекрасно работает....
 

Magnat

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

а переход на язык у меня осуществляется посредством перехода на странику, с указанием языка и фиксированием странички с которой перешёл юзверь в сесии... после того, как в сессии регитсрируется новый язвк.. юзверб возвращатся на ту страничку где и был... и пр переходе на страничку news.php?id=2 он увидит дефолтовую версию... т.к. айдишник то никальный, поэтому у двух одинаковых записей будут разщные айдишики... а надо сразу определять.... :(

-~{}~ 04.06.05 01:20:

PHP:
if (!empty($_SESSION['lang']))
    {
      $language = trim($_SESSION['lang']);
      $lang_dir = SITE_ROOT."/Language/".$language;
      
      if (is_dir($lang_dir))
      {
        $lang_page = $_SERVER['SCRIPT_NAME'];
        include_once ($lang_dir.$lang_page);
      } else {
        $lang_page = $default_language;
        include_once ($lang_dir.$lang_page);
      }
    }
Вот здесь мы подключаем файл языка....

PHP:
session_start();
    
    $lang = trim(strip_tags($_GET['lang']));
    $_SESSION['lang'] = $lang;

    $page = trim(strip_tags($_GET['page']));
    
    Header("Location:".$page);
а вот это контент всего перемыкача языка :)) и возврата на нужную нам страничку.... т.е. никакой нагрузки на неё... хотя её можно просто опдключать к main.php который инклудиться везде... ну впринцепе нет никакой разницы.. что так. что иначе быстро работает :)) и не успеваешь заметить. что переходит на language.php для переключения... :))
 

SiMM

Новичок
> переход на язык у меня осуществляется посредством перехода на странику, с указанием языка и фиксированием странички с которой перешёл юзверь в сесии
Хранить в сессии язык контента не надо ВООБЩЕ. Никогда. Если ты этого захотел, значит тебе это не нужно.
Ну не ужели сложно сходить на тот же php.net, и узреть, как там реализованы языковые версии? Язык НАДО таскать в GET'е. И никак иначе.

Во всё остальное не вникал, поскольку проблема похожа на высосанную из пальца. Кроме того, похоже автор не последовал правилам и не воспользовался поиском и не смотрел в избранном.
 

Magnat

Guest
SiMM

поиском пользовался... ничего путнего не нашёл для себя... Внздн обсуждается просто мультиязычная плоатформа... т.е. всё что касается общих переводов... это у меня посредством файлах, в которых уже определяются языковые константы... :)

Но вот что-то про БД я так и ничего не нашёл...

А что касается ГЕТА... Даже и не знаю, тчо тебе сказать... А смысл его тягать за собой? Только портит вид адресной строки и заствляет соответственно к мод рэврайт прихоить :))

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

SiMM

Новичок
> А смысл его тягать за собой?
С луны свалился? Очень хорошо. Допустим я нашёл нужную мне инфу у тебя на сайте. Теперь я решил поделиться ею с другим человеком. Другой человек, тоже русский, но находящийся сейчас к примеру в Японии, вместо ожидаемого текста видит ФИГУ на японском языке. Кроме того, что ты будешь делать с поисковиками? Да, они проиндексируют твой сайт, НО(!) тот кто рискнёт воспользоваться поисковиком с большой долей вероятности увидит совсем не то, что он ожидал. Потому что сессионные переменные поисковика давно потеряны, кроме того, если поисковик поддерживает куки - пользователь о них даже знать не будет. И передать тебе их нужное значение - не сможет.

> Только портит вид адресной строки
Простите, что портит? От испорченной адресной строки наверно браузер у пользователя ломается, да? Или у самого пользователя начинаются нервные тики? Открою тебе по секрету - пользователю ПО БАРАБАНУ, что в адресной строке. Вообще. Единственное, зачем она ему нужна - чтобы ввести имя хоста или скопировать ссылку, чтобы кому-то её отдать.

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

Magnat

Guest
ну типа убедил.. вот на счёт поисковиков ты прав :)))
давай покаместь отолижм этот разговор.. меня сейчас больше всего волнует перевод контента который лежит в БД на нескольких языках :(

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

SiMM

Новичок
Не вникая в беллетристику, как это можно сделать.
Таблица
id lang_id first_id some_fields
где id - id записи
lang_id - id языка записи
first_id - id первой помещённой в таблицу записи на эту тему на каком-то языке (у первой записи first_id=id)
some_fields - остальные столбцы таблицы
У тебя два варианта формирования ссылок:
1. lang_id/first_id - одна и та же новость, но на разных языках, при этом отличается лишь полем lang_id
2. id, в этом случае нет необходимости таскать что-то дополнительное в GET'е вообще, для перехода на ту же статью, но на другом языке, достаточно лишь получить все id, у которых first_id такой же, как у этой странички.
Какой из этих двух вариантов ты выберешь - дело твоё.
 

Magnat

Guest
мммм... вот при first_id я то и не подумал.. сенкс... :) сейчас буду пробовать :)

-~{}~ 04.06.05 13:03:

капец.... у меня то впринцепе так и было организовано то:

Вот структура таблицы для линкования:
id | type | id_def_lang | id_trans | language
протсо чуток по другому поля назывались :)
посто нужно было фиксировтаь все языки с дефолтовым :))) всё ок...
 

Royal Flash

-=MaestrO=-
SiMM
А как к гету относятся теже самые поисковики? Не будут ли они на него плеваться? Реальный пример: есть сайт, на которм сразу при входе запускается сессия session_start (); и гугл отказался индексировать страницы далее первой, так как все ссылки первой страницы этого сайта в гугле были вида contacts.php?PHPSESSID=bc1734e58794830dfd4ef5afe6acadd8 Т.е. PHPSESSID - это и есть GET для гугла.

Мое мнение для каждой языковой версии, лучше создать разные файлы, например:index_ru.php index_en.php и т.д. и ни в коем случае не использовать ни GET, ни сессии, для определения языка, если нужен хоть сколько-нибудь пристойный рейтинг сайта в поисковиках.
 

fixxxer

К.О.
Партнер клуба
1) гуглу по фиг. это либо воспоминания 5летней давности, либо бред.
2) mod_rewrite никто не отменял
 

Royal Flash

-=MaestrO=-
fixxxer
Гм... Я уверен, не пофиг. Задал поиск в гугле: inurl:site.com, на что получил только первую страницу, остальных в результате поиска просто нет, хотя ссылки там совсем "ровные": contacts.php, magazine.php и т.д. Просмотрел эту страницу в сохраненном виде в гугле - увидел, что там во всех ссылках PHPSESSID. Это не 5 лет назад было, а 2 дня назад. Переделал старт сессии (сессия запускается только после авторизации), жду результата.
 

SiMM

Новичок
> Просмотрел эту страницу в сохраненном виде в гугле - увидел, что там во всех ссылках PHPSESSID.
PHP FAQ: Сессии. Область применения.

> Мое мнение для каждой языковой версии, лучше создать разные файлы
О том, что не надо использовать сессии для хранения языка контента, я уже говорил выше. Иногда надо читать...
 

crocodile2u

http://vbolshov.org.ru
Сессию надо запускать не "после авторизации", а тогда, когда ресурс, который пользователь хочет увидеть, доступен только зарегистрированным полльзователям.
 

DiTHER

bang bang
[offcut]скажи прямо - ты думаешь гугл не обрабатывает линки с query? Подумай хорошенько прежде чем говорить.

p.s. мне так нравится как магически называют "старт сессии". По отношению к гуглу или к юзеру это либо установка куки либо подписывание переменной в query.. да и только.[/offcut]
 

Royal Flash

-=MaestrO=-
SiMM crocodile2u
if (isset($_REQUEST[session_name()])) session_start(); - 1-в 1 как в факе, вот только судя по статистике гугл еще не заходил на сайт, и не могу точно сказать, поможет ли, что нет PHPSESSID в ссылках. Хотя не вижу более ни одной причины, по которой гугл не прошел по остальным страницам, кроме первой.

SiMM
Я читал... полностью согласен с тем, что не нужно использовать сессии для хранения id языковой версии... Именно СВОЕ мнение я и написал, только с дополнением про GET.

DiTHER
Я говорил именно про дописаный GET к ссылке, который вредит индексированию страниц гуглом (т.е. поисковиком). Где ты "узрел" магичесское называние старта сессии? :)
Скажу тебе прямо, по секрету - действительно, PHPSESID в ссылке гуглом НЕ ОБРАБАТЫВАЕТСЯ. Если не согласен - кинь сюда реальный пример.
 

yugene

Отошел от дел
Автор оригинала: Royal Flash
Задал поиск в гугле: inurl:site.com, на что получил только первую страницу
А ты попробуй поискать site:site.com ;)

http://www.google.com/help/operators.html

If you include [inurl:] in your query, Google will restrict the results to documents containing that word in the url. For instance, [inurl:google] will return documents that mention the word "google" in their url.
 
Сверху