Мультиязычный сайт
Coffee CMS является минималистичной CMS и не содержит в себе каких-то готовых сложныж возможностей. Мультиязычность как раз такой и является. Но на ней все же можно делать мультиязычные сайты и очень разными способами.
Наиболее правильным будет устанавливать под каждый язык свою копию CMS и помещать их в подпапки. Например, в корень сайта помещаем основную версию на русском языке. В папку /en/ устанавливаем вторую копию и сажаем за нее отдельного человека. В папку /es/ устанавливаем третью копию и так же сажаем за нее отдельного человека.
Чтобы заработал виджет переключения языков, в каждую страницу сайта вставляем вспомогательный код. Пусть, для примера, это будет страница контактов с адресом /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
Можно придумывать различные системы детектирования страниц с одинаковым контентом, на разных языках. Для этого можно использовать уже существующее поле тегов у страниц. Теги не выводить, но группировать аналогичные страницы по признаку одинаковости тегов. Можно в таблицу страниц добавить колонку для группировки одинаковых страниц на разных языках, но в админке она нигде выводиться не будет.
Возможно это неплохие варианты, но есть и попроще. Правда придется отказаться от уникальности окончания url и делать их такими
/contacts
/en/contacts
/es/contacts
Тогда искать аналогичные страницы можно по url.
В начало файла шаблона html.php вставляем такой код
<?php
// Определяем текущий язык
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.