Мультиязычный сайт

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.

Комментировать
Закрыть
Сумма:
0 ₽
После согласования условий заказа мы Вам отправим счёт или ссылку c удобным способом оплаты.
Оформить заказ