proxyfabio 28 января 2014 7 19

О пакете

Пакет добавляет для всех объектов типа modResource и их производных вкладку управления персональными словарями ресурса.

Управление разделами словаря(языками)

Управление словарями идет через панель компонента: Components > Xlexicon:

Следует обратить внимание на 3 основных параметра языка: ISO,Context,Status
Параметры
Status
Данная настройка регулирует доступность языка для вывода и словаря. Не активен === не доступен.
Context
Список контекстов, для которых доступен тот или иной язык.
ISO
Код языка. Является определяющей настройкой каждого словаря. На основе его формируется устанавливаемый cultureKey на сайте.

Управление словарями ресурса

Для ресурсов, к контекстам которых привязан активный раздел словаря, становится доступна спец. вкладка для управления словарем ресурса:


В процессе добавления новых языков будут появляться новые вкладки.Сохранение данных словаря происходит вместе с данными ресурса.

Особенности модуля


Установка базового языка
Формирование активных языков происходит на основе разделов словаря, созданных через панель управления разделами словаря. Для базового языка используются стандартные поля ресурса. Базовый языковой ключ сайта устанавливает настройка xlexicon.cultureKey_base. По-умолчанию ru.
Это значение используется как основное и добавляется в выборку всех активных языков

Подключение сторонних словарей
Возможно у вас уже есть лексиконы с занесенными туда переводами, которые вы хотите использовать на сайте. Добавьте их имена в системную настройку xlexicon.lexicon_list. Подключение всех перечисленных словарей произойдет автоматически.

Вывод данных ресурса
Модуль спроектирован таким образом, что для выводимого ресурса нет нужды использовать какие-то специальные теги. Значения словаря, актуальные активному cultureKey, автоматически будут подставлены в плейсхолдеры типа [[*]].

Взаимодействие со сторонними модулями
Если с выводом ресурса мы не имеем проблем, то сторонние модули придется настроить.
В основе популярных модулей типа Wayfinder, которые могут в том или ином виде оперировать существующими ресурсами, лежат методы getObject и getCollection и их вариации. Для вывода данных по ресурсам эти модули используют чанки.
Для возможности получения значений полей ресурса в чанке был создан спец. процессор web/dictionary/getfield:
Вызов:
[[!runprocessor?&res=`[[+docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]


Параметры:
res — id ресурса, поле которого мы хотим получить
field — имя поля ресурса
ns и action — параметры, отвечающие за логику данного сниппета

Примечание:
Из примера выше видно, что выборка идет через специальный сниппет-прослойку, отвечающий за вывод данных. Мы его вынуждены использовать, т.к. например в чанке нельзя исполнять php-код. В случае использования шаблонов на основе phpTemplates+Smarty мы освобождаемся от необходимости так делать. Просто запускаем процессор через метод api modx.

Примечание 2:
Если вы используете данный модуль, как основу для мультиязычного сайта, то вас никто не обязывает использовать данную прослойку. Можно сразу учитывать актуальный словарь для ресурса в запросах согласно связке ресурс–словарь. Так или иначе выбор за разработчиком.

Получение списка языков
Для вывода списка активных языков идет через процессор web/languages/getlist.
Вызов:
[[!runprocessor?ns=`xlexicon`&action=`web/languages/getlist`&ph=`langs`&row=`row`&outer=`outer`]]


Параметры:
row — чанк-шаблон для пункта списка
outer — чанк-шаблон для обертки списка
ph — плейсхолдер для вывода данных

Чтобы поменять актуальный язык достаточно передать на сервер требуемый cultureKey. Это можно сделать например через GET-параметр.

Примечание:
Пользователи phpTemplates+Smarty так мучиться не обязаны. Получаем данные, оборачиваем в шаблон :)

AJAX
Если работать с ajax-запросами через коннекторы, то нельзя нативно менять текущий язык. MODX в базовом варианте просто не рассчитан на такое для контекстов, отличных от mgr. Приходилось как-то влезать и встраивать код, реагирующий на изменение языка.

В модуле данная проблема была решена. Класс-обработчик запросов был расширен и прокачан. Теперь если посылать данные на коннектор, передавая с данными требуемый cultureKey, то в исполняемом коде системная настройка cultureKey будет реагировать на входные данные. Достаточно лишь передать в запросе {cultureKey:’iso-код языка’}.

Кэширование
Для кэширования результатов не используются дополнительные системы кэширования. Кэшер выбирается в зависимости от того, какой используется в системе.

Для статичных страниц модуль меняет префикс кэша в зависимости от текущего языкового ключа.

Для основных процессоров, выдающих данные, кэширование тоже предусмотрено. По-умолчанию оно включено. Настройки, отключающей кэширвоание, не предусмотрено.

Плюшки
В модуле создано 3 чанка с примерами:
example_connectortest — чанк-пример, демонстрирующий работу модуля с ajax.
example_wf_row — пример вывода пункта меню для Wayfinder.
example_xlexicon — комплексный пример, демонстрирующий работу (2 предыдущих чанка включены туда).
19 комментариев
f
firstgm 25 марта 2015г в 22:19 #
После установки пакета захожу в Приложения >> xlexicon и получаю ошибку:

Fatal error: require_once() [function.require]: Failed opening required 'W:/domains/holograma/core/components/xlexicon/controllers/index.class.php' (include_path='.;W:/modules/php/PHP-5.3.23/;W:/modules/php/PHP-5.3.23/PEAR') in W:\domains\holograma\core\model\modx\modmanagercontroller.class.php on line 936
Fi1osof1
Fi1osof 25 марта 2015г в 22:32 #
Вот заплатка. Просто перепишите содержимое этого файла и все. Руки не доходят собрать новый пакет, все времени нет.
f
firstgm 25 марта 2015г в 22:38 #
Ага, теперь все ОК. Спасибо.
Времени никогда не хватает, если постоянно откладывать, так руки и не дойдут ;)
Fi1osof1
Fi1osof 25 марта 2015г в 23:56 #
Вы можете поторопить процесс:) Внизу есть форма. Штуку-другую закините на эти цели и полетит дело:) А так пока более важные дела есть (включая и другие бесплатные, но более приоритетные модули).
f
firstgm 25 марта 2015г в 22:59 #
А как переключатель языка сделать и как это выглядит в URL? Не пойму, что-то…
f
firstgm 25 марта 2015г в 23:18 #
Подключил чанк [[$example_xlexicon]] и все понял )
Жаль URL получается вида: site.ru/?cultureKey=en
site.ru/en/ — так солиднее смотрится

И еще не подскажите, как быть с текстами, которые остаются непосредственно в шаблонах или чанках, как их переключать на другой язык?
Неужели все до мелочей нужно помещать в Ресурсы?
Даже банальную надпись в footere "Компания Название 2015. Все права защищены." тоже что ли помещать в Ресурсы, по-моему, как то глупо получится…
proxyfabio1
proxyfabio 25 марта 2015г в 23:20 #
Для фикс. записей есть лексиконы
f
firstgm 25 марта 2015г в 23:34 #
Приведите пример пожалуйста.
proxyfabio1
proxyfabio 25 марта 2015г в 23:36 #
`$modx->lexicon('school.basketball')`
f
firstgm 01 апреля 2015г в 04:25 #
По лексикону за подсказку спасибо! ) Я им еще не пользовался поэтому пришлось разбираться…
Ожидал ответ более конкретный конечно, ну вроде сам разобрался.

А на будущее может кому пригодится:
1. В Управлении словарями >> Создаем запись — на тех языках, которые нужно
2. Вызываем в нужном месте через модификатор [[%имя_записи]]
proxyfabio1
proxyfabio 25 марта 2015г в 23:21 #
До `site.ru/en/` все руки не доходят
Tramp13571
Tramp1357 26 августа 2015г в 21:33 #
Сергей, добрый день.
У меня клиент просит именно `site.ru/en/`
Не подскажешь, в каком направлении двигаться, чтобы допилить компонент?
Насколько я понимаю, на входе нужно поменять логику в xlexicon::sanitizeCultureKey()
А как сделать, чтобы на выходе получался нужный uri?
proxyfabio1
proxyfabio 30 августа 2015г в 20:03 #
Привет.

Зависит от структуры сайта. Если страницы под en нет, то ловить плагином ссылки с en на событие onPageNotFound и отсылать на обычную страницу, попутно выставляя en, как cultureKey.
Также придется написать что-то кастомное для формирования правильного урл в зависимости от текущего языка.
Я бы в таком ключе действовал.
Tramp13571
Tramp1357 30 августа 2015г в 20:06 #
Понял, спасибо. Буду пробовать.

spector1
spector 22 января 2016г в 10:58 #
Для моей текущей задачи решил это вопрос путем добавления RewriteRule в файл .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^(ru|en)/ /ru%{REQUEST_URI} [L,R=301]
RewriteRule ^(ru|en)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]

Все на первый взгляд адекватно работает…
Т.е. ссылки с ./ru/ и /en/ передаются как ссылки с соответствующим параметром cultureKey. Русский язык по умолчанию. Так же необходимо в директории manager переименовать файл ht.access в .htaccess(в этом файле отключается переадресация)
spector1
spector 22 января 2016г в 11:22 #
Да, и в папке ./connectors/ тоже надо добавить файл .htaccess отключающий переадресацию, с содержимым:

RewriteEngine Off

Tramp13571
Tramp1357 22 января 2016г в 11:41 #
Я примерно так и начинал делать, но потом сообразил, что этого мало. Нужно еще, чтобы все ссылки на сайте генерировались не как
«page_addr?cultureKey=en», а как
«page_addr/en»
вот тут и застопорилась разработка :(
spector1
spector 22 января 2016г в 11:51 #
В шаблонах вывода просто учитывать

$modx->getOption('classKey').'/'.[alias]

И так по мере необходимости везде учитывать classKey и, на мой взгляд, проблем не должно быть
Tramp13571
Tramp1357 22 января 2016г в 11:56 #
Конечно, это вариант. Но я в то время переносил сайт, в котором в самом контенте было немало ссылок типа [[~444]]. Вот тут дело и встало, а не тот момент я не рискнул лезть в парсер MODX
spector1
spector 22 января 2016г в 12:21 #
То что xlexicon по умолчанию передает просто параметр cultureKey — это нормально, по такому же принципу построены практически все мультиязычные сайты и компоненты, только параметр может называться по другому, а формирование СЕО-дружесвенных урлов из GET параметра происходит на уровне сервера. В том же самом Babel еще надо плагином переключать контент и в два раза увеличивать дерево ресурсов.
spector1
spector 22 января 2016г в 12:26 #
описался
переключать контекст
Tramp13571
Tramp1357 22 января 2016г в 13:04 #
знаю, на babel и делал. требование заказчика было конкретным — ...page/en/…
и чтобы в контенте все ссылки были именно такие. :)
spector1
spector 22 января 2016г в 14:40 #
Плагин на событие OnBeforeDocFormSave, в котором урлам добавлять [[++cultureKey]]/, при отсутствии такого.
все же можно решить)
f
firstgm 30 марта 2015г в 13:10 #
Добрый день! ) Подскажите еще пожалуйста, почему там, где вывод через getResources текст не переключается на другой язык:
[[!getResources? 
&parents=`21` 
&includeTVs=`1` 
&hideContainers=`1` 
&showHidden=`1` 
&sortdir=`ASC`
&tpl=`tpl.news` 
&limit=`3`]]


В чанках все стандартно: [[+pagetitle]] [[+description]] и т.д.
Fi1osof1
Fi1osof 30 марта 2015г в 19:08 #
Потому что текст переключает сниппетом по названию поля, а не просто так меняются плейсхолдеры.
[[!runprocessor?&res=`[[+docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
f
firstgm 31 марта 2015г в 02:01 #
Я так пробовал, тогда просто вместо заголовка из плейсхолдера [[+pagetitle]] везде просто пишется «Главная» то есть название первого документа в ресурсах.
f
firstgm 01 апреля 2015г в 04:16 #
Николай, так как правильно выводить id тогда, подскажите пожалуйста?
[[!runprocessor?&res=`[[+docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]

&res=`[[+docid]]` — вот тут что-то не так просто… Пробовал по разному [[*docid]] [[~[[*docid]]]] [[~[[+id]]]]
Все равно выводит заголовок первого Ресурса — «Главная»
Fi1osof1
Fi1osof 01 апреля 2015г в 18:46 #
Смотрите какой плейсхолдер в getResources содержит id документа в итерации. Совершенно не факт, что это [[+docid]]
f
firstgm 01 апреля 2015г в 19:05 #
Решено! Вот что значит на свежую голову ;)
[[!runprocessor?&res=`[[+id]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
Fi1osof1
Fi1osof 01 апреля 2015г в 19:06 #
Вот и здорово :)
U
Ulugbek Nuriddinov 02 апреля 2015г в 16:31 #
Modx Revo 2.3.3
Почему когда открываю через Приложение — Xlexicon показывает пустую страницу…
Fi1osof1
Fi1osof 02 апреля 2015г в 16:38 #
Смотрите комментарий выше.
Пустая страница — потому что критическая ошибка, а вывод ошибок отключен в настройках сервера. Прокачивайтесь по отладке.
s
shadow 22 августа 2015г в 18:02 #
Доброго дня! Xlexicon не размещался в репозитарии modx.com? Не планируете?
proxyfabio1
proxyfabio 23 августа 2015г в 06:45 #
На данный момент есть пара багов с совместимостью. Исправить руки не доходят. Как будет исправлено — появится.
U
Ulugbek Nuriddinov 19 сентября 2015г в 12:12 #
Здравствуете, немогу получить список языков. Можете объяснить?
[[!runprocessor?ns=`xlexicon`&action=`web/languages/getlist`&ph=`langs`&row=`row`&outer=`outer`]] вставил на шаблон. но пусто (((
U
Ulugbek Nuriddinov 21 сентября 2015г в 16:06 #
[[!runprocessor?&res=`[[+id]]`&field=`content`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
как сделать контент как [[+content:ellipsis=`100`]]
proxyfabio1
proxyfabio 21 сентября 2015г в 16:22 #
Для текущего ресурса нет смысла получать контент через вызов сниппета. Значение, соответствующее текущему языковому ключу, доступно напрямую.
z
zvorchik 30 января 2017г в 16:46 #
[[!runprocessor::strip_tags:ellipsis=`50`?..
или просто
[[!runprocessor:ellipsis=`50`?..
proxyfabio1
proxyfabio 21 сентября 2015г в 16:20 #
Пусто в плейсхолдере `[[+langs]]`?
p
panama 17 октября 2016г в 16:58 #
здравствуйте, хотела бы вернутся к вышеупомянутой задаче. Как все-таки сделать ссылки, к примеру, не site.com/text/text/?cultureKey=en, а site.com/en/text/text?? Не используя контексты
Fi1osof1
Fi1osof 17 октября 2016г в 22:18 #
Изучите это: modxclub.ru/blog/168.html
Перехватывайте запросы на OnHandleRequest, подменяйте УРЛ и выставляйте culture_key, должно все работать без проблем. Компонент просто реагирует на то, какой culture_key сейчас выставлен в MODX.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.