Мультиязычность ТВ параметров
На сайте реализована мультиязычность через Babel.
Разным языкам соответствует свой домен.
например:
ru.domain.com — для контекста web (ru)
en.domain.com — для контекста en
it.domain.com — для контекста it
вывод в шаблоне разноязычных частей (где это необходимо) реализован различными чанками через:
Был приобретен великолепный mSearch2. Все работает. Но возникла проблема с фильтрацией по ТВ параметру. В выборе фильтрации выводится на нужном языке, считаются все варианты, но при выборе галочкой — не показывает ничего (((
Факт в том, что mFilter2 фильтрует значения, которые сохранены в БД. У меня, получается, в БД сохраняются значения типа:
Как из этой ситуации выходить?
Есть совет поискать разработчика, который хотя-бы знает, что в MODX есть лексиконы и как их можно использовать. Как можно реализовать мультиязычность ТВ?
Допусловие: Надо, чтобы в админке выбор ТВ параметра могли видеть (понимать) как русскоговорящие админы, так и англо/итальяноговорящие, то есть на своем родном языке как в админке.
Разным языкам соответствует свой домен.
например:
ru.domain.com — для контекста web (ru)
en.domain.com — для контекста en
it.domain.com — для контекста it
вывод в шаблоне разноязычных частей (где это необходимо) реализован различными чанками через:
[[*context_key:is=`web`:then=`[[$header-ru]]`:else=``]]
[[*context_key:is=`en`:then=`[[$header-en]]`:else=``]]
[[*context_key:is=`it`:then=`[[$header-it]]`:else=``]]
соответственно пример для вывода ТВ-параметров реализован так (Тип вывода: Список (одиночный выбор)):Golf / Golf / Гольф==[[*context_key:is=`web`:then=`Гольф`:else=``]][[*context_key:is=`en`:then=`Golf`:else=``]][[*context_key:is=`it`:then=`Golf`:else=``]]
||Sci / Ski resorts / Горнолыжные курорты==[[*context_key:is=`web`:then=`Горнолыжные курорты`:else=``]][[*context_key:is=`en`:then=`Ski resorts`:else=``]][[*context_key:is=`it`:then=`Sci`:else=``]]
||Città / Town / Город==[[*context_key:is=`web`:then=`Город`:else=``]][[*context_key:is=`en`:then=`Town`:else=``]][[*context_key:is=`it`:then=`Città`:else=``]]
||Centro storico / Historical centers / Историческиe центры==[[*context_key:is=`web`:then=`Историческиe центры`:else=``]][[*context_key:is=`en`:then=`Historical centers`:else=``]][[*context_key:is=`it`:then=`Centro storico`:else=``]]
||Mare / Seaside / Море==[[*context_key:is=`web`:then=`Море`:else=``]][[*context_key:is=`en`:then=`Seaside`:else=``]][[*context_key:is=`it`:then=`Mare`:else=``]]
||Laghi / Lakes / Озера==[[*context_key:is=`web`:then=`Озера`:else=``]][[*context_key:is=`en`:then=`Lakes`:else=``]][[*context_key:is=`it`:then=`Laghi`:else=``]]
||Colline / Hills / Холмы==[[*context_key:is=`web`:then=`Холмы`:else=``]][[*context_key:is=`en`:then=`Hills`:else=``]][[*context_key:is=`it`:then=`Colline`:else=``]]
Итак закончим с преамбулой и перейдем к самому вопросу.Был приобретен великолепный mSearch2. Все работает. Но возникла проблема с фильтрацией по ТВ параметру. В выборе фильтрации выводится на нужном языке, считаются все варианты, но при выборе галочкой — не показывает ничего (((
Факт в том, что mFilter2 фильтрует значения, которые сохранены в БД. У меня, получается, в БД сохраняются значения типа:
Golf / Golf / Гольф==[[*context_key:is=`web`:then=`Гольф`:else=``]][[*context_key:is=`en`:then=`Golf`:else=``]][[*context_key:is=`it`:then=`Golf`:else=``]]
Потом это значение выбирает фильтр и выводит на экран. Дальше парсер разбирает его и получаетсяГольфИ при попытке фильтрации на сервер уходит именно эта строка. А в БД, напоминаю, находится не она, а моё длинющее выражение с фильтрами. Вот и получается, что содержимое БД и запрос не совпадают, и фильтр не работает. (((
или
Golf
или
Golf
Как из этой ситуации выходить?
Есть совет поискать разработчика, который хотя-бы знает, что в MODX есть лексиконы и как их можно использовать. Как можно реализовать мультиязычность ТВ?
Допусловие: Надо, чтобы в админке выбор ТВ параметра могли видеть (понимать) как русскоговорящие админы, так и англо/итальяноговорящие, то есть на своем родном языке как в админке.
Комментарии: 25
параметры ввода tv
в вызове mFilter2 определите свой row чанк для каждого результата этого tv (например, category)
и вместо [[+title]] подставляете:
вариант со своими лексиконами (лучше)
другой вариант
дополнительное условие не сразу увидел, тогда в tv
Выберите==0||
Гольф==golf||
Горнолыжные курорт==ski_resorts||
Историческиe центры==historical_centers||
в вызове mFilter2 определите свой row чанк для каждого результата этого tv (например, category)
&tplFilter.row.category=`category-row`
и вместо [[+title]] подставляете:
вариант со своими лексиконами (лучше)
[[+title:is=`golf`:then=`[[%abc.cat1]]`]]
[[+title:is=`ski_resorts`:then=`[[%abc.cat2]]`]]
[[+title:is=`historical_centers`:then=`[[%abc.cat3]]`]]
другой вариант
[[+title:is=`golf`:then=`[[*context_key:is=`web`:then=`Гольф`]][[*context_key:is=`en`:then=`Golf`[[*context_key:is=`it`:then=`Golf`]]`]]
дополнительное условие не сразу увидел, тогда в tv
[[%abc.cat1]]==golf||
[[%abc.cat2]]==ski_resorts||
Андрей, спасибо за направление.
Не совсем разбираюсь в лексиконах (точнее совсем не разбираюсь, узнал о их существовании пару дней назад)
объясните, что такое [[%abc.cat1]], [[%abc.cat2]] и т.д.?
если у меня TV параметр например region, то вызов в mFilter2 будет:
Верно?
Не совсем разбираюсь в лексиконах (точнее совсем не разбираюсь, узнал о их существовании пару дней назад)
объясните, что такое [[%abc.cat1]], [[%abc.cat2]] и т.д.?
если у меня TV параметр например region, то вызов в mFilter2 будет:
&tplFilter.row.category=`region-row`
Верно?
Гораздо лучше подставлять сразу так:
[[%[[+title]]]]
И тогда при разборе получится[[%golf]]
[[%ski_resorts]]
[[%historical_centers]]
Зачем лишние фильтры, если можно сразу забить названия параметров в нужные словари?
Василий, можно поподробнее?
Это значит параметры ввода tv
Это значит параметры ввода tv
[[%golf]]==golf||
[[%ski_resorts]]==ski_resorts||
[[%historical_centers]==historical_centers||
так будет?
Василий, спасибо за изящное решение, переделаю на своем проекте)
Михаил, создайте свой компонент и добавьте туда значения лексикона. Также можно скачать какой-нибудь сторонний компонент, который вы не собираетесь обновлять, и в core/components/компонент/lexicon/код_языка в default.inc.php впишите значения
Михаил, создайте свой компонент и добавьте туда значения лексикона. Также можно скачать какой-нибудь сторонний компонент, который вы не собираетесь обновлять, и в core/components/компонент/lexicon/код_языка в default.inc.php впишите значения
$_lang['golf'] = 'Golf';
Андрей, я так понял, что TV параметр у меня будет называться position
В нем будет одиночный выбор
а category-row — это шаблон вывода?
Если все верно понял, то подскажите как добавить все переводы в Лексиконы? Как создать свой компонент?
В нем будет одиночный выбор
Select==0||
[[%golf]]==golf||
[[%ski_resorts]]==ski_resorts||
[[%town]]==town||
[[%historical_centers]==historical_centers||
[[%seaside]]==seaside||
[[%lakes]]==lakes||
[[%hills]]==hills
Вызов mFilter2:[[!mFilter2?
&parents=`8`
&element=`mSearch2`
&showHidden=`1`
&tpl=`myRowTpl_ru2`
&prepareTVs=`1`
&processTVs=`1`
&showHidden=`1`
&includeContent=`1`
&tvPrefix=`tv.`
&includeTVs=`code,position,internal_size,external_size,condition,swimming_pool,photo,price,HitsPage`
&filters=`
tv|price:number,
tv|condition,
tv|region,
tv|prop_type,
tv|position
`
&tplFilter.row.tv|position=`category-row`
&tplFilter.outer.tv|price=`tpl.mFilter2.filter.slider`
&tplFilter.row.tv|price=`tpl.mFilter2.filter.number`
&showLog=`1`
]]
где tv|position — мой ТВ параметра category-row — это шаблон вывода?
Если все верно понял, то подскажите как добавить все переводы в Лексиконы? Как создать свой компонент?
Михаил, создайте свой компонент и добавьте туда значения лексикона.Мой уровень еще не настолько хорош, чтобы писать свой компонент (((
Также можно скачать какой-нибудь сторонний компонент, который вы не собираетесь обновлятьМожете предложить какой-нибудь для примера? Как найти компонент с лексиконами?
просто скачайте любой компонент в репрозитории, откройте фтп и ищите по адресу core/components/компонент/lexicon/
Ответил чуть ниже.
Подскажите, что делаю не так?
Вроде все как вы сказали…
Вроде все как вы сказали…
TV region2 выглядит так:
на сайте выбор выглядит так:
все работает!!! )))
Осталась самая малость — сделать переводы.
По совету Andrei D. нашел свободный компонент archivist.
В нем как не пробовал добавлять — переводы не появляются (((
Что делать?
Select==0||
[[%lake_maggiore]]==lake_maggiore||
[[%lake_como]]==lake_como||
[[%lake_garda]]==lake_garda||
[[%piedmont]]==piedmont||
[[%lombardy]]==lombardy||
[[%liguria]]==liguria||
[[%veneto]]==veneto||
[[%emilia_romagna]]==emilia_romagna||
[[%tuscany]]==tuscany||
[[%umbria]]==umbria||
[[%marche]]==marche||
[[%lazio]]==lazio||
[[%campania]]==campania||
[[%calabria]]==calabria||
[[%apulia]]==apulia||
[[%sicily]]==sicily||
[[%sardinia]]==sardinia
Создал вызов:[[!mFilter2?
&parents=`8`
&element=`mSearch2`
&showHidden=`1`
&tpl=`myRowTpl_ru2`
&prepareTVs=`1`
&processTVs=`1`
&showHidden=`1`
&includeContent=`1`
&tvPrefix=`tv.`
&includeTVs=`code,position,internal_size,external_size,condition,swimming_pool,photo,price,HitsPage`
&filters=`
tv|price:number,
tv|region2,
tv|prop_type2,
tv|position2
`
&tplFilter.row.tv|region2=`tpl.mFilter2.filter.select2`
&tplFilter.row.tv|prop_type2=`tpl.mFilter2.filter.select2`
&tplFilter.row.tv|position2=`tpl.mFilter2.filter.select2`
&tplFilter.outer.tv|price=`tpl.mFilter2.filter.slider`
&tplFilter.row.tv|price=`tpl.mFilter2.filter.number`
&showLog=`1`
]]
где tpl.mFilter2.filter.select2 выглядит так:<label for="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]" class="[[+disabled]]">
<input type="checkbox" name="[[+filter_key]]" id="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]" value="[[+value]]" [[+checked]] [[+disabled]]/> [[%[[+title]]]] <sup>[[+num]]</sup>
</label>
в админке выбор выглядит так: на сайте выбор выглядит так:
все работает!!! )))
Осталась самая малость — сделать переводы.
По совету Andrei D. нашел свободный компонент archivist.
В нем как не пробовал добавлять — переводы не появляются (((
Что делать?
Вы не очищаете кэш после добавления записей
чищу и кэш и обновлял даже Индекс в mSearch2.
Не могу понять в чем «затык» (
Не могу понять в чем «затык» (
После того как руками добавил в /core/components/archivist/lexicon/ru/default.inc.php:
P.S. Изменил кодировку файла на UTF-8 — все стало норм.
Но на странице и в админке все равно перевод не появился (
$_lang['lake_maggiore'] = 'Озеро Маджоре';
$_lang['lake_como'] = 'Озеро Комо';
$_lang['lake_garda'] = 'Озеро Гарда';
в админке вообще вот так показывает:P.S. Изменил кодировку файла на UTF-8 — все стало норм.
Но на странице и в админке все равно перевод не появился (
Проверьте, добавили ли вы лексиконы для всех языков на сайте
Также в настройках проверьте нет ли у вас путаницы в разделе «Словарь и язык»
У контекстов прописан cultureKey?
А если так [[!%[[+title]]]]?
Также в настройках проверьте нет ли у вас путаницы в разделе «Словарь и язык»
У контекстов прописан cultureKey?
А если так [[!%[[+title]]]]?
Проверьте, добавили ли вы лексиконы для всех языков на сайте.Это где и как проверить?
Также в настройках проверьте нет ли у вас путаницы в разделе «Словарь и язык»
Лексиконы с mSearch2 то работают.
У контекстов прописан cultureKey?Вот так вот «по образу и подобию»
А если так [[!%[[+title]]]]?не сработало (((
Обожемой, не могу это уже читать.
1. Заходим в управление словарями.
2. Выбираем пространство имён core, тема default, язык русский.
3. Жмём Создать запись, вводим имя text_entry, значение Моя запись.
4. Сохраняем, чистим кэш.
5. На главной странице в шаблоне или содержимом ресурса (если оно выводится) пишем
Таким же макаром задаём любые нужные записи, не забывая переключить при этом языки. Всё!
Никаких редактирований файлов, никаких посторонних дополнений, сниппетов или плагинов. Это встроенный в MODX функционал, перестаньте уже изобретать велосипед!
1. Заходим в управление словарями.
2. Выбираем пространство имён core, тема default, язык русский.
3. Жмём Создать запись, вводим имя text_entry, значение Моя запись.
4. Сохраняем, чистим кэш.
5. На главной странице в шаблоне или содержимом ресурса (если оно выводится) пишем
[[%text_entry]]
6. Сохраняем, проверяем — на главной должно быть Моя запись.Таким же макаром задаём любые нужные записи, не забывая переключить при этом языки. Всё!
Никаких редактирований файлов, никаких посторонних дополнений, сниппетов или плагинов. Это встроенный в MODX функционал, перестаньте уже изобретать велосипед!
ГЕНИАЛЬНО!!!
Василий — вы реально Гуру ModX!!!
Спасибо!!!
Andrei D. тоже спасибо за участие )))
Василий — вы реально Гуру ModX!!!
Спасибо!!!
Andrei D. тоже спасибо за участие )))
Так ведь таким образом данные будут сохраняться только в БД?
А если значений больше 200 (например, у меня весь сайт на лексиконах), которые нужно периодически отдавать на проверку и перевод, то php файл ведь лучше подходит
А если значений больше 200 (например, у меня весь сайт на лексиконах), которые нужно периодически отдавать на проверку и перевод, то php файл ведь лучше подходит
У меня всего около 40 переводов.
Так что решение Василия для меня идеально )
Так что решение Василия для меня идеально )
Вот когда (и если) у него возникнет такой вопрос — можно рассказать про создание своего набора словарей, с использованием namespaces и php файлов.
Никак.
В админке везде должны быть кодовые слова, типа
Сделать на MODX мультиязычную админку, чтобы у всех менеджеров отображались свои названия ТВ параметров, насколько я понимаю, невозможно. Только писать свою собственную админку, типа такой.
В админке везде должны быть кодовые слова, типа
villa_type_1 villa_type_2 villa_type_3а в словарях уже записи для этих типов вилл.
Сделать на MODX мультиязычную админку, чтобы у всех менеджеров отображались свои названия ТВ параметров, насколько я понимаю, невозможно. Только писать свою собственную админку, типа такой.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.