Для DocLister достаточно просто, указать контроллер lang_content, и все поля и урл, будут подменятся в зависимости от языка.
[[DocLister? &tpl=`@CODE:[+title+]` &controller=`lang_content`]]
[[DLMenu? &controller=`lang_menu`]]
Создаем конфигурацию по примеру:
<?php
$settings['display'] = 'vertical';
$settings['fields'] = array(
'title' => array(
'caption' => 'Title RU',
'type' => 'text'
),
'title_en' => array(
'caption' => 'Title EN',
'type' => 'text'
),
'title_ua' => array(
'caption' => 'Title UA',
'type' => 'text'
),
);
$settings['templates'] = array(
'outerTpl' => '<div class="images">[+wrapper+]</div>',
'rowTpl' => '<p>[+title[(_suffix)]+]</p>'
);
Здесь под каждый язык, мы создаем поле, а при выводе используем суффикс.
<?php
$settings['display'] = 'vertical';
$settings['fields'] = array(
'title' => array(
'caption' => 'Title RU',
'type' => 'text'
),
);
$settings['templates'] = array(
'outerTpl' => '<div class="images">[+wrapper+]</div>',
'rowTpl' => '<p>[+title+]</p>'
);
$bLang = \bLang\bLang::GetInstance($this->modx);
$settings = $bLang->bLangChangeMultitvFields($settings,['title'],'#caption# (#lang#)',['templates']);
В этом варианте, мы автоматичиски дублируем поля под каждый язык, и автоматичиски подменяем плейсхолдеры в шаблонах. Первый параметр - это как раз масив настроек. Второй масив из полями, для который нужно делать дубли. Третий - формат назнаний. Четвертный масив груп шаблонов, в который нужно подменять плейсхолдеры.
<?php
$settings = [
'caption' => 'All fields',
'settings' => [
'field' => [
'caption' => 'Text field',
'type' => 'text',
],
],
];
$bLang = \bLang\bLang::GetInstance($modx);
return $bLang->changeClientSettingsFields($settings,['field']);
Логика как и в multitv, метод сам сделает дубли в конфигурации. В шаблоне используем [(g_field)], значение само изменится в зависимости от языка.
В словаре создаем запись FL_lexicon, и для каждого языка пишем названия лексикона (соответствует названию папоп /assets/snippets/FormLister/core/lang)
Для ru russian-UTF8, для en english.
В вызов добавляем два параметра:
&lang=[(__FL_lexicon)]
&lexiconHandler=\bLang\bLangLexiconHandler
Внутри формы получить значение записи из словаря можем
В action нужно в начале написать [(_root)], чтоб форма отправлялась на нужную языковую версию
Тут все достаточно просто, названия фильтров выносим в словарь. И либо в кониге пишет в инпету для названия [(name)] либо в конфиге [(filter_[+tv_id+])] и в словаре создаем запись filter_41, где 41 - это id tv параметра.
Все параметры которые нужно менять, в зависимости от языка, необходимо вынести в дерево, каждому прописать значение для каждого языка. В возможных значений такой тв прописать
@EVAL return $modx->runSnippet("bLang", [ 'type'=>'getTreeParams', "parent"=>"6", 'firstEmpty'=>'1']);
bLang будет возвращать в зависимости от языка значение из нужного поля.
Для каждого языка создаем свой контейнер, и PageBuilder вызываем из нужным контейнером.