Мультиязычность ТВ параметров

На сайте реализована мультиязычность через Babel.
Разным языкам соответствует свой домен.

например:
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 есть лексиконы и как их можно использовать. Как можно реализовать мультиязычность ТВ?

Допусловие: Надо, чтобы в админке выбор ТВ параметра могли видеть (понимать) как русскоговорящие админы, так и англо/итальяноговорящие, то есть на своем родном языке как в админке.
Михаил Боровов
11 мая 2016, 15:31
modx.pro
1
2 407
0

Комментарии: 25

Andrei D.
11 мая 2016, 20:50
+1
параметры ввода 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||
    Михаил Боровов
    11 мая 2016, 21:17
    0
    Андрей, спасибо за направление.
    Не совсем разбираюсь в лексиконах (точнее совсем не разбираюсь, узнал о их существовании пару дней назад)

    объясните, что такое [[%abc.cat1]], [[%abc.cat2]] и т.д.?

    если у меня TV параметр например region, то вызов в mFilter2 будет:

    &tplFilter.row.category=`region-row`


    Верно?
      Василий Наумкин
      11 мая 2016, 21:18
      +2
      Гораздо лучше подставлять сразу так:
      [[%[[+title]]]]
      И тогда при разборе получится
      [[%golf]]
      [[%ski_resorts]]
      [[%historical_centers]]
      Зачем лишние фильтры, если можно сразу забить названия параметров в нужные словари?
        Михаил Боровов
        11 мая 2016, 21:23
        0
        Василий, можно поподробнее?

        Это значит параметры ввода tv

        [[%golf]]==golf||
        [[%ski_resorts]]==ski_resorts||
        [[%historical_centers]==historical_centers||
        так будет?
          Andrei D.
          11 мая 2016, 21:29
          0
          Василий, спасибо за изящное решение, переделаю на своем проекте)

          Михаил, создайте свой компонент и добавьте туда значения лексикона. Также можно скачать какой-нибудь сторонний компонент, который вы не собираетесь обновлять, и в core/components/компонент/lexicon/код_языка в default.inc.php впишите значения
          $_lang['golf'] = 'Golf';
            Михаил Боровов
            11 мая 2016, 21:43
            0
            Андрей, я так понял, что TV параметр у меня будет называться position

            В нем будет одиночный выбор

            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 — это шаблон вывода?

            Если все верно понял, то подскажите как добавить все переводы в Лексиконы? Как создать свой компонент?
              Михаил Боровов
              11 мая 2016, 22:13
              0
              Михаил, создайте свой компонент и добавьте туда значения лексикона.
              Мой уровень еще не настолько хорош, чтобы писать свой компонент (((

              Также можно скачать какой-нибудь сторонний компонент, который вы не собираетесь обновлять
              Можете предложить какой-нибудь для примера? Как найти компонент с лексиконами?
                Andrei D.
                12 мая 2016, 00:38
                0
                просто скачайте любой компонент в репрозитории, откройте фтп и ищите по адресу core/components/компонент/lexicon/
        Михаил Боровов
        12 мая 2016, 00:40
        0
        TV region2 выглядит так:

        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.
        В нем как не пробовал добавлять — переводы не появляются (((

        Что делать?

          Михаил Боровов
          12 мая 2016, 00:45
          0
          Вот так добавил:


          Вот как в админке:


          Даже руками прописывал в /core/components/archivist/lexicon/ru/default.inc.php

          $_lang['lake_maggiore'] = 'Озеро Маджоре';
          Что и где я делаю не так? (((
            Andrei D.
            12 мая 2016, 13:12
            0
            Вы не очищаете кэш после добавления записей
              Михаил Боровов
              12 мая 2016, 13:18
              0
              чищу и кэш и обновлял даже Индекс в mSearch2.

              Не могу понять в чем «затык» (
                Михаил Боровов
                12 мая 2016, 13:24
                0
                После того как руками добавил в /core/components/archivist/lexicon/ru/default.inc.php:

                $_lang['lake_maggiore'] = 'Озеро Маджоре';
                $_lang['lake_como'] = 'Озеро Комо';
                $_lang['lake_garda'] = 'Озеро Гарда';
                в админке вообще вот так показывает:


                P.S. Изменил кодировку файла на UTF-8 — все стало норм.



                Но на странице и в админке все равно перевод не появился (
                  Andrei D.
                  12 мая 2016, 13:41
                  0
                  Проверьте, добавили ли вы лексиконы для всех языков на сайте
                  Также в настройках проверьте нет ли у вас путаницы в разделе «Словарь и язык»
                  У контекстов прописан cultureKey?
                  А если так [[!%[[+title]]]]?
                    Михаил Боровов
                    12 мая 2016, 14:24
                    0
                    Проверьте, добавили ли вы лексиконы для всех языков на сайте.
                    Также в настройках проверьте нет ли у вас путаницы в разделе «Словарь и язык»
                    Это где и как проверить?
                    Лексиконы с mSearch2 то работают.

                    У контекстов прописан cultureKey?
                    Вот так вот «по образу и подобию»



                    А если так [[!%[[+title]]]]?
                    не сработало (((

                      Михаил Боровов
                      12 мая 2016, 14:27
                      0
                      Также в настройках проверьте нет ли у вас путаницы в разделе «Словарь и язык»
                Василий Наумкин
                12 мая 2016, 14:49
                +2
                Обожемой, не могу это уже читать.

                1. Заходим в управление словарями.
                2. Выбираем пространство имён core, тема default, язык русский.
                3. Жмём Создать запись, вводим имя text_entry, значение Моя запись.
                4. Сохраняем, чистим кэш.
                5. На главной странице в шаблоне или содержимом ресурса (если оно выводится) пишем
                [[%text_entry]]
                6. Сохраняем, проверяем — на главной должно быть Моя запись.

                Таким же макаром задаём любые нужные записи, не забывая переключить при этом языки. Всё!

                Никаких редактирований файлов, никаких посторонних дополнений, сниппетов или плагинов. Это встроенный в MODX функционал, перестаньте уже изобретать велосипед!
                  Михаил Боровов
                  12 мая 2016, 14:55
                  0
                  ГЕНИАЛЬНО!!!
                  Василий — вы реально Гуру ModX!!!

                  Спасибо!!!

                  Andrei D. тоже спасибо за участие )))
                    Andrei D.
                    12 мая 2016, 14:58
                    0
                    Так ведь таким образом данные будут сохраняться только в БД?
                    А если значений больше 200 (например, у меня весь сайт на лексиконах), которые нужно периодически отдавать на проверку и перевод, то php файл ведь лучше подходит
                      Михаил Боровов
                      12 мая 2016, 15:00
                      0
                      У меня всего около 40 переводов.
                      Так что решение Василия для меня идеально )
                        Василий Наумкин
                        12 мая 2016, 15:08
                        +1
                        Вот когда (и если) у него возникнет такой вопрос — можно рассказать про создание своего набора словарей, с использованием namespaces и php файлов.
                          Михаил Боровов
                          12 мая 2016, 15:41
                          0
                          А в админке все равно осталось


                          Как это поправить?

                          P.S. во фронтенде все перевелось и стало отлично!
                            Василий Наумкин
                            12 мая 2016, 15:47
                            +1
                            Никак.

                            В админке везде должны быть кодовые слова, типа
                            villa_type_1
                            villa_type_2
                            villa_type_3
                            а в словарях уже записи для этих типов вилл.

                            Сделать на MODX мультиязычную админку, чтобы у всех менеджеров отображались свои названия ТВ параметров, насколько я понимаю, невозможно. Только писать свою собственную админку, типа такой.
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      25