Не работает мультиязычность плагина localizator
Добрый день! Пробую настроить локализацию с помощь localizator.
Создал локализацию
Потом на главной странице сделал так
За тем перехожу на страницу (http://sherlock.good-site.com.ua/ua/) но заголовок страницы по прежнему русский.
Подскажите, пожалуйста, что я делаю не так?
Создал локализацию
Потом на главной странице сделал так
За тем перехожу на страницу (http://sherlock.good-site.com.ua/ua/) но заголовок страницы по прежнему русский.
Подскажите, пожалуйста, что я делаю не так?
Комментарии: 32
О! Я в этом шарю!)))
Короче.
Смотрите, чтобы у вас отображался заголовок другой, вам нужно забить на то, что у вас в настройках ресурса есть такая строка.
У Локализатора это все дублируется в его окне. ВСЕ! Кроме контента. У контента вызов особенный.
Один узбекский сайт на этом дополнении поднял. Но он больше похож на франкенштейна.
http://uzpromarm.uz
Короче.
Смотрите, чтобы у вас отображался заголовок другой, вам нужно забить на то, что у вас в настройках ресурса есть такая строка.
У Локализатора это все дублируется в его окне. ВСЕ! Кроме контента. У контента вызов особенный.
Один узбекский сайт на этом дополнении поднял. Но он больше похож на франкенштейна.
http://uzpromarm.uz
Пока не очень понятно) Я просто в первый раз столкнулся с локализацией. Можно как-то подробнее?)
Надо добавить все локализации что есть, в настройках выбрать локализацию по-умолчанию, на странице редактирования ресурса из полей нужны только Заголовок, все остальные поля заполняются во вкладке Локализации.
htaccess настроили?
А что там настраивать, если он не доменное имя новое задает, а всего-лишь подраздел.
У меня так все стоит.
По умолчанию русский подключен.
Все слова непонятные в словарь забиваю.
А вообще если пройтись по инструкции что в описании плагина есть, все должно работать.
Хотя там не описаны готовые решения по переключению языков, правильное исправление ссылок на переключение и т.п. и т.д.
Хотя большую часть можно решить банальным {if}{/if}
У меня так все стоит.
По умолчанию русский подключен.
Все слова непонятные в словарь забиваю.
А вообще если пройтись по инструкции что в описании плагина есть, все должно работать.
Хотя там не описаны готовые решения по переключению языков, правильное исправление ссылок на переключение и т.п. и т.д.
Хотя большую часть можно решить банальным {if}{/if}
И заголовок тоже не нужен.Точнее нужен но не в том, контексте, как привыкли его использовать.
1. HTTP HOST нужно заполнить без http://
2. Для переключения контекстов, я использую плагин с событием OnHandleRequest
Код плагина:
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;
}
}
}
Это мой сниппет для панельки переключения языков)))
=\ давно писался
Если будете использовать, перепишите под себя. У меня тут на три языка. EN, RU, UZ
=\ давно писался
Если будете использовать, перепишите под себя. У меня тут на три языка. 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;
А это плагин для вызова ссылки. На событие pdoToolsOnFenomInit
У меня весь сайт на fenom. Так что если будете использовать тоже с оглядкой.
У меня весь сайт на 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;
}
а зачем это все?)
локализатор подменяет site_url на нужный хост, типа: site.ru/en/
вставляете в тег base
все ссылки генерятся относительные и работают без вашего модификатора
локализатор подменяет site_url на нужный хост, типа: site.ru/en/
вставляете в тег base
все ссылки генерятся относительные и работают без вашего модификатора
На сколько я помню у меня при переключении на другой язык отваливались картинки и стили при переключении на другой язык. Кажется так.
как раз для этого и нужно вносить правки в htaccess)
На сколько я помню .htaccees вообще ни на что не влиял на том хостинге)
Да и вообще, за прошедший почти год, сайт сменил 6-7 хостингов. О_о
Да и вообще, за прошедший почти год, сайт сменил 6-7 хостингов. О_о
либо неправильно настраивали, либо работал через nginx
Все может быть.
Я тогда вот точно так же как автор поста сидел на этом форуме и искал помощи, все что я сюда накидал — это мне подсказали. Либо я перелопатил все найденные мне форумы по этой теме.
И как ни странно, ни в одном из них про .htaccess не было ни слова. Так что, я приятно удивлен, что были более цивилизованные варианты.
Я тогда вот точно так же как автор поста сидел на этом форуме и искал помощи, все что я сюда накидал — это мне подсказали. Либо я перелопатил все найденные мне форумы по этой теме.
И как ни странно, ни в одном из них про .htaccess не было ни слова. Так что, я приятно удивлен, что были более цивилизованные варианты.
Можете показать правильно настроенный .htaccess?
Я хотя бы посмотрю как это делается.
Я хотя бы посмотрю как это делается.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA]
C тремя языками, как будет в исполнении?
RewriteRule ^(ru|en|de)/assets(.*)$ assets$2 [L,QSA]
Не!)
Если были другие варианты, я только за их реализацию)
Но это было давно, и я тогда fenom использовал только с открытыми три тысячи и одной вкладкой справки и документации)
Вообщем колхозил как только мог.
Да и сейчас на звание профессионала не претендую.
Если были другие варианты, я только за их реализацию)
Но это было давно, и я тогда fenom использовал только с открытыми три тысячи и одной вкладкой справки и документации)
Вообщем колхозил как только мог.
Да и сейчас на звание профессионала не претендую.
Вообщем я не помню точно, но я его использовал вместо fenom-овского makeUrl как $id|locUrl
Если вы юзаете 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;
Я же говорил, что не сайт — а франкенштейн)
Еще тут при вызовах 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
]}
Скажите, а почему localizator не работает на https? Когда сайт на http все работает верно но когда сайт на https то в [[++site_url]] сайт остается на http и соответственно слетают все стили. Как бороться с этим?
Я просто тег
<base>
пропсал
Так я тоже в тег base пишу [[++site_url]]
Но [[++site_url]] содержит в себе ссылку с http а не с https
Но [[++site_url]] содержит в себе ссылку с http а не с https
да, с site_url есть косяк. Причём он странный, там в плагине он таким образом делается:
'site_url' => $_SERVER['REQUEST_SCHEME'] . '://' . $language->http_host,
То есть проблема даже не в локализаторе, а почему-то $_SERVER['REQUEST_SCHEME'] отдаёт http. Я просто вручную в base прописал урл сайта.
Обращение к автору компонента. Очень хотелось бы, чтобы добавили возможность удалять/редактировать запись из словаря, ну или просто хотя бы редактировать дабл кликом ключ записи словаря (значение по дабл клику редактируется). Получается, если создать запись в словаре, на вкладке Словарь компонента Localizator то не удалить не отредактировать нельзя. Можно, только «восстановить по умолчанию» в словарях системы, но это ведь глупо? Получается из-за одной записи, будут удалены все уже ранее созданные записи словаря. А отправлять клиента в phpMyadmin ну такое, согласитесь… :)
Я так понимаю Localizator просто наследует процессор workspace модикса, разве никто с этой проблемой не сталкивался?
Я так понимаю Localizator просто наследует процессор workspace модикса, разве никто с этой проблемой не сталкивался?
локализацию лучше делать на фронтенде у юзера в браузере, на сервере слишком много возни и гимороя. можете мой фреймворк взять за основу, он сыроват но бесплатный.
Прикольный компонент получился, спасибо автору, за то, что он ещё и бесплатный.
Есть одна просьба:
При реализации переводов на мультидоменных сайтах, приходится делать кучу дублей в локализациях,
так например есть сайт site.ru и sbp.site.ru, нужна английская и русская версии на обоих.
Так вот приходится делать 4 локализации: две на русский и две на английский, а всё из-за того, что нет возможности в настройку HTTP_HOST прописать маску типа *.site.ru или через запятую перечислить все хосты для данного языка.
Есть одна просьба:
При реализации переводов на мультидоменных сайтах, приходится делать кучу дублей в локализациях,
так например есть сайт site.ru и sbp.site.ru, нужна английская и русская версии на обоих.
Так вот приходится делать 4 локализации: две на русский и две на английский, а всё из-за того, что нет возможности в настройку HTTP_HOST прописать маску типа *.site.ru или через запятую перечислить все хосты для данного языка.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.