Мультиязычный сайт
Coffee CMS является минималистичной CMS и не содержит в себе каких-то готовых сложных возможностей таких как мультиязычность. Но на ней все же можно делать мультиязычные сайты и очень разными способами.
Наиболее правильным будет устанавливать под каждый язык свою копию CMS и помещать их на поддомены или в подпапки. Например, в корень сайта помещаем основную версию на русском языке. В папку /en/ устанавливаем вторую копию и сажаем за нее отдельного человека. В папку /es/ устанавливаем третью копию и так же сажаем за нее отдельного человека.
Если копии CMS находятся в подпапках, то для поисковика это один и тот же сайт. Но не забудьте поисковикам показать все карты сайта в подпапках.
Чтобы заработал нижеприведенный виджет переключения языков, в каждую страницу сайта вставляем вспомогательный код. Пусть, для примера, это будет страница контактов с адресом /kontakty, тогда прямо в код страницы добавляем два комментария
<!--lang:en:/en/contacts-->
<!--lang:es:/es/contactos-->
А в файл шаблона html.php добавляем код обработки этой информации.
if ( isset( $cms["page"]["text"] ) ) {
if ( preg_match_all( "/(.*)(<!--lang:(\w\w):([^>]+)-->)(.*)/u", $cms["page"]["text"], $matches_array, PREG_SET_ORDER ) ) {
foreach( $matches_array as $m ) {
$lang_href_arr[ $m[3] ] = $m[4];
}
}
}
А в том месте где нужно выводить переключалку языков добавляем
<div class="group-lang">
<div title="Выбран Русский" class="active-lang rus">РУ</div>
<a title="Switch to English" class="lang eng" href="<?php echo $lang_href_arr["en"]; ?>">EN</a>
<a title="Switch to Spanish" class="lang esp" href="<?php echo $lang_href_arr["es"]; ?>">ES</a>
</div>
С помощью стилей можно скрыть ссылки содержащие пустой href если страница не содержит ссылку на аналогичную иностранную.
Такое разделение и ручная перелинковка позволяет делать максимально качественные сайты. Где оформление и контент для разных языков могут быть разными. При этом могут существовать страницы только на одном языке и отсутствовать их аналоги на других языках.
Способ №2
Все языки на одном движке.
Можно придумывать различные системы детектирования страниц с одинаковым контентом на разных языках. Для этого можно использовать уже существующее поле тегов у страниц. Теги не выводить, но группировать аналогичные страницы по признаку одинаковости тегов. Можно в таблицу страниц добавить колонку для группировки одинаковых страниц на разных языках, но в админке она нигде выводиться не будет. При этом чтобы колонка не вызывала проблем по умолчанию ей поставить значение NULL. Тогда она не будет мешать работе модуля страниц.
Возможно это неплохие варианты, но есть и попроще. Правда придется отказаться от уникальности окончания url и делать их такими
/contacts
/en/contacts
/es/contacts
Тогда искать аналогичные страницы можно по url.
В начало файла шаблона html.php вставляем такой код
<?php
// Определяем текущий язык по url текущей страницы
if ( preg_match( "/^([a-z]{2})\/(.*)/", $cms["url"]["path"], $m ) ) {
$curr_lang = $m[1];
$tail = $m[2];
} else {
// Если нет префикса то RU
$curr_lang = "ru";
$tail = $cms["url"]["path"];
}
?>
<html lang="<?php echo $curr_lang; ?>">
Он будет пытаться определить язык текущей страницы и хвост url по которому искать аналоги страницы.
А там где необходимо вывести переключалку языков вставить такой код
<div class="language-dropdown">
<!-- Смена языка START -->
<?php
$etail = mysqli_real_escape_string( $cms["base"], $tail );
// Такое условие чтобы не попали все страницы под .*
$q = "SELECT url FROM pages WHERE url REGEXP '.*/{$etail}$' OR url='{$etail}' ORDER BY url";
$li = "";
if ( $r = mysqli_query( $cms["base"], $q ) ) {
while ( $i = mysqli_fetch_assoc( $r ) ) {
// Текущую страницу исключить из списка
if ( $cms["url"]["path"] === $i["url"] ) continue;
if ( preg_match( "/^([a-z]{2})\/(.*)/", $i["url"], $m ) ) {
$li .= "<li data-lang={$m[1]} role=menuitem><a href='{$cms['base_path']}{$i['url']}'>"
. strtoupper( $m[1] ) . "</a></li>";
} else {
$li .= "<li data-lang=ru role=menuitem><a href='{$cms['base_path']}{$i['url']}'>RU</a></li>";
}
}
}
?>
<div class="language-button"><?php echo strtoupper( $curr_lang ); ?></div>
<ul class="language-list" role="menu">
<?php echo $li; ?>
<!--
<li data-lang="en" role="menuitem">EN</li>
<li data-lang="es" role="menuitem">ES</li>
<li data-lang="fr" role="menuitem">FR</li>
<li data-lang="de" role="menuitem">DE</li>
<li data-lang="ua" role="menuitem">UA</li>
-->
</ul>
<div class="bg-reset-lang"></div>
<!-- Смена языка END -->
</div>
Какой из способов выбрать решайте сами. У каждого из них есть свои недостатки.
При ручной перелинковке через комментарии возможны разрывы связей при смене url одной из страниц. Но удобство в том, что на каждом отдельном языковом сайте удобнее работать не мешая друг другу и не устраивая свалку страниц на всех языках. Если языков много то, конечно, придется изрядно потрудиться.
Если объединять страницы через теги, то смена url не приведет к разрыву связей. Но свалка страниц на всех языках, и админка, скорее всего в режиме английского, не прибавят удобства.
Третий способ, с одинаковыми хвостами url выглядит более надежным, чем второй, потому что изначально существует некоторый стандарт оформления url.
Можно придумать и другие способы, когда сайты работают на разных копиях цмс, но при этом каждый из них может залезть в базу данных другого и там искать страницы-аналоги.
Наверно еще поэтому не стоит усложнять саму CMS и выбирать за пользователей какой-то самый правильный способ. Потому что кто-то решит пойти самым простым путем, и переключалкой языка отправлять на главную страницу, и весь лишний код будет только усложнять админку CMS.