Создание мультиязычности на сайте — база данных

В связи с большим количеством вопросов по этой теме, решил написать статью про создание мультиязычности на сайте, а именно ту часть которая отвечает за базу данных. Программную часть я описал в статье на примере настройки мультиязычности на yii2 , но появилось много вопросов по созданию мультиязычнсоти в базе данных, что я вам собственно сейчас и распишу

Общий алгоритм действий: если нам нужно создать мультиязычность, нам нужно разделить нашу сущность на две. В одной будет хранится список переводимых значений, в другой(основной) ссылка на первую таблицу. Чаще всего это связывание одно ко многим. Сейчас попробую обьяснить на примере. Допустим у нас есть табличка которая представляет обычные статичные страницы с полями, id  title text url author. Которая хранит набор страниц, и нам нужно сделать их мультиязычными. Первым делом мы выносим из таблицы значения которые будут на разных языках, в нашем случае это title и text. И того имеет табличку page c наполнением
--
-- Структура таблицы `page`
--

CREATE TABLE IF NOT EXISTS `page` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`url` varchar(50) NOT NULL,
`author` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


— Дамп данных таблицы `page`

INSERT INTO `page` (`id`, `url`, `author`) VALUES
(1, ‘test’, ‘test_author’),
(2, ‘test2’, ‘tes2_author’);

Теперь нам нужно создать табличку в которой будут хранится контент на разных языках:

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

CREATE TABLE IF NOT EXISTS `lang_page` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(500) NOT NULL,
`text` text NOT NULL,
`lang` varchar(10) NOT NULL,
`page_id` int(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;


— Дамп данных таблицы `lang_page`

INSERT INTO `lang_page` (`id`, `title`, `text`, `lang`, `page_id`) VALUES
(5, ‘Заголовок’, ‘русский язык’, ‘ru’, 1),
(6, ‘english’, ‘eng text’, ‘eng’, 1),
(7, ‘Українська мова’, ‘Українська мова’, ‘ua’, 1);

 

первые три поля думаю понятно, поле lang — идентификатор языка, для упрощение в нашем примере в нем текстовые записи, но в боевых условиях это часто идентификатор языка(третья сущность с перечнем языков). и последнее поле page_id это наша связь с табличкой страниц (хранит айди страницы)
Теперь, что бы нам вытянуть страницу например на русском языке наш запрос будет иметь примерно такой вид

SELECT `title`,`text`//выбираем нужные поля
FROM lang_page//с нашей таблички
LEFT JOIN page // присоединяем табличку страниц
ON page.id=lang_page.page_id // указываем поля по которым идет привязка
WHERE lang_page.lang= 'ru' // сортируем по языку

Вставлять записи нужно соответственно, учитывая наши связи. Если у вас есть вопросы, задавайте в комментариях, если совсем непонятно, советую вначале подучить реляционные базы данных, нормальные формы. Удачи

Оставить комментарий