[localizator] Мультиязычность, СЕО, автоперевод...
Языковые версии \ сателиты без контекстов, с автоматическим переводом всех полей ресурса + сео, да еще и автоперевод лексиконов — это я уместил в названии localizator.
Зачем я это сделал: бабeл мне ниразу не подошел, долго я держал один проект на migx «локализации», но слишком он не удобен, собрал все минусы которые успел выявить и решил их в своем компоненте.
Возможности
1. Создание псевдоконтекстов «локализации» (можно вместе работать через site.ru/en/ и ch.site.ru)
2. У ресурса есть таб, где заполняются все стандартные поля ресурса + сео, далее по нажатию кнопки это все можно перевести на другие языки, поле контента пока что поддерживает только tiny mce rte.
3. Для удобства пользования лексиконами есть отдельные таб на странице компонента, где видны только лексиконы компонента. Там же выбор языка. Тут тоже есть автоматизация перевода, одно нажатие кнопки.
Локализация pdoTools
Про работу с pdoResources и pdoMenu не забыл, вот пример:
{'!pdoMenu' | snippet : [
'parents' => 0,
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
]}
Итого все поля ресурса заменяются на переведенные.Как использовать
Все поля ресурса подменяются локализированными, кроме content, он выводится через {$_modx->resource.localizator_content}.
Настройки
Для автоматизации перевода нужен api key для яндекс переводчика, получить можно тут: translate.yandex.ru/developers/keys и указать в настройке localizator_key_yandex, так же что бы переводчик понимал с какого языка переводить нужно указать ключ локализации в localizator_default_language
Стоимость
Компонент полностью бесплатен, делал для своего проекта, думаю многим облегчит жизнь.
Отправить свое спасибо можно тут: yasobe.ru/na/localizator или попросить у меня номер карты в лс :)
Демо: localizator.but1head.ru/
Компонент отправил в modstore.pro, исходники на github.com/but1head/localizator
Комментарии: 353
Интересное решение. Пока не знаю где применить, но жопой чую уверен, что пригодится и не раз.
P.S. Ссылка на Git не работает.
P.S. Ссылка на Git не работает.
Автору респект. Теперь мультиязычность сайтов перестанет быть головной болью, с кучей контекстов и дублей ресурсов.
Круто получилось!
И никаких плагинов, контекстов и дополнительных настроек!
И никаких плагинов, контекстов и дополнительных настроек!
Круто, не терпится попробовать, а на github.com/but1head/localizator — 404
Залил на github
Спасибо! И вопрос, если не сильно отвлекаю, на рабочий сайт ставить можно?
PS По описанию это похоже на Lingua (там тоже поля документа создаются для каждого языка. Очень интересно попробовать и сравнить, и да, сателлиты как раз делаю прямо сейчас, до чего же кстати, если все поойдет)
PS По описанию это похоже на Lingua (там тоже поля документа создаются для каждого языка. Очень интересно попробовать и сравнить, и да, сателлиты как раз делаю прямо сейчас, до чего же кстати, если все поойдет)
Уже вижу «A MODX's Lexicon switcher for front-end interface.», у меня одной из задач было уйти от лексиконов.
По поводу полей — создаются только pagetitle, longtitle, menutitle, introtext, description, content, seotitle, keywords, и подменяются если нужно. В настройках можно задать только перевод определенных полей.
Демо вполне рабочее, только там pdoTools не понимает что главная в /en/ это не / (ссылка), пока не знаю как его обучить, руками в чанке можно поправить.
На боевой проект в теории можно, я пока перестраиваю свой проект на эту связку.
По поводу полей — создаются только pagetitle, longtitle, menutitle, introtext, description, content, seotitle, keywords, и подменяются если нужно. В настройках можно задать только перевод определенных полей.
Демо вполне рабочее, только там pdoTools не понимает что главная в /en/ это не / (ссылка), пока не знаю как его обучить, руками в чанке можно поправить.
На боевой проект в теории можно, я пока перестраиваю свой проект на эту связку.
кстати, в Lingua
Даже для минишопа пробовал — было «почти» хорошо.
Lexicon switcher— это не связано с лексиконами MODX, просто переключает поля в документе в соответствии с выбранным с фронтенда языком.
Даже для минишопа пробовал — было «почти» хорошо.
«перевести все» и чтоб крон обратабывалотличная идея!
Компонент отправил в modstore.pro— что-то долго не появляется. Будет ли доступен в modstore.pro?
Давно уже отправил, modstore видимо уехали в Алматы на встречу
Точно.
Как правильно прописать base href="{$_modx->config.site_url}" для такого варианта s9732.h8.modhost.pro/en/?
Сейчас у меня там выводится только домен.
Сейчас у меня там выводится только домен.
баг с ссылкой на главную, всегда кидает на «голый домен»В случае поддомена — нет проблемы, а с «папочными» вариантами скидывает на оригинальный язык
P.S.: Видел для мультиязычности на MODX проект SLI (github), но обновлялся годы назад, плюс идет поверх системы, поэтому экспериментировать с ним не решился. Нативное решение очень радует). Отключенный перевод контента — это супер))
Афигенно! =) Очень часто делал мультиязычные сайты, на 3-4 языках. Это просто идеальное решение, без контекстов! Спасибо автору!
Однако опередил) Пишу такой же компонент…
modstore.pro/packages/utilities/localizator Пакет в модстор
есть сайт site.ru и есть сайт site.com так будет расширение работать?
Я даже не знаю как ответить на этот вопрос.
Делаете 2 псевдоконтекста и все.
Делаете 2 псевдоконтекста и все.
спасибо… компонент то что нужно! спасибо
Спасибо. Про babel можно смело забыть.
нельзя, к сожалению
Вообще не понял где брать все эти ключи локализаций…
попробовал что то сделать, нажимаю автоматический перевод пишет «Для автоматического перевода необходимо добавить хотя бы одну запись в таблицу»…
Что писать в localizator_default_language, ru Russian или Ru ???
Чот скудная документация, извините мозги после годовой работы без выходных не пашут, но хотелось бы поподробней информативней как то…
попробовал что то сделать, нажимаю автоматический перевод пишет «Для автоматического перевода необходимо добавить хотя бы одну запись в таблицу»…
Что писать в localizator_default_language, ru Russian или Ru ???
Чот скудная документация, извините мозги после годовой работы без выходных не пашут, но хотелось бы поподробней информативней как то…
тоже долго ковырялся пока не перепробовал все варианты
после всего этого нужно на странице ресурса во вкладке локализации (почему не во вкладке «документ» — не знаю) создать «перевод» (еще одна странность вытекающая из первой, так как это не перевод, а основной текст) и заполнить все поля на основном языке, после этого уже можно жать на автоперевод
вопрос создателю: будет ли в будущем возможность перевода любых полей, тв параметров, минишоповских и т.п.?
спасибо за компонент!
попробовал что то сделать, нажимаю автоматический перевод пишет «Для автоматического перевода необходимо добавить хотя бы одну запись в таблицу»…нужно на странице локализатора добавить основной язык (допустим русский) + те, на которые нужно перевести (допустим украинский) и прописать http hosts
Что писать в localizator_default_language, ru Russian или Ru ???ru
после всего этого нужно на странице ресурса во вкладке локализации (почему не во вкладке «документ» — не знаю) создать «перевод» (еще одна странность вытекающая из первой, так как это не перевод, а основной текст) и заполнить все поля на основном языке, после этого уже можно жать на автоперевод
вопрос создателю: будет ли в будущем возможность перевода любых полей, тв параметров, минишоповских и т.п.?
спасибо за компонент!
Восстановите, пожалуйста, демо-сайт.
Ввиду того что компонент бесплатный, а хостинг нет, я удалил демку.
Если кто-нибудь задонатит yasobe.ru/na/localizator то демка чудом оживет.
Если кто-нибудь задонатит yasobe.ru/na/localizator то демка чудом оживет.
Чудо произошло! Скоро верну демку.
s9732.h8.modhost.pro/en/category/page-1
При переходе на Main — ведет на ru версию.
При переходе на Main — ведет на ru версию.
А можно еще одну, совсем уж нагловатую просьбу?)
Можешь запилить исходники демо-сайта, я имею в виду элементы, тоже на GitHub? Я что-то не хочу быдлокодить, но в упор не понимаю, как можно сделать ссылки в меню. А так залез и смотришь, все что хочешь
Можешь запилить исходники демо-сайта, я имею в виду элементы, тоже на GitHub? Я что-то не хочу быдлокодить, но в упор не понимаю, как можно сделать ссылки в меню. А так залез и смотришь, все что хочешь
А, увидел. Спасибо)
yadi.sk/d/VxBlpjwk3JQG2Z
Не знаете почему вот так всё? Без подписей, надписей?
Не знаете почему вот так всё? Без подписей, надписей?
Попробуйте переустановить
Ошибка была в том, что по умолчанию язык панели — английский у меня был. Ваш компонент имеет только русскую локализацию — очень неудобно для иностранных разработчиков
Не делал перевод кроме русского, можете добавить на гитхаб.
Добавил перевод на Английский и Французский языки.
Чото я не догнал немного, как включить эту прелесть…
Контексты нужно создавать?
Можно в паре предложений маленький «fast start»?
Контексты нужно создавать?
Можно в паре предложений маленький «fast start»?
1) создаем локализации (псевдоконтексты)
2) в настройке localizator_default_language указываем ключ основной локализации (у меня это ru, на скрине pt)
3) в настройке localizator_key_yandex указываем апи ключ яндекса, translate.yandex.ru/developers/keys
Конец.
Контент указывается в табе ресурса.
2) в настройке localizator_default_language указываем ключ основной локализации (у меня это ru, на скрине pt)
3) в настройке localizator_key_yandex указываем апи ключ яндекса, translate.yandex.ru/developers/keys
Конец.
Контент указывается в табе ресурса.
Хм, вроде все так и делал. Не хочет на sitename.com/en/ контент отображать, 404 отдает. хоть и настроил вроде все, и перевод ресурса сделал… Ладно, завтра еще попробую. Спасибо!
Пришли доступы modx.pro/users/but1head/, не помню как там через /en/ делать
****/en/ слэша вконце не хватало
Отличное расширение! Решил проверить вместе с minishop2. Локализация срабатывает частично http://i.imgur.com/v6ev1X4.png
Пробовал подгружать через {$_modx->lexicon->load('minishop2:default')} — разницы нет.
Пробовал подгружать через {$_modx->lexicon->load('minishop2:default')} — разницы нет.
Локализатор грузит свои словари вот так:
$modx->lexicon->load($cultureKey . ':localizator:site');
Следовательно вам надо (возможно синтаксис не правильный){$_modx->lexicon->load(('cultureKey' | option) ~ ':minishop2:default')}
или в плагине\сниппете $modx->lexicon->load($modx->cultureKey . ':minishop2:default');
А вообще должно было «само», но видимо минишоп грузит словари раньше чем локализатор подменит язык.
Спасибо! Синтаксис правильный.
Можно ли пользоваться для локализации товаров в minishop2?
Пока чтото не особо выходит(
Пока чтото не особо выходит(
Выше спрашивали про ms2, что у вас не выходит?
Теги товаров \ тв параметры не получится, только костылями
Теги товаров \ тв параметры не получится, только костылями
названия товаров, метатеги, название опций.
вообще запутался, может посмотрите доступ в админку дам, отблагодарю
вообще запутался, может посмотрите доступ в админку дам, отблагодарю
Все инструкции в посте есть, в комментариях тоже
Есть небольшой вопрос — уточнение.
Есть 2 языка RU EN
Создал два псевдоконтекста, во вкладке Локализация при добавлении перевода можно выбрать эти оба.
То есть получается что, чтобы создать ресурс с переводом, необходимо заполнить 3 вкладки?
1* Основная (там что в основной вкладке Документ)
2* RU
3* EN
Я правильно понял или есть какие-то тонкости?
Есть 2 языка RU EN
Создал два псевдоконтекста, во вкладке Локализация при добавлении перевода можно выбрать эти оба.
То есть получается что, чтобы создать ресурс с переводом, необходимо заполнить 3 вкладки?
1* Основная (там что в основной вкладке Документ)
2* RU
3* EN
Я правильно понял или есть какие-то тонкости?
У ресурса вам надо заполнить только pagetitle, далее основную локализацию т.е. RU. Потом нажать «автоматический перевод» и переведется на EN. Все.
Спасибо
Для новых документов такое решение может и пойдет, но для ресурсов которые уже созданы, это дублирование. Ведь можно добавить флажок в системных настройках «использовать язык по умолчанию для стандартных полей ресурса». Либо расширить плагин или сниппет, который может на прямую запросы строить без обязательной привязке к класу «localizatorContent» (к примеру если вызывать pdoPage c ajax button, то пагинация не работает, говорит что не знает про класс localizatorContent при нажатии на кнопку «Подгрузить еще», а это из-за расширения стандартного pdoFetch — если вызывать сниппет pdoPage без leftjoin, select, where). Просто хочеться чуть больше гибкости, чтобы сайт который уже работает с 1000 новостями не перебивать через скрипты тупо дублируя их еще в одной таблице для стандартного языка (ru) и для английского языка (en). Ведь никто не будет переводить старые новости, а просто оставит старые как есть, причем на двух языках, но не выводить их не правильно, и дублировать не правильно.
не нашлось решение, у меня аналогичный вопрос?
Плагин не работает. Всё сделал по инструкции. Автор попросил 10к за локализацию простенького сайта с тремя товарами из минишопа. Гори в аду, аффтар!
Ты болен, Дима.
да тебе говоришь, ты не понимаешь. за 5 минут бы помог бы, отблагодарил бы, тебе это 5 минут ровно стоит
Здравствуйте. Подскажите, подойдет ли данное решениедля моего проекта. Будет сайт на 5 регионов на поддоменах типа site.ru, kazan.site.ru, spb.site.ru, nn.site.ru, ekb.site.ru. Все поддомены реализованы в одной админке на контекстах.
И у каждого такого сайта 2 языка будет. На контекстах уже не получится, насколько я понимаю, т.к. их функции заняты. Ваше решение, кажется, то, что нужно. Только еще 2 моментна не понял:
1)может ли одна страница быть на 2х языках, но иметь разный темплейт?
2)не очень понял про автоматический перевод. Обязательно ли его подключать и использовать? Можно ли заполнять pagetitle, longtitle и т.п. вручную? Потому что в будущем, возможно, будет китайский язык добавлен, и нет уверенности, что яндекс переводчик нормально переведет.
И у каждого такого сайта 2 языка будет. На контекстах уже не получится, насколько я понимаю, т.к. их функции заняты. Ваше решение, кажется, то, что нужно. Только еще 2 моментна не понял:
1)может ли одна страница быть на 2х языках, но иметь разный темплейт?
2)не очень понял про автоматический перевод. Обязательно ли его подключать и использовать? Можно ли заполнять pagetitle, longtitle и т.п. вручную? Потому что в будущем, возможно, будет китайский язык добавлен, и нет уверенности, что яндекс переводчик нормально переведет.
Подойдет, возможно нужно будет переписать плагин, но если сделали свитч на контекстах тут тоже разберетесь.
1) Да, в плагине можно проверять $modx->localizator_key и от него менять шаблон, смотрите плагин
2) Можно вручную
Свои контексты можете удалять (хотя локализатор для одного контента сделан, т.е. разделение новостей не предусмотрено, с другой стороны если новость не переведена на псевдоконтекст то она не выводится и выдает 404).
Псевдоконтексты вам нужны такие:
http_host: site.ru, ключ языка: ru
http_host: site.ru/en/, ключ языка: en
http_host: spb.site.ru, ключ языка: ru
http_host: spb.site.ru/en/, ключ языка: en
и т.д., или en.spb.site.ru…
1) Да, в плагине можно проверять $modx->localizator_key и от него менять шаблон, смотрите плагин
2) Можно вручную
Свои контексты можете удалять (хотя локализатор для одного контента сделан, т.е. разделение новостей не предусмотрено, с другой стороны если новость не переведена на псевдоконтекст то она не выводится и выдает 404).
Псевдоконтексты вам нужны такие:
http_host: site.ru, ключ языка: ru
http_host: site.ru/en/, ключ языка: en
http_host: spb.site.ru, ключ языка: ru
http_host: spb.site.ru/en/, ключ языка: en
и т.д., или en.spb.site.ru…
спасибо, попробую разобраться
У Вас получилось разобраться?
Не пробовал пока, проект еще в процессе прототипирования
Расскажите, пожалуйста, где можно подробнее почитать про пространства имён, темы и т.д. в лексиконах?
У меня настроен Localizator на два языка( RU — domain.com, EN — domain.com/en/)
Столкнулся с такой проблемой, что при работе с mFilter2 и с выводом списка результатов с ajax кнопкой первая выборка нормально переводится, а после нажатия кнопки «Загрузить ещё» элементы подгружаются не с соответствующими переводами, а просто с плейсхолдерами. И на английской версии сайта(domain.com/en/), если выводить значение {$_modx->config.cultureKey}, то на «первых» результатах правильно выводится «en», а на подгруженных ajax'ом выводится «ru». Видимо при ajax запросе нужно как-то пробрасывать правильный cutureKey, вот только никак не могу понять как и куда…
У меня настроен Localizator на два языка( RU — domain.com, EN — domain.com/en/)
Столкнулся с такой проблемой, что при работе с mFilter2 и с выводом списка результатов с ajax кнопкой первая выборка нормально переводится, а после нажатия кнопки «Загрузить ещё» элементы подгружаются не с соответствующими переводами, а просто с плейсхолдерами. И на английской версии сайта(domain.com/en/), если выводить значение {$_modx->config.cultureKey}, то на «первых» результатах правильно выводится «en», а на подгруженных ajax'ом выводится «ru». Видимо при ajax запросе нужно как-то пробрасывать правильный cutureKey, вот только никак не могу понять как и куда…
как вариант ставить куку lang=en, писать плагин на onhandlerequest где переключать язык на язык из куки. пока что локализатор под msearch2 не подстраивал.
логика такая, только тут еще запрос именно msearch2 бы выловить.
логика такая, только тут еще запрос именно msearch2 бы выловить.
<?php
if($modx->event->name != 'OnHandleRequest') return;
$lang = $_COOKIE['lang'];
if(!$lang) return;
$modx->setOption('cultureKey', $lang);
Спасибо, сейчас попробую!
Ну как, получилось? С такой же проблемой столкнулся.
И ещё вспомнил: в domain.com/en/ не выводятся записи из словаря, который заполняется на странице дополнения Localizator, тоже плейсхолдеры. Проверил на слове из словаря в пространстве имён «mSearch2» — выводится перевод. (Это тоже при выводе mFilter2) Везде, кроме mFilter2 — норм.
Получается и пространство имён нужно как-то подгружать с ajax'ом?
Получается и пространство имён нужно как-то подгружать с ajax'ом?
modx.pro/components/12012-localizator-multilingual-seo-translation/#comment-81194 возможно это поможет, слэш вконце должен быть указан
Добрый день.
Установила компонент, в настройкак localizator_default_language указала, API ключ яндекс добавила, В Ресурсах Локализацию сделала, но заполненные поля не подтягиваются, надо все вручною, исходя из прочитанного понямаю что должно вроде подтягиваться, в настройках также попыталась указать названия дополнительных полей, чтоб они тоже переводились, но на сайт ничего не выводится. Через en.sitename.com выводит изначальный русский текст, а через sitename.com/en/ выводит ошибку 404
Если добавить вызовы в чанки, как у вас в изходниках как github, ничего не генерируется код остается кодом.
Подскажите плиз в чем ошибка и куда копать.
Установила компонент, в настройкак localizator_default_language указала, API ключ яндекс добавила, В Ресурсах Локализацию сделала, но заполненные поля не подтягиваются, надо все вручною, исходя из прочитанного понямаю что должно вроде подтягиваться, в настройках также попыталась указать названия дополнительных полей, чтоб они тоже переводились, но на сайт ничего не выводится. Через en.sitename.com выводит изначальный русский текст, а через sitename.com/en/ выводит ошибку 404
Если добавить вызовы в чанки, как у вас в изходниках как github, ничего не генерируется код остается кодом.
Подскажите плиз в чем ошибка и куда копать.
В вашем случае надо:
2 «контекста», ru и en. localizator_default_language = ru. У ресурса заполняется ru, нажимаете авто-перевод — получаете en. Смотрите в лог ошибок, там все должно быть написано. Возможно ключ заблокирован (не дает больше 1кк переводить в сутки). Если уж совсем все плохо контакты в профиле.
2 «контекста», ru и en. localizator_default_language = ru. У ресурса заполняется ru, нажимаете авто-перевод — получаете en. Смотрите в лог ошибок, там все должно быть написано. Возможно ключ заблокирован (не дает больше 1кк переводить в сутки). Если уж совсем все плохо контакты в профиле.
Никита, привет!
Подскажи, пожалуйста, как вывести pdomenu, чтобы срабатывала локализация, без использования fenom?
Подскажи, пожалуйста, как вывести pdomenu, чтобы срабатывала локализация, без использования fenom?
В шапке указан пример, переписать все на родной синтаксис, ('localizator_key' | option) заменить на [[++localizator_key]], должно сработать. А лучше включить феном.
Пишу вот так, ничего не выводиться. Подскажи, пожалуйста, где ошибки?
&leftJoin = `{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "[[*localizator.resource_id]] = [[*id]]"
}
}`
&select = `{ "localizator" : "modResource.*, localizator.*, [[*id]]" }`
&where = `{ "[[*localizator.key"]]: "' ~ [[++localizator_key]] ~ '"}`
задайте параметр
&showLog=`1`
и посмотрите в чем дело. Предполагаю что вот это точно криво"on" : "[[*localizator.resource_id]] = [[*id]]"
Владимир, добрый день!
Вызываю так:
localizator_key ничего не выводит, заменил на cultureKey, для других языков меню выводит, а вот для ru пусто.
Вызываю так:
&leftJoin = `{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}`
&select = `{ "localizator" : "modResource.*, localizator.*, modResource.id" }`
&where = `{ "localizator.key" : "[[++localizator_key]]"}`
Лог:"0.0027568: pdoTools loaded
0.0000181: xPDO query object created
0.0001328: leftJoined localizatorContent as localizator
0.0000141: Added selection of localizatorContent: SQL_CALC_FOUND_ROWS modResource.*, localizator.*, modResource.id
0.0000219: Processed additional conditions
0.0002921: Added where condition: localizator.key=, modResource.parent:IN(0), OR:modResource.id:IN(0), modResource.published=1, modResource.hidemenu=0, modResource.deleted=0, modResource.context_key=web
0.0000482: Sorted by modResource.menuindex, ASC
0.0001478: SQL prepared "SELECT SQL_CALC_FOUND_ROWS modResource.*, localizator.*, modResource.id FROM `buffalo_modxsite_content` AS `modResource` LEFT JOIN `buffalo_modxlocalizator_content` `localizator` ON localizator.resource_id = modResource.id WHERE ( `localizator`.`key` = '' AND ( `modResource`.`parent` IN (0) OR `modResource`.`id` IN (0) ) AND `modResource`.`published` = 1 AND `modResource`.`hidemenu` = 0 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' ) ORDER BY modResource.menuindex ASC "
0.0007360: SQL executed
0.0000601: Total rows: 0
0.0000081: Rows fetched
0.0000060: Returning raw data
0.0000021: Tree was built
0.0043030: Total time
6 291 456: Memory usage
localizator_key ничего не выводит, заменил на cultureKey, для других языков меню выводит, а вот для ru пусто.
А вы перевод-то страницы создали?
для всех страниц создал переводы.
А вы выбираете страницы в том же языке, для которого создан перевод?
Дмитрий,
ситуация такая, что есть 2 контекста для регионов.
site.ru
site.ru/region/
Переключение контекстов сделано по плагину Безумкина bezumkin.ru/sections/tips_and_tricks/2439/
Настройка локализации
ситуация такая, что есть 2 контекста для регионов.
site.ru
site.ru/region/
Переключение контекстов сделано по плагину Безумкина bezumkin.ru/sections/tips_and_tricks/2439/
Настройка локализации
Господи иисусе. Локализатор замена контекстам, вы еще babel поставьте, чтоб наверняка.
Как локализатор можно использовать, если у тебя для другого региона другая инфа, и она заполнена в migx и tv?
Написать мини сниппет который распарсит json из tv и покажет то что надо.
Как-то так
&leftJoin = `{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}`
&select = `{ "localizator" : "modResource.*, localizator.*, modResource.id" }`
&where' = `{ "localizator.key" : "[[++localizator_key]]"}`
]}
У меня только так сработало:
&leftJoin = `{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}`
[[++cultureKey:ne=`ru`:then=`
&select = `{ "localizator" : "modResource.*, localizator.*, modResource.id" }`
&where = `{ "localizator.key" : "[[++cultureKey]]"}`
`]]
[[++localizator_key]] - ничего не выводит
С tv не работает?
Нет, но чуть-чуть магии и плагинов решат любую задачу
Знаний не хватает(
А можно схематично описать как с помощью «магии» можно сделать перевод для tv параметров? Нужно расширять таблицу локализатора? Перевод ведь должен где-то храниться. Или предполагается, что он будет делаться на лету?
Я через MIGX в MIGX сделал. Первый уровень — выбор языка. Список языков подтягивается из компонента.
prntscr.com/ftjy5v
prntscr.com/ftjxlz
prntscr.com/ftjy5v
prntscr.com/ftjxlz
Друзья, поясните, как в итоге выводить контент и как настроить pdomenu))
Для контента нашел: {$_modx->resource.localizator_content}, но не понимаю, как это использовать))
пока получилось только вывести pagetitle.
Дополнение крутое.
Для контента нашел: {$_modx->resource.localizator_content}, но не понимаю, как это использовать))
пока получилось только вывести pagetitle.
Дополнение крутое.
Тоже не мог вывести контент. Оказалось вся проблема из-за визуального редактора. У меня стоял ckeditor. И содержимое поля просто не сохранялось.
С tinymce работает.
С tinymce работает.
А контент в итоге нужно выводить так — [[*content]], в локализованной версии?
Нет.
{$_modx->resource.localizator_content}
Вот так.
Проверь, еще должен быть включен fenom для обработки страниц (системные настройки / pdotools)
{$_modx->resource.localizator_content}
Вот так.
Проверь, еще должен быть включен fenom для обработки страниц (системные настройки / pdotools)
Спасибо, заработало!
У меня вопрос по поводу локализации на поддомене.
Создал на хостинге поддомен. В настройках локализатора создал два псевдоконтекста
site.ru
en.site.ru
Перехожу на en.site.ru выдает 500 ошибку
Если делать через папку /en/ все работает
Как корректно настроить работу через поддомен?
Создал на хостинге поддомен. В настройках локализатора создал два псевдоконтекста
site.ru
en.site.ru
Перехожу на en.site.ru выдает 500 ошибку
Если делать через папку /en/ все работает
Как корректно настроить работу через поддомен?
Что в логах?
Можете прислать доступ, гляну. Контакты в профиле.
Можете прислать доступ, гляну. Контакты в профиле.
Проблема при работе с minishop2
При переключении языков почему-то выводятся разные корзины. Т.е. происходит независимое добавление товаров на разных локализациях. Подозреваю, что это связано с тем, что у меня одна из локализаций сделана на поддомене.
Как побороть эту проблему?
При переключении языков почему-то выводятся разные корзины. Т.е. происходит независимое добавление товаров на разных локализациях. Подозреваю, что это связано с тем, что у меня одна из локализаций сделана на поддомене.
Как побороть эту проблему?
Проблема была в том, что сессии были разные для поддомена и домена.
Решение
В системной настройке session_cookie_domain указал .site.com
Решение
В системной настройке session_cookie_domain указал .site.com
Классный компонент.
Подскажите пример, как вывести переведённые поля pagetitle и description у товаров в категории минишопа?
Подскажите пример, как вывести переведённые поля pagetitle и description у товаров в категории минишопа?
{$_modx->resource.pagetitle}
{$_modx->resource.description}
Все стандартно, компонент подменяет значения
{$_modx->resource.description}
Все стандартно, компонент подменяет значения
На странице товара так и делаю, значения подменяются.
А как получить их в каталоге товаров, т.е через msProducts?
А как получить их в каталоге товаров, т.е через msProducts?
В шапке пример для pdomenu, тоже самое для msProducts
Спасибо, получилось!
У кого-нибудь получилось сделать чтобы при ajax-пагинации или при фильтрации через mFilter2 сохранялся текущий язык?
Этот коммент видел, но у меня не получилось сделать modx.pro/components/12012-localizator-multilingual-seo-translation/#comment-82299
Этот коммент видел, но у меня не получилось сделать modx.pro/components/12012-localizator-multilingual-seo-translation/#comment-82299
Методом тыка все-таки нашел нужное событие:)
Вот такой плагин получился (возможно что-то лишнее):
Вот такой плагин получился (возможно что-то лишнее):
<?php
$eventName = $modx->event->name;
switch($eventName) {
//case 'OnWebPageInit':
//if ($modx->context->get('key') == 'mgr') {return;}
//$modx->lexicon->load($modx->cultureKey . ':minishop2:default');
//break;
case 'OnParseDocument':
if ($modx->context->get('key') == 'mgr') {return;}
$lang = $_COOKIE['lang'];
if(!$lang) return;
$modx->setOption('cultureKey', $lang);
$modx->lexicon->load($lang . ':minishop2:default');
break;
case 'OnLoadWebDocument':
if ($modx->context->get('key') == 'mgr') {return;}
$value = $modx->getOption('cultureKey');
setcookie("lang", $value, time() + (86400 * 365));
break;
}
return;
Ещё при добавлении товара в корзину / изменении количества в корзине, оформление заказа можно такой плагин добавить, чтобы jGrowl сообщения в корректном языке выводились.
<?php
switch ($modx->event->name) {
case 'msOnBeforeAddToCart':
case 'msOnBeforeRemoveFromCart':
case 'msOnBeforeChangeInCart':
case 'msOnSubmitOrder':
$request = $_SERVER['HTTP_REFERER'];
$host = $find = $_SERVER['HTTP_HOST'];
if($request) {
if(strpos($request, '/') !== false) {
$request = str_replace($_SERVER['HTTP_ORIGIN'] . '/', '', $request);
$tmp = explode('/', $request);
$find = $host . '/' . $tmp[0] . '/';
} else {
$find = $host . '/' . $request;
}
}
$q = $modx->newQuery('localizatorLanguage', array(
array('http_host' => $find),
array('OR:http_host:=' => $host)
));
$q->select('cultureKey');
$lang = $modx->getValue($q->prepare());
$modx->setOption('cultureKey', $lang);
$modx->lexicon->load($lang . ':minishop2:cart');
break;
}
Спасибо! Этот плагин ведь не работает, если языковые версии сделаны через папки (site.ru/en/)?
Попытался сделать с учетом папок, но тоже не хочет работать…:
Попытался сделать с учетом папок, но тоже не хочет работать…:
<?php
$eventName = $modx->event->name;
switch($eventName) {
case 'msOnBeforeAddToCart':
case 'msOnBeforeRemoveFromCart':
case 'msOnBeforeChangeInCart':
case 'msOnSubmitOrder':
$http_host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp == '') {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%{$http_host}"));
}
}
}
$lang = $tmp->key;
$modx->setOption('cultureKey', $lang);
$modx->lexicon->load($lang . ':minishop2:cart');
break;
}
return;
Попросили запостить конечный рабочий вариант: gist.github.com/ig0r74/bea4170495890e5caa3e0179d06119fb
Спасибо Игорь, полезная инфа
Еще не забыть добавить события на плагин
OnWebPageInit
OnParseDocument
OnLoadWebDocument
msOnBeforeAddToCart
msOnBeforeRemoveFromCart
msOnBeforeChangeInCart
msOnSubmitOrder
msOnChangeOrderStatus
OnWebPageInit
OnParseDocument
OnLoadWebDocument
msOnBeforeAddToCart
msOnBeforeRemoveFromCart
msOnBeforeChangeInCart
msOnSubmitOrder
msOnChangeOrderStatus
Добрый день. Это ж код и для для всплывающих сообщений при добавлении в корзину должен подойти?
Поставил у себя — что-то ничего не сработало. События назначил.
Для языков типа site.ru/en/ подходит?
Поставил у себя — что-то ничего не сработало. События назначил.
Для языков типа site.ru/en/ подходит?
Может есть у кого пример кода, как перенести контент ресурсов в определенную языковую версию.
Или как через API создать перевод.
Или как через API создать перевод.
Может кому пригодится:
<?php
$local = $modx->newObject('localizatorContent');
$local->set('key', 'en');
$local->set('resource_id',35);
$local->set('pagetitle','TEST');
$local->set('content','TEST CONTENT');
$local->set('ative',1);
$local->save();
Доступные поля можно посмотреть в БД <?php
$lang = 'ru',
$localizator = $modx->getService('localizator');
$resources = $modx->getIterator('modResource');
foreach($resources as $resource) {
$tmp = $modx->getObject('localizatorContent', array('resource_id' => $resource->id, 'key' => $lang));
if($tmp) {
$tmp = $modx->newObject('localizatorContent');
$tmp->fromArray(array(
'key' => $lang,
'resource_id' => $resource->id,
'active' => 1,
'pagetitle' => $resource->pagetitle,
// ...
));
} else {
// обновление если нужно, fromArray или ->set(key, value);
}
$tmp->save();
}
ну а потом уже можно вызывать процессор core/components/localizator/processors/mgr/content/translate.class.php
Спасибо!
Подскажи еще пожалуйста. Правильно запускаю процессор?
<?php
$resources = $modx->getIterator('modResource', array('class_key'=>'msProduct'));
foreach($resources as $resource) {
print $resource->pagetitle;
$processorProps = array(
'resource_id' => $resource->id
);
$otherProps = array(
'processors_path' => $modx->getOption('core_path') . 'components/localizator/processors/'
);
$response = $modx->runProcessor('mgr/content/translate', $processorProps, $otherProps);
return $response->response;
}
На выходе получаю просто `Array`
подскажите получилось ли у вас перенести контент? какая правильная последовательность действий? как правильно вызвать процессор?
Да. Вот, должен быть рабочий вариант:
<?php
$resources = $modx->getIterator('modResource', array('class_key'=>'msProduct'));
foreach($resources as $resource) {
print $resource->pagetitle;
$processorProps = array(
'resource_id' => $resource->id
);
$otherProps = array(
'processors_path' => $modx->getOption('core_path') . 'components/localizator/processors/'
);
$response = $modx->runProcessor('mgr/content/translate', $processorProps, $otherProps);
// return $response->response;
// return $response->isError() ? print_r($response->getAllErrors(), 1) : print_r($response->response,1);
}
Не вижу отличий, но он, по крайней мере, сохранен у меня в консоли.
подскажите еще… как этим скриптом перенести поле content уже созданных ресурсов в локализатор о перевести на 3 языка?
1. Добавить эти 3 языка
2. Перенести контен в основной язык этим скриптом (добавить нужные поля 'content' => $resource->content,) modx.pro/components/12012/#comment-83962
3. Перевести этим скриптом modx.pro/components/12012/#comment-93457
2. Перенести контен в основной язык этим скриптом (добавить нужные поля 'content' => $resource->content,) modx.pro/components/12012/#comment-83962
3. Перевести этим скриптом modx.pro/components/12012/#comment-93457
Добрый день, подскажите пожалуйста, можно ли с помощью этого скрипта modx.pro/components/12012/#comment-83962 автоматически создать локализацию для всех созданных ресурсов перенеся в эту локализацию поля: pagetitle, longtitle?
Пробую так: prnt.sc/lfgYjY8GrPRL
Ругается на синтаксическую ошибку…
Пробую так: prnt.sc/lfgYjY8GrPRL
Ругается на синтаксическую ошибку…
Вместо "," нужно ";"
Спасибо!!! Попробовал, но фатальная ошибка возникла prnt.sc/IRdEt9PcHJgf
Fatal error: Uncaught Error: Call to a member function save() on null in /home/o/olesiayc/olesiayc.beget.tech/public_html/core/components/console/processors/exec.class.php(24): eval()'d code:19 Stack trace: #0 /home/o/olesiayc/olesiayc.beget.tech/public_html/core/components/console/processors/exec.class.php(24): eval() #1 /home/o/olesiayc/olesiayc.beget.tech/public_html/core/model/modx/modprocessor.class.php(185): ConsoleExecProcessor->process() #2 /home/o/olesiayc/olesiayc.beget.tech/public_html/core/model/modx/modx.class.php(1770): modProcessor->run() #3 /home/o/olesiayc/olesiayc.beget.tech/public_html/core/model/modx/modconnectorresponse.class.php(144): modX->runProcessor('exec', Array, Array) #4 /home/o/olesiayc/olesiayc.beget.tech/public_html/core/model/modx/modconnectorrequest.class.php(86): modConnectorResponse->outputContent(Array) #5 /home/o/olesiayc/olesiayc.beget.tech/public_html/core/model/modx/modconnectorrequest.class.php(73): modConnectorRequest->prepareResponse(Array) #6 /home/o/olesiayc/olesiayc.beget.te in /home/o/olesiayc/olesiayc.beget.tech/public_html/core/components/console/processors/exec.class.php(24): eval()'d code on line 19
$tmp->save(); нужно переместить внутрь if ($tmp) {… }
Спасибо! Теперь ошибка пропала: prnt.sc/Y6GQrMCHXjyr
Скрипт сработал
Но локализации spb в ресурсах не добавились:https://prnt.sc/uKX81XjRPLcN
Вот скрипт:
Скрипт сработал
Но локализации spb в ресурсах не добавились:https://prnt.sc/uKX81XjRPLcN
Вот скрипт:
<?php
$lang = 'spb';
$localizator = $modx->getService('localizator');
$resources = $modx->getIterator('modResource');
foreach($resources as $resource) {
$tmp = $modx->getObject('localizatorContent', array('resource_id' => $resource->id, 'key' => $lang));
if($tmp) {
$tmp = $modx->newObject('localizatorContent');
$tmp->fromArray(array(
'key' => $lang,
'resource_id' => $resource->id,
'active' => 1,
'pagetitle' => $resource->pagetitle,
// ...
));
$tmp->save();
} else {
// обновление если нужно, fromArray или ->set(key, value);
}
}
Доброй ночи! Объясните, пожалуйста, «чайнику»:
1. Каким образом необходимо выполнить вышеуказанный код для переноса контента ресурсов (например, товары miniShop2) из определенной категории (например, id-11) в языковую версию (ru)?
2. Как «потом вызывать процессор core/components/localizator/processors/mgr/content/translate.class.php»?
1. Каким образом необходимо выполнить вышеуказанный код для переноса контента ресурсов (например, товары miniShop2) из определенной категории (например, id-11) в языковую версию (ru)?
2. Как «потом вызывать процессор core/components/localizator/processors/mgr/content/translate.class.php»?
Добрый день, подскажите пожалуйста, можно ли с помощью этого скрипта modx.pro/components/12012/#comment-83962 автоматически создать локализацию для всех созданных ресурсов перенеся в эту локализацию поля: pagetitle, longtitle?
Пробую так: prnt.sc/lfgYjY8GrPRL
Ругается на синтаксическую ошибку…
Пробую так: prnt.sc/lfgYjY8GrPRL
Ругается на синтаксическую ошибку…
А как можно локализовать пункты фильтра mFilter2?
Для пунктов фильтрации по цвету решил вводить цвета в опции на латинице и потом через словарь выводить перевод.
А как быть с названиями категорий?
Для пунктов фильтрации по цвету решил вводить цвета в опции на латинице и потом через словарь выводить перевод.
А как быть с названиями категорий?
Примерно так можно (на примере способов оплаты):
translit — сниппет транслитерации.
{foreach $payments as $payment}
<label class="payment input-parent">
<input type="radio" name="payment" value="{$payment.id}" id="payment_{$payment.id}" {$payment.id == $order.payment ? 'checked' : ''}>
{set $paymentname = 'po_pay_' ~ $payment.name | translit}
{$paymentname | lexicon}
{if $payment.description?}
{set $paymentdescr = 'po_pay_descr_' ~ $payment.description | translit}
<small>
{$paymentdescr | lexicon}
</small>
{/if}
</label>
{/foreach}
translit — сниппет транслитерации.
Получается это нужно категории тоже в словарь загонять?
А подтянуть перевод из локализации никак нельзя? Это же названия родительских ресурсов по сути.
А подтянуть перевод из локализации никак нельзя? Это же названия родительских ресурсов по сути.
Наверное можно приджойнить.
Если как в топике сделать leftJoin, не работает?
У меня просто не было категорий в фильтре…
Если как в топике сделать leftJoin, не работает?
У меня просто не было категорий в фильтре…
У меня там уже идет leftjoin локализатора.
Получается надо сначала приджойнить категории, а потом джойнить к категориям и продуктам локализатор. Так чтоли?
Вызов фильтра:
Получается надо сначала приджойнить категории, а потом джойнить к категориям и продуктам локализатор. Так чтоли?
Вызов фильтра:
{'!mFilter2' | snippet : [
'paginator'=>'pdoPage@wia',
'class'=>'msProduct',
'element'=>'msProducts',
'tplOuter'=>'wia.mFilter2.outer',
'parents'=>'[[*id]]',
'tpls'=>'wia.msProducts.row',
'filters'=>'ms|price:number,
resource|parent:categories,
msoption|color:default,
msoption|size:default',
'tplFilter.outer.ms|price'=>'wia.mFilter2.filter.price.slider',
'tplFilter.row.ms|price'=>'wia.mFilter2.filter.price.row',
'tplFilter.outer.msoption|color'=>'wia.mFilter2.filter.outer',
'tplFilter.row.msoption|color'=>'wia.mFilter2.filter.checkbox.color',
'tplFilter.outer.msoption|size'=>'wia.mFilter2.filter.outer',
'tplFilter.row.msoption|size'=>'wia.mFilter2.filter.checkbox',
'tplFilter.outer.resource|parent'=>'wia.mFilter2.filter.outer',
'tplFilter.row.resource|parent'=>'wia.mFilter2.filter.checkbox',
'includeThumbs'=>'260x237',
'sort'=>'id:asc',
'leftJoin' => '{"localizator" : {"class" : "localizatorContent","alias" : "localizator","on" : "localizator.resource_id = msProduct.id"}}',
'select' => '{ "localizator" : "msProduct.*, localizator.*, msProduct.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}'
]}
словари локализатора = родным словарям, вынес для удобства. в mfilter2 пункты добавляются в словари ms2, тут можно добавить в словари локализатора. все хранится в «теме» (или как там она) localizator — frontend.
про категории только джойны
про категории только джойны
Так и не разобрался как сделать джойны для категорий в фильтре.
В результате сделал через сниппет. В него передается id категории, а на выходе локализованный pagetitle.
Не знаю насколько это правильное решение, но по крайней мере работает.
В результате сделал через сниппет. В него передается id категории, а на выходе локализованный pagetitle.
Не знаю насколько это правильное решение, но по крайней мере работает.
Или еще как вариант через расширение класса mse2FiltersHandler
Прошу прощения за уровень вопроса, но не могу разобраться, как сделать «переключатель» языков, те же флажки. Настроил три языка «по папкам», когда ввожу адрес с папкой — локализация выводится как задумано. Создал сниппет getLanguages (как здесь), вызываю его, а на выходе — пустота, и все, что в хтмл после вызова сниппета — отсутствует. Где ошибся, как правильно? За компонент и советы большое спасибо!
yadi.sk/i/QddzUsVX3LwnAm
<?php
$output = "<ul>";
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
foreach($languages as $lang) {
if($lang->key == $modx->localizator_key) continue;
$url = 'http://' . $lang->http_host . $_SERVER['REQUEST_URI'];
$output .= "<li><a href=\"{$url}\"><img src=\"assets/template/img/lang/{$lang->key}.svg\"><span>{$lang->name}</span></a></li>";
}
$output .= "</ul>";
return $output;
Спасибо, почти работает, но если у меня урл основного языка вида хост.ру, то с адреса хост.ру/en на основной ссылка не возвращает. И на конце ссылки два слэша "//" вместо одного. Как исправить?
Я вот так сделал. Костыль, но работает:
И уже ниже можно использовать {$site_url} для правильной ссылки на главную.
<base href="{if $_modx->config.cultureKey == 'el'}{$site_url = $_modx->config.site_url}{else}{$site_url = $_modx->config.site_url ~ $_modx->config.cultureKey ~ '/'}{/if}">
el заменить на cultureKey основного языка.И уже ниже можно использовать {$site_url} для правильной ссылки на главную.
Спасибо, но не вполне понял, как пользовать костыль. Полная картина у меня такова: основной язык сайта, в настройках — ru (чтобы «видеть» локализатор). С помощью локализатора созданы языки, основной — en c адресом хост.en, дополнительные с адресом хост.en/ru/ и т.д. При вызове вышеозначенного сниппета я с основного хоста переключаюсь на страницу с нужным языком. Но вот обратно, на аналогичную страницу с основным языком ссылка не ведет. К тому же, при переключении на те языки, что «в папках» (это срабатывает) — в адресной строке множатся косяки: хост.en/ru//fi//ru// и т.д. Как бы справиться?..
То есть, знал бы синтаксис, поправил бы в сниппете, чтобы для каждого языка в локализаторе брался бы «хост языка» (хост.en, хост.en/ru/ etc...) и на ссылках-«флажках» подставлялся бы http:// + «хост языка» + [[*alias]] текущей страницы.
Кажется, этого, в моем случае по крайней мере, было бы достаточно… Кодить, вот, не умею, чтоб проверить.
Кажется, этого, в моем случае по крайней мере, было бы достаточно… Кодить, вот, не умею, чтоб проверить.
а, ну вот так вроде получилось:
<?php
$output = "<div>";
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
foreach($languages as $lang) {
if($lang->key == $modx->localizator_key) continue;
$url = 'http://' . $lang->http_host;
$output .= "<a href=\"{$url}/[[*alias]].html\"><img src=\"../layout/{$lang->key}-icon.png\" style=\"width:24px\"><span>{$lang->name}</span></a>";
}
$output .= "</div>";
return $output;
Тоже, правда, костылем выглядит…
У кого-нибудь получилось подружить локализатор и msearch2? К babel возвращаться совсем не хочется
Что именно подружить?
Ваш модуль и поисковик Василия, больше ничего. Сейчас к сожалению не индексируются слова из таблицы локализатора.
Напишите сколько это будет стоить. Возьму на заметку
Использую локализатор + минишоп.
Локализатор меняет значение id товара в форме с кнопкой Купить, поэтому в корзину добавляется другой товар.
То есть вместо id товара выводится id записи в таблице локализатора.
Подскажите, как поправить?
Локализатор меняет значение id товара в форме с кнопкой Купить, поэтому в корзину добавляется другой товар.
То есть вместо id товара выводится id записи в таблице локализатора.
Подскажите, как поправить?
{'msProducts' | snippet : [
'limit' => 0,
'sortby' => 'menuindex',
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = msProduct.id"
}
}',
'select' => '{ "localizator" : "msProduct.id, localizator.*" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
]}
'select' => '{ "localizator" : "modResource.*, localizator.*, msProduct.id" }',
Хочу поделиться сниппетом, аналог pdoField, так как я часто пользуюсь pdoField.
Сниппет getLocalizatorField
Сниппет getLocalizatorField
<?php
$sp = &$scriptProperties;
$resource_id = $modx->getOption('resource_id', $sp, $modx->resource->id);
$field = $modx->getOption('field', $sp, 'pagetitle');
$key = $modx->getOption('key', $sp, $modx->getOption('cultureKey'));
$q = $modx->newQuery( "localizatorContent" );
$q->where( array( "`resource_id` = '" . $resource_id . "'", "`key` = '" . $key . "'" ) );
$q->select( array( $field ) );
$s = $q->prepare(); // print $q->toSQL(); die;
$s->execute();
$array = $s->fetch(PDO::FETCH_ASSOC);
$field_value = $array[$field];
return $field_value;
Вызов: {'getLocalizatorField' | snippet : [
'resource_id' => 20,
'field' => 'content'
]}
Спасибо, Николай.
Хотелось бы выводить так:
Написал модификатор для этого. Буду благодарен, если кто-то улучшит код.
Хотелось бы выводить так:
{4 | localizator : 'pagetitle'}
Написал модификатор для этого. Буду благодарен, если кто-то улучшит код.
$pdo = $modx->getService('pdoTools');
// localizator
$fenom->addModifier('localizator', function ($id, $field = null) use ($pdo, $modx) {
$pdo->debugParserModifier($id, 'localizator');
/** @var modResource $resource */
if (empty($id)) {
$resource = $modx->resource;
} elseif (!is_numeric($id)) {
$field = $id;
$resource = $modx->resource;
} elseif (!$resource = $pdo->getStore($id, 'resource')) {
$resource = $modx->getObject('modResource', $id);
$pdo->setStore($id, $resource, 'resource');
}
$key = $modx->getOption('cultureKey');
if( $modx->getOption('cultureKey') != 'ru' ) {
$q = $modx->newQuery( "localizatorContent" );
$q->where( array( "`resource_id` = '" . $id . "'", "`key` = '" . $key . "'" ) );
$q->select( array( $field ) );
$s = $q->prepare(); // print $q->toSQL(); die;
$s->execute();
$array = $s->fetch(PDO::FETCH_ASSOC);
$field_value = $array[$field];
return $field_value;
}
$output = '';
if (!empty($resource)) {
if (!empty($field)) {
if (strtolower($field) == 'content') {
$output = $resource->getContent();
} else {
$output = $resource->get($field);
if (is_null($output)) {
$output = $resource->getTVValue(preg_replace('#^tv\.#i', '', $field));
}
}
} else {
$output = $resource->toArray();
}
}
$pdo->debugParserModifier($id, 'localizator');
return $output;
});
Нубский вопрос, как это подключить?
Я дописал и поправил ваш код.
Теперь он не путается со сниппетом localizator и дружит с ТВ полями
Работает так
Запилил я это все в плагин (проверено)
И для страждущих getImageList (проверено)
Теперь он не путается со сниппетом localizator и дружит с ТВ полями
Работает так
{9 | locfield : 'tv_name'}
Можно использовать id tv поля, можно имя (видно из кода)Запилил я это все в плагин (проверено)
<?php
/** @var modX $modx */
switch ($modx->event->name) {
case 'pdoToolsOnFenomInit':
/** @var Fenom $fenom
Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы.
Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
*/
$pdo = $modx->getService('pdoTools');
// localizator
$fenom->addModifier('locfield', function ($id, $field = null) use ($pdo, $modx) {
$pdo->debugParserModifier($id, 'locfield');
/** @var modResource $resource */
if (empty($id)) {
$resource = $modx->resource;
} elseif (!is_numeric($id)) {
$field = $id;
$resource = $modx->resource;
} elseif (!$resource = $pdo->getStore($id, 'resource')) {
$resource = $modx->getObject('modResource', $id);
$pdo->setStore($id, $resource, 'resource');
}
$key = $modx->getOption('cultureKey');
if( $modx->getOption('cultureKey') != 'ru' ) {
$q = $modx->newQuery( "localizatorContent" );
$q->where( array( "`resource_id` = '" . $id . "'", "`key` = '" . $key . "'" ) );
$q->select( array( $field ) );
$s = $q->prepare(); // print $q->toSQL(); die;
$s->execute();
$array = $s->fetch(PDO::FETCH_ASSOC);
$field_value = $array[$field];
if(empty($field_value)){
if(is_numeric($field)){
$tvId = intval($field);
}else{
$tvObj = $modx->getObject('modTemplateVar', array('name' => $field));
$tvId = $tvObj->get('id');
}
$q = $modx->newQuery( "locTemplateVarResource" );
$q->where( array( "`contentid` = '" . $id . "'", "`key` = '" . $key . "'", "`tmplvarid` = '" . $tvId . "'" ) );
$q->select( 'value' );
$s = $q->prepare();
$s->execute();
$array = $s->fetch(PDO::FETCH_ASSOC);
return $array['value'];
}else{
return $field_value;
}
}
$output = '';
if (!empty($resource)) {
if (!empty($field)) {
if (strtolower($field) == 'content') {
$output = $resource->getContent();
} else {
$output = $resource->get($field);
if (is_null($output)) {
$output = $resource->getTVValue(preg_replace('#^tv\.#i', '', $field));
}
}
} else {
$output = $resource->toArray();
}
}
$pdo->debugParserModifier($id, 'locfield');
return $output;
});
break;
}
Галочку pdoToolsOnFenomInit
не забудьтеИ для страждущих getImageList (проверено)
[[getImageList? &tpl=`why_we.tpl` &value=`[[*why_we]]`]]
или даже так, когда данные в другом ресурсе (не успел проверить, но вроде должно){'getImageList' | snippet : [
'tpl' => 'why_we.tpl',
'value' => (9 | locfield : 'tv_name')
]}
Мелкая правка
if(is_numeric($field)){
$tvId = intval($field);
}else{
$tvObj = $modx->getObject('modTemplateVar', array('name' => $field));
if($tvObj)$tvId = $tvObj->get('id');
}
if($tvId == 0){
$resource = $modx->getObject('modResource', $id);
if($resource) return $resource->get($field);
}
Этим получится сделать поиск через mSearch2?
Сомневаюсь
У вас имеется решение? Или может предвидится?
Нету. Не предвидится, все исходники на github, вы можете самостоятельно решить эту проблему и поделиться ею с обществом (как я сделал с локализатором). Компонент бесплатный, мне не особо интересно сращивать его с mSearch2 бесплатно, темболее времени на это у меня нет.
Какова стоимость? Можно даже примерно
темболее времени на это у меня нет.
Не пойму, как вывести локализованные SEO-теги.
Пробовал так
Пробовал так
Пробовал так
[[*seotitle]]
ПустоПробовал так
{$_modx->resource.seotitle}
Тоже пусто
del
Это что значит?
{$_modx->resource.seotitle} — выводит, на демо проверил, все ок.
<title>{$_modx->resource.seotitle ?: $_modx->resource.longtitle ?: $_modx->resource.pagetitle}</title>
Хм… Мистика. Заработало. Видимо я — рукожоп
Спасибо)
Использую связку minishop2 и localiztor.
Localizator отрабатывает, но термины из словаря minishop2 не заменяются.
Пробовал добавлять в шаблон
Localizator отрабатывает, но термины из словаря minishop2 не заменяются.
Пробовал добавлять в шаблон
{$_modx->lexicon->load(('cultureKey' | option) ~ ':minishop2:default')}
но термины все равно не подменяются.
Имею конфигурацию
site.com/ru/ и site.com/en/
в HTTP HOST (localizator) прописано site.com/ru/ и site.com/en/
вывожу
Посмотрел на примере у Владимира и там тоже самое если перейти на EN и посмотреть ссылку в шапке на логотипе, то она ведет на русский контекст
Как правильно выводить линк на главную страницу того (псевдо) контекста где сейчас находится пользователь а не посылать его на основной по умолчанию web
site.com/ru/ и site.com/en/
в HTTP HOST (localizator) прописано site.com/ru/ и site.com/en/
вывожу
{'site_url' | option} или {$_modx->config.site_url}и получаю site.com/ а должно быть site.com/ru/ или /en/
Посмотрел на примере у Владимира и там тоже самое если перейти на EN и посмотреть ссылку в шапке на логотипе, то она ведет на русский контекст
Как правильно выводить линк на главную страницу того (псевдо) контекста где сейчас находится пользователь а не посылать его на основной по умолчанию web
<a class="site-logo" href="{'site_url' | option}">Site</a>или
<a class="site-logo" href="{'site_url' | option}{'cultureKey' | option}/">Site</a>
Для такой конфигурации (el)site.com/ и site.com/en/ я так сделал:
<base href="
{if $_modx->config.cultureKey != 'el'}
{$site_url = $_modx->config.site_url ~ $_modx->config.cultureKey ~ '/'}
{else}
{$site_url = $_modx->config.site_url}
{/if}
">
Тебе скорее всего подойдет такой вариант:{$site_url = $_modx->config.site_url ~ $_modx->config.cultureKey ~ '/'}
Ниже уже можешь использовать переменную $site_url
Игорь, спасибо.
Простите за дубль вопроса, невнимательно прочитал топик.
Простите за дубль вопроса, невнимательно прочитал топик.
Еще один момент, при конфигурации site.com/ru/ и site.com/en/ создаю страницу для 404 и прописываю ее в системных настройках и дальше ее перевожу через localizator и все работает если вызываю 404 из контекстов, но если получить 404 из site.com/404 (без контекста) то получаю поля из основного контекста web без участия localizator…
А как сделать что бы нельзя было попасть на site.com а сразу перекидывать пользователя на /ru/ или /en/?
У меня nginx + apache и в последнем
А как сделать что бы нельзя было попасть на site.com а сразу перекидывать пользователя на /ru/ или /en/?
У меня nginx + apache и в последнем
php_flag register_globals Off AddDefaultCharset utf-8 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^/$ [NC] RewriteCond %{HTTP:Accept-Language} (ru|uk|by|kz) [NC] RewriteRule .* https://site.com/ru/ [R=302,L] RewriteCond %{REQUEST_URI} ^/$ [NC] RewriteRule .* https://site.com/en/ [R=302,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Дописал под себя getLanguages.
Сделал вывод в placeholders и добавил css class «active»
getLanguages
В шаблоне
Содержимое section-langs-1
Содержимое section-langs-2
На уникальность не претендую, но уверен что кому то поможет.
Критика и правки приветствуются.
Сделал вывод в placeholders и добавил css class «active»
getLanguages
<?php
$pdo = $modx->getService('pdoTools');
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}
$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage');
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key ? 'active' : '',
'url'=>$protocol . $language->http_host . $uri,
);
} else {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key ? 'active' : '',
'url'=>$protocol . $language->http_host . '/' . $uri,
);
}
$output .= $pdo->getChunk($tpl, $placeholders);
}
return $output;
В шаблоне
<div class="langs">
{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-1',])}
<div class="dropdown-menu">
{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-2',])}
</div>
</div>
Содержимое section-langs-1
<a href="#" data-toggle="dropdown" role="button" aria-expanded="false"></a><img class="imglang {$active}" src="/assets/img/flags/{$cultureKey}.png" alt="{$cultureKey}">
Содержимое section-langs-2
<div class="dropdown-item">
{if $active != 'active'}
<a class="{$active}" href="{$url}"><img class="imglang {$active}" src="/assets/img/flags/{$cultureKey}.png" alt="{$cultureKey}"></a>
{else}
<div class="{$active}"><img class="imglang {$active}" src="/assets/img/flags/{$cultureKey}.png" alt="{$cultureKey}"></div>
{/if}
</div>
На уникальность не претендую, но уверен что кому то поможет.
Критика и правки приветствуются.
В снипете getLanguages забыл дописать $output = ''; в самом начале, а иначе в логе будет много PHP notice: Undefined variable: output
Подскажите как вывести название языка? Русский, Английский
Я нигде не нашел как можно вытащить название языка (локализации).
Сделал такой сниппет getLanguageName:
чанк section-langs-1
Причем как видно я переделал отображение знака языка не через картинку а через flag_24.png.
Использовал пример под Babel с
Заменил в нем косяки (языки kg на самом деле ky (там ky вообще какой то левый флаг не понял что за страна), ir (Иранский) у меня оформлен как fa (персидский),
Добавил стили
Файл с иконками языка https://disk.yandex.ru/i/y-G8apn1dSooww
Файл css стилей https://disk.yandex.ru/d/R-eJsFVVQP5OmA
Сделал такой сниппет getLanguageName:
<?php
if (isset($keysearch) && $keysearch === '') {
$scriptProperties['keysearch'] = $modx->localizator_key;
}
$output = "";
$clang = $keysearch;/*$modx->config.cultureKey;*/
/*$languages = $modx->getIterator('localizatorLanguage'/*, $c*//*);*/
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
foreach($languages as $language) {
if ($language->key==$clang) {
$output .= $language->get('name');
}
}
return $output;
В чанках сделал так:чанк section-langs-1
<a href="#" class="nav-link dropdown-toggle {if $_modx->config.cultureKey == $cultureKey} {$active} {else} collapse {/if} localizator_lang" data-toggle="dropdown" data-bs-toggle="dropdown" role="button" aria-expanded="false" >{*'localizator_key' | option} - {$_modx->config.cultureKey*}
<span class="{$cultureKey}_24" style="display: inline-block;"></span>
{$_modx->runSnippet('!getLanguageName', ['keysearch'=>$cultureKey])}
{*<img class="imglang {$active}" src="/assets/img/flags/{$cultureKey}.png" alt="{$cultureKey}">*}{*картинка языка подбирается из assets/app/images/flags/flag_24.png исходя из локали по настройкам assets/app/css/flag_24.css*}
</a>
Чанк: section-langs-2:{if $_modx->config.cultureKey != $cultureKey}
<li >
{if $active != 'active'}
<a class="{$active} localizator_lang" href="{$url}" class="dropdown-item">{*картинка языка подбирается из assets/app/images/flags/flag_24.png исходя из локали по настройкам assets/app/css/flag_24.css*}
{*<img class="imglang {$active}" src="/assets/img/flags/{$cultureKey}.png" alt="{$cultureKey}">*}
<span class="{$cultureKey}_24" style="display: inline-block;"></span>
{$_modx->runSnippet('!getLanguageName', ['keysearch'=>$cultureKey])}
</a>
{else}
<div class="{$active} {$cultureKey}_24 localizator_lang" class="dropdown-item">{*картинка языка подбирается из assets/app/images/flags/flag_24.png исходя из локали по настройкам assets/app/css/flag_24.css*}
{*<img class="imglang {$active}" src="/assets/img/flags/{$cultureKey}.png" alt="{$cultureKey}">*}
<span class="{$cultureKey}_24" style="display: inline-block;"></span>
{$_modx->runSnippet('!getLanguageName', ['keysearch'=>$cultureKey])}
</div>
{/if}
</li>
{/if}
Чанк вывода панели выбора языков:<ul class="nav nav-pills localizator-block babel-block">
<li class="langs nav-item dropdown">
{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-1'])}
<ul class="dropdown-menu">
{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-2'])}
</ul>
</li>
</ul>
Вывожу для Bootstrap 5, а не как в Причем как видно я переделал отображение знака языка не через картинку а через flag_24.png.
Использовал пример под Babel с
Заменил в нем косяки (языки kg на самом деле ky (там ky вообще какой то левый флаг не понял что за страна), ir (Иранский) у меня оформлен как fa (персидский),
Добавил стили
.localizator_lang{
color: black!important;
background-color: unset!important;
align-items: center;
display: flex;
}
в настройках .htaccess добавил так:RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en|fa|tk|ky|abkhazia|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bl|bm|bn|bo|br|bs|bt|bw|by|by_|bz|ca|cd|cf|cg|ch|ci|cl|cm|cn|co|cr|cu|cv|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|england|er|es|et|eu|fi|fiji|fk|fm|fo|fr|ga|gd|ge|gg|gh|gl|gm|gn|gq|gr|gs|gt|gu|gw|gy|hk|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kosovo|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mf|mg|mh|mk|ml|mm|mn|mo|mp|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nagorno-karabakh|nato|nf|ng|ni|ni_|nl|no|np|nr|nz|om|pa|pe|pg|ph|pk|pl|pn|pr|ps|pt|pw|py|qa|red_cross|ro|rs|ru|rw|sa|sb|sc|scotland|sd|se|sg|sh|si|sk|sl|sn|so|somaliland|south_ossetia|sr|ss|st|sv|sy|sz|tc|td|tg|th|tj|tm|tn|to|tp|tr|tt|turkish_republic_of_northern_cyprus|tv|tw|tz|ua|ug|uk|un|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wales|ws|ye|za|zm|zw)/assets(.*)$ assets$2 [L,QSA]
Получилась такая красота https://disk.yandex.ru/i/MG9-_uxLZDNTEAФайл с иконками языка https://disk.yandex.ru/i/y-G8apn1dSooww
Файл css стилей https://disk.yandex.ru/d/R-eJsFVVQP5OmA
Все проще можно было сделать.
Можно было просто добавить еще один плейсхолдер 'languageName'=> $language->name (к имеющимся cultureKey, active и url) в сниппете getLanguages. В чанках подставлять просто {$languageName}
Можно было просто добавить еще один плейсхолдер 'languageName'=> $language->name (к имеющимся cultureKey, active и url) в сниппете getLanguages. В чанках подставлять просто {$languageName}
Поправил заметку https://modx.pro/lessons/24602.
Просто заметил что:
в новом FireFox (56.0.1 (64-бит)) не прокручивается окно локализации и не дает в контент сделать запись.
В Хроме все нормально (Версия 61.0.3163.100 (Официальная сборка), (64 бит)). Win 8.1
в новом FireFox (56.0.1 (64-бит)) не прокручивается окно локализации и не дает в контент сделать запись.
В Хроме все нормально (Версия 61.0.3163.100 (Официальная сборка), (64 бит)). Win 8.1
После обновления до версии 2.6.1 в админке пропали локализации. На фронте тексты остались. Получается не могу отредактировать ни одну локализацию
В инструментах разработчика в хроме видно, что возникает ошибка 500 при попытке обращения к файлу assets\components\localizator\connector.php
Выяснилось, что после обновления modx в корневой папке отсутствовал файл config.core.php, что вызывало ошибку при попытке его подключения в коннекторе
Никита подскажи пожалуйста, а у тебя нормально ставит ссылки в page.nav с site_url например
Не работает
у меня подмена site_url для феном такая, но вот беда пагинацией
site.ru/en/en/cat.html?page=2
Или это глюк pdoPage, а точнее глюк формирования page.nav?
Остальные сниппеты нормально работают, в том числе uri в самом pdoPage, т.к. обертка pdoResource
http://localizator.but1head.ru/en/
и выводит ли через феном site_urlНе работает
{$_modx->config['site_url']}
Через феном не выводит нужный site_url, а просто дефолту меня подмена site_url для феном такая, но вот беда пагинацией
case 'OnHandleRequest':
if($modx->context->key == 'mgr') return;
$language = 'en';
$modx->config['site_url'] = $_SERVER['REQUEST_SCHEME'] . '://' .$_SERVER['HTTP_HOST'] .'/'. $language.'/';
break;
Пагинация выдает такие ссылкиsite.ru/en/en/cat.html?page=2
Или это глюк pdoPage, а точнее глюк формирования page.nav?
Остальные сниппеты нормально работают, в том числе uri в самом pdoPage, т.к. обертка pdoResource
{'site_url' | option}
У меня вроде pdopage норм работает, trade-leader.com (11 языков)Сейчас нет компа под рукой
trade-leader.com (11 языков)У тебя там на поддоменах, а глюк когда по папке раскиданы версии 'http://but1head.ru/en/'
Так тоже выводит дефолтный site_url
У тебя подмена плейслохолдера только происходит
$modx->setPlaceholders(array(
'cultureKey' => $cultureKey,
'site_url' => $_SERVER['REQUEST_SCHEME'] . '://' . $language->http_host,
), '+');
т.е.//Нерабочие варианты
{$_modx->config['site_url']}
{'site_url' | option}
{'site_url' | placeholder}
//Рабочие
{'+site_url' | placeholder}
[[!++site_url]]
Все таки я склоняюсь, что pdoPage не дружит с base, но на это наверно только Василий может ответить)
Подскажите, как правильно сформировать карту сайта для локализаций (псевдоконтестов) для разных доменов? Здесь trade-leader.com и trade-leader.ru карта сайта формируется верно.
вам XML карту надо?
Да, верно. Обычно для этого использую pdoSitemap+RobotsBuilder, но сейчас такая связка не срабатывает для разных доменов, точне XML карта корректно выводится только после очистки кеша сайта.
Никита, огромное спасибо за помощь и сам компонент. Сейчас есть ошибки в разборе XML — «error on line 8 at column 3: Extra content at the end of the document», попытаюсь решить их самостоятельно.
webmaster яндекса? он хочет для разных разделов (авто, каталог, маркет) доп.данные, все остальные валидаторы норм проверяют. сайт 2 года живет и яндекс его нормально ест.
В ресурсе sitemap укажите «настройки» > тип содержимого XML
В ресурсе sitemap укажите «настройки» > тип содержимого XML
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{'@FILE snippets/sitemap.php' | snippet}
</urlset>
Спасибо, все работает! Никита, не сочтите за наглость, но вы не планировали добавить в XML-карту атрибут hreflang? Сам «чайник», а атрибут hreflang очень рекомендуют Яндекс и Google для мультиязычних сайтов.
форматы кода стран не всем подойдут, можно просто в head добавить вручную
<link rel="alternate" hreflang="en" href="http://trade-leader.com/" />
<link rel="alternate" hreflang="ru" href="http://trade-leader.ru/" />
<link rel="alternate" hreflang="pt" href="http://pt.trade-leader.com/" />
и т.д.
Да, уже «подсмотрел» у вас на сайте trade-leader.com)), очень мне он нравиться.
Случайно обнаружил, что в XML карте url главной страницы выводится с «index» —
<loc>http://trade-leader.com/index</loc>
. У меня на сайте добавляется и / — <loc>http://site.com/index/</loc>
. Как исключить «index» с XML карты?
Привет, не до конца понял как работает компонент.
Но на старте возникает проблема:
при вставки в локализатор контента, он не вставляется, и не переводится соответственно. Остаются заголовки, И так далее, а сам контент исчезает при повторном открытии: Видно на видео
Но на старте возникает проблема:
при вставки в локализатор контента, он не вставляется, и не переводится соответственно. Остаются заголовки, И так далее, а сам контент исчезает при повторном открытии: Видно на видео
поле контента пока что поддерживает только tiny mce rte.
Граждане, подскажите пожалуйста с такой задачей: есть 4 разных сайта на одном движке, организовано все это дело через контексты — все прекрасно работает, но тут встала задача сделать языковые версии для всех 4 сайтов. Решил через localizator, работает только на одном контексте, как запилить на остальных 3-х?
Кхм. Localizator как-таки и создан для того, чтобы уйти от контекстов. Поэтому, как я полагаю, он просто совершенно не создан для того, чтобы делать языковые версии для множества контекстов.
таки допилил ) суть в том, что было 4 лендинга (4 контекста), а разбивать на 4 клиент не захотел, так то бы естественно раскопировал бы, да на каждом по отдельности сделал бы языковые версии, в итоге получилось 6 языков на 4-х контекстах.
Простите за глупый вопрос, но не получается разобраться.
На сайте два языка: русский и английский. Создал, к примеру, два «контекста» site.com и site.com/en/
После переключения на англоязычную версию — ссылки в меню становятся на английском, но все равно ведут на русскоязычные версию сайта, т.е. должно быть быть site.com/en/about.html а ведет на site.com/about.html. При переходе на англоязычную версию сайта () в base отображается адрес site.com. Должен быть site.com/en/? А если вбить в base site.com/en/, то все стили на сайт ломаются, вообще не подгружаются
На сайте два языка: русский и английский. Создал, к примеру, два «контекста» site.com и site.com/en/
После переключения на англоязычную версию — ссылки в меню становятся на английском, но все равно ведут на русскоязычные версию сайта, т.е. должно быть быть site.com/en/about.html а ведет на site.com/about.html. При переходе на англоязычную версию сайта () в base отображается адрес site.com. Должен быть site.com/en/? А если вбить в base site.com/en/, то все стили на сайт ломаются, вообще не подгружаются
У стилей, картинок, скриптов слэш в начале пути поставь: /assets/css/…
спасибо!
Всем привет. Подскажите как правильно вывести текущий CultureKey в чанке товара minishop (tpl.msProducts.row) и что бы при выборе фильтра в mFilter2 он оставался.
На сайте один контекст и два языка (en и ru) через localizator в системной настройке cultureKey стоит «ru»
Если вывожу в чанке {$_modx->config['cultureKey']} или {'localizator_key' | option} то вижу текущий язык, но при отработке фильтра ajax'ом язык {$_modx->config['cultureKey']} слетает на установленный в системных настройках а {'localizator_key' | option} вовсе не отображает.
На сайте один контекст и два языка (en и ru) через localizator в системной настройке cultureKey стоит «ru»
Если вывожу в чанке {$_modx->config['cultureKey']} или {'localizator_key' | option} то вижу текущий язык, но при отработке фильтра ajax'ом язык {$_modx->config['cultureKey']} слетает на установленный в системных настройках а {'localizator_key' | option} вовсе не отображает.
Чтобы локализации работали с mFilter, необходимо накидать плагин. У меня примерно такой:
Переписать можно куда лучше и универсальнее, просто задачи не стояло. Надеюсь, помог.
<?php
if($modx->context->key == "mgr"){return;}
$modx->setOption('cultureKey', 'en');
if (!empty($_COOKIE['lang'])){
if ($_COOKIE['lang']=='en'){
$modx->setOption('cultureKey', 'en');
} else {
$modx->setOption('cultureKey', 'ru');
}
}
событие OnInitCultureПереписать можно куда лучше и универсальнее, просто задачи не стояло. Надеюсь, помог.
Не получилось, не вижу языки после ajax
Вот демка localizator.tirinipul.ru/catalog/
Я уже перепробовал все что мог, не понимаю куда копать дальше.
Вот демка localizator.tirinipul.ru/catalog/
Я уже перепробовал все что мог, не понимаю куда копать дальше.
Ах да. Сам написал не совсем правильно.
Смотрите, если почитать код, то там можно увидеть, что есть обращение к куки.
Но у вас на демке куки не пишутся. Значит что? Что в этом проблема. И тут я вспомнил, что нужен еще один плагин. Я его просто в другое место спрятал и поэтому сразу не нашел.
Смотрите, если почитать код, то там можно увидеть, что есть обращение к куки.
Но у вас на демке куки не пишутся. Значит что? Что в этом проблема. И тут я вспомнил, что нужен еще один плагин. Я его просто в другое место спрятал и поэтому сразу не нашел.
<?php
if($modx->context->key == "mgr"){return;}
$alias = $modx->context->getOption('request_param_alias', 'q');
$request = $_REQUEST[$alias];
$tmp = explode('/', $request);
if ($tmp[0]=='en'){
$modx->setOption('cultureKey', 'en');
setcookie('lang','en',0,'/');
} else {
$modx->setOption('cultureKey', 'ru');
setcookie('lang','ru',0,'/');
}
Событие OnHandleRequest, например.
Дима, большое спасибо, все заработало.
Нужно было еще сессии и кеш прибить.
Нужно было еще сессии и кеш прибить.
Здравствуйте. Задам сюда, что бы не плодить темы…
Подскажите пожалуйста, поменять порядок вывода языков, если используешь приведенный тут getLanguages снипет?
Отметку активного языка сделал через условие, а как менять порядок вывода не знаю.
Подскажите пожалуйста, поменять порядок вывода языков, если используешь приведенный тут getLanguages снипет?
Отметку активного языка сделал через условие, а как менять порядок вывода не знаю.
<?php
$output = "";
// определяем есть ли языки через "папки"
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}
$languages = $modx->getIterator('localizatorLanguage');
$tekush = $modx->localizator_key;
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$link = $language->http_host . $uri;
} else {
$link = $language->http_host . '/' . $uri;
}
if ($tekush == $language->key) {
$output .= " <li><a href=\"http://{$link}\" class=\"checked\">{$language->name}</li>\n";
} else {
$output .= " <li><a href=\"http://{$link}\">{$language->name}</li>\n";
};
};
return $output;
И еще, как правильно реализовать добавление характеристик товаров небольшого каталога для многоязычности с использованием локализатора?
если 3 языка, то просто делать для каждого ресурса по 3 тв параметра для каждой характеристики и потом в шаблоне по условию, в зависимости от текущего языка их выводить?
если 3 языка, то просто делать для каждого ресурса по 3 тв параметра для каждой характеристики и потом в шаблоне по условию, в зависимости от текущего языка их выводить?
И еще один глупый вопрос… а как разное поле contant на разных языках заполнить?
Перечитай сначала пост) Выводить контент так {$_modx->resource.localizator_content}
Как выводить я знаю ) а как заполнять? Там же у ресурса только одно поле контент
Ну ёмоё самая первая картинка) file.modx.pro/files/0/3/a/03a3687e1df58d0d7ec68902bad2d12c.png
Там все поля заполняются для каждого языка.
Там все поля заполняются для каждого языка.
Поставил SEO TAB что бы делать 301 редиректы битых ссылок, и при добавлении я указываю id ресурса на который должна вести ссылка, и столкнулся с проблемой что в компоненте линк генерируется исходя из контекста и в итоге получается что site.ru/test я могу указать а вот site.ru/EN/test не могу так как localizator же на псевдо контекстах. prntscr.com/ipggei
Может сделать второй контекст пустой?
Подскажите куда копать, может сталкивался.
Может сделать второй контекст пустой?
Подскажите куда копать, может сталкивался.
Поставил на два сайта, на одном из них неприятный баг.
Когда добавляю или пытаюсь изменить значение двух полей полей — Аннотация и SEO Описание, то после сохранения они заменяются на 0.
Думал может конфликтует с каким дополнением, но сделал на другом сайте тот же набор дополнений и там все по-прежнему работает. Как-то можно найти причину подмены текста на 0?
Когда добавляю или пытаюсь изменить значение двух полей полей — Аннотация и SEO Описание, то после сохранения они заменяются на 0.
Думал может конфликтует с каким дополнением, но сделал на другом сайте тот же набор дополнений и там все по-прежнему работает. Как-то можно найти причину подмены текста на 0?
github.com/but1head/localizator/blob/master/core/components/localizator/model/schema/localizator.mysql.schema.xml вот тут надо поменять phptype=«text» на phptype=«string». Чуть позже пересоберу компонент.
Поменял, но все равно в этих двух строках после сохранения 0.
В общем так и не понял что не так, пока перекинул аннотации в поле для ключевых слов.
Точно такая же проблема, после сохранения появляется в этих полях «0»
Последняя версия MODX и пакета
Последняя версия MODX и пакета
github.com/but1head/localizator/blob/master/core/components/localizator/model/schema/localizator.mysql.schema.xml вот тут надо поменять phptype=«text» на phptype=«string». Чуть позже пересоберу компонент.Все, проблема решена
мне помогло только частично. текст не сохраняется по прежнему, а сохраняются только числа и то если они написаны в самом начале (посмотреть можно на видео — http://take.ms/3qIjR)
решилось всё заменой phptype с text на string (как советовал @but1head) и переходом с php 7.2 на 7.1
Чтоб на 7.2 не переключать
В этом файле тоже text на string нужно заменить
строка 83 и 90
github.com/but1head/localizator/blob/master/core/components/localizator/model/localizator/mysql/localizatorcontent.map.inc.php
В этом файле тоже text на string нужно заменить
строка 83 и 90
github.com/but1head/localizator/blob/master/core/components/localizator/model/localizator/mysql/localizatorcontent.map.inc.php
github.com/but1head/localizator/blob/master/core/components/localizator/model/localizator/mysql/localizatorcontent.map.inc.php
В этом файле тоже text на string нужно заменить
строка 83 и 90
В этом файле тоже text на string нужно заменить
строка 83 и 90
У кого-нибудь получилось использовать редактор отличающийся от TinyMCE?
@but1head скажи хотя бы в какую сторону копать? Всё перерыл, но никак не могу понять — от чего зависит выбор именно Tiny.
@but1head скажи хотя бы в какую сторону копать? Всё перерыл, но никак не могу понять — от чего зависит выбор именно Tiny.
Не выводит поле content на Русском языке, только на Английском почему-то
С английским всё нормально:
В логах ничего нет, названия переводятся нормально.
Во вкладке локализация переведено с русского на русский и английская версия.
При cultureLAnguage ru ничего не выводит, при en всё как нужно. Разумеется Fenom везде включен.
but1head, очень надеюсь на твою помощь, ибо я в тупике…
{$_modx->resource.localizator_content}
На русском пустота, хотя в локализации и в стандартном теле ресурса есть текст: С английским всё нормально:
В логах ничего нет, названия переводятся нормально.
Во вкладке локализация переведено с русского на русский и английская версия.
При cultureLAnguage ru ничего не выводит, при en всё как нужно. Разумеется Fenom везде включен.
but1head, очень надеюсь на твою помощь, ибо я в тупике…
Пока закостылил как-то так:
[[++cultureKey:is=`ru`:then=`[[*content]]`]][[++cultureKey:is=`en`:then=`{$_modx->resource.localizator_content}`]]
localizator_default_language указал?
Прошу вашей помощи, дабы не плодить новые темы, задаем его тут.
Собственно, а как обновить ранее добавленные разделы и страницы, просто в ручную каждый добавлять не есть гуд, пробовал в самом приложении в словарях сделать автоперевод, он не работает, постоянно загрузка идет в логах ошибок нету, в консоле тоже пусто. Подскажите как обновить все?!
Собственно, а как обновить ранее добавленные разделы и страницы, просто в ручную каждый добавлять не есть гуд, пробовал в самом приложении в словарях сделать автоперевод, он не работает, постоянно загрузка идет в логах ошибок нету, в консоле тоже пусто. Подскажите как обновить все?!
Рабочий кусок вывода локализованного pdoResources, вдруг кому пригодится. Я долго вкурить не могу почему не работает! Оказывается, что нужно было использовать конструкцию {$_modx->runSnippet()}, а не в том укороченном виде, что представлен в статье
{$_modx->runSnippet('pdoResources', [
'parents' => 10,
'depth' => 0,
'tpl' => 'newsRowTpl',
'includeTVs' => 'news-image',
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
])}
Метод костыльного программирования продалжался!
Предыдущий вариант выводил только иностранный перевод, но не русский :D Решил проблему гениально тупо, но работает:
Предыдущий вариант выводил только иностранный перевод, но не русский :D Решил проблему гениально тупо, но работает:
{$_modx->runSnippet('pdoResources', [
'parents' => 10,
'depth' => 0,
'tpl' => 'newsRowTpl',
'includeTVs' => 'news-image',
[[++cultureKey:ne=`ru`:then=`
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
`]]
])}
{'pdoPage' | snippet : [
'element' => 'ms2GalleryResources',
'tpl' => '@FILE chunks/article.row.tpl',
'parents' => 179,
'limit' => 8,
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '", "localizator.active" : 1}',
]}
работает больше года
Вот хоть убей не работает у меня в таком виде, уже весь проект на cultureKey'ях в итоге
Подскажите пожалуйста, как выводите tv поле в шаблоне 'includeTVs' => 'news-image'?
а если не трудно то покажите шаблон 'tpl' => 'newsRowTpl'. Мне нужно тв с текстом вывести, не получается (через сниппет pdoResources).
Благодарю.
а если не трудно то покажите шаблон 'tpl' => 'newsRowTpl'. Мне нужно тв с текстом вывести, не получается (через сниппет pdoResources).
Благодарю.
После отключения языка (который не нужен или пока на доработке), он все равно отображается. Это должно быть так или как то фиксится?
Делал вывод по аналогии как тут
Делал вывод по аналогии как тут
Добрый день.
Возник тот же вопрос… Вам удалось как-то его решить?
Возник тот же вопрос… Вам удалось как-то его решить?
Не проверял, но скорее всего нужно в сниппете вот эту строку:
$languages = $modx->getIterator('localizatorLanguage');
заменить на: $languages = $modx->getIterator('localizatorLanguage', array( 'active' => 1 ));
Компонент сыпет ошибками в консоль на PHP Version 7.2.8
(ERROR @ html/core/components/localizator/processors/mgr/language/update.class.php : 38) PHP warning: Use of undefined constant key - assumed 'key' (this will throw an Error in a future version of PHP)
Здравствуйте, как включить поле в перевод свойства товара minishop2?
Доброе утро, каким образом реализованы эти вкладки из примера?
Добавление записи в словарь — работает, а удаление — нет в компоненте, у всех не работает?
Добавление записи в словарь — работает, а удаление — нет в компоненте, у всех не работает?
Мой вариант getLanguages на основе текущего:
<?php
$log = $output = '';
$default_host = $modx->getOption('http_host', []);
$pdoFetch = $modx->getService('pdoTools');
$pdoFetch->setConfig($scriptProperties, false);
$pdoFetch->addTime('pdoTools loaded');
preg_match('/([^.]+){1}\.([^.]+)$/i', $_SERVER['HTTP_HOST'], $matches);
$languages = $modx->getIterator('localizatorLanguage', [
'http_host:LIKE' => "%{$matches[0]}",
'active' => 1
]);
$placeholders = [];
$result = false;
foreach($languages as $language) {
// print_r($language->toArray());
// if (!$result && $language->http_host == $matches[0]){
if ($language->key == $modx->localizator_key){
$result = true;
}
if ($default_host == $matches[0]){
$default_key = $language->key;
}
$placeholders[$language->key] = [
'id' => $language->id,
'name' => $language->name,
'cultureKey' => $language->key,
'current' => ($language->key == $modx->localizator_key),
'active' => ($language->key == $modx->localizator_key),
'url' => $_SERVER['REQUEST_SCHEME'] . '://' . $language->http_host,
];
}
// сортировка результата
uasort($placeholders, function ($a, $b){
return ($a['id'] <=> $b['id']);
});
if (!$result && $default_key && $placeholders[$default_key]){
$placeholders[$default_key]['active'] = true;
}
$output = !empty($tpl) ? $pdoFetch->getChunk($tpl, ['langs' => $placeholders]) : print_r($placeholders, 1);
// print_r($placeholders);
// die();
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
$log .= '<pre class="pdoResourcesLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}
if ($scriptProperties['return'] == 'data') {
return ['data' => $output, 'log' => $log];
}
if (!empty($toPlaceholder)) {
$modx->setPlaceholder($toPlaceholder, $output);
}
return $output;
пример использования:{if !$localizator = $_modx->cacheManager->get('localizator_'~$.server.HTTP_HOST)}
{set $localizator = '!getLanguages' | snippet : [
'showLog' => '1',
'tpl' => '@FILE:others/chunks/languages__items.tpl',
]}
{set $null = $_modx->cacheManager->set('localizator_'~$.server.HTTP_HOST, $localizator, 1)} {* кэш на 30 минут *}
{/if}
<span class="lang-selector dropdown-el">
{$localizator}
</span>
Возникла проблема с HybridAuth, все ссылки, которые идут в response переходят на сайт провайдера с ошибкой из-за протокола. Протокол HTTP, вместо HTTPS. Что с этим можно сделать? Если в компоненте http_host ввести site.ru/ то это работает, но всё остальное отображается не так. Подставляя URL спереди ещё одну копию https://
Нашёл в чём дело в файле \core\components\localizator\model\localizator\localizator.class.php
if($language) {
if (preg_match("/^(http(s):\/\/)/i", $language->http_host)) {
$site_url = $language->http_host;
}
else
$site_url = MODX_URL_SCHEME . $language->http_host;
Вот эту строчку $site_url = MODX_URL_SCHEME . $language->http_host;
заменить на $site_url = 'https://' . $language->http_host;
Но костыль не очень конечно. Если обновлять на новые версии, то всё потрётся. Как придумать по деликатнее способ?
А как в msCart вывести переведнные названия товаров?
{'!msCart' | snippet : [
'tpl' => 'tpl.msCart',
]}
{'!msCart' | snippet : [
'tpl' => 'tpl.msCart',
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = msProduct.id"
}
}',
'select' => '{ "localizator" : "msProduct.*, localizator.*, msProduct.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '", "localizator.active" : 1}',
]}
А как в msGetOrder вывести переведенные названия товаров?
и что бы в письме покупателю они переведенные отправлялись?
и что бы в письме покупателю они переведенные отправлялись?
Присоединяюсь к вопросу. У вас получилось перевести название товаров в msGetOrder и письмо?
Присоединяюсь к вопросу. У кого получилось с msGetOrder и письмом — подскажите, пожалуйста!
msGetOrder запускается непосредственно из основного класса miniShop2. Изменить это поведение можно одним способом — расширить основной класс заказа и прописать там специальный метод changeOrderStatus из основного класса — miniShop2 предусматривает это.
Ну а в методе уже можно поменять логику, как душе угодно.
Ну а в методе уже можно поменять логику, как душе угодно.
решение довольно простое
1. добавляем в чанк шаблон tpl.msEmail конструкцию из Получение и вывод pagetitle от другого ресурса с условием проверки локализации
проверяем наш шаблон письма через
1. добавляем в чанк шаблон tpl.msEmail конструкцию из Получение и вывод pagetitle от другого ресурса с условием проверки локализации
{if $_modx->config.cultureKey == 'ru'}
{set $tTitle = $product.name}
{else}
{set $tTitle = 'pdoResources' | snippet : [
'tpl' => '@INLINE {$pagetitle}',
'class' => 'localizatorContent',
'sortby' => 'id',
'limit' => 1,
'where' => [
'key' => ('localizator_key' | option),
'resource_id' => $product.id
],
]}
{/if}
и {$product.name} заменяем на наш {$tTitle} проверяем наш шаблон письма через
{'!msGetOrder' | snippet : [
'id' => 460, //номер заказа
'tpl' => 'tpl.msEmail.new.user',
]}
Доброго времени суток. Столкнулся с такой проблемой не получается вывести pdoCrumbs. Вывожу вот так
Вот лог
{'!pdoCrumbs' | snippet : [
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
'outputSeparator' => '<li><i class="far fa-angle-double-right"></i></li>',
'tpl' => '@INLINE: <li><a class="activated" href="[[+link]]">[[+menutitle]]</a></li>',
'tplCurrent' => '@INLINE: <li>{$menutitle}</li>',
'tplHome' => '@INLINE: <li><i class="fas fa-home activated"></i><a class="activated" href="[[+link]]">[[+menutitle]]</a></li>',
'tplWrapper' => '@INLINE: <div class="breadcrumbs"><div class="container"><ul>[[+output]]</ul></div></div>',
'showHome' => 1,
]}
Хотя pdoMenu, pdoResources, MIGX выводить без проблем.Вот лог
[2019-05-26 23:30:27] (ERROR @ /Volumes/Work/Projects/Salon/web/core/model/modx/modx.class.php : 1031) `` is not a valid integer and may not be passed to makeUrl()
[2019-05-26 23:30:27] (ERROR @ /Volumes/Work/Projects/Salon/web/core/model/modx/modresponse.class.php : 210) Attempted to redirect to an empty URL.
[2019-05-26 23:30:27] (ERROR @ /Volumes/Work/Projects/Salon/web/core/components/pdotools/model/pdotools/pdofetch.class.php : 172) [pdoTools] Error 42000: Expression #89 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'salon.localizator.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
[2019-05-26 23:30:28] (ERROR @ /Volumes/Work/Projects/Salon/web/core/model/modx/modx.class.php : 1031) `` is not a valid integer and may not be passed to makeUrl()
[2019-05-26 23:30:28] (ERROR @ /Volumes/Work/Projects/Salon/web/core/model/modx/modresponse.class.php : 210) Attempted to redirect to an empty URL.
[2019-05-26 23:30:28] (ERROR @ /Volumes/Work/Projects/Salon/web/core/model/modx/modx.class.php : 1031) `` is not a valid integer and may not be passed to makeUrl()
[2019-05-26 23:30:28] (ERROR @ /Volumes/Work/Projects/Salon/web/core/model/modx/modresponse.class.php : 210) Attempted to redirect to an empty URL.
Не вижу ошибок, но вот точно работающий вызов:
{$_modx->runSnippet('pdoCrumbs', [
'tpl' => '@INLINE <span class="help-center-breadcrumbs__item"><a class="help-center-breadcrumbs__link" href="{$link}">{$menutitle}</a></span>',
'tplCurrent' => '@INLINE <span class="help-center-breadcrumbs__item"><span class="help-center-breadcrumbs__link">{$menutitle}</span></span>',
'tplMax' => '@INLINE <span class="help-center-breadcrumbs__item"><span class="help-center-breadcrumbs__link"> ... </span></span>',
'tplWrapper' => '@INLINE <div class="help-center-breadcrumbs">{$output}</div>',
'showHome' => 1,
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
])}
Ну тогда я совсем нечего не понимаю. Этот вызов тоже у меня не работает.
Если вызываю так то выводит только на одном языке:
Если вызываю так то выводит только на одном языке:
{'!pdoCrumbs' | snippet : [
'outputSeparator' => '<li><i class="far fa-angle-double-right"></i></li>',
'tpl' => '@INLINE: <li><a class="activated" href="{$link}">{$menutitle}</a></li>',
'tplCurrent' => '@INLINE: <li>{$menutitle}</li>',
'tplHome' => '@INLINE: <li><i class="fas fa-home activated"></i><a class="activated" href="{$link}">{$menutitle}</a></li>',
'tplWrapper' => '@INLINE: <div class="breadcrumbs"><div class="container"><ul>{$output}</ul></div></div>',
'showHome' => 1,
]}
Добавляю вызов localizator не выводит вообще нечего:'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}
Что я мог сделать не так?
Вот рабочий вариант
{'Localizator' | snippet : [
'snippet' => 'pdoCrumbs',
]}
Я так пробывал и тоже не чего не выводит. Очевидно ошибка не в вызове. Но я не знаю как посмотреть что не так.
showLog
Знающие подскажите в чем ошибка
0.0002098: pdoTools loaded
0.0001490: Conditions prepared
0.0000281: Query parameters ready
0.0000520: xPDO query object created
0.0004518: leftJoined localizatorContent as localizator
0.0000038: Grouped by modResource.id
0.0005441: Added selection of modResource: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000300: Added selection of localizatorContent: modResource.*, localizator.*, modResource.id
0.0005841: Added where condition: published=1, deleted=0, id:IN(7,1), localizator.key=en
0.0002360: Sorted by find_in_set(`modResource`.`id`,'7,1'),
0.0000050: Limited to 10, offset 0
0.0004940: SQL prepared "SELECT `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`alias_visible`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`content`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, modResource.*, localizator.*, modResource.id FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_localizator_content` `localizator` ON localizator.resource_id = modResource.id WHERE ( `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`id` IN (7,1) AND `localizator`.`key` = 'en' ) GROUP BY modResource.id ORDER BY find_in_set(`modResource`.`id`,'7,1') LIMIT 10 "
0.0008790: Could not process query, error #1055: Expression #89 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'salon.localizator.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
0.0000141: Chunks processed
0.0040200: Total time
4 194 304: Memory usage
Все разобрался всем спасибо за помощь
Подскажите, в чем была проблема?
Доброго времени суток. Подскажите почему может быть такая ошибка?
Notice: Undefined index: localizatorTVs in /home/s/saybme/ved-garant.saybme.beget.tech/public_html/core/components/pdotools/model/pdotools/pdofetchlocalizator.class.php on line 13
на появляется когда меняешь настройку pdoFetch.class на pdotools.pdofetchlocalizator
Такая же проблема
И не пропускает почему TV где тип migx
Для Localizator надо создавать несколько контекстов для выбора разных Локалей? Реально сделать на одном контексте, несколько языковых версий? И как сделать переключение языков тогда, если контекст один? Поделитесь опытом?
docs.modx.pro/komponentyi/localizator/obshhee-opisanie-i-nastrojka
Компонент Localizator дает возможность создания языковых версий / сателитов без контекстов
А как происходит переключение языка, с сохранением выбора? Нужно для такой структуры site.ru/en/
Прочитайте внимательно инструкцию по ссылке. Думаю там все расписано.
задолбали ошибки везде типа
Notice: Undefined variable: hook in /home/m/melnichvl/cultstroy.su/public_html/core/cache/includes/elements/modsnippet/44.include.cache.php on line 45
Подскажите как быть(как правильно) когда вызов идет с ms2GalleryResources
{'!pdoPage@pg' | snippet : [
'element' => 'ms2GalleryResources'
'parents' => 30
'tpl' => 'newsItem'
'limit' => 18
'includeOriginal' => 1
'sortby' => 'menuindex'
'sortdir' => 'ASC'
]}
{'page.nav' | placeholder}
И такой вызов{'!ms2GalleryResources' | snippet : [
'parents' => 7
'tpl' => 'main.pItem'
'limit' => 4
'depth' => 0
'includeOriginal' => 1
'sortby' => 'menuindex'
'sortdir' => 'ASC'
]}
Попробуйте так, но я не тестил
1.
1.
{'!pdoPage@pg' | snippet : [
'element' => 'Localizator',
'snippet' => 'ms2GalleryResources',
'parents' => 30,
'tpl' => 'newsItem',
'limit' => 18,
'includeOriginal' => 1,
'sortby' => 'menuindex',
'sortdir' => 'ASC'
]}
2.{'!Localizator' | snippet : [
'snippet' => 'ms2GalleryResources',
'parents' => 7,
'tpl' => 'main.pItem',
'limit' => 4,
'depth' => 0,
'includeOriginal' => 1,
'sortby' => 'menuindex',
'sortdir' => 'ASC'
]}
В случае если на сайте уже были документы, необходимо ручками добавлять для них перевод?
Добрый день. При попытке перевода автоматически пишет «Для автоматического перевода необходимо добавить хотя бы одну запись в таблицу»
Локализации добавлены, язык по умолчанию выбран
UPD: вопрос снят — нужно было создать один перевод для основного языка на странице, тогда автоматический перевод работает. Было бы здорово указать это в доках))
Локализации добавлены, язык по умолчанию выбран
UPD: вопрос снят — нужно было создать один перевод для основного языка на странице, тогда автоматический перевод работает. Было бы здорово указать это в доках))
Можно ли с помощью localizator переводить поля вида $_modx->config.name_config?
нет, не получится. Придётся выкручиваться, например лексиконами.
Понял, а подскажите, как через лексиконы сделать переводы тех конфигов, который через компонент config сделаны?
Скрины пожалуйста. В каком виде у вас конфиги?
В догонку: получается чтобы сайт работал например на 2 языках: английском и французском, нужно помимо того что заполнены поля в вкладке Документ еще перезаполнить их для основного языка на вкладке Локализации — нет ли возможности если не заполнены локализации тянуть все с вкладки Документ?
Там кажется по умолчанию именно так и сделано. Если не заполнены поля локализации, они подтягиваются с основных.
не тянется по умолчанию
Удалось решить вопрос? Если да, то можешь подсказать как?
Добрый день. Как сделать localization для каталога tickets?
{'!pdoPage' | snippet : [
'element' => 'getTickets',
'parents' => 11,
'limit'=>0,
'tvPrefix' => '',
'includeTVs' => 'img',
'tpl' => 'tpl.block.item'
]}
массив пустой
нашел решение
Пиши тут, вдруг кто-то тоже будет искать решение.
Хорошо Иван, ты прав. Я вывел вот так
{'pdoResources' | snippet : [
'tpl' => '@INLINE {foreach $value as $row}
<div class="h_p_list">
<div class="h_price_item" data-title="">
<h5>{if $row.logo?}<img width="85" src="/{$row.logo}" alt="{$row.name}">{else}-{/if}</h5>
</div>
</div>
{/foreach}',
'class' => 'locTemplateVarResource',
'sortby' => 'id',
'limit' => 0,
'where' => [
'key' => ('localizator_key' | option),
'tmplvarid' => 25,
]
]}
где tmplvarid это id tv параметра
Как у вас прописаны правила в htaccess:
RewriteRule ^(ru|en|ar|ch)/assets(.*)$ assets$2 [L,QSA]
Так?
явно проблемы с путями
В .htaccess сделал так, список расширений для игнорирования, к примеру /ir/templates/default/css/style.css => /templates/default/css/style.css и т.д.
А вызов из документации вообще ничего не выводит
Также, может кому-то помогу, представлю mysql запрос, который перенесет уже имеющую локализацию сделанную на доп. полях (tv). К примеру, keywords_en, country_en и т.п. с постфиксом _en на конце:
RewriteCond %{REQUEST_URI} ^/([a-z]{2})/(.*\.(php|css|doc|docx|gif|ico|jpeg|jpg|js|pdf|png|ppt|pptx|svg|xls|xlsx|zip|woff|ttf|txt|xml))$
RewriteRule ^([a-z]{2})/(.*)$ $2 [L,QSA]
Сниппет переключения языка для Bootstrap 4<?php
$pdo = $modx->getService('pdoTools');
$tplDefault = '@INLINE
<a href="http://{$link}" class="dropdown-item">
<img src="{$image}" alt="$language_name" title="{$language_name}">
</a>';
$tplWrapperDefault = '@INLINE
<div class="dropdown show lang-switcher">
<a class="d-block btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{$modx->cultureKey | upper}</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
{$output}
</div>
</div>';
$tpl = $modx->getOption('tpl', $scriptProperties, $tplDefault);
$tplWrapper = $modx->getOption('tplWrapper', $scriptProperties, $tplWrapperDefault);
$output = array();
// Определяем есть ли языки через "папки"
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}
$languages = $modx->getIterator('localizatorLanguage');
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$link = $language->http_host . $uri;
} else {
$link = $language->http_host . '/' . $uri;
}
$image = "template/default/images/flags/" . $language->key . ".svg";
$params = array(
'link' => $link,
'image' => $image,
'language_name' => $language->name
);
$output[] = $pdo->getChunk($tpl, $params);
}
$output = implode("\n", $output);
return $pdo->getChunk($tplWrapper, array('output' => $output));
В чанке, использую так {if $_modx->config.cultureKey != 'ru'}
{set $select = '{ "localizator" : "modResource.*, localizator.*, modResource.id" }' }
{set $where = '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}' }
{/if}
{set $langSwitcher = $modx->runSnippet('langSwitcher')}
{$_modx->runSnippet('pdoMenu', [
'level' => 2,
'parents' => 0,
'outerClass' => 'menu w-100',
'tpl' => '@INLINE <li><a href="[[+link]]">[[+menutitle]]</a>[[+wrapper]]</li>',
'tplOuter' => '@INLINE
<ul [[+classes]] id="menu">
[[+wrapper]]
<li class="float-right pr-3">' ~ $langSwitcher ~ '</li>
</ul>',
'tplInner' => '@INLINE <ul>[[+wrapper]]</ul>',
'tplParentRow' => '@INLINE
<li>
<label for="drop-[[+id]]" class="toggle toogle-2" data-item="[[+menutitle]]"><span class="fa fa-angle-down" aria-hidden="true"></span></label>
<a href="[[+link]]">[[+menutitle]] <span class="fa fa-angle-down" aria-hidden="true"></span></a>
<input type="checkbox" id="drop-[[+id]]">
[[+wrapper]]
</li>',
'leftJoin' => '{
"localizator" : {
"class" : "localizatorContent",
"alias" : "localizator",
"on" : "localizator.resource_id = modResource.id"
}
}',
'select' => $select,
'where' => $where
])}
P.S. locfield представленный выше модуль, работает криво при выводе content:{$_modx->resource.id | locfield : 'content'}
А вызов из документации вообще ничего не выводит
{$_modx->resource.localizator_content}
Хотелось бы понять почему так происходит…Также, может кому-то помогу, представлю mysql запрос, который перенесет уже имеющую локализацию сделанную на доп. полях (tv). К примеру, keywords_en, country_en и т.п. с постфиксом _en на конце:
INSERT INTO modx_localizator_tmplvar_contentvalues (`key`, `tmplvarid`, `contentid`, `value`)
SELECT 'en' AS 'key',
modx_site_tmplvars_copy.id tmplvarid,
modx_site_tmplvar_contentvalues.contentid,
modx_site_tmplvar_contentvalues.value
FROM modx_site_tmplvar_contentvalues
JOIN modx_site_tmplvars
ON modx_site_tmplvar_contentvalues.tmplvarid = modx_site_tmplvars.id
JOIN modx_site_tmplvars modx_site_tmplvars_copy
ON Substring_index(modx_site_tmplvars.name, '_en', 1) = modx_site_tmplvars_copy.name
WHERE modx_site_tmplvars.name LIKE '%_en';
Все это дело тестировалось на MODX Revolution 2.7.2-pl
Не забудьте в чанке, который отвечает за вывод начала документа (
Не забудьте в чанке, который отвечает за вывод начала документа (
<html><head>...</head>
), прописать{$_modx->lexicon->load($modx->cultureKey . ':localizator:default')}
<base href="[[++site_url]]"/>
Разобрался в чем дело, в поле с переводом контента был вставлен сниппет и при использовании
Добавляю код допила плагина, с учетом всех косяков.
{$_modx->resource.id | locfield : 'content'}
, появлялась ошибка... core\components\pdotools\model\pdotools\pdotools.class.php : 989) Unexpected token ':' ...
, после добавления processElementTags в конце плагина проблем нет.Добавляю код допила плагина, с учетом всех косяков.
<?php
/** @var modX $modx */
switch ($modx->event->name) {
case 'pdoToolsOnFenomInit':
/** @var Fenom $fenom
Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы.
Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
*/
$pdo = $modx->getService('pdoTools');
// localizator
$fenom->addModifier('locfield', function($id, $field = null) use ($pdo, $modx)
{
$pdo->debugParserModifier($id, 'locfield');
/** @var modResource $resource */
if (empty($id)) {
$resource = $modx->resource;
} elseif (!is_numeric($id)) {
$field = $id;
$resource = $modx->resource;
} elseif (!$resource = $pdo->getStore($id, 'resource')) {
$resource = $modx->getObject('modResource', $id);
$pdo->setStore($id, $resource, 'resource');
}
$key = $modx->getOption('cultureKey');
if ($modx->getOption('cultureKey') != 'ru') {
$q = $modx->newQuery("localizatorContent");
$q->where(array(
"`resource_id` = '" . $id . "'",
"`key` = '" . $key . "'"
));
$q->select(array(
$field
));
$s = $q->prepare(); // print $q->toSQL(); die;
$s->execute();
$array = $s->fetch(PDO::FETCH_ASSOC);
$field_value = $array[$field];
if (empty($field_value)) {
if (is_numeric($field)) {
$tvId = intval($field);
} else {
$tvObj = $modx->getObject('modTemplateVar', array(
'name' => $field
));
if ($tvObj)
$tvId = $tvObj->get('id');
}
if ($tvId == 0) {
$resource = $modx->getObject('modResource', $id);
if ($resource)
return $resource->get($field);
}
$q = $modx->newQuery("locTemplateVarResource");
$q->where(array(
"`contentid` = '" . $id . "'",
"`key` = '" . $key . "'",
"`tmplvarid` = '" . $tvId . "'"
));
$q->select('value');
$s = $q->prepare();
$s->execute();
$array = $s->fetch(PDO::FETCH_ASSOC);
return $array['value'];
} else {
return $field_value;
}
}
$output = '';
if (!empty($resource)) {
if (!empty($field)) {
if (strtolower($field) == 'content') {
$output = $resource->getContent();
} else {
$output = $resource->get($field);
if (is_null($output)) {
$output = $resource->getTVValue(preg_replace('#^tv\.#i', '', $field));
}
}
} else {
$output = $resource->toArray();
}
}
$pdo->debugParserModifier($id, 'locfield');
// Get the modParser instance
$parser = $modx->getParser();
// Define how deep we can go
$maxIterations = (integer) $modx->getOption('parser_max_iterations', null, 10);
// Parse cached tags, while leaving unprocessed tags in place
$parser->processElementTags('', $output, false, false, '[[', ']]', array(), $maxIterations);
// Parse uncached tags and remove anything that could not be processed
$parser->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations);
return $output;
});
break;
}
Также есть баг, например при использовании tinymcewrapper, поле для ввода перевода контента становится не textarea, а input, и в консоль выпадают критические JS ошибки, не давая всплывающему окну сохранить перевод, лечится таким костылем:
<?php
switch ($modx->event->name) {
case 'OnManagerPageBeforeRender':
/* Прерываем ошибку JavaScript при инициализации TinyMCE */
$tinymwrapper_path = MODX_CORE_PATH . '/components/migx/elements/tv/tinymcewrapper.tpl';
if (is_file($tinymwrapper_path)) {
$tpl_content = file_get_contents($tinymwrapper_path);
$tpl_file = preg_replace('/[^\S\r\n](tinymce\.get\(.*?\)\.save\(\);)/', 'try{$1}catch(e){}', $tpl_content);
file_put_contents($tinymwrapper_path, $tpl_file);
}
/* Отключаем редактор для поля CONTENT в localizator, иначе поле будет input */
$localizator_fields_path = MODX_CORE_PATH . '/components/localizator/processors/mgr/fields.class.php';
if (is_file($localizator_fields_path)) {
$tpl_content = file_get_contents($localizator_fields_path);
$tpl_file = preg_replace('/[^\S\r\n]+(\$resourcefields\[\'content\'\])/', '$richtext = false;$1', $tpl_content);
file_put_contents($localizator_fields_path, $tpl_file);
}
break;
}
И последний инструмент, который поможет быстро заполнить переводы в ручном режиме для словаря:
Скрипт, генерации mysql запросов.
Используется при статических переводах, к примеру заголовки и т.д. Вызывается перевод на примере скриншота так
Скрипт, генерации mysql запросов.
Используется при статических переводах, к примеру заголовки и т.д. Вызывается перевод на примере скриншота так
{'product_title' | lexicon}
. Но не забудьте, что сгенерированный запрос нужно выполнить в phpMyAdmin… Сам скрипт, нужно поместить в созданную в корне папку, к примеру lexicongen
К примеру, если Вы хотите использовать перевод из словаря для русского слова, которое можно использовать в виде ключа словаря, но для этого нужно перевести к примеру Австрия -> avstrija и уже цеплять по этому ключу перевод из словаря:
{$country | translit | lower | lexicon}
Привожу код, сниппета translit:<?php
$stringToApplyTransliterationTo = $input;
$options = array();
$translitTableName = 'russian';
$translitClassPath = $modx->getOption('friendly_alias_translit_class_path', $options, $modx->getOption('core_path', $options, MODX_CORE_PATH) . 'components/') . 'modx/translit/';
if ($modx->getService('translit', 'modTransliterate', $translitClassPath, $options)) {
$alias = $modx->translit->translate($stringToApplyTransliterationTo, $translitTableName);
}
return $alias;
P.S. Можно добавить trim, или replace пробелов в fenom конструкцию, если контент менеджер случайно пробелы впишет до или после " Австрия"
Вообще печально, когда возвращаюсь к проектам на ModX, что за такое время не допилили многоязычность по умолчанию из пакета установки. Пришлось потратить много времени, чтобы перенести уже имеющиеся 20 тыс записей из TV в localizator и автоматизировать этот вопрос. Да и добавление в словарь переводов в самом движке требует ~3 кликов мыши — поэтому был написан скрипт генерации mysql запросов. Благодарен автору за реализацию данного модуля, иначе было бы вообще печально редактировать эти переводы в доп. полях, теперь все по полочкам лежит :-)
В Shopkeeper 3 перевод в корзине тоже не подключался при её обновлении с помощью AJAX, можно использовать такой Wrapper для корзины с помощью плагина:
<?php
if (!defined('MODX_BASE_PATH')) {
die('What are you doing? Get out of here!');
}
$e =& $modx->Event;
$groupWrapTpl = isset($groupWrapTpl) ? $groupWrapTpl : '';
if ($e->name == 'OnSHKbeforeCartLoad') {
$modx->lexicon->load($modx->cultureKey . ':localizator:default');
$this_page_url = $this->config['pageId'] && is_numeric($this->config['pageId']) ? $this->modx->makeUrl($this->config['pageId'], '', '', 'full') : '/';
$url_qs = strpos($this_page_url, "?") !== false ? "&" : "?";
$empty_url = $this_page_url . $url_qs . 'shk_action=empty';
$order_page_url = $modx->makeUrl($modx->config['personal_catalog_page_id'], '', '', 'full');
$html = '
<div class="card catalog-cart list-cart rounded-0 my-4 shop-cart" data-shopcart="1">
<div class="card-header text-uppercase">' . $modx->lexicon('personal_catalog_title') . '</div>
<div class="card-body p-0">';
if (!empty($_SESSION['shk_order'])) {
$html .= '
<div class="d-flex px-2 my-3">
<p class="cart-clear mr-auto"><a href="' . $empty_url . '" id="shk_butEmptyCart"><i class="fa fa-times-circle pr-1"></i>' . $modx->lexicon('clear_catalog') . '</a></p>
<p class="cart-print"><a href="' . $order_page_url . '" id="shk_butOrder"><i class="fa fa-print pr-1"></i>' . $modx->lexicon('print_preview') . '</a></p>
</div>
';
}
$e->output($html);
}
Подскажите можно ли каждой локализации создавать отдельный alias?
Как?
Спасибо!
Как?
Спасибо!
Пока такой возможности нет.
Всем привет, не пойму что не так с компонентом.
Локализации настроил: prntscr.com/qksnz0
Настройки указал: prntscr.com/qkso72
Пытаюсь добавить перевод: prntscr.com/qksola
А он мне все равно ошибку выдает: «Не указан ключ локализации» в смысле он не указан? В настройках указан localizator_default_language: ru
Компонент работает на modx revo 2.7.0???? И если да, то что у меня не так с компонентом?
Локализации настроил: prntscr.com/qksnz0
Настройки указал: prntscr.com/qkso72
Пытаюсь добавить перевод: prntscr.com/qksola
А он мне все равно ошибку выдает: «Не указан ключ локализации» в смысле он не указан? В настройках указан localizator_default_language: ru
Компонент работает на modx revo 2.7.0???? И если да, то что у меня не так с компонентом?
Вероятно, не заполнена «ru» локализация. См. modx.pro/components/12012#comment-82464. На скриншоте prnt.sc/qksola вами выбрана «en» локализация.
В том то и дело что заполнена, а все равно выдает такую ошибку:
prntscr.com/qkwpf3
prntscr.com/qkwpnu
Вот и не пойму в чем дело.
prntscr.com/qkwpf3
prntscr.com/qkwpnu
Вот и не пойму в чем дело.
Второй скриншот — укажите язык «ru», это же «ru» локализация? Все поля «ru» локализации заполните текстом на русском языке.
Даже для уже созданных ресурсов, для которых ни одна локаль не указана, он не дает добавить. Пример:
Страница «контакты» — prntscr.com/qkwzhz
Пытаюсь добавить русскую локализацию: prntscr.com/qkwzx2
Все равно выдает ошибку.
Страница «контакты» — prntscr.com/qkwzhz
Пытаюсь добавить русскую локализацию: prntscr.com/qkwzx2
Все равно выдает ошибку.
Прежде всего, хочу поблагодарить автора за замечательный компонент -просто и удобно.
Возник следующий вопрос -совместим ли компонент с wayfinder или придется часть функционала переписывать на pdotools?
Возник следующий вопрос -совместим ли компонент с wayfinder или придется часть функционала переписывать на pdotools?
А в чем проблема перехода. Название параметров сниппетов в 99% одинаковы. Изменить одно название на второе. Плюс очень много фишек сразу получите)
Всем привет.
Подскажите, как можно к полю «Содержимое» (которое localizator_content) подключить установленный редактор кода? У меня установлен Ace
Подскажите, как можно к полю «Содержимое» (которое localizator_content) подключить установленный редактор кода? У меня установлен Ace
Сделал всё по инструкции, а в ответ на поддомен все равно — 404 Page not found!
Что не так?
Что не так?
Такая же проблема. Удалось разобраться?
Всем привет. Беда с 404 ошибок при site/en/. Вроде все по инструкции, притом на 2 сайтах (один тестовый
modx+siteDev). Голову сломал что не так. Люди добрый помогите кто советом пожалуйста, погибаю). Просто смотрю не одного у меня беда такая случалось, а путного ничего по этому поводу в просторах сети не нашел.
modx+siteDev). Голову сломал что не так. Люди добрый помогите кто советом пожалуйста, погибаю). Просто смотрю не одного у меня беда такая случалось, а путного ничего по этому поводу в просторах сети не нашел.
В .htaccess или nginx внесли изменения?
Доброе утро, Иван. Если Вы имеете ввиду RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA], то да.
Всем добра.
Как сделать так, чтобы при сохранении ресурса автоматический переносил содержимого ресурса и TV в раздел локализаций?
Как сделать так, чтобы при сохранении ресурса автоматический переносил содержимого ресурса и TV в раздел локализаций?
В плагине локализатора на OnDocFormPrerender напрямую дергается шаблон из ресурса в строке
было бы неплохо добавить проверку в следующем обновлении
localizator.config.resource_template = "' . $resource->get('template') . '";
из этого следует, что если открыть несуществующий ресурс в админке, то получим 500 ошибкубыло бы неплохо добавить проверку в следующем обновлении
if ($mode == 'upd' && $resource instanceof modResource) {
было бы неплохо добавить проверку в следующем обновленииПрисылайте PR — Артем соберет новую версию.
if ($mode == 'upd' && $resource instanceof modResource) {
Присылайте PR — Артем соберет новую версию.Его уже смерджили уже как год почти: github.com/nizart91/localizator/pull/15
Вопрос может наивный, но:
Если сайт уже есть на одном языке, а нужно добавить второй, можно ли добавить только одну локализацию?
Как в этом случае выводить content — из ресурса для первого языка и из локализации для нового?
Если сайт уже есть на одном языке, а нужно добавить второй, можно ли добавить только одну локализацию?
Как в этом случае выводить content — из ресурса для первого языка и из локализации для нового?
Ещё один наивный вопрос but1head.
Все поля ресурса подменяются локализированными, кроме content, он выводится через {$_modx->resource.localizator_content}Почему так сделано? Я попробовал в плагине убрать проверку — работает:
// if($field == 'content') {
// $placeholders['localizator_content'] = $value;
// $modx->resource->set('localizator_content', $value);
// } else
// {
$placeholders[$field] = $value;
$modx->resource->set($field, $value);
// }
Content ресурса тоже подменяется на перевод — в шаблонах вообще ничего менять не надо. И мой первый вопрос отпадает, если перевода нет, выводится content самого ресурса. Наверняка где-то собака зарыта, не подскажешь?
Пришел сайт с этим компонентом.
Вместо цен отражается ноль, если в товаре создать перевод. Плагин localizator отключаешь и все отлично начинает работать. Ошибок на эту тему в журнале нет. Выходит компонент перестал быть совместим с minishop2? Что за чудеса такие?
Вместо цен отражается ноль, если в товаре создать перевод. Плагин localizator отключаешь и все отлично начинает работать. Ошибок на эту тему в журнале нет. Выходит компонент перестал быть совместим с minishop2? Что за чудеса такие?
Вы как то решили эту проблему?
Здравствуйте, кто то пробовал подружить Localizator и Tagger?
Нужно выводить перевод по определенному тегу.
Вывод по тегу работает, но правильно подключить Localizator к выводу не удается.
Нужно выводить перевод по определенному тегу.
Вывод по тегу работает, но правильно подключить Localizator к выводу не удается.
[[!pdoPage?
&element=`pdoResources`
&limit=`5`
&loadModels=`tagger`
&class=`TaggerTagResource`
&leftJoin=`{
"NameTag": {
"class": "TaggerTag",
"on": "TaggerTagResource.tag = NameTag.id"
},
"Posts": {
"class": "modResource",
"on": "TaggerTagResource.resource = Posts.id"
},
"TV1": {
"class": "modTemplateVarResource",
"on": "Posts.id = TV1.contentid and TV1.tmplvarid = 3"
}
}`
&select=`{
"TaggerTagResource": "*",
"NameTag": "NameTag.tag, NameTag.alias",
"Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.publishedon, Posts.content",
"TV1": "TV1.value as tv1"
}`
&where=`{
"NameTag.id": "[[+id]]"
}`
&sortby=`publishedon`
&sortdir=`ASC`
&tplFirst=`article_horizontal_tpl`
&tpl=`article_prim_tpl`
]]
Буду рад любым подсказкам
Попробуйте добавить
&element=`Localizator`
Пробовал такой вариант.
Лог выдает:
Лог выдает:
0.0000110: Loaded model "tagger" from "/core/components/tagger/model/"
0.0000200: pdoTools loaded
0.0000119: xPDO query object created
0.0000401: leftJoined localizatorContent as localizator
0.0000269: leftJoined TaggerTag as NameTag
0.0000248: leftJoined modResource as Posts
0.0000250: leftJoined modTemplateVarResource as TV1
0.0000100: Added selection of localizatorContent: SQL_CALC_FOUND_ROWS `TaggerTagResource`.*, *, `TaggerTagResource`.`id`
0.0000181: Added selection of TaggerTagResource: `tag`, `resource`
0.0000041: Added selection of TaggerTag: NameTag.tag, NameTag.alias
0.0000041: Added selection of modResource: Posts.id, Posts.pagetitle, Posts.description, Posts.publishedon, Posts.content
0.0000041: Added selection of modTemplateVarResource: TV1.value as tv1
0.0000401: Added where condition: localizator.key=pl, NameTag.id=14
0.0000210: Sorted by publishedon, ASC
0.0000010: Limited to 5, offset 0
0.0003941: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `TaggerTagResource`.*, `localizator`.*, `TaggerTagResource`.`id`, `TaggerTagResource`.`tag`, `TaggerTagResource`.`resource`, NameTag.tag, NameTag.alias, Posts.id, Posts.pagetitle, Posts.description, Posts.publishedon, Posts.content, TV1.value as tv1 FROM `modx_tagger_tag_resources` AS `TaggerTagResource` LEFT JOIN `modx_localizator_content` `localizator` ON `localizator`.`resource_id` = `TaggerTagResource`.`id` LEFT JOIN `modx_tagger_tags` `NameTag` ON TaggerTagResource.tag = NameTag.id LEFT JOIN `modx_site_content` `Posts` ON TaggerTagResource.resource = Posts.id LEFT JOIN `modx_site_tmplvar_contentvalues` `TV1` ON Posts.id = TV1.contentid and TV1.tmplvarid = 3 WHERE ( `localizator`.`key` = 'pl' AND `NameTag`.`id` = '14' ) ORDER BY publishedon ASC LIMIT 5 "
0.0007181: Could not process query, error #1054: Unknown column 'TaggerTagResource.id' in 'field list'
0.0014360: Total time
6 291 456: Memory usage
Не увидел тут вопроса про реализацию перевода названий оплаты и доставки в msOrder. Может кто поделится рабочим вариантом или подскажет куда копать?
modx.pro/components/12012#comment-84183
Либо просто id способа доставки/оплаты подставлять.
Либо просто id способа доставки/оплаты подставлять.
{('lc_payment_' ~ $payment.id) | lexicon}
Есть сайт. Все дружественные URL включены и настроены. Есть несколько локализаций: ru, en, es, de, it. Локализация по-умолчанию — en. Все настроено и работает. Но, обнаружился один момент. Когда открываю страницу site.com/news/ — все ок. С этой страницы через выбор языка переключаюсь на de-локализацию — все ок — открывается как и положено site.com/de/news/. Так со всеми локализациями, кроме ru. Если переключаюсь с любой локализации (en,es,de,it) на русскую в разделе site.com/news/, то в адресной строке получаю site.com//?q=ru/news
Пробовал на другом разделе site.com/faq/ — все ок. На странице site.com/news/ есть вызов pdoPage с аякс-подгрузкой — думал из-за этого — убрал вызов, но проблема осталась.
Кто-нибудь сталкивался с подобным багом?
Пробовал на другом разделе site.com/faq/ — все ок. На странице site.com/news/ есть вызов pdoPage с аякс-подгрузкой — думал из-за этого — убрал вызов, но проблема осталась.
Кто-нибудь сталкивался с подобным багом?
А кто-то сталкивался с ошибкой:
/core/components/localizator/model/localizator/localizator.class.php: 82) localizator: yandex error — 408, see tech.yandex.ru/translate/doc/dg/reference/translate-docpage/
Все работало и потом отвалилось
/core/components/localizator/model/localizator/localizator.class.php: 82) localizator: yandex error — 408, see tech.yandex.ru/translate/doc/dg/reference/translate-docpage/
Все работало и потом отвалилось
Яндекс отключил выдачу бесплатных ключей, и работу старых:
Мы приостановили выдачу ключей для бесплатного использования API Яндекс.Переводчика. Для всех существующих бесплатных ключей с 31 июля будет установлен лимит в 50 000 символов, а с 15 августа эти ключи перестанут работать.Подробнее — https://translate.yandex.ru/developers/keys
Добрый день.
А можно ли использовать компонент с разными доменами?
Например, русская версия на site.ru
А английская на site.com
Ну и например китайская на cn.site.com
А можно ли использовать компонент с разными доменами?
Например, русская версия на site.ru
А английская на site.com
Ну и например китайская на cn.site.com
Да, есть описание в документации.
такая проблема, на сайте 5 языков:
Как это можно починить?
для переключения использую стандартный Сниппет getLanguages
ru, en, be, de, zh
и такое получается при переключение языков, например зашли на китайскую zh версию сайта/zh/about/zozh/poslerodovaya-depressiya.html
и потом если переходим на любой другой язык, то ссылка меняется на неверную (404 ошибка)/en/about/zoposlerodovaya-depressiya.html
т.е. буквы zh и / вырезались из ссылкиКак это можно починить?
для переключения использую стандартный Сниппет getLanguages
Здравствуйте, в чем может быть проблема?
На одних страницах все работает, на других изображение
«Ломается» структура, выводит Доп поля ниже основных полей без стилей и функционала.
На одних страницах все работает, на других изображение
«Ломается» структура, выводит Доп поля ниже основных полей без стилей и функционала.
Yandex приостановил выдачу API. Как заставить автоматически переводить сайт?
Чане Чанк: section-langs-1 выводит список всех языков и Чанк: section-langs-2 выводит аналогичный список, только в dropdown. Как в чанке 1 вывести только текущий язык? А в dropdown все остальные? Скриншот: prntscr.com/16buxq7
Установил плагин, ничего не настраивал. Вкладка локализация -> добавить перевод, ловлю вот такую ошибку:
MODX Revolution 2.8.3-pl
MySQL-8.0-Win-10
OpenServer 5.4.0
[2021-07-28 13:34:23] (ERROR @ C:\OpenServer\domains\kgbc.loc\core\xpdo\om\xpdoobject.class.php : 240)
Error 42000 executing statement:
Array
(
[0] => 42000
[1] => 1064
[2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC, category ASC' at line 1
)
MODX Revolution 2.8.3-pl
MySQL-8.0-Win-10
OpenServer 5.4.0
Потому, что MySQL 8.
В репозитории есть issue по MySQL 8 github.com/modxcms/revolution/issues?q=is%3Aissue+is%3Aopen+MySQL
Можете понизить версию MySQL и не будет ошибки
В репозитории есть issue по MySQL 8 github.com/modxcms/revolution/issues?q=is%3Aissue+is%3Aopen+MySQL
Можете понизить версию MySQL и не будет ошибки
Иван, оффтоп, а есть возможность глянуть пулреквест по фиксу modManagerLog в MySQL github.com/modxcms/revolution/pull/15736?
Done
Огромное спасибо!
Спасибо, так и сделал по вашему совету. Откатил на 5.7
Я и до этого пробовал откат, но у меня modx посыпался. Оказалось надо было дамп сливать и на новую версию заливать ))
Вообще есть смысл стремиться к MySQL 8?
Я и до этого пробовал откат, но у меня modx посыпался. Оказалось надо было дамп сливать и на новую версию заливать ))
Вообще есть смысл стремиться к MySQL 8?
у меня на 8.0.23 работает.
Подскажите пожалуйста, как поменять порядок вывода языков
Сниппет:
<?php
$output = "";
$pdo = $modx->getService('pdoTools');
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}
$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key? 'active': '',
'url'=>$protocol. $language->http_host. $uri,
);
} else {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key? 'active': '',
'url'=>$protocol. $language->http_host. '/'. $uri,
);
}
$output .= $pdo->getChunk($tpl, $placeholders);
}
return $output;
Вывод:
{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-2'])}
Заранее спасибо!
Сниппет:
<?php
$output = "";
$pdo = $modx->getService('pdoTools');
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}
$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key? 'active': '',
'url'=>$protocol. $language->http_host. $uri,
);
} else {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key? 'active': '',
'url'=>$protocol. $language->http_host. '/'. $uri,
);
}
$output .= $pdo->getChunk($tpl, $placeholders);
}
return $output;
Вывод:
{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-2'])}
Заранее спасибо!
Можно удалить все локализации и создать их заново в той последовательности которой тебе надо, либо изменить немножко код:
<?php
$pdo = $modx->getService('pdoTools');
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}
$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
$output = [];
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$placeholders = array(
'cultureKey' => $language->key,
'active' => $language->key == $modx->localizator_key? 'active': '',
'url' => $protocol. $language->http_host. $uri,
);
} else {
$placeholders = array(
'cultureKey' => $language->key,
'active' => $language->key == $modx->localizator_key? 'active': '',
'url' => $protocol. $language->http_host. '/'. $uri,
);
}
$output[$language->key] = $pdo->getChunk($tpl, $placeholders);
}
uksort($output, function($a, $b) {
$order = array(
"ru", "uk", 'en', 'it', 'fr' //Твоя последовательность языков
);
return array_search($a, $s) > array_search($b, $order);
});
return implode('', $output);
Приветствую!
Подскажите, пожалуйста, как правильно настроить локализацию типа en.site.ru.
На хостинге создал поддомен, создал локализацию, создал перевод страницы. Но открывается заглушка хостинга при клике на язык. Что-то еще нужно донастроить?
Подскажите, пожалуйста, как правильно настроить локализацию типа en.site.ru.
На хостинге создал поддомен, создал локализацию, создал перевод страницы. Но открывается заглушка хостинга при клике на язык. Что-то еще нужно донастроить?
всё оказалось просто — новый поддомен нужно было сделать как синоним к основному)
а htaccess что-то писали или дополнительный плагин? У меня редирект на основной домен((
Ничего. Только настройки самого локализатора по инструкциии и родной вызов переключателя языков.
Вся загвоздка была в том, что бы правильно подвязать поддомен в панели хостинга.
Вся загвоздка была в том, что бы правильно подвязать поддомен в панели хостинга.
Точно, уже решил проблему. На будущее:
для локализации в виде en.site.com нужно лишь включить «автоподдомены», это когда поддомены создаются автоматически (не нужно создавать алиасы) или, если на хостинге нет функции «автоподдомены» добавить вручную alias (псевдоним, синоним) en.домен.зона и убрать «главное зеркало» основного домена.
А в htaccess прописать редирект домена и всех поддоменов с www на без www
для локализации в виде en.site.com нужно лишь включить «автоподдомены», это когда поддомены создаются автоматически (не нужно создавать алиасы) или, если на хостинге нет функции «автоподдомены» добавить вручную alias (псевдоним, синоним) en.домен.зона и убрать «главное зеркало» основного домена.
А в htaccess прописать редирект домена и всех поддоменов с www на без www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Правильно понимаю, что тексты основного языка нужно в любом случае указывать в локализациях, иначе он не будет отображаться?
Ни как это не обойти?
Ни как это не обойти?
Всем привет, как удалить компонент localizator?
Удаляю — слетает сайт.
Пришлось снова его установить.
Решил пойти путем удаления локализаций. Но пропали все стандартные выводы заголовком и доп полей.
Как быть?
Удаляю — слетает сайт.
Пришлось снова его установить.
Решил пойти путем удаления локализаций. Но пропали все стандартные выводы заголовком и доп полей.
Как быть?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.