LINUX.ORG.RU

мультиязычный контент в базе


0

0

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

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

я для себя сделал вот так: SELECT IFNULL(content_ru, IFNULL(content_hz, IFNULL(content_pc))) from table....

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

что скажете?


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

none
() автор топика
Ответ на: комментарий от none

или чтоб наглядней - lang char(2) default 'en' и выборку типа если у статьи с этим id есть содержание на ru то фетчить ру, иначе en.

azure ★★
()
Ответ на: комментарий от azure

а допустим если у меня есть дерево каталогов, и я хочу тоже для них многоязыковой перевод. тогда получается, нужно как-то пппо-другому делать.. скажем, у каталога есть id, к которому прикреплены элементы (многоязыковые :) ). перевод каталога тогда нужно держать либо в той же таблице, либо не знаю. отдельная таблица переводов имён (и других текстовых полей) каталога?

none
() автор топика
Ответ на: комментарий от none

бррр.. всё. догнал.. надо просто убрать флаг primary с id. тогда можно одинаковые id держать. долго же думал однако)

none
() автор топика
Ответ на: комментарий от static_lab

если честно, то я думал, что выборка будет по 2-ум полям - id + lang_id (MUL). но правда не знаю, как это на скорости скажется. не добрался ещё до мануала.

cat_id - это идентификатор папки, в которой хранятся вск переводы какого-либо материала?

none
() автор топика

PostgreSql умеет работать с типом данных массив. Посмотри соответствующий раздел документации про работу с массивами.

swwwfactory ★★
()

Хорошая и важная тема. +1 Там, где я работал когда-то было так:

CREATE TABLE `galery_settings_t` (
  `id` int(11) NOT NULL auto_increment,
  `key_id` int(11) NOT NULL default '0',
  `main_text` text,
  `locale_id` varchar(2) default 'ru',
  `meta_title` varchar(250) default NULL,
  `keywords` text,
  `description` text,
  `no_pics_text` text,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Объясняю: если locale_id - ru, то и содержимое в записи на языке ru. В самой же CMS locale_id определяется само в зависимости от расположения клиента.

Если бы я делал многоязычное приложение, то сделал бы именно так

impr
()
Ответ на: комментарий от none

в таком случае иметь еще одну табличку tree_translations int id, char(2) lang, text value

azure ★★
()

Обширная и нужная тема, ага.

У меня такая мысля была, хранить переводимый контент в формате gettext'а. Никто ничего подобного не реализовывал?

YogSagot ★★★
()
Ответ на: комментарий от YogSagot

Где то я такое видял...
Не уверен, но кажется много кто с gettext делает.

Не реализовывал, только собирался.

impr
()

думаю, хорошим примером здесь будет django с ее sites. в принципе от locale_id мало чем отличается, но я бы сделал как в django (мало ли, да и гибкости больше)

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

а можно про их структуру многоязычности где-то почитать в общих словах? я просто не знаком с django вообще, буду благодарен, если ссылок накидаешь

none
() автор топика
Ответ на: комментарий от none

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

none
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.