Создание многоязычного сайта CMSMS с использованием модуля MleCMS

  1. Настройка страниц:
  2. Настройка модуля MleCMS:
  3. Настройка нашего шаблона:
  4. А как насчет «глобальных блоков контента»?
  5. Использование модулей с MleCMS
  6. Как насчет результатов поиска?

На CMS Made Simple Board часто обсуждаются вопросы создания многоязычного сайта с использованием CMSMS, поэтому на этот раз мы собираемся пройти процедуру установки многоязычного сайта с использованием модуля MleCMS.

Я уже написал альтернативный способ создания многоязычного сайта, который вы можете найти в моем блоге: « Еще один метод Multilignaul CMSMS Page «. Вскоре после моего блога был выпущен модуль MleCMS, и он стал моим предпочтительным методом, когда речь заходит о создании многоязычного сайта с использованием CMSMS.

Я все еще надеюсь, что когда-нибудь будет внедрено встроенное решение или будет выпущен модуль с лучшим Workflow; на данный момент, я думаю, MleCMS максимально приближается к достойному решению.

Сначала давайте посмотрим, что нам понадобится:
Модуль MleCMS
Модуль CGExtensions
CGContentUtils (если страницы существуют на одном языке)
CGSimpleSmarty

Обычно вы можете найти все эти модули и установить их, просто используя Менеджер модулей ( Расширения »ModuleManager ). После установки этих модулей вам нужно будет настроить языки, которые должны использоваться для вашего сайта.

Настройка страниц:

В качестве примера, мы собираемся настроить сайт, используя английский и немецкий языки. Давайте предположим, что в нашем примере у нас уже есть некоторые страницы, настроенные с использованием английского языка, поэтому мы можем посмотреть, как легко вы можете скопировать существующий сайт с помощью модуля CGContentUtils ( я буду работать с образцом контента, который поставляется с настройкой CMSMS по умолчанию ).

Давайте предположим, что в нашем примере у нас уже есть некоторые страницы, настроенные с использованием английского языка, поэтому мы можем посмотреть, как легко вы можете скопировать существующий сайт с помощью модуля CGContentUtils ( я буду работать с образцом контента, который поставляется с настройкой CMSMS по умолчанию )

Создать английскую страницу

Первый шаг - нажать « Content» Pages »и создать новую страницу под названием« English ». На вкладке «Параметры» мы изменим псевдоним страницы на «en» (или любой другой, который вы предпочитаете использовать в качестве идентификатора языка ), а затем нажмите «Отправить».

Поскольку у нас создана страница на английском языке, мы должны переместить наши существующие страницы как «дети» страницы английского языка Поскольку у нас создана страница на английском языке, мы должны переместить наши существующие страницы как «дети» страницы английского языка. Для этого нажмите «Изменить порядок страниц» в интерфейсе «Текущие страницы» и переместите все родительские страницы, включая их дочерние элементы, на один уровень вправо с помощью простого «перетаскивания».

Когда вы закончите, нажмите «Отправить», чтобы сохранить изменения.

Ранее я упоминал, что мы также рассмотрим модуль CGContentUtils, поскольку мы хотим скопировать наши существующие страницы на новый язык. В этом случае для создания «немецкой» части сайта.
Зайдите в « Расширения» Calguys Content Utils »и нажмите на вкладку« Экспорт содержимого ». Выберите из выпадающего списка «1. На английском »и оставьте флажок« Export Children »установленным, затем нажмите« Submit ». При нажатии «Отправить» файл с именем cms_content.xml будет экспортирован. Ранее я упоминал, что мы также рассмотрим модуль CGContentUtils, поскольку мы хотим скопировать наши существующие страницы на новый язык

Чтобы импортировать этот контент, нажмите на вкладку «Импорт контента», выберите файл cms_content.xml после нажатия кнопки «Загрузить» и нажмите «Отправить». Если ошибки не было, вы должны увидеть список импортированных страниц. Теперь, когда вы вернетесь к страницам « Содержимое», вы увидите две родительские страницы (если вы следили до сих пор, номера иерархии должны быть 1 и 2 для этих страниц), обе из которых названы «английскими». Откройте страницу «Английский» с иерархией № 2, измените заголовок и текст меню на «Немецкий» и измените псевдоним страницы на «de» на вкладке «Параметры».
В той же процедуре мы можем изменить эту страницу на «Тип контента: Ссылка на внутреннюю страницу» и выбрать нашу «2.1 Домашнюю страницу» в качестве «Страницы назначения». Повторите этот процесс также для нашей оригинальной «английской» страницы.
Чтобы импортировать этот контент, нажмите на вкладку «Импорт контента», выберите файл cms_content

Если вы сделали все, как описано выше, вы должны увидеть такую ​​структуру страницы:
Если вы сделали все, как описано выше, вы должны увидеть такую ​​структуру страницы:

Настройка модуля MleCMS:

Настройка модуля MleCMS:

Поскольку у нас есть готовая структура страницы, мы можем перейти к настройке модуля MleCMS. После установки модуль можно найти в « Контенте» MleCMS «. Первое, что нам нужно сделать, это определить, какие языки мы собираемся использовать. Для этого нажмите «Добавить» на вкладке «Multilang config».
В следующем интерфейсе введите имя, корневой псевдоним (это псевдоним наших родительских страниц Lanugage) и языковой стандарт языка. В нашем случае это «английский, английский, английский» и «немецкий, немецкий».

Теперь вы можете перейти к «Многоязыковому шаблону» и отредактировать, создать или выбрать один из шаблонов переключения языка. Для этого примера мы просто установим tempalte «Разделитель» на значение по умолчанию.

У нас есть все, что нам нужно настроить, и мы можем перейти к нашей странице Шаблон.

Настройка нашего шаблона:

Для демонстрации мы просто будем использовать шаблон NCleanBlue, который поставляется с установкой CMSMS по умолчанию. Перейдите в раздел «Шаблон » и откройте шаблон для редактирования. Первое, что нам нужно, это инициализировать модуль MleCMS в нашем шаблоне. Это даст нам переменные {$ lang_parent} и {$ lang_locale} позже.
Для этого добавьте {MleCMS action = 'init'} поверх Template перед чем-либо еще ( где {process_pagedata} ).

Следующим шагом является добавление нашего «переключателя языка», поэтому выберите место в вашем шаблоне, где вы хотите, чтобы он появился, и добавьте {MleCMS action = 'langs'} . Это создаст ссылки на наши родительские страницы (английский, немецкий).

Поскольку мы не хотим показывать наши языки как часть навигации, мы также должны отредактировать наш тег MenuManager в шаблоне. Найдите {menu} в вашем шаблоне и измените его на {menu childrenof = $ lang_parent} . В моем случае (используя NCleanBlue) это выглядит так:

{menu loadprops = '0' childrenof = $ lang_parent template = 'cssmenu_ulshadow.tpl'}.
И это то, что мы имеем до сих пор.

И это то, что мы имеем до сих пор

К сожалению, когда вы посмотрите на «Хлебные крошки», вы увидите, что там также показан «английский», поэтому, если вы похожи на меня, вам не понравится это в вашей «Хлебной крошке». К счастью, у нас есть решение и для этого, просто используя MenuManager вместо тега Breadcrumbs (Спасибо, Foaly *).
Перейдите в « Layout» MenuManager »и создайте новый шаблон, назовите его, например,« menu_breadcrumbs »и добавьте следующий код.

<div class = "breadcrumbs core-float-right"> {перевод текста = 'Вы здесь:'} {if $ lang_parent == 'en' && $ content_id! = '15'} {cms_selflink dir = 'start' menu = '1'} & raquo; {elseif $ lang_parent == 'de' && $ content_id! = '62'} {cms_selflink page = '62 'menu =' 1 '} & raquo; {/ if} {foreach from = $ nodelist item = node} {if $ node-> parent} <a href="‹$node-> url} "> {$ node-> menutext} </a> & raquo; {elseif $ node-> current} <a href="‹$node-> url} "{if! isset ($ get_title)} class =" selected "{/ if}> {$ node-> menutext} </ a > {/ if} {/ foreach} {if isset ($ get_title)} & raquo; <span class = "selected"> {$ get_title} </ span> {/ if} </ div>

Итак, что мы сделали выше?
Тег {translate} происходит из модуля MleCMS, он используется для перевода строк с использованием модуля MleCMS ( см. Вкладку Translate ), вы также можете использовать выходные данные из модулей, таких как {translate text = $ entry-> somefield}, или даже назначить этот тег и повторно использовать Это.

Затем мы проверяем, на каком языке мы находимся, и если content_id ( идентификатор страницы, наведите курсор на «заголовок страницы» в бэкэнде, чтобы найти идентификатор ) не совпадает с идентификатором английской или немецкой «домашней» страницы, на которую мы показываем ссылку «Домой», затем строится остальная часть пути Breadcrumb.

Вы также можете видеть, что я использовал переменную $ get_title . Если вы следили за некоторыми из моих других сообщений в блоге, как « Как поставить метатеги CMSMS на автопилот »Вы, вероятно, знаете, что мы можем назначить заголовок из других модулей и использовать его в нашем шаблоне в качестве заголовка (например, в News Detailtemplate: {assign var = 'get_title' value = $ entry-> title}.

В этом примере, если мы попадаем на страницу «Новости» и читаем полную новостную статью на странице «Подробности новости», наша крошка будет выглядеть как «Главная» Новости »Заголовок некоторых новостей»

А как насчет «глобальных блоков контента»?

Если вы регулярно используете CMSMS, вы будете знать, что глобальные блоки контента очень полезны, когда речь идет о контенте, который одинаков на всех страницах ( например, наличие некоторого текста тизера на боковой панели или чего-то подобного ). При использовании модуля MleCMS у вас есть другой способ использования такого рода контента, особенно если он должен быть переведен на используемые языки.

В этом случае, когда у нас будет текст «Призыв к действию» на боковой панели, который должен отображаться на английском и немецком языках, мы будем использовать функции модуля MleCMS, используя опции «Фрагменты» и «Блоки» в интерфейсе модуля.

Я пытаюсь сказать, что вам следует избегать использования «глобальных блоков контента», если вам нужны эти многоязычные. Вместо этого используйте фрагменты и блоки MleCMS, чтобы ограничить количество запросов к базе данных.

На данный момент у нас есть функциональный многоязычный сайт, и мы можем начать использовать его, но если мы хотим сделать наш сайт более гибким и использовать его не только для простого текста, нам, скорее всего, также потребуются некоторые модули.

Использование модулей с MleCMS

В настоящее время, когда речь идет о многоязычных сайтах и ​​модулях, особой гибкости нет, и мы не контролируем вывод модулей на основе языка. Хуже того, мы не контролируем структуру URL модуля.
Большинство контентных модулей в CMSMS предлагают либо своего рода настройки «Категории», либо возможность добавлять «Дополнительные поля». Это решения, которые мы можем использовать при создании многоязычного сайта.

Давайте кратко рассмотрим модуль новостей.

Модуль новостей, вероятно, является наиболее распространенным модулем, который вы будете использовать в большинстве своих проектов Модуль новостей, вероятно, является наиболее распространенным модулем, который вы будете использовать в большинстве своих проектов. Лучший способ использовать этот модуль на многоязычном сайте - это установить две категории: «Английский» и «Немецкий» в нашем примере, и, поскольку подкатегории поддерживаются, мы можем создавать общие категории в качестве подкатегорий на каждом языке.

После создания наших категорий, как показано на скриншоте, мы можем выбирать подкатегории на основе языка при написании статьи. При добавлении нашего тега News в шаблон мы должны убедиться, что мы также используем параметр «category». Кроме того, убедитесь, что вы используете Новости на боковой панели, чтобы показывать последние новости, которые вы указали в параметре «detailpage», таким образом вы можете сохранить структуру вашей страницы в чистоте и избежать попадания на «немецкий» язык при чтении английской новостной статьи.

По сути, вы могли бы использовать «Snippets» в модуле MleCMS, но, на мой взгляд, это приводит к ненужным запросам к базе данных, поэтому вы также можете использовать что-то в этом духе, чтобы достичь своей цели.

{if $ lang_parent == 'de'} {news detailpage = 'aktuelles' category = 'Deutsch *' number = '5' lang = 'de_DE'} {else} {news detailpage = 'news' category = 'English *' число = '5' lang = 'en_US'} {/ if}

Здесь мы проверили, находимся ли мы в данный момент на странице, где псевдоним родительской страницы равен «de», используя переменную $ lang_parent из модуля MleCMS. Если это так, у нас есть тег новостей, который показывает новости с «Deutsch», и с помощью * мы указываем, что подкатегории должны быть включены.

Если вышеприведенное не так, отображается «английский». Возможно, вы заметили, что я просто использовал {else} вместо проверки «en», поскольку у нас только два языка. Английский язык может быть использован в качестве языка по умолчанию, если другие не удается.

Пока все хорошо, но остается одна проблема.

Возможно, вы захотите показать «Дата публикации» при показе новостей на веб-интерфейсе, но вы заметите, что независимо от того, на каком языке вы говорите, «английский» ( в случае, если это язык по умолчанию, установленный в «Глобальных настройках» ) будет показано на рисунке.
При обычной установке на одном языке вы могли бы просто «исправить» эту проблему, установив для locale в файле config.php значение $ config ['locale'] = 'de_DE'; но поскольку мы используем многоязычный сайт, это нам мало помогает.

Решением этой проблемы является небольшой UDT, который использует PHP setlocale функция , Идея исходит из блога « Локализуйте свои даты ”Написано пользователем CMSMS Мануэлем, но я хотел запретить все операторы if внутри шаблона ( чтобы он был чище ), поэтому я воспользовался урезанным UDT« get_root_page », который можно найти на сайте cmsmadesimple.org в разделе« Поделитесь своими тегами " раздел.

Перейдите в раздел «Расширения» Пользовательские теги »и создайте новый UDT со следующим содержимым и назовите его« set_locale ».

$ gCms = cmsms (); $ smarty = $ gCms -> GetSmarty (); $ op = $ smarty-> get_template_vars ('content_obj'); $ current_id = $ smarty-> get_template_vars ('content_id'); $ temp = explode ('/', $ op-> mHierarchyPath); $ root_alias = $ temp [0]; $ temp = explode ('.', $ op-> mIdHierarchy); if ($ root_alias == 'de') {setlocale (LC_ALL, массив ('de_DE.UTF-8', 'de_DE @ euro', 'de_DE', 'german')); } else {setlocale (LC_ALL, array ('en_US.UTF-8', 'en_US', 'english')); }

Этот UDT проверяет псевдоним страницы корневой родительской страницы, в нашем случае это будет «de» и «en», затем в операторе if мы ищем «de» и меняем настройку языкового стандарта, используя «setlocale» на немецкий, по умолчанию у нас есть «английский». Когда вы сохраняете этот UDT, нажимая «Submit», переходите к шаблону вашей страницы и добавляете этот вновь созданный UDT поверх tempalte, используя тег {set_locale} ( set_locale происходит от имени UDT ).

Теперь, когда вы переключаете язык во внешнем интерфейсе, язык даты, отображаемый в новостной статье, должен меняться в соответствии с текущим языком.

Когда модуль не предлагает «Категории», вам придется использовать «Дополнительные поля». По сути, вы должны создать шаблон модуля, используя ту же технику, что описана выше, где мы использовали переменную $ lang_parent, чтобы показать правильную категорию новостей.

Другой вариант также заключается в простом использовании тега {translate}, который поставляется с модулем MleCMS. Идеальным примером для такого использования будет модуль FormBuilder, где все, что вам нужно перевести, - это некоторые метки форм и уведомления.

Я надеюсь, что вы получите основную идею о том, как работать с модулями на многоязычном сайте, используя MleCMS.

Как насчет результатов поиска?

Это очень распространенный вопрос, когда речь заходит о многоязычных сайтах в CMSMS, поскольку нет встроенной функции для фильтрации результатов по языку. Как бы ни был ограничен модуль поиска, это не означает, что это невозможно. С выходом CMSMS 1.10 Martinique существует также предпочтение выбора стандартного модуля поиска, то есть если у какого-либо разработчика модуля есть хорошая идея об альтернативном поиске. модуль, это просто вопрос времени, что мы увидим альтернативный модуль.

Итак, что мы можем сделать с результатами поиска?

Мы будем использовать другой UDT. Я на самом деле написал об этом в « Как добавить краткое содержание для результатов поиска “, Но это немного отличается, так как мы проверяем вывод“ URL ”из результатов поиска.

Перейдите в раздел «Расширения» Пользовательские теги »и создайте новый UDT с именем« get_alias »со следующим содержимым.

/ ** Получить псевдоним страницы из url * @params string $ params ['url'] * / $ gCms = cmsms (); $ cntnt = cmsms () -> GetContentOperations (); foreach ($ cntnt-> GetAllContent () как $ page) {if ($ page-> GetURL () == $ params ['url']) {$ return = ($ page-> mAlias); перерыв; }} if (! empty ($ params ['assign'])) {$ smarty = cmsms () -> GetSmarty (); $ smarty-> assign (trim ($ params ['assign']), $ return); } else {return $ return; }

Когда ваш UDT будет готов, перейдите в «Поиск по расширениям» и отредактируйте «Шаблон результатов». Мы собираемся использовать созданный UDT «get_alias» для получения псевдонима страницы из URL-адреса результатов поиска, затем, используя этот результат, мы будем использовать модуль CGSimpleSmarty для получения корневого псевдонима этой страницы, который должен вернуть «en »Или« де ». Получив этот результат, мы можем использовать переменную $ lang_parent, чтобы сравнить результаты поиска с текущим языком страниц и отобразить результаты, относящиеся к этому языку.

Поэтому наш «шаблон результатов» должен выглядеть примерно так:

{strip} <h3> {перевод текста = $ searchresultsfor} & quot; {$ фраза} & quot; </ h3> {if $ itemcount> 0} {foreach from = $ results item = entry} {get_alias url = $ entry-> url assign = 'set_alias'} {$ cgsimple-> get_root_alias ($ set_alias, 'is_lang')} {if $ entry-> module == 'News'} {if $ lang_parent == 'de'} {news category = " Deutsch * "detailpage = 'aktuelles'} {* вы можете создать шаблон результатов поиска и использовать для этого параметр summarytemplate *} {else} {news category =" English * "detailpage = 'news'} {/ if} {if $ is_lang = = $ lang_parent} <a href="‹$entry-> url} "> {$ entry-> urltxt} </a> {/ if} {/ foreach} {/ if} {/ strip}

Это оно! У нас есть результаты поиска, которые должны отображаться на основе текущего языка страницы. Часть с модулем новостей должна повторяться для каждого модуля, который вы используете и который возвращает результаты поиска.

Надеюсь, вам понравился этот пост и вы нашли несколько полезных советов.

Удачного хостинга,

Горан Илич

Ищете отличный CMSMS вариант хостинга? Смотреть не дальше, чем Arvixe Хостинг !

Как насчет результатов поиска?
Итак, что мы можем сделать с результатами поиска?