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

Silentland

Новичок
Как-то сложно для понимания... Можно пример запроса который удалял бы циклически потомков и переводы. А то пока не доходит каким боком это применимо к моему случаю
 

Тугай

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

Можно собрать в три joina и написать or. Конкретно в этой ситуации со статьями полей не много.
Но в варианте где будет не три а 10 полей для перевода, придется делать 10 join.
 

Silentland

Новичок
С constraint foreign key on delete cascade разобрался, работает!

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

Как написать select, который выберет все поля из articles а на выходе выдаст массив пар text1, text2, которые будут заменены переводами, например, для русского языка (ru)
 

Silentland

Новичок
Теперь ломаю голову, почему такой запрос с ошибкой выполняется...
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 не распространяется
 

Silentland

Новичок
Разобрался. Проблема крылась в защите от инъекций, т.к. все числовые выражения подставлял в базу через 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 такую же штуку провернуть не могу, т.к. на нее ссылаются из нескольких таблиц
 

Фанат

oncle terrible
Команда форума
NULL - это не строка, а оператор
строки пишутся в кавычках
числа - без
 

Silentland

Новичок
А можно передать null в переменной по http? Если заворачиваю в json, то все нормально, а если, например, передаю из jQuery.ajax как поле myVar = null, то приходит myVar = "". Это можно победить?
 

С.

Продвинутый новичок
Огласи весь список типов, в которых по-твоему можно передавать переменные по http.
 

Silentland

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

Silentland

Новичок
Как вернуть контент на нужном языке в зависимости от того, что за фрукт зашел на сайт. Поясню. У нас есть пользователи. Они могут быть просто гостями или зарегистрированными, язык которых сохранен в БД. Более того пользователь может переключать языки, что отражается в БД (если он зареган) и куках.

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

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

Какой способ выбрать, какие еще есть?
 

fixxxer

К.О.
Партнер клуба
1) определять первоначальный язык надо по заголовку Accept-Language
2) если сессия нафиг не нужна, ставь куку с id языка и все
3) хорошим тоном является наличие языка в урле, т.е. domain.tld/ru/page/, или скажем ru.domain.tld/page/ - всегда можно дать ссылку туда, куда хотел дать ссылку
 

Silentland

Новичок
До урлов пока не дошел, поэтому есть только index.php, должно с ним работать.
Сессия пока только для зареганых, стремно сохранять там каждого гостя, хотя, возможно, от миллиончика сессиионных записей нагрузки почти не будет, не проверял.
А Accept-Language можно с помощью js/jQuery поменять? Экспресс гугление пока ничего не дало по этому вопросу
 

fixxxer

К.О.
Партнер клуба
А Accept-Language можно с помощью js/jQuery поменять? Экспресс гугление пока ничего не дало по этому вопросу
нет, это заголовок, отправляемый браузером в соответствии с его настройками. оттуда надо брать изначальный язык для гостя (если не стоит кука и т.д.)
 

Silentland

Новичок
Значит, алгоритм такой:
При загрузке index.php читаем сессию, если там есть user_id, идем в базу и переписываем оттуда инфу о пользователе (в т.ч. язык) в куку, если user_id нет, читаем куку, если там нет языка, то берем его из Accept-Language и записываем язык оттуда в куку. Т.е. в куке теперь всегда есть нужный язык.
Далее при запросах к action.php (который выдает контент) берем язык из куки и на основании его отправляем данные. Все хорошо, но смущает, что при каждой отправке будет производится дополнительный опрос куки, что не очень быстро. Может быть делать для гостей краткосрочное хранилище на сервере, типа второй сессии?
 

Ragazzo

TDD interested
Silentland
Ага, а лучше сразу притащить сюда что-нибудь из NoSQL ведь куки это самый боттлнек, срочно все заменить :D
 

fixxxer

К.О.
Партнер клуба
Какой еще "опрос куки" :)

Во-первых, возьми сниффер и посмотри как ходят куки.
Во-вторых, id сессии по твоему где?
 

Silentland

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