Не работает мультиязычность плагина localizator

Добрый день! Пробую настроить локализацию с помощь localizator.
Создал локализацию

Потом на главной странице сделал так

За тем перехожу на страницу (http://sherlock.good-site.com.ua/ua/) но заголовок страницы по прежнему русский.
Подскажите, пожалуйста, что я делаю не так?
Дмитрий
23 октября 2018, 15:13
modx.pro
5 541
0

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

Oleg
23 октября 2018, 16:29
0
О! Я в этом шарю!)))

Короче.
Смотрите, чтобы у вас отображался заголовок другой, вам нужно забить на то, что у вас в настройках ресурса есть такая строка.
У Локализатора это все дублируется в его окне. ВСЕ! Кроме контента. У контента вызов особенный.

Один узбекский сайт на этом дополнении поднял. Но он больше похож на франкенштейна.

http://uzpromarm.uz
    Дмитрий
    23 октября 2018, 16:40
    0
    Пока не очень понятно) Я просто в первый раз столкнулся с локализацией. Можно как-то подробнее?)
      Андрей
      23 октября 2018, 18:12
      0
      Надо добавить все локализации что есть, в настройках выбрать локализацию по-умолчанию, на странице редактирования ресурса из полей нужны только Заголовок, все остальные поля заполняются во вкладке Локализации.
        Дмитрий
        23 октября 2018, 18:31
        0
        Добавил локализацию
        и в настройках выбрал стандартную

        но при переходе по ссылке site.com/ua/ ничего не меняется
          Артем
          23 октября 2018, 19:43
          0
          htaccess настроили?
            Oleg
            24 октября 2018, 08:38
            0
            А что там настраивать, если он не доменное имя новое задает, а всего-лишь подраздел.

            У меня так все стоит.
            По умолчанию русский подключен.
            Все слова непонятные в словарь забиваю.

            А вообще если пройтись по инструкции что в описании плагина есть, все должно работать.
            Хотя там не описаны готовые решения по переключению языков, правильное исправление ссылок на переключение и т.п. и т.д.

            Хотя большую часть можно решить банальным {if}{/if}
              Oleg
              24 октября 2018, 08:41
              0


              А так в системных настйроках.
            Oleg
            24 октября 2018, 08:34
            0
            И заголовок тоже не нужен.Точнее нужен но не в том, контексте, как привыкли его использовать.
        Aleksandr Huz
        23 октября 2018, 22:25
        +1
        1. HTTP HOST нужно заполнить без http://
        2. Для переключения контекстов, я использую плагин с событием OnHandleRequest
        Код плагина:
        <?php
        // Работаем только на фронтенде и только с friendly urls
        if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr' || !$modx->getOption('friendly_urls')) {return;}
        
        // Получаем запрашиваемый url
        $alias = $modx->getOption('request_param_alias', null, 'alias', true);
        $request = &$_REQUEST[$alias];
        
        // Выбираем контексты с настройкой base_url
        $q = $modx->newQuery('modContextSetting', array('key' => 'base_url', 'value:!=' => ''));
        $q->select('context_key,value');
        
        $contexts = array();
        $tstart = microtime(true);
        if ($q->prepare() && $q->stmt->execute()) {
        	// Учитываем наш запрос в БД
        	$modx->queryTime += microtime(true) - $tstart;
        	$modx->executedQueries++;
        	// Разбираем результаты
        	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
        		$base_url = trim($row['value'], '/');
        		$context = $row['context_key'];
        		// Если запрос начинается с base_url какого-то контекста
        		if (preg_match('/^('.$base_url.')\//i', $request)) {
        			// То переключаемся на этот контекст
        			// Web инициализируется в index.php - на него переключаться не нужно
        			if ($context != 'web') {
        				$modx->switchContext($context);
        			}
        			// Вырезаем base_url из запроса, чтобы MODX нашел ресурс по uri
        			$request = preg_replace('/^'.$base_url.'\//', '', $request);
        			// Дело сделано - выходим из цикла
        			break;
        		}
        	}
        }
          Oleg
          24 октября 2018, 08:44
          0
          Это мой сниппет для панельки переключения языков)))
          =\ давно писался
          Если будете использовать, перепишите под себя. У меня тут на три языка. EN, RU, UZ
          <?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');
          foreach($languages as $language) {
              if(mb_substr($language->http_host, -1) == '/') {
                  $link = $language->http_host . $uri;
              } else { 
                  $link = $language->http_host . '/' . $uri;
              }
              $langIMG = array(
                  'rus' =>'assets/templates/UZVALVE/img/ru_flag.png',
                  'eng' =>'assets/templates/UZVALVE/img/en_flag.jpeg',
                  'uzb' =>'assets/templates/UZVALVE/img/uz_leng.png'
              );
              $lang = explode("/", $link);
              if($lang[1] == 'uz'){
                  $image = $langIMG['uzb'];
              }
              elseif($lang[1] =='en'){
                  $image = $langIMG['eng'];
              }
              else{
                  $image = $langIMG['rus'];
              }
              $output .= "<li><a href=\"http://{$link}\"><img src=\"{$image}\" alt=\"russian_language\" title=\"{$language->name}\"></a></li>";
          }
              
          return $output;
            Oleg
            24 октября 2018, 08:46
            0
            А это плагин для вызова ссылки. На событие pdoToolsOnFenomInit
            У меня весь сайт на fenom. Так что если будете использовать тоже с оглядкой.
            <?php
            switch ($modx->event->name) {
                case 'pdoToolsOnFenomInit':
                    /** @var Fenom $fenom
                      Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы.
                      Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
                     */
                    $fenom->addModifier('locUrl', function ($input) use ($modx) {
                        if (is_numeric ($input)){
                            if ($modx->localizator_key != 'ru') {
                                if($input!=1){
                                    $output = $modx->localizator_key.'/'.$modx->makeUrl($input);
                                }else{
                                    $output = $modx->localizator_key.'/';
                                }
                            } else {
                                $output = $modx->makeUrl($input);
                            }
                            return strtolower($output);
                        } else {
                            $output = $input;
                            return strtolower($output);
                        }
                    });
                    break;
            }
              Артем
              24 октября 2018, 09:14
              0
              а зачем это все?)
              локализатор подменяет site_url на нужный хост, типа: site.ru/en/
              вставляете в тег base
              все ссылки генерятся относительные и работают без вашего модификатора
                Oleg
                24 октября 2018, 10:00
                0
                На сколько я помню у меня при переключении на другой язык отваливались картинки и стили при переключении на другой язык. Кажется так.
                  Артем
                  24 октября 2018, 10:04
                  0
                  как раз для этого и нужно вносить правки в htaccess)
                    Oleg
                    24 октября 2018, 10:06
                    0
                    На сколько я помню .htaccees вообще ни на что не влиял на том хостинге)
                    Да и вообще, за прошедший почти год, сайт сменил 6-7 хостингов. О_о
                      Артем
                      24 октября 2018, 10:09
                      0
                      либо неправильно настраивали, либо работал через nginx
                        Oleg
                        24 октября 2018, 10:12
                        0
                        Все может быть.
                        Я тогда вот точно так же как автор поста сидел на этом форуме и искал помощи, все что я сюда накидал — это мне подсказали. Либо я перелопатил все найденные мне форумы по этой теме.

                        И как ни странно, ни в одном из них про .htaccess не было ни слова. Так что, я приятно удивлен, что были более цивилизованные варианты.
                          Oleg
                          24 октября 2018, 10:14
                          0
                          Можете показать правильно настроенный .htaccess?
                          Я хотя бы посмотрю как это делается.
                            Артем
                            24 октября 2018, 10:15
                            1
                            +1
                            RewriteCond %{REQUEST_FILENAME} !-d
                            RewriteCond %{REQUEST_FILENAME} !-f
                            RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA]
                              Oleg
                              24 октября 2018, 12:38
                              0
                              C тремя языками, как будет в исполнении?
                                Артем
                                24 октября 2018, 12:39
                                0
                                RewriteRule ^(ru|en|de)/assets(.*)$ assets$2 [L,QSA]
                        Oleg
                        24 октября 2018, 10:08
                        0
                        Не!)
                        Если были другие варианты, я только за их реализацию)
                        Но это было давно, и я тогда fenom использовал только с открытыми три тысячи и одной вкладкой справки и документации)
                        Вообщем колхозил как только мог.
                        Да и сейчас на звание профессионала не претендую.
                      Oleg
                      24 октября 2018, 10:01
                      0
                      Вообщем я не помню точно, но я его использовал вместо fenom-овского makeUrl как $id|locUrl
                    Oleg
                    24 октября 2018, 08:48
                    0
                    Если вы юзаете pdoTools то при попытке подружить его с localizator будет косяк при генерации sitemap.xml
                    У меня короче как-то так.
                    <?php
                    $output = "";
                    $resources = $modx->runSnippet('pdoResources', [
                    	'parents' => 0,
                    	'limit' => 0,
                    	'resources'=>'-9, -10',
                    	'sortby'=>'{"id":"ASC"}',
                    	'leftJoin' => '{
                        		"localizator" : {
                        			"class" : "localizatorContent",
                        			"alias" : "localizator",
                        			"on" : "localizator.resource_id = modResource.id"
                        		}
                        	}',
                    	'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
                    	'where' => [
                    		'localizator.key' => $modx->localizator_key,
                    		'localizator.active' => 1,
                    	],
                    	'return' => 'json',
                    ]);
                    
                    if($resources) {
                    	$resources = json_decode($resources);
                    	foreach($resources as $resource) {
                    	    $lang = $modx->localizator_key;
                    	    $out_uri = $resource->uri;
                    	    if($lang != 'ru'){
                    		    $url = $modx->config['site_url'] .$lang.'/'. $$out_uri;
                    	        }else{
                    	        $url = $modx->config['site_url'] . $out_uri;    
                    	        }
                    		$changefreq = 'weekly';
                    		$priority = '0.5';
                    
                    		// дата изменения
                    		$lastmod = date('Y-m-d', $resource->editedon ?: $resource->createdon);
                    
                    		/* if($row['last_review_date']){
                    		$date = new DateTime($row['last_review_date']);
                    		$lastmod = $date->format('Y-m-d');
                    		} */
                    
                    
                    		// пометка ежечастного обноавления, id категорий
                    		if(in_array($resource->parent, [35, 36, 4])) $changefreq = 'hourly';
                    
                    		// приоретитет
                    		if(in_array($resource->id, [1, 2, 3])) $priority = '1.0';
                            $url_our = str_replace('index', '', $url);
                    		$output .= "
                    		<url>
                    		    <loc>{$url_our}</loc>
                    		    <lastmod>{$lastmod}</lastmod>
                    		    <changefreq>{$changefreq}</changefreq>
                    		    <priority>{$priority}</priority>
                    		</url>
                    		";
                    	}
                    
                    }
                    
                    return $output;

                    Я же говорил, что не сайт — а франкенштейн)
                      Oleg
                      24 октября 2018, 08:49
                      0
                      Еще тут при вызовах pdoTools есть свои особенности, вот пример pdoCrumbs
                      {'!pdoCrumbs'|snippet:[
                      			        'from'=>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) ~ '"}',
                      			        'outputSeparator'=>' → ',
                      			        'tpl'=>'@INLINE <a href="{$id|locUrl}" class="bread_home">{$menutitle}</a>',
                      			        'tplCurrent'=>'@INLINE <span>{$menutitle}</span>',
                      			        'tplHome'=>'@INLINE <a href="{$id|locUrl}" class="bread_home">{$menutitle}</a>',
                      			        'tplWrapper'=>'@INLINE <div class="col-12 wrap_breadcrumbs">{$output}</div>',
                      			        'showHome'=>1
                      			    ]}
                        Дмитрий
                        30 ноября 2018, 17:46
                        0
                        Скажите, а почему localizator не работает на https? Когда сайт на http все работает верно но когда сайт на https то в [[++site_url]] сайт остается на http и соответственно слетают все стили. Как бороться с этим?
                          Антон
                          01 декабря 2018, 02:30
                          0
                          Я просто тег
                          <base>
                          пропсал
                            Дмитрий
                            01 декабря 2018, 12:19
                            0
                            Так я тоже в тег base пишу [[++site_url]]
                            Но [[++site_url]] содержит в себе ссылку с http а не с https
                              Антон
                              01 декабря 2018, 14:45
                              0
                              да, с site_url есть косяк. Причём он странный, там в плагине он таким образом делается:
                              'site_url' => $_SERVER['REQUEST_SCHEME'] . '://' . $language->http_host,
                              То есть проблема даже не в локализаторе, а почему-то $_SERVER['REQUEST_SCHEME'] отдаёт http. Я просто вручную в base прописал урл сайта.
                        Виталий
                        17 января 2019, 03:45
                        0
                        Обращение к автору компонента. Очень хотелось бы, чтобы добавили возможность удалять/редактировать запись из словаря, ну или просто хотя бы редактировать дабл кликом ключ записи словаря (значение по дабл клику редактируется). Получается, если создать запись в словаре, на вкладке Словарь компонента Localizator то не удалить не отредактировать нельзя. Можно, только «восстановить по умолчанию» в словарях системы, но это ведь глупо? Получается из-за одной записи, будут удалены все уже ранее созданные записи словаря. А отправлять клиента в phpMyadmin ну такое, согласитесь… :)

                        Я так понимаю Localizator просто наследует процессор workspace модикса, разве никто с этой проблемой не сталкивался?
                          Artur Plugin
                          17 января 2019, 11:29
                          0
                          локализацию лучше делать на фронтенде у юзера в браузере, на сервере слишком много возни и гимороя. можете мой фреймворк взять за основу, он сыроват но бесплатный.
                            Семён Кудрявцев
                            28 февраля 2019, 10:42
                            0
                            Прикольный компонент получился, спасибо автору, за то, что он ещё и бесплатный.
                            Есть одна просьба:
                            При реализации переводов на мультидоменных сайтах, приходится делать кучу дублей в локализациях,
                            так например есть сайт site.ru и sbp.site.ru, нужна английская и русская версии на обоих.
                            Так вот приходится делать 4 локализации: две на русский и две на английский, а всё из-за того, что нет возможности в настройку HTTP_HOST прописать маску типа *.site.ru или через запятую перечислить все хосты для данного языка.
                              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                              32