К содержанию

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

На сайте реализована мультиязычность через 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
2 988
Реклама

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

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

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

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

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


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

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

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

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

              Также можно скачать какой-нибудь сторонний компонент, который вы не собираетесь обновлять
              Можете предложить какой-нибудь для примера? Как найти компонент с лексиконами?
                Andrei D.
                Andrei D. Проверенный
                12 мая 2016, 00:38
                просто скачайте любой компонент в репрозитории, откройте фтп и ищите по адресу core/components/компонент/lexicon/
                  Михаил Боровов
                  Михаил Боровов Старожил
                  12 мая 2016, 00:41
                  Ответил чуть ниже.
                    Михаил Боровов
                    Михаил Боровов Старожил
                    12 мая 2016, 12:03
                    Подскажите, что делаю не так?
                    Вроде все как вы сказали…
            Михаил Боровов
            Михаил Боровов Старожил
            12 мая 2016, 00:40
            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
              Вот так добавил:


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


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

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

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

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


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



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

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



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

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

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

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

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

                      Спасибо!!!

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


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

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

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

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