We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 31335
    • 47 Posts
    Мультиязычный сайт без создания папок для разных языков

    Встала тут передо мной задача, господа, сделать двуязычный сайт – с русским и английским языком. При первом приближении к проблеме предлагаемые решения мне не понравились. Ну, право, что это за решение – сделать отдельные папки для разноязычных документов? Соответственно и шаблоны по другом и ваще – скачи туда-сюда. Негодица.
    Однако! Набрел я на обсуждение этой проблемы вот здесь http://modxcms.com/forums/index.php/topic,1957.45.html Особенно заинтерсовался сообщением и сниппетом Djamoer’а (пост №57). И вот на его основе сделал себе решение.
    Значит, так, нужно нам:

    1. Сделать плагин (все права на него – Djamoer’а):
    <?php
    //
    // [Plugin] LanguageVar
    //
    if(isset($_GET['lang']) && trim($_GET['lang']) != '') $_SESSION['lang'] = strtolower($_GET['lang']);
    ?>

    Поставить ему системное событие на OnWebPagePrerender.

    2. Создать сниппет:
    <?php
    //
    // [Snippet] LangVar
    //
    // Usage: [!LangVar? &var=`content`&type=`snp||var`!]
    //
    $default_lang = 'ru';
    
    if(!isset($type) || trim($type) == '') $type = 'var';
    
    $type = strtolower($type);
    
    if ($type == 'var') {
          if(!isset($var) || trim($var) == '') $var = 'content';
    }
    
    $lang = '';
    if(isset($lang) && trim($lang) != '') $lang = '_'.$lang;
    else if(isset($_GET['lang']) && trim($_GET['lang']) != '') $lang = '_'.strtolower($_GET['lang']);
    else if(isset($_SESSION['lang']) && trim($_SESSION['lang']) != '') $lang = '_'.strtolower($_SESSION['lang']);
    else if(isset($_COOKIE['lang']) && trim($_COOKIE['lang']) != '') $lang = '_'.strtolower($_COOKIE['lang']);
    
    if ($type == 'var') {
          if($lang == '_'.$default_lang || !isset($modx->documentObject[$var.$lang]) || trim($modx->documentObject[$var.$lang][1]) == '') $lang = '';
          if(isset($edit) && $edit = true) return '[*#'.$var.$lang.'*]';
          else return '[*'.$var.$lang.'*]';
    } else {
          if ($lang == '') $lang = '_'.$default_lang;
          return '{{'.$var.$lang.'}}';
    }
    ?>
    

    Параметров всего два. Первый название сниппета (без фигурных скобок) или переменной документа (content там или еще какой pagetitle). Второй – тип, эээ, ну не знаю, чего это тип, но значений только два – snp (сниппет) и var (переменная документа).
    3. Создаем еще один сниппет:
    <?php
    // SetLangCookie snippet for ModX
    // set cookie with language ID
    // 08-28-2005
    // [email protected]
    if(isset($_GET['lang']) && trim($_GET['lang']) != '') {
          $lang=strtolower($_GET['lang']);
          setcookie("lang",$lang,time()+604800);
    }
    ?>

    Его надо будет вызывать в шаблоне тупо [!SetLangCookie!]. Не кэшируем!
    4. Создаем TV. TV мы создаем какие хотим, только главное, чтобы они назывались соответственно. Например, "дублер" поля content должен зваться content_en (или content_fr, или что там вы будете передавать в качестве переключателя в поле &lang, но об этом ниже).
    5. Создаем сниппеты. Тут все сниппеты называем по схеме: НазваниеСниппета_ИдентификаторЯзыка. Например, TopMenu_ru, TopMenu_en и т. д.
    6. Делаем себе красивые иконки с флагами (или тырим их, где плохо/хорошо положено). Ссылочки на них оформлеяем как "index.php?id=[*id*]&lang=en" или там "index.php?id=[*id*]&lang=ru"

    Ну, собственно, вроде и все smiley

    Да. С переключением заголовков в меню, конечно, пурхалово. Потому как не понятно мне, как заставить WayFinder брать в качестве заголовков значения TV. Вышел из положения тем, что в русском он показывает pagetitle, в английском – menutitle. Это, конечно, не супер, но все же.
    Как получилось – http://www.ibrainsoft.com
      • 28814 ☆ A M B ☆
      • 1,086 Posts
      Да, идея интересная, в новом сайте обязательно попробую, в разрабатываемом сайте уже пусть будут разные папки для разных языков.. но вот использование TV для этого меня удручает sad Это как пристройка пятой ноги, чес слово.. Хочется гораздо мощнее и гибче мультиязычную систему, как например это реализовано в TYPO3 rolleyes.. Вроде вот где-то на форуме я читал, что в новых релизах MODx TV будут значительно переделаны и получат гораздо более мощные возможности, ну поживем-увидим.
        Разработка сайтов и программных модулей на MODX.
        Опыт работы на MODx с 2005 года. Высокое качество.
        Компания Baltic Design Colors: http://www.bdcolors.ru.
        • 19164
        • 1,215 Posts
        Возможно я не совсем точно уловил суть повествования, но не получается ли в данном случае, что структуры сайтов на всех языках в этом случае должны точно соотвествовать друг другу? А ведь реально это вовсе не обязательно, ведь, скажем, английская версия сайта не должна быть полной копией русской, а за неимением нормального переводчика, представляет собой лишь несколько кратких страниц с описанием деятельности компании.

        Опять таки, способ показался мне слишком сложным и нелогичным. Отдельная папка для каждого языка кажется более понятным и простым способом, к тому же если применить mod_rewrite, выбор языка можно свести в выбору домена 3 уровня ru.site.ru или en.site.ru
          DirectResize 0.9 beta. PHPThumb, sets of configurations, configuration, binded to specific path. No backward compatibility. | DirectResize 0.9. PHPThumb, наборы параметров, параметры, привязанные к определенным путям. Без обратной совместимости.

          Unfortunately, DirectResize project is closed. If you want to continue development, PM me for access to project page on Google Code. К сожалению, проект DirectResize закрыт. Если вы желаете продолжить разработки, обращайтесь через ПМ для получения доступа к репозиторию на Google Code.

          [PLUGIN] DirectResize - as Maxigallery but for single images :: Download :: [url=http://modxcms.com/forums/index.php/topic,21490]
          • 28814 ☆ A M B ☆
          • 1,086 Posts
          Quote from: Metaller at Jan 17, 2007, 03:47 PM

          Возможно я не совсем точно уловил суть повествования, но не получается ли в данном случае, что структуры сайтов на всех языках в этом случае должны точно соотвествовать друг другу? А ведь реально это вовсе не обязательно, ведь, скажем, английская версия сайта не должна быть полной копией русской, а за неимением нормального переводчика, представляет собой лишь несколько кратких страниц с описанием деятельности компании.
          Это возможно только в случае "неимения" переводчика. Вообще говоря, конечно сайт на разных языках может быть представлен по-разному, но в принципе структура сайта и его контент должны быть аналогичны на всех языках. Например, сайты, которые приходится делать мне - 3-язычные (английский, русский и латышский), содержимое более-менее отличается бывает только что на английском языке.
          Quote from: Metaller at Jan 17, 2007, 03:47 PM

          Опять таки, способ показался мне слишком сложным и нелогичным. Отдельная папка для каждого языка кажется более понятным и простым способом, к тому же если применить mod_rewrite, выбор языка можно свести в выбору домена 3 уровня ru.site.ru или en.site.ru
          Способ выбора языка как раз в данном случае не имеет большого значения, можно сделать так, как ты написал, можно - как приводит вариант vbatushev, запоминая выбранный язык через куки.. Вопрос же в другом - как рулить всем этим контентом из одного места, точнее - из одного документа редактировать тот же контент на разных языках.
            Разработка сайтов и программных модулей на MODX.
            Опыт работы на MODx с 2005 года. Высокое качество.
            Компания Baltic Design Colors: http://www.bdcolors.ru.
            • 19164
            • 1,215 Posts
            Quote from: Igor at Jan 17, 2007, 04:03 PM

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

            Я не так выразился и меня не так поняли. Я имел ввиду не способ выбора языка, а логику, которая в описанном выше способе показалась мне запутанной и сложной.
              DirectResize 0.9 beta. PHPThumb, sets of configurations, configuration, binded to specific path. No backward compatibility. | DirectResize 0.9. PHPThumb, наборы параметров, параметры, привязанные к определенным путям. Без обратной совместимости.

              Unfortunately, DirectResize project is closed. If you want to continue development, PM me for access to project page on Google Code. К сожалению, проект DirectResize закрыт. Если вы желаете продолжить разработки, обращайтесь через ПМ для получения доступа к репозиторию на Google Code.

              [PLUGIN] DirectResize - as Maxigallery but for single images :: Download :: [url=http://modxcms.com/forums/index.php/topic,21490]
              • 31335
              • 47 Posts
              Поясняю логику.
              Задача стояла следующая:
              1. Документы (страницы) сайта должны быть идентичными друг другу. Это не два различных сайта, а один с максимально приближенным по смыслу контентом как на одном языке, так и на другом.
              2. Каждый конкретный документ должен быть в единственном экземпляре и ввод в него данных должен быть в одном месте.
              3. Шаблоны должны быть для всех языков идентичны.

              Применение TV и дает возможность "рулить всем этим контентом из одного места, точнее - из одного документа редактировать тот же контент на разных языках". Нет ведь никаких проблем назвать сделать заголовок TV (не имя!) - "Content (eng)" и "Content (de), ведь так? А потом привязать оные TV к своему шаблону. Таким образом в менеджере человек и пишет весь контент в одном месте на всех доступных ему языках. Не увидел никакой путаницы в логике. Или "логика" это представление документов на древе?
                • 12550
                • 107 Posts
                Отличное решение.
                Не всегда надо, иногда и правда достаточно отдельной папки с 2-3 общими страницами о компании на английском, но иногда все-таки надо больше.
                Пока не нужно, но рано или поздно наверняка пригодится, спасибо. )
                  • 31716
                  • 61 Posts
                  Äîðûé äåíü!

                  Ðåøåíèå êðàñèâîå. Íî åñòü îäíî âàæíîå ÍÎ.

                  ÍÎ, çàêëþ÷àåòñÿ â òîì, ÷òî ýòî áóäåò íåóäîáíî êóøàòü ïîèñêîâèêàì. Âìåñòî òîãî ÷òî áû èìåòü â áàçå îáå âåðñèè ðóññêóþ è àíãëèéñêóþ ñàéòà, ïîèñêîâèêè áóäóò èìåòü òîëüêî îäíó âåðñèþ, ðóññêóþ èëè àíãëèéñêóþ.

                  Ïî ýòîìó ìíîãèå êðóïíûå êîìïàíèè ïðèøëè êàê ðàç ê ðàçäåëåíèþ ñàéòà, âî âñÿêîì ñëó÷àå âíåøíå. Ò.å. mysite.com/ru, mysite.com/de è ò.ä.

                  Ñ óâàæåíèåì, Âëàäèìèð
                    www.verseq.ru - необычный клавиатурный тренажер, уже через час вы сможете печатать вслепую. smiley
                    www.taiso.ru - арт-группа Taiso Style (портфолио, правда до сих пор нет времени выложить за последних два года smiley )
                    • 7935
                    • 19 Posts
                    Уважаемые модх-гуру

                    Можно ли в дополнение к этой теме кратко описать процесс создания мультияза на базе папок?

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

                    Может в основе подход был неправильный?
                    Плиз хелп.
                    Изучил (русскоязыный раздел) форум - не нашел темы посвященной папочной структуре мультияза. Если уже обсуждалось - бросьте ссылкой плз.
                      • 897
                      • 1,620 Posts
                      смотрите у вайфандера параметры level и start
                        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                        Не используйте Revo для "просто сайтов". Используйте Evo

                        Who can defeat the Russian bear?