CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » Как делать мультиязычность?
Официальный форум Eleanor CMS » Для вебмастеров и владельцев сайтов » Комната программистов
Страницы: 1, 2
Youshi
Дамп БД:

-- phpMyAdmin SQL Dump
-- version 2.11.3deb1ubuntu1.1
-- [url]http://www.phpmyadmin.net[/url]
--
-- Хост: localhost
-- Время создания: Дек 31 2008 г., 19:38
-- Версия сервера: 5.0.51
-- Версия PHP: 5.2.4-2ubuntu5.4

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- База данных: `eleanor`
--

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

--
-- Структура таблицы `el_news`
--

CREATE TABLE IF NOT EXISTS `el_news` (
  `id` int(11) NOT NULL auto_increment,
  `url` varchar(100) NOT NULL,
  `cid` int(11) NOT NULL default '0',
  `status` tinyint(1) NOT NULL default '1',
  `def_lang` tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `url` (`url`),
  KEY `cid` (`cid`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7;

--
-- Дамп данных таблицы `el_news`
--

INSERT INTO `el_news` (`id`, `url`, `cid`, `status`, `def_lang`) VALUES
(1, 'url_1', 1, 1, 0),
(2, 'url_2', 2, 1, 0),
(3, 'url_3', 1, 1, 0),
(4, 'url_4', 3, 1, 0),
(5, 'url_5', 2, 1, 0),
(6, 'url_6', 3, 1, 1);

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

--
-- Структура таблицы `el_news_lang`
--

CREATE TABLE IF NOT EXISTS `el_news_lang` (
  `id` int(11) NOT NULL,
  `language` varchar(10) NOT NULL,
  `title` varchar(200) NOT NULL,
  `text` text NOT NULL,
  KEY `language` (`language`),
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `el_news_lang`
--

INSERT INTO `el_news_lang` (`id`, `language`, `title`, `text`) VALUES
(1, 'ru', 'Новость 1', 'Это новость 1'),
(1, 'en', 'Story 1', 'This is story 1'),
(2, 'ru', 'Новость 2', 'Эт новость 2'),
(3, 'ru', 'Новость 3', 'Это новость 3'),
(4, 'ru', 'новость 4', 'Это новость 4'),
(5, 'en', 'Новость 5', 'Это новость 5'),
(5, 'ru', 'Новость 5', 'Это новость 5 русская'),
(6, 'ru', 'Новость 6', 'Это новость 6');


Запрос:

SELECT * 
FROM el_news AS n
INNER JOIN el_news_lang AS nl
USING ( `id` ) 
WHERE n.status =1 -- ну это понятно
HAVING IF( n.def_lang =1, nl.language = 'ru', nl.language = 'en' )  -- это поясню отдельно


результат:

id     url     cid     status     def_lang     language     title     text
1    url_1    1    1    0    en    Story 1    This is story 1
5    url_5    2    1    0    en    Новость 5    Это новость 5
6    url_6    3    1    1    ru    Новость 6    Это новость 6

И поясню запрос. В табличке el_news я добавил еще один флаг def_lang. Он указывает, отображать новость всегда на языке по умолчанию или же с учетом языка. Данный запрос подойдет для пункта (1)

Цитата (Alexander @ 31.12.2008, 18:49)
1. Должна быть возможность установить одну новость для всех языков. Это не значит, что так должно быть по-умолчанию.


Для пункта 2 я пока не придумал... размышляю.
Попутных вопрос:

а что делать, если к примеру дефолтный язык русский, новость размещена только на украинском, а сайт работает с русским/украинским/английским?
Alexander
Цитата (Youshi @ 31.12.2008, 20:51)
а что делать, если к примеру дефолтный язык русский, новость размещена только на украинском, а сайт работает с русским/украинским/английским?

Такого не будет. А даже, если и будет - новость должна будет отображаться в украинской версии сайта.

Кстати, лучше мне кажется поле language сделать типа enum.. На одно действие больше при добавлении/удалении языка.. Зато нагрузка на БД меньше.
Youshi
Цитата (Alexander @ 31.12.2008, 20:01)
Кстати, лучше мне кажется поле language сделать типа enum.. На одно действие больше при добавлении/удалении языка.. Зато нагрузка на БД меньше.


Не стоит, имхо. Лучше языки выбирать по целочисленному индексу. Размерности tinyint (3) unsigned, думаю, хватит за глаза. потому как менять структуру таблицы для каждого модуля, имхо, не разумно. Но решай сам ;)
Alexander
Цитата (Youshi @ 31.12.2008, 21:30)
Не стоит, имхо. Лучше языки выбирать по целочисленному индексу.

А вот тут я не согласен. Это затруднит прямое редактирование БД через PMA.. Да и как-то приравнивать языки к цифрам по-моиму не очень: я вообще планировал только русско-английскую версию системы. Лишь благодаря некоторым людям, решил добавить еще и украинский язык. Не думаю, что enum медленнее tinyint.
Youshi
Цитата (Alexander @ 31.12.2008, 21:01)
А вот тут я не согласен. Это затруднит прямое редактирование БД через PMA.. Да и как-то приравнивать языки к цифрам по-моиму не очень: я вообще планировал только русско-английскую версию системы. Лишь благодаря некоторым людям, решил добавить еще и украинский язык. Не думаю, что enum медленнее tinyint.


Если количество языков фиксировано, то я с тобой абсолютно согласен - enum лучший вариант.
Alexander
Цитата (Youshi @ 31.12.2008, 22:14)
Если количество языков фиксировано

Количество языков не фиксированно. Вероятность изменения количества языков стремится к 0. Система в первую очередь будет ориентированна на русскоязычное население планеты - именно поэтому в качестве кодировки по-умолчанию выбрана ср1251. Если кому-то нужно будет добавить еще один какой-то язык, скажем китайский - нужно будет перелопатить всю в утф всю базу и все файлы. На фоне этого, добавление еще одного пункта в enum поля покажется детской забавой.
Youshi
Цитата (Alexander @ 31.12.2008, 21:50)
Количество языков не фиксированно. Вероятность изменения количества языков стремится к 0. Система в первую очередь будет ориентированна на русскоязычное население планеты - именно поэтому в качестве кодировки по-умолчанию выбрана ср1251. Если кому-то нужно будет добавить еще один какой-то язык, скажем китайский - нужно будет перелопатить всю в утф всю базу и все файлы. На фоне этого, добавление еще одного пункта в enum поля покажется детской забавой.



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

Как будут хранится данные

Тут уже стоит вопрос в след.

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

2 способ
В зависиости от того какие языки вкл. администратор
будут создваться таблицы с языками для разных новостей типа
en_news_content
ru_news_content
ua_news_content

и будет опять же основная таблица
news

id|date|...|ua|..(и остальные языки которые были включены админом)значение полей языка
типа 1\0 добавлена ли новость на этом языке или нет

Потом просто когда пользователь будет смотреть новость
будет надпись смотреть новость так же на таких-то языках: и будет перечислены языки на которых она была написано(выборк будет осуществлятся из таблиц по значению языковых полей типа ua\en\ru (0 или 1 )).

Или просто отображать пользователь с руским языком только новости которые были опубликованые на рус.

Или взависиомтси от того какие доп. языки выбрал себе пользователь(в своих настройках типа какими владеет)....

Вот такие варианты от меня
Alexander
Цитата (ProG @ 10.1.2009, 8:26)
идет автоопределение языка(по умолчанию это тот который выбран на сайте у пользователя)
Далее он заполняет это на своем языке . После нажатии добавить его спрашивают не хотели бы вы заполнить новость еще на каком-то языке и появляется список из доступных языков.

Очень хорошая идея. Будет реализовано, но позже.. Пока новость с пользовательской части будет добавляться только с одним языком.
Дело ваше. Мое мнение делать сразу все правильно . что бы потом не переделывать.
Alexander
Я просто до конца не уверен в правильности избранного пути. Мне, например не нравится, что для добавления новости нужно будет переходить по страницам. Уж лучше, чтобы все было на одной. (тогда не возникнет проблем, если в момент добавления, вдруг прервется связь с сервером).
Цитата (Alexander @ 11.1.2009, 18:28)
Я просто до конца не уверен в правильности избранного пути. Мне, например не нравится, что для добавления новости нужно будет переходить по страницам. Уж лучше, чтобы все было на одной. (тогда не возникнет проблем, если в момент добавления, вдруг прервется связь с сервером).


Смотри допустим когда автора нажал добавить Происходит Новость добавлена успешно тоесть она уже добавилась, после того как от сервера пришел ответ ок , происходит вопрос к клиенту хотите ли добавить еще на каком языке , и сморти новость добавиться даже при дисконекте.

А твой вариант всё на одном это ужастно смотртится прдставь тебе что на сайте 5 языков!!!Ты представляешь какого размера будет стр.
А как говорилось в какой-то статье жилательно чтобы стр вписывалась так чтобы не появлялась скролбара это не удобно для пользователя.
2 языка это 4 больших техт_ареа + еще доп поля. Слишком много места заниматся будет на 1 стр.

И зачем переход по стр. ??? После того как пользователь успешно добавил 1 новость , он нажимает допустим добавить новость на англ . После этого из файла англ языка. подгружаются новые названия тоесть заменится пару слов : Title ,Date, Shor news, Ful News etc.
Alexander
Цитата (ProG @ 11.1.2009, 20:11)
А твой вариант всё на одном это ужастно смотртится прдставь тебе что на сайте 5 языков!!!Ты представляешь какого размера будет стр.

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

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

вот по вкладкам да согласен лучше сделать тогда так

News Lang : Русский | Украинаский | English

То есть в зависимости какая вкладка заполнения выбрана пользователем
а дальше опять же при нажатии добавить если пользователь не заполнен больше новость не на какхи языках выскакивает диалоговое окно .
Alexander
Делать для каждого языка отдельную вкладу - не самое оптимальное решение. Сам же сказал, что на сайте может быть больше 5 языков.. И это пять вкладок - очень некрасиво будет. Нужно все делать на одной вкладке, но для ненагромождения внешнего вида, можно реализовать свертку других языков. Смотри пример на сайте http://www.dni.ru/polit/2009/1/11/156855.html в правой колонке "Политика".
Screatch
Вот как переключение языков вижу я, ну и конечно переключение между вкладками должно быть организовано на ajax.
Если посмотреть на lenta.ru, bbc.com то там нету выбора языка... Все таки наверно сайты создают для публики родного языка. Не будем же мы просить юзеров при создании тем на форуме просить их заполнить три поля на 3 языках :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.