Как сделать мультиязычный сайт с неограниченным числом языков
Чаще мультиязычный сайт делают с фиксированным числом языков. Тогда, чтобы добавить
или исключить какой-нибудь язык, заказчик вновь обращается к веб-мастеру, которому
приходится соглашаться с такой вялотекучкой. Но бывает, что по инициативе заказчика,
либо веб-мастера достигнута договорённость о разработке мультиязычного сайта с
неограниченным числом языков, то есть такого, на который можно добавить или исключить
язык и затем достаточной просто продублировать контент на новом языке, опять же не
прибегая к услугам веб-мастера.
Давайте разберёмся, как сделать такой мультиязычный сайт. Неограниченность числа языков
достигается определённой структурой базы данных и связи в ней определённых полей таблиц.
Используя описанную ниже логику, можно сделать сайт с любым числом единиц данных, выводимых
на страницы. В нашем примере разбираем простой сайт - каталог, не перегруженный большим
числом единиц данных, как то подробным описанием товаров.
Итак, создаём базу данных. В ней должна быть таблица с данными о языках, в примере она
называется 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 '
';
}
}
?>
Редактирование языков (если заказчик захочет не удалить, а, допустим, заменить немецкий
на испанский):
Код 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 '
';
}
}
?>
Удаление языков - достаточно простая операция и, если Вы читаете эту статью, то, вероятно,
уже владеете навыками организации такой операции. Но всё же приведём части кода. Сам
запрос на удаление:
Код 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 Вам поможет материал "Булева алгебра (алгебра логики)".
А об операциях для манипулирования данными из баз данных - материал "Реляционная алгебра"
Поделиться с друзьями