Компьютеры
и программирование

Как сделать мультиязычный сайт с неограниченным числом языков

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

Давайте разберёмся, как сделать такой мультиязычный сайт. Неограниченность числа языков достигается определённой структурой базы данных и связи в ней определённых полей таблиц. Используя описанную ниже логику, можно сделать сайт с любым числом единиц данных, выводимых на страницы. В нашем примере разбираем простой сайт - каталог, не перегруженный большим числом единиц данных, как то подробным описанием товаров.

Итак, создаём базу данных. В ней должна быть таблица с данными о языках, в примере она называется languages. Если непонятно, что такое lang_postfix: это краткое обозначение языка, например, ru, en, de. Таблица catalogue содержит совсем мало полей, это потому, что практически все данные каталога - в таблице langto_cat, в которой эти данные привязаны к занесёнными в таблицу language языкам.

Код MySQL

CREATE TABLE `languages` ( `lang_id` int(2) NOT NULL AUTO_INCREMENT, `lang_name` varchar(15) NOT NULL, `lang_postfix` varchar(5) NOT NULL, PRIMARY KEY (`lang_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ; CREATE TABLE `catalogue` ( `cat_id` int(4) NOT NULL AUTO_INCREMENT, `cat_name` varchar(50) NOT NULL, `cat_pic` varchar(50) NOT NULL, PRIMARY KEY (`cat_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ; CREATE TABLE `langto_cat` ( `ent_id` int(4) NOT NULL AUTO_INCREMENT, `cat_id` int(4) NOT NULL, `lang` varchar(10) NOT NULL, `cat_name` varchar(50) NOT NULL, `cat_title` varchar(50) NOT NULL, `cat_descr` varchar(50) NOT NULL, PRIMARY KEY (`ent_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ;

По тому же принципу создаётся таблица goods: её основное назначение - уникальная идентификация единиц товара. В основном же данные о товаре - в таблице langto_good, там они опять же привязаны с имеющимся языкам сайта.

Код MySQL

CREATE TABLE `goods` ( `good_id` int(10) NOT NULL AUTO_INCREMENT, `cat_id` int(4) NOT NULL, `good_foto` varchar(16) NOT NULL, `good_name` varchar(100) NOT NULL, PRIMARY KEY (`good_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; CREATE TABLE `langto_good` ( `lnt_id` int(4) NOT NULL AUTO_INCREMENT, `good_id` int(4) NOT NULL, `lang` varchar(10) NOT NULL, `good_name` varchar(50) NOT NULL, `good_title` varchar(50) NOT NULL, `good_descr` varchar(50) NOT NULL, `good_price` varchar(100) NOT NULL, `good_oldprice` varchar(100) NOT NULL, `good_text` text NOT NULL, `good_quant` int(10) NOT NULL, `good_first` int(1) DEFAULT '0', `good_activated` int(1) DEFAULT '1', PRIMARY KEY (`lnt_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ;

Показанные выше правила создания таблиц базы данных являются предметом вопроса в Тест по теме Программирование PHP/MySQL.

На нашем мультиязычном сайте могут быть также страницы типа "О нас", "Доставка" и другие, то есть страницы с простой текстовой информацией, а не страницы каталога. Мультиязычность эти страниц также достигается уже описанной логикой, приведём только код.

Код MySQL

CREATE TABLE `pages` ( `page_id` int(2) NOT NULL AUTO_INCREMENT, `page_name` varchar(150) NOT NULL, `page_foto` varchar(16) NOT NULL, PRIMARY KEY (`page_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; CREATE TABLE `langto_pages` ( `ent_id` int(2) NOT NULL AUTO_INCREMENT, `page_id` int(2) NOT NULL, `lang` varchar(10) NOT NULL, `page_name` varchar(150) NOT NULL, `title` varchar(150) NOT NULL, `descriptions` varchar(200) NOT NULL, `page_text` text NOT NULL, PRIMARY KEY (`ent_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Для вывода горизонтального меню (информационных страниц) организуется запрос к таблице страниц на языках с условием языка сессии.

Код PHP

<? $result4 = mysql_query("SELECT * FROM `langto_pages` WHERE `lang`='$_SESSION[lan]'") or die(mysql_error()); $myrow4 = mysql_fetch_array($result4); do { echo '<div class="mainmenu"><a href="index.php?page_id='.$myrow4['page_id'].'">'.$myrow4['page_name'].'</a></div>'; } while ($myrow4 = mysql_fetch_array($result4)); ?>

По такому же принципу выводится меню разделов каталога.

Код PHP

<? $result3 = mysql_query("SELECT * FROM `langto_cat` WHERE `lang`='$_SESSION[lan]'") or die(mysql_error()); $myrow3 = mysql_fetch_array($result3); do { echo '<h2><a href="cat.php?cat_id='.$myrow3['cat_id'].'">'.$myrow3['cat_name'].'</a></h2>'; } while ($myrow3 = mysql_fetch_array($result3)); ?>

Вывод текстов несколько сложнее: в запросе уже два условия - текущий id страницы (page_id) и язык сессии.

Код PHP

<? $sq2=mysql_query("SELECT * FROM `langto_pages` WHERE `page_id` = '$page_id' AND `lang`='$_SESSION[lan]' ORDER BY `page_name`") or die(mysql_error()); $or2 = mysql_fetch_array($sq2); do { echo '<h1>'.$or2['title'].'</h1> '.$or2['page_text']; } while ($or2 = mysql_fetch_array($sq2)); ?>

Точно так же организуется вывод товаров из соответствующей таблицы.

Код PHP

<? $result13 = mysql_query("SELECT * FROM `goods` WHERE `cat_id`='$cat_id'") or die(mysql_error()); $myrow13 = mysql_fetch_array($result13); do { $gid = $myrow13['good_id']; $sq2=mysql_query("SELECT * FROM `langto_good` WHERE `good_id` = '$gid' AND `lang`='$_SESSION[lan]'") or die(mysql_error()); $or2 = mysql_fetch_array($sq2); do { echo '<h1>'.$or2['good_name'].'</h1>'; } while ($or2 = mysql_fetch_array($sq2)); } while ($myrow13 = mysql_fetch_array($result13)); ?>

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

Вот как выглядит код меню админки, в котором присутствуют все необходимые страницы-модули.

Код PHP

<? echo '<div><table border="1"><tr>'; echo '<td><a href="admin.php">Добро пожаловать</a></td>'; echo '<td><a href="edlang.php">Языки</a></td>'; echo '<td><a href="edpages.php">Страницы</a></td>'; echo '<td><a href="edpageslang_01.php">Настройки страниц на языках</a></td>'; echo '</tr></table></div>'; echo '<div class="linksamd" style="background:#5365eb;"><table border="1"><tr>'; echo '<td><a href="edcat.php">Разделы каталога</a></td>'; echo '<td><a href="edcatlang_01.php">Настройки разделов на языках</a></td>'; echo '<td><a href="edgood_01.php">Товары</a></td>'; echo '<td><a href="edgoodlang_01.php">Характеристики товаров на языках</a></td>'; echo '</tr></table></div>'; ?>

А далее - самые важные части кода файла edlang.php, ответственного за добавление и удаление языков.

Код PHP

<? if(isset($_GET["action"]) AND $_GET["action"]=='add_lang') { echo '
Языки ---> Добавить язык
'; if(isset($_REQUEST['act']) AND $_REQUEST['act'] == 'add') ?> ... <? { $adlang = mysql_query("INSERT INTO languages VALUES ('', '$_POST[lang_name]', '$_POST[lang_postfix]' )") or die (mysql_error()); echo '
Добавлено
'; } else { echo '
'; echo ''; echo '
Название языка
Постфикс языка (напр. ru, eng, ...)
'; } } ?>

Редактирование языков (если заказчик захочет не удалить, а, допустим, заменить немецкий на испанский):

Код PHP

<? echo '
Языки ---> Редактирование
'; if ($_POST[act] == 'com_edit'){ $prlen = mysql_query("UPDATE languages set lang_name='$_POST[lang_name]', lang_postfix='$_POST[lang_postfix]' WHERE lang_id='$_POST[lang_id]'") or die (mysql_error()); //Редактирование записи в базе данных echo '
Изменено
'; // Сообщение о выполненной операции } else { $lml=mysql_query("select * FROM languages WHERE lang_id='$_GET[lang_id]'") or die (mysql_error()); while ($prc = mysql_fetch_array($lml)) { echo '
'; echo ''; echo '
Название языка
Постфикс языка
'; } } ?>

Удаление языков - достаточно простая операция и, если Вы читаете эту статью, то, вероятно, уже владеете навыками организации такой операции. Но всё же приведём части кода. Сам запрос на удаление:

Код PHP

<? //блок удаления языков if ($_GET[action] == 'fa_del'){//проверка наличия $_GET['action'] - линк из таблицы mysql_query("DELETE FROM languages WHERE lang_id='$_GET[lang_id]'") or die (mysql_error()); echo '
Удалено
'; // Сообщение о выполненной операции } ?>

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

Код PHP

<? //вывод таблицы с названиями языков echo "<div class=\"header \">Языки</div> <a href=\"edlang.php?action=add_quest\"><b>Добавить язык</b></a><br><br> <table border=\"1\" cellspacing=\"0\" bordercolor=\"#336699\"><tr> <td>id</td><td>Название</td><td>Постфикс</td><td>Редактировать</td><td>Удалить</td></tr>"; while ($prc = mysql_fetch_array($lml)) { echo "<tr>"; echo "<td>".$prc[lang_id]."</td> <td>".$prc[lang_name]."</td> <td>".$prc[lang_postfix]."</td> <td><a href=\"edlang.php?action=com_edit&lang_id=".$prc[lang_id]."\">Редактировать</a></td> <td><a onclick=\"return confirm('Вы действительно желаете удалить язык?')\" href=\"edlang.php?action=fa_del&lang_id=".$prc[lang_id]."\">Удалить</a></td>"; } echo "</tr></table>"; ?>

В файле edcat.php - запрос на добавление раздела каталога.

Код PHP

<? $incat = mysql_query("INSERT INTO catalogue VALUES ('', '$_POST[cat_name]', '$_POST[cat_pic]' )") or die (mysql_error()); echo '
Добавлено
'; ?>

Подчеркнём: главная цель данной статьи - предоставить логику организации мультиязычного сайта в виде определённой структуры базы данных и это было сделано в начале данной статьи. Советы же по общей организации админки сайта - не цель данной статьи, и, как уже было отмечено, Вы, вероятно уже владеете таким навыком. Отметим лишь, что эта админка построена на обычных запросах к базе данных на добавление, редактирование и удаления данных, которые являются общими для любых данных. Так что в общих чертах урок по созданию мультиязычного сайта с неограниченным числом языков подошёл к концу.

Возможно, Вы захотите усовершенствовать изложенные в этой статье разработки. Строить сложные логические условия для запросов на MySQL Вам поможет материал "Булева алгебра (алгебра логики)".

А об операциях для манипулирования данными из баз данных - материал "Реляционная алгебра"

Поделиться с друзьями