Перейти к содержимому

Фото
- - - - -

Нужен совет php/mysql


  • Вы не можете создать новую тему
  • Please log in to reply
22 ответов в этой теме

#1 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 04 декабря 2007 - 15:58

Вообшем хочу попросить совета, как лучше делать многоязычный сайт, каким способом?
То ли хранить переменную в сессии и кукисах, но там свои отдельные проблемы, то ли таскать язык в сылке, но надо учитывать много ньюансов.
С помощью темплатов не хочу, так как проектик не такой уж большой.
Думаю проще по ссылкам тегать, типа - линк.сom/ее/indeх.html


Второй вопрос, как лучше организовать бд. Делать, например, 2 таблицы "novosti_ee" i "novosti_ru", или просто раздваивать поля в 1 таблице типа title_ee, title_ru?
  • 0

#2 BlackIce

BlackIce

    грозный Дон Пако

  • Пользователь
  • 313 сообщений
  • Откуда:Tallinn

Отправлено 04 декабря 2007 - 16:03

Xtops, тут уже вопрос о том как тебе удобнее, если сайт не большой, то можно делать как удобнее ...
  • 0
а кули, я тоже рульный дизайнер ввв.ме2.ее

#3 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 04 декабря 2007 - 16:27

допустим. А если делать с залогом на будущее?
  • 0

#4 Контрафхтагн

Контрафхтагн

    но вот

  • Постоялец
  • 2 565 сообщений

Отправлено 04 декабря 2007 - 16:38

Лучше не делать таблиц на два языка в одной записи -- каким бы прилежным не был вебмастер, через какое-то время появятся ситуации, где одного языка нет. Да и не всегда все новости для обоих языков актуальны,
  • 0

#5 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 04 декабря 2007 - 17:42

Вообшем хочу попросить совета, как лучше делать многоязычный сайт, каким способом?
То ли хранить переменную в сессии и кукисах, но там свои отдельные проблемы, то ли таскать язык в сылке, но надо учитывать много ньюансов.
С помощью темплатов не хочу, так как проектик не такой уж большой.
Думаю проще по ссылкам тегать, типа - линк.сom/ее/indeх.html
Второй вопрос, как лучше организовать бд. Делать, например, 2 таблицы "novosti_ee" i "novosti_ru", или просто раздваивать поля в 1 таблице типа title_ee, title_ru?

Лучше всего таскать язык в ссылке, это хорошо как для пользователя, так и для поисковиков (ссылки вида www.site.ee/est/page.html) таскать язык в параметрах (page.html?lang=est) - идиотизм, себе дороже.

Для новостей сделай одну таблицу и добавь в неё индексируемое поле lang и в запросах просто пиши (where `lang` = 'est') отдельные компоненты страниц (отдельные фразы) желательно хранить в файлах. Например, est_lang.ini (parse_ini_file) или est_lang.php с массивом внутри. Вариантов множество. Не советую юзать константы, они достаточно тормозные. Просто там где надо что-то вставить, вызываешь например, ф-цию __( 'VAR_NAME' ); - это стиль gettext ;) P.S. Ф-цию эту надо написать самому. Но лучше обзови её по-человечески.
  • 0

#6 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 04 декабря 2007 - 22:51

помнится когда здесь роботал у нас были локализованные тексты на разных языках для каждой страницы. А вот по-поводу новостей не помню...
  • 0

#7 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 05 декабря 2007 - 09:31

Лучше всего таскать язык в ссылке, это хорошо как для пользователя, так и для поисковиков (ссылки вида www.site.ee/est/page.html) таскать язык в параметрах (page.html?lang=est) - идиотизм, себе дороже.

Для новостей сделай одну таблицу и добавь в неё индексируемое поле lang и в запросах просто пиши (where `lang` = 'est') отдельные компоненты страниц (отдельные фразы) желательно хранить в файлах. Например, est_lang.ini (parse_ini_file) или est_lang.php с массивом внутри. Вариантов множество. Не советую юзать константы, они достаточно тормозные. Просто там где надо что-то вставить, вызываешь например, ф-цию __( 'VAR_NAME' ); - это стиль gettext ;) P.S. Ф-цию эту надо написать самому. Но лучше обзови её по-человечески.


Так и сделал с самого начала )
Но вот возникает проблема, когда.. допустим у пользователя должна быть страница на 2 языках, тоесть если смотришь страницу на эстонском - видишь ту инфу которую он писал на эстонском, ну и соответственно на русском видишь русскую инфу. Получается, что полем ланг тут не отделаешься, да и две записи ка с новостями не сделаешь тоже, ибо это уже будет считаться как 2 разных пользователя.
  • 0

#8 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 декабря 2007 - 10:04

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

В таком случае, как вариант - можно убрать язык из ссылки... Или отказаться от идеологии "правильных ссылок" и вывести страницу на 2х языках (в UTF8) по тем же УРЛ (www.site.ee/est/page.html). Главное - не наломать дров, особенно, если у тебя таких страниц всего пару штук. Адаптировать под это всю систему бессмысленно. В любом случае пользователь выбирает тот язык, на котором хочет просматривать сайт и в течении сессии тебе не нужно потерять его выбор ;) Так что мультиязычная страница - это не проблема. Особенно, если основной каркас сайта будет на выбранном пользователем языке, а сам контент на разных языках...
  • 0

#9 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 05 декабря 2007 - 10:12

Ок, остановлюсь всетаки на таскании языка в ссылке
Но вот в последнем посте я имел ввиду как быть с бд? Получается всетаки надо таблицу делать с полями инфо_ее инфо_ру и т.п?
  • 0

#10 Voland

Voland
  • Пользователь
  • 272 сообщений

Отправлено 05 декабря 2007 - 11:09

Setor, а почему именно ini? чем массив плох?
  • 0

#11 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 декабря 2007 - 15:08

Ок, остановлюсь всетаки на таскании языка в ссылке
Но вот в последнем посте я имел ввиду как быть с бд? Получается всетаки надо таблицу делать с полями инфо_ее инфо_ру и т.п?

Да нет, обычная таблица news_id, language, news_text просто для каждой новости в этой таблице будешь язык указывать.

Setor, а почему именно ini? чем массив плох?

Ну, я привёл массив тоже, как вариант. Ини просто удобно редактировать, на вкус и цвет... Я использую ini, а кешировать их можно в массивах. У меня шаблонизатор языковые переменные кеширует уже в шаблонах статически, так что они по-сути нужны только перед компиляцией шаблона, но и динамически тоже используются в скриптах. Мне удобней редактировать ини, чем массив. Некоторые маньяки в XML хранят, вот в их пользу мне сложно что-то сказать, только если использовать X-Path...
  • 0

#12 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 05 декабря 2007 - 15:27

С таблицей новостей понятно, а как же быть с таблицей, например пользователей?
  • 0

#13 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 декабря 2007 - 15:37

Когда данных должен быть 1 экземпляр, а переводов несколько, используется две таблицы и можно хоть 10 переводов делать на любых языках:
1) users: users_id, login, password....
2) users_lang: users_id, language, lang_info1, lang_info2

Правда, таблица пользователей не очень подходит под это, не представляю что там могут быть за мультиязычные данные?)

Потом только джойниш таблицу с переводом... Но тогда надо следить, чтобы данные на нужном тебе языке оказались в таблице ;) Иначе надо лефт жойном джойнить таблицу переводов и использовать группировку group by
  • 0

#14 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 05 декабря 2007 - 16:11

а если в место joina сделать типа так Select * from users, users_lang Where users.users_id = users_lang.users_id limit 1 ?
разница есть?
  • 0

#15 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 декабря 2007 - 16:16

Xtops, сделай и увидишь разницу :) INNER JOIN что ты написал (краткая его запись) выбирает столбцы, которые есть и в 1й и во 2й таблице. Т.е. если у тебя есть пользователь матти и у него есть инфа только на эстонском, в русской части сайта ты этого пользователя не увидишь.

LEFT JOIN безоговорочно вернёт все столбцы 1й таблицы и попробует подставить к ним столбцы из 2й, если каких-то соответствий не будет, значения этих столбцов будут равны NULL

P.S. чтобы избежать дублирования записей , например, будет на странице две записи о матти на русском и эст. языке, надо юзать GROUP BY users.user_id но это зависит от запроса)
  • 0

#16 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 05 декабря 2007 - 16:35

да с джойнами я знаком, но я всеравно не догнал разницы в данном примере.
Если у нас есть пользователь матти, открываем страницу на эстонском языке и нам нужна инфа только на эстонском, выполняется запрос SELECT * FROM users, users_lang WHERE users.id = users_lang.id AND users_lang = 'ee' LIMIT 1. Вроде как правильно.
:)
  • 0

#17 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 декабря 2007 - 16:47

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

Я приводил пример для выборки полного списка юзеров вне зависимости от того, есть для них запись на нужном языке или нету. А ты уж сам реши, что тебе надо :)
  • 0

#18 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 05 декабря 2007 - 16:50

все, разобрался. большое спасибо )
  • 0

#19 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 05 декабря 2007 - 17:57

Мне интересно, а где Vladson и почему еще ни разу не прозвучало слово "лох" ?
  • 0

#20 ParadoxL

ParadoxL
  • Постоялец
  • 5 023 сообщений
  • Откуда:Edinburg

Отправлено 05 декабря 2007 - 18:14

zedirtybastard, твой кумир? :D

ЗЫ! Шаблоны думаю оптимальный вариант ...
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#21 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 05 декабря 2007 - 18:25

Да не, просто в каждой бочке затычка :)
  • 0

#22 Fors

Fors
  • Пользователь
  • 328 сообщений

Отправлено 09 декабря 2007 - 18:31

Лучше всего таскать язык в ссылке, это хорошо как для пользователя, так и для поисковиков (ссылки вида www.site.ee/est/page.html) таскать язык в параметрах (page.html?lang=est) - идиотизм, себе дороже.

для поисковиков лучше сделать вообще mod_rewrite.
Опять таки, дело вкуса.. я бы вообще пихал в сессию все.
  • 0

#23 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 10 декабря 2007 - 17:05

для поисковиков лучше сделать вообще mod_rewrite.
Опять таки, дело вкуса.. я бы вообще пихал в сессию все.

Тут есть вероятность, что у потенциального посетителя отключены куки (поисковый робот) и тогда он не сможет проиндексировать нормально сайт, а человек не сможет переключить язык ;) Но людей с отключенными куками мало, а вот поисковики - да. Если таскать идентификатор сессии в URL (trans_sid), то ссылки получаются ужасными...
  • 0