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

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

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

Когда встала необходимость реализовать многоязычность мы решили написать свой компонент, который подходил бы под наши требования удобства и функциональности. Изначально компонент начинал разрабатывать Валентин Расулов, но потом приостановил работу над расширением и дал добро на доработку. Мы хорошо поработали над функционалом и в результате появился Extended Lexicon.


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

Переводы для любых типов страниц
Первое и, возможно, самое главное: компонент рассчитан на создание словарей для любых типов страниц, как стандартных modResource, так и любых других. Это значит, что xlexicon совместим с другими компонентами, формирующими другие типы страниц.

Удобство администрирования.
Фактически Вы открываете только одну страницу и получаете доступ ко всем вариантам ее перевода. На сайте может быть сколь угодно много языков, и при этом все переводы конкретной страницы находятся в одном ресурсе в Админке. Панель управления переводами встраивается в стандартное окно редактирования ресурса.

xlexicon

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

Управление языками осуществляется также просто и удобно. Для этого нужно перейти в панель управления модулем xlexicon в верхнем меню. Вы увидите все текущие языки и сможете добавить, удалить или изменить языки по своему желанию. Изменения сразу отразятся на сайте. Допустим при добавлении нового языка каждая страница на сайте автоматически получит новую закладку для вставки туда соответствующего перевода.

MODX теги обрабатываются для всех языков
При выводе документа не нужно менять стандартные MODX теги. То есть тег [[*pagetitle]] будет обработан и будет подставлено значение в зависимости от языка страницы. Проще говоря, если вы находитесь на Русской странице – увидите Русский pagetitle, а если на Английской – Английский. Это значительно облегчает работу с шаблонами. Пока что поддерживаются только основные изменяемые теги.

AJAX запросы с языковым ключом
В MODX для реализации AJAX запросов к серверу Вы можете пользоваться встроенными классами коннекторов, обрабатывающих запросы из панели управления. Но есть один минус. Они изначально рассчитаны на учет языкового ключа только для админки. В модуле эта проблема решена. Т.е. вы можете передавать языковой ключ и получать ответы от сервера на языке, который запрашивался.

Компонент работает под MODX Revolution
Установить xlexicon можно из нашего репозитория http://rest.modxstore.ru/extras/ или из официального репозитория MODX.
С подробной документацией можете ознакомиться по ссылке Xlexicon manual
27 комментариев
vanchelo1
vanchelo 29 января 2014г в 00:34 #
Молодцы что взялись и допилили хорошую вещь
Fi1osof1
Fi1osof 29 января 2014г в 00:48 #
Мы старались :)
А тебе вот еще за это спасибо! modxclub.ru/blog/vehicles/315.html
S
Sindibober 29 января 2014г в 01:08 #
спасибо за очень нужный компонент, есть такой вопрос: с его помощью можно перевести меню, сформированное wayfinder-ом?
proxyfabio1
proxyfabio 29 января 2014г в 01:29 #
Можно, но придется немного подшаманить шаблоны, т.к. вейфайндер дергает объект напрямую.
Код сниппета ниже.
Нужно просто заменить плейсхолдер, выводящий название пункта меню, на него.
Также почитай мануал по модулю. Там освещены базовые моменты.
proxyfabio1
proxyfabio 29 января 2014г в 01:33 #
Сниппет:
[[!runprocessor?&res=`[[+wf.docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
S
Sindibober 29 января 2014г в 01:43 #
отлично, спасибо, только собирался искать мануал.
Fi1osof1
Fi1osof 29 января 2014г в 10:07 #
Сергей, позволь мне свои 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();
//............ Далее твой код
Fi1osof1
Fi1osof 29 января 2014г в 10:23 #
Пример вызова: [[!*pagetitle:xlexicon=`pagetitle`]]

Но, к примеру, для Wayfinder-а он как модификатор не годится, так как для него требуется передача трех параметров (res (resource_id), key, field). У нас же здесь только два параметра (input и options). Как-то я не нашел вариантов передавать в модификатор поппараметры, поэтому приходится все равно прописывать в виде вызываемого сниппета.
proxyfabio1
proxyfabio 29 января 2014г в 12:46 #
В целом так и есть. Слишком много параметров.

Облегчить сниппет — хорошая мысль. Но в планах скорее связать модуль с modxSite и использовать runprocessor оттуда. В таком случае так или иначе передавать ns и action, хотя можно просто запилить набор параметров и вызывать сниппет с ним. Думаю так будет более универсально.
Fi1osof1
Fi1osof 29 января 2014г в 13:30 #
Но в планах скорее связать модуль с modxSite и использовать runprocessor оттуда
Разницы нет. От этого кол-во входящих параметров не изменится.

хотя можно просто запилить набор параметров и вызывать сниппет с ним
Это не решает проблемы передачи трех параметров — id ресурса, языковой ключ и поле документа.
proxyfabio1
proxyfabio 29 января 2014г в 13:44 #
хотя можно просто запилить набор параметров и вызывать сниппет с ним
Это не решает проблемы передачи трех параметров — id ресурса, языковой ключ и поле документа.
Трех нет, пяти да.

Да и языковой ключ не нужно передавать. Он берется автоматом от текущего cultureKey. Только 2 параметра остается id русурса и поле документа.
S
Sindibober 29 января 2014г в 14:01 #
А как передать языковой ключ( чтобы изменить язык)? Т.е. насколько я понял — cultureKey — настройка контекста. как ее поменять? Т.е. у меня один контекст ( в нем cultureKey — ru), я хочу добавить латышский язык — захожу в компоненты -> xlexicon -> добавляю язык( по мануалу). Редактирую страницы( заполняю вкладку dictionaries). если в ручную теперь в контексте выставить lv — ничего не меняется- главная как называлась по русски — так и называется(title).
proxyfabio1
proxyfabio 29 января 2014г в 14:19 #
В контексте ничего выставлять не надо. Настройка cultureKey будет меняться в зависимости от того, какой языковой ключ сейчас актуален.
Добавил новый язык, выставил в настройках компонента базовый cultureKey.
Остается только в GET передать ?cultureKey=lv
S
Sindibober 29 января 2014г в 14:25 #
про get — спасибо, кстати, может стоит добавить в мануал.
proxyfabio1
proxyfabio 29 января 2014г в 14:29 #
Это есть в разделе Особенности модуля > получение списка языков
proxyfabio1
proxyfabio 29 января 2014г в 14:21 #
Внимательно ознакомься в мануале с пунктами «Установка базового языка» и «Получение списка языков».
muzapapa1
muzapapa 02 февраля 2014г в 17:06 #
Дико извиняюсь, уважаемые! Во-первых, большое спасибо за компонент!
Уж очень хочется в нем разобраться…
Установил, поставил словарь, перевёл одну статью для примера… а как отобразить английскую версию? Извините ради всех живых ежели я пятисотый кто задает такие дурацкие вопросы, но я очень надеюсь на вашу поддержку!
Заранее благодарю!
muzapapa1
muzapapa 02 февраля 2014г в 17:11 #
пробовал прописать /index.php?cultureKey=en
без изменений… или я не правильно понял пост выше?
proxyfabio1
proxyfabio 02 февраля 2014г в 17:41 #
Создал словарь, наполнил статью, сбросил кеш сайта.
Если через get передать cultureKey, то данные ресурса должны были автоматически подмениться. Скорее всего дело в кеше. Если не поможет, то скинь доступы в личку. Посмотрю в чем дело.
muzapapa1
muzapapa 11 февраля 2014г в 23:39 #
решил просмотреть логи ошибок и натолкнулся на уйму подобных:
[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/

и их очень много…
с чем это может быть связано?
proxyfabio1
proxyfabio 12 февраля 2014г в 13:14 #
Проверяйте права доступа к директориям.
m
msk13s 01 апреля 2014г в 18:25 #
Интересует, как такой метод мультиязчности повлияет на SEO
Fi1osof1
Fi1osof 02 апреля 2014г в 10:53 #
Если итоговые адреса разных языковых версий одинаковые, то конечно ничего хорошего из этого не получится. Правильней делать на различные поддомены и вешать плагин на OnHandleRequest, в котором прописать в зависимости от того, какой домен текущий, установку нужного cultureKey и cache_prefix. Тогда у вас разные языковые версии сайтов будут на разных доменах/поддоменах.
К сожалению, сейчас не можем продемонстрировать готовый вариант, но скоро будет дополненная версия пакета как раз с такими возможностями.
А
Александр Избицкий 06 марта 2015г в 11:04 #
Великодушно извиняюсь, но после установки модуля из репозитория во вкладке приложения xlexicon не запускается, вместо него пустой экран, revo 2.3.3. Помогите разобраться, очень нужная вещь по описанию. Либо подскажите аналог как в evoBabelLexicon
proxyfabio1
proxyfabio 06 марта 2015г в 13:27 #
В логах что пишет?
Fi1osof1
Fi1osof 06 марта 2015г в 14:29 #
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 оно робить не хотит. Я догадываюсь о причинах, сейчас попробую пофиксить.
Fi1osof1
Fi1osof 06 марта 2015г в 14:40 #
Попробуйте вот это дописать в контроллер. Должно помочь.
Позже выпустим пакет с багфиксом.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.