Каким способом заложить многоязычность в движок?

Как-то сложно для понимания... Можно пример запроса который удалял бы циклически потомков и переводы. А то пока не доходит каким боком это применимо к моему случаю
 
А что с поиском не так?
Сегодня всем нравится искать как в гугле, вводишь текст в одно поле и оно ищет.
Если я ищу статью, я могу примерно помнить автора или заголовок или про что статья.
Так что поиск должен сразу искать во всех этих полях. И кроме того mysql поддерживает full text search, как раз для этих целей.

Можно собрать в три joina и написать or. Конкретно в этой ситуации со статьями полей не много.
Но в варианте где будет не три а 10 полей для перевода, придется делать 10 join.
 
С constraint foreign key on delete cascade разобрался, работает!

С джойнами...
Значит, в таблице articles есть поля: id и text1_id, text2_id с сылками на translates

Как написать select, который выберет все поля из articles а на выходе выдаст массив пар text1, text2, которые будут заменены переводами, например, для русского языка (ru)
 
Теперь ломаю голову, почему такой запрос с ошибкой выполняется...
insert into `menu_items` (`id`, `position`, `pid`)
values ('19', '0', '0'), ('31', '1', '0'), ('29', '2', '0'), ('30', '3', '29')
on duplicate key update `position` = values(`position`), `pid` = values(`pid`)
#1452 - Cannot add or update a child row: a foreign key constraint fails (`db`.`menu_items`, CONSTRAINT `menu_items_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `menu_items` (`id`) ON DELETE CASCADE)

Судя по всему, ему не нравится, что pid тут равен 0 три раза... Без понятия почему так. Из js уходит строка pidов null, null, null, 29, а приходят нули...

... да и, вообще, тут insert, а на insert ON DELETE CASCADE не распространяется
 
Разобрался. Проблема крылась в защите от инъекций, т.к. все числовые выражения подставлял в базу через intval(). Хотя, чтобы подставить null пришлось помучится. mySQL принимает за null только строку 'null', остальные значения принимает за пустую строку
PHP:
"('" . intval($v) . "', '" . intval($k) . "', " . ($pids[$k] ? intval($pids[$k]) : 'null') . ")";

И сразу небольшой вопрос, нужно ли в моем случае значения заключать в кавычки " ' " . intval($v) . " ' " или числа можно и так подставлять без проблем?

-------------------------------

И это все хорошо, конечно, но constraint foreign key on delete cascade не решает основную проблему.
А именно потомки должны не просто удаляться, а удалять за собой все свои переводы по такой формуле:
PHP:
DELETE m, t FROM menu_items AS m LEFT JOIN translates AS t ON m.name = t.id WHERE m.id = '113'

Разумеется, для таблицы translates такую же штуку провернуть не могу, т.к. на нее ссылаются из нескольких таблиц
 
NULL - это не строка, а оператор
строки пишутся в кавычках
числа - без
 
А можно передать null в переменной по http? Если заворачиваю в json, то все нормально, а если, например, передаю из jQuery.ajax как поле myVar = null, то приходит myVar = "". Это можно победить?
 
Огласи весь список типов, в которых по-твоему можно передавать переменные по http.
 
Не густо... Думал, может при передаче что-нибудь кодируется хитрым образом. Браузер всегда что-то кодирует и посылает кракозябры...
 
Как вернуть контент на нужном языке в зависимости от того, что за фрукт зашел на сайт. Поясню. У нас есть пользователи. Они могут быть просто гостями или зарегистрированными, язык которых сохранен в БД. Более того пользователь может переключать языки, что отражается в БД (если он зареган) и куках.

Как все происходит: пользователь заходит на сайт, проверяются его куки и сразу же инфа о выбранном языке отсылается на сервер. И где-то сам сохраняется... Где? Для зареганного пользователя в БД, а для остальных? В сессии? Получается нужно для каждого гостя заводить сессию? Через секунду (не хотелось бы такую задержку) приходит ответ и уже отправляются все остальные запросы для получение инфы на нужном языке.

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

Какой способ выбрать, какие еще есть?
 
1) определять первоначальный язык надо по заголовку Accept-Language
2) если сессия нафиг не нужна, ставь куку с id языка и все
3) хорошим тоном является наличие языка в урле, т.е. domain.tld/ru/page/, или скажем ru.domain.tld/page/ - всегда можно дать ссылку туда, куда хотел дать ссылку
 
До урлов пока не дошел, поэтому есть только index.php, должно с ним работать.
Сессия пока только для зареганых, стремно сохранять там каждого гостя, хотя, возможно, от миллиончика сессиионных записей нагрузки почти не будет, не проверял.
А Accept-Language можно с помощью js/jQuery поменять? Экспресс гугление пока ничего не дало по этому вопросу
 
А Accept-Language можно с помощью js/jQuery поменять? Экспресс гугление пока ничего не дало по этому вопросу
нет, это заголовок, отправляемый браузером в соответствии с его настройками. оттуда надо брать изначальный язык для гостя (если не стоит кука и т.д.)
 
Значит, алгоритм такой:
При загрузке index.php читаем сессию, если там есть user_id, идем в базу и переписываем оттуда инфу о пользователе (в т.ч. язык) в куку, если user_id нет, читаем куку, если там нет языка, то берем его из Accept-Language и записываем язык оттуда в куку. Т.е. в куке теперь всегда есть нужный язык.
Далее при запросах к action.php (который выдает контент) берем язык из куки и на основании его отправляем данные. Все хорошо, но смущает, что при каждой отправке будет производится дополнительный опрос куки, что не очень быстро. Может быть делать для гостей краткосрочное хранилище на сервере, типа второй сессии?
 
Silentland
Ага, а лучше сразу притащить сюда что-нибудь из NoSQL ведь куки это самый боттлнек, срочно все заменить :D
 
Какой еще "опрос куки" :)

Во-первых, возьми сниффер и посмотри как ходят куки.
Во-вторых, id сессии по твоему где?
 
Такой вот опрос) index.php отдает пользователю, по сути, шаблон страницы. Браузер ее получает, после чего различные компоненты (меню, списки, текстовые поля и т.п.) начинают отсылать аякс запросы, в ответ на которые сервер уже посылает контент. А чтобы послать его в нужном переводе, он должен прочитать язык из куки. А т.к. куку находится в браузере, то он должен послать запрос на ваш комп и получить ее оттуда. Разве не так?
 
Сверху