Иван Бондаренко
28 янв. 2014 г., 8:28

Extended Lexicon (xlexicon) - компонент для реализации многоязычности

Здравствуйте, хочу представить вашему вниманию компонент Extended Lexicon (xlexicon), написанный специалистами MODX-Клуба. Extended Lexicon включает все, что нужно для организации мультиязычности на сайте. При этом администрировать такой сайт будет просто и удобно.

Зачем нужен xlexicon?

Компонентов, позволяющих создать мультиязычный сайты на MODX Revolution, не так много и фактически, кажущаяся весьма простой задача по реализации мультиязычности на самом деле является весьма сложной. Очень часто эту проблему решают путем создания нескольких контекстов, но это неудобно с точки зрения администрирования. Представьте, что сайт часто обновляется, и каждый раз приходится искать или создавать страницы в нескольких контекстах одновременно. А что если языков не два, а больше и сайт состоит из множества страниц? Администратору такого ресурса не позавидуешь.
Когда встала необходимость реализовать многоязычность мы решили написать свой компонент, который подходил бы под наши требования удобства и функциональности. Изначально компонент начинал разрабатывать Валентин Расулов, но потом приостановил работу над расширением и дал добро на доработку. Мы хорошо поработали над функционалом и в результате появился Extended Lexicon.

Основные плюсы

Переводы для любых типов страниц
Первое и, возможно, самое главное: компонент рассчитан на создание словарей для любых типов страниц, как стандартных modResource, так и любых других. Это значит, что xlexicon совместим с другими компонентами, формирующими другие типы страниц.
Удобство администрирования.
Фактически Вы открываете только одну страницу и получаете доступ ко всем вариантам ее перевода. На сайте может быть сколь угодно много языков, и при этом все переводы конкретной страницы находятся в одном ресурсе в Админке. Панель управления переводами встраивается в стандартное окно редактирования ресурса.
?
Такое решение позволяет создавать и редактировать страницы для мультиязычного сайта без необходимости искать версию каждой страницы в разных контекстах. Это очень удобно и экономит время.
Управление языками осуществляется также просто и удобно. Для этого нужно перейти в панель управления модулем xlexicon в верхнем меню. Вы увидите все текущие языки и сможете добавить, удалить или изменить языки по своему желанию. Изменения сразу отразятся на сайте. Допустим при добавлении нового языка каждая страница на сайте автоматически получит новую закладку для вставки туда соответствующего перевода.
MODX теги обрабатываются для всех языков
При выводе документа не нужно менять стандартные MODX теги. То есть тег [[*pagetitle]] будет обработан и будет подставлено значение в зависимости от языка страницы. Проще говоря, если вы находитесь на Русской странице – увидите Русский pagetitle, а если на Английской – Английский. Это значительно облегчает работу с шаблонами. Пока что поддерживаются только основные изменяемые теги.
AJAX запросы с языковым ключом
В MODX для реализации AJAX запросов к серверу Вы можете пользоваться встроенными классами коннекторов, обрабатывающих запросы из панели управления. Но есть один минус. Они изначально рассчитаны на учет языкового ключа только для админки. В модуле эта проблема решена. Т.е. вы можете передавать языковой ключ и получать ответы от сервера на языке, который запрашивался.
Компонент работает под MODX Revolution Установить xlexicon можно из нашего репозитория http://rest.modxstore.ru/extras/ или из официального репозитория MODX. С подробной документацией можете ознакомиться по ссылке Xlexicon manual
Молодцы что взялись и допилили хорошую вещь
Мы старались :) А тебе вот еще за это спасибо! modxclub.ru/blog/vehicles/315.html
спасибо за очень нужный компонент, есть такой вопрос: с его помощью можно перевести меню, сформированное wayfinder-ом?
Можно, но придется немного подшаманить шаблоны, т.к. вейфайндер дергает объект напрямую. Код сниппета ниже. Нужно просто заменить плейсхолдер, выводящий название пункта меню, на него. Также почитай мануал по модулю. Там освещены базовые моменты.
Сниппет:
[[!runprocessor?&res=`[[+wf.docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
отлично, спасибо, только собирался искать мануал.
Сергей, позволь мне свои 5 копеек…
1. ns=`xlexicon`&action=`web/dictionaries/getfield` Их имеет смысл закинуть в свойства плагина по умолчанию.
2. Я тут немного допилил его, чтобы он вызывался как модификатор (только переименовал его в xlexicon):
<?php $output = ''; if(!$res AND !empty($modx->resource)){ $scriptProperties['res'] = $modx->resource->id; } if(!$field AND !empty($options)){ $scriptProperties['field'] = $options; } $params = array(); //............ Далее твой код
Пример вызова: [[!*pagetitle:xlexicon=`pagetitle`]]
Но, к примеру, для Wayfinder-а он как модификатор не годится, так как для него требуется передача трех параметров (res (resource_id), key, field). У нас же здесь только два параметра (input и options). Как-то я не нашел вариантов передавать в модификатор поппараметры, поэтому приходится все равно прописывать в виде вызываемого сниппета.
В целом так и есть. Слишком много параметров.
Облегчить сниппет — хорошая мысль. Но в планах скорее связать модуль с modxSite и использовать runprocessor оттуда. В таком случае так или иначе передавать ns и action, хотя можно просто запилить набор параметров и вызывать сниппет с ним. Думаю так будет более универсально.
Но в планах скорее связать модуль с modxSite и использовать runprocessor оттуда
Разницы нет. От этого кол-во входящих параметров не изменится.
хотя можно просто запилить набор параметров и вызывать сниппет с ним
Это не решает проблемы передачи трех параметров — id ресурса, языковой ключ и поле документа.
хотя можно просто запилить набор параметров и вызывать сниппет с ним Это не решает проблемы передачи трех параметров — id ресурса, языковой ключ и поле документа.
Трех нет, пяти да.
Да и языковой ключ не нужно передавать. Он берется автоматом от текущего cultureKey. Только 2 параметра остается id русурса и поле документа.
А как передать языковой ключ( чтобы изменить язык)? Т.е. насколько я понял — cultureKey — настройка контекста. как ее поменять? Т.е. у меня один контекст ( в нем cultureKey — ru), я хочу добавить латышский язык — захожу в компоненты -> xlexicon -> добавляю язык( по мануалу). Редактирую страницы( заполняю вкладку dictionaries). если в ручную теперь в контексте выставить lv — ничего не меняется- главная как называлась по русски — так и называется(title).
В контексте ничего выставлять не надо. Настройка cultureKey будет меняться в зависимости от того, какой языковой ключ сейчас актуален. Добавил новый язык, выставил в настройках компонента базовый cultureKey. Остается только в GET передать ?cultureKey=lv
Внимательно ознакомься в мануале с пунктами «Установка базового языка» и «Получение списка языков».
про get — спасибо, кстати, может стоит добавить в мануал.
Это есть в разделе Особенности модуля > получение списка языков
Дико извиняюсь, уважаемые! Во-первых, большое спасибо за компонент! Уж очень хочется в нем разобраться… Установил, поставил словарь, перевёл одну статью для примера… а как отобразить английскую версию? Извините ради всех живых ежели я пятисотый кто задает такие дурацкие вопросы, но я очень надеюсь на вашу поддержку! Заранее благодарю!
пробовал прописать /index.php?cultureKey=en без изменений… или я не правильно понял пост выше?
Создал словарь, наполнил статью, сбросил кеш сайта. Если через get передать cultureKey, то данные ресурса должны были автоматически подмениться. Скорее всего дело в кеше. Если не поможет, то скинь доступы в личку. Посмотрю в чем дело.
решил просмотреть логи ошибок и натолкнулся на уйму подобных:
[2014-02-02 18:18:45] (ERROR @ /connectors/resource/index.php) Path specified for package translations is not a valid or accessible directory: /home/v/vladim20ru/public_html/core/components/translations/model/ [2014-02-02 18:18:45] (ERROR @ /connectors/system/derivatives.php) Path specified for package translations is not a valid or accessible directory: /home/v/vladim20ru/public_html/core/components/translations/model/ [2014-02-02 18:18:45] (ERROR @ /connectors/system/contenttype.php) Path specified for package translations is not a valid or accessible directory: /home/v/vladim20ru/public_html/core/components/translations/model/ [2014-02-02 18:18:45] (ERROR @ /manager/components/xlexicon/connectors/dictionaries.php) Path specified for package translations is not a valid or accessible directory: /home/v/vladim20ru/public_html/core/components/translations/model/
и их очень много… с чем это может быть связано?
Проверяйте права доступа к директориям.
Интересует, как такой метод мультиязчности повлияет на SEO
Если итоговые адреса разных языковых версий одинаковые, то конечно ничего хорошего из этого не получится. Правильней делать на различные поддомены и вешать плагин на OnHandleRequest, в котором прописать в зависимости от того, какой домен текущий, установку нужного cultureKey и cache_prefix. Тогда у вас разные языковые версии сайтов будут на разных доменах/поддоменах. К сожалению, сейчас не можем продемонстрировать готовый вариант, но скоро будет дополненная версия пакета как раз с такими возможностями.
Великодушно извиняюсь, но после установки модуля из репозитория во вкладке приложения xlexicon не запускается, вместо него пустой экран, revo 2.3.3. Помогите разобраться, очень нужная вещь по описанию. Либо подскажите аналог как в evoBabelLexicon
Fatal error: require_once(): Failed opening required '......../public_html/core/components/xlexicon/controllers/index.class.php' (include_path='.:/usr/share/php:/usr/share/pear') in /........./public_html/core/model/modx/modmanagercontroller.class.php on line 936
Да, на MODX2.3 оно робить не хотит. Я догадываюсь о причинах, сейчас попробую пофиксить.
Попробуйте вот это дописать в контроллер. Должно помочь. Позже выпустим пакет с багфиксом.

Добавить комментарий