Компонент "Языки" для ICMS 2

+42
7.96K
Иллюстрация
Компонент "Языки" предназначен для тотального перевода сайта на нужный вам язык. Он позволяет переводить все меню и виджеты сайта, контент страниц и групп, категории, заголовки полей контента, категории, наборы, теги, профили пользователей. Поддерживается любое количество языков, определение установленных языков происходит автоматически. Потратив 15-20 минут вы сможете полностью перевести ваш сайт на несколько языков и организовать переключение между ними.

Идеей для написания компонента послужил компонент "Мультиязычность", автору которого хочется выразить огромный респект. Компонент был написан с нуля, однако я не счел зазорным позаимствовать у его автора несколько мелких фрагментов, например виджет переключения языков. И не потому, что лень было писать самому, а потому, что в этом нет никакого смысла. Надеюсь он на меня не в обиде.

По возможности был использован функционал хуков системы, однако в целом ряде случаев он оказался бесполезен, что потребовало правки шаблонов. Возможно я пропустил какой-либо момент, который мог использовать, я не претендую на роль человека, знающего систему во всех тонкостях и деталях, но функционал хуков на мой взгляд бедноват. Надеюсь разработчики обратят на это внимание в будущих релизах. В целом потребовалось около десятка вставок в код шаблона чтобы реализовать все задуманное.

На данный момент в компоненте предусмотрен перевод всего и вся за исключением комментариев. Перевод комментариев я счел лишним по целому ряду причин о которых, думаю, распространяться не стоит. Ниже вы найдете обзорный видеоролик, посвященный компоненту. Я никогда еще не записывал видео, поэтому это моя первая "проба пера". Прошу строго не судить. Видео записывал по ходу тестирования поэтому просьба простить мне все неточности формулировок и неудачно сформулированные фразы.

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

Языки
Компонент

Языки

от dwd
Скачать 5 517 загрузок
+7
My-InstantCMS.Ru My-InstantCMS.Ru 7 лет назад #
Отличная разработка, большой плюс.
Жалко конечно, что придется внести вручную правки, но если это и вправду только в шаблонах, то нечего страшного)
Не терпится скачать и посмотреть код)
+1
dwd dwd 7 лет назад #
Пока что ожидает модерации. Как отмодерируют скачаете. Для реализации поиска по переведенным тегам пара строк добавлена в контроллер тегов, все остальное не затрагивает файлы системы, все вставки кода на уровне шаблонов.
0
My-InstantCMS.Ru My-InstantCMS.Ru 7 лет назад #
Постепенно разработчики добавляют хуки и мы избавляемся от хаков, думаю с поиском тегов тоже справимся.
А разработчики шаблонов могут добавить код в свой шаблон с проверкой
Код PHP:
  1. $langs = cmsCore::isControllerExists('langs') ? cmsCore::getController('langs') : false;
  2. <?php if ($langs) { ?>
  3. //код
  4. <?php } ?>
+4
dwd dwd 7 лет назад #
Вот практически как вы написали это и реализовано. Все вставки имеют вид:

Код PHP:
  1. $system_lang = cmsCore::getLanguageName();
  2. $config = cmsConfig::getInstance();
  3. if(cmsCore::isControllerExists('languages') && $system_lang !== $config->language) {
  4. $model = cmsCore::getModel('languages');
  5. $title = $model->filterEqual('item_id', $group['id'])->filterEqual('lang', $system_lang)->filterEqual('ctype','groups')->getFieldFiltered('languages_groups', 'title');
  6. if($title) $group['title'] = $title;
  7. }
+2
Игорь Lu Игорь Lu 7 лет назад #
После тестов сразу надо включить в новый релиз Инстанта dance
0
&$!#% &$!#% 7 лет назад #
На данный момент в компоненте предусмотрен перевод всего и вся за исключением комментариев
И перевод городов? Пример. Делаем ангоязычную версию. На нее приходит ангоязычный посетитель и хочет зарегистрироваться. При регистрации нужно заполнить поле Город. Он увидит список стран, регионов, городов на английском? Или же Ваш компонент переводит только контент?
+3
dwd dwd 7 лет назад #
Специально для вас сделаю данную возможность если вы возьметесь перевести 9к+ городов, областей и стран хотя бы на один язык.
0
&$!#% &$!#% 7 лет назад #
Если я не ошибаюсь, в Инстанте уже заложен английский "пакет" городов. Где-то видел, кажется, Fuze говорил, что при выборе английского языка в начале установки, все города будут на английском.

Специально для вас
Спасибо)) Специально для меня не надо. Но без этого ни одно дополнение для мультиязычности не имеет смысла, если при создании сайта мы ориентируемся на пользователей, не знающих русский.

Ну а вообще, конечно, хорошо, что Инстант развивается и обрастает разными полезностями.
+1
dwd dwd 7 лет назад #
Все города хранятся в БД, так что вряд ли вы найдете там английский язык. Хотя я, если признаться в эту сторону и не копал. Лично мне поле "Город" не требовалось ни в одном из моих проектов. Так что для вас может это смысла и не имеет, а для меня в самый раз. Все сугубо индивидуально.
0
&$!#% &$!#% 7 лет назад #
Я это знаю. Но Вы сказали, что сможете реализовать перевод городов, если я Вам предоставлю их список на другом)) Вот здесь скачайте последнюю версию InstantCMS, в архиве в папке install\languages\en в файле geo.sql все города и страны на английском. Пользуйтесь на здоровье))

Лично мне... не требовалось
Лично Вам может и нет. Но ведь Вы делитесь разработкой не лично с собой?))) Но это всё слова. Отличный компонент, всё хорошо!))
+2
Loadырь Loadырь 7 лет назад #
Английские названия городов устанавливаются при установке движка с выбранным английским языком по умолчанию.
0
&$!#% &$!#% 7 лет назад #
Так речь ведь идет о мультиязычной версии. Я так понимаю, для украинской версии города должны быть на украинском, для английской - на английском, для немецкой - на немецком.

Я задал простой вопрос, на который получил простой ответ)) Не стоит теперь это перемусоливать, как обойтись, обойти и так далее. Нет так нет))
0
Денис Васильевич Денис Васильевич 7 лет назад #
Это не к чему. Украинцы и русские поймут что написано на русском. Англичане и немцы поймут что написано на английском. Иначе через лет этак, когда вы закончите формировать мультиязычную базу городов, выясниться что появилось ещё с десяток прежде несуществующих наций. )))
0
&$!#% &$!#% 7 лет назад #
Если так рассуждать, то тогда вообще этот компонент не нужен. Немец поймет, что написано по английски, а украинец - что написано по-русски. Зачем заморачиваться? А для тех, кому не понятно что-то - ссылку в сайдбаре на переводчик)) Зачем осенью ставить зимнюю резину? По асфальту можно и на летней ездить.
0
Денис Васильевич Денис Васильевич 7 лет назад #
Ну это вы обобщаете я же по сути говорю. ))
0
&$!#% &$!#% 7 лет назад #
По сути - если переводить, то переводить АБСОЛЮТНО ВСЁ, а не кусками. Другое дело, что возможности такой нет.
+1
dwd dwd 7 лет назад #
Попробую поставить точку:



Ну а вот собственно правильный перевод:



И таких городов, поверьте, наберется немало. Так что правильность перевода, как я и сказал выше, будет безбожно хромать. Делать это должен человек, который действительно знает как правильно города называются. Иначе толку от такого перевода ноль.
0
&$!#% &$!#% 7 лет назад #
Все города хранятся в БД
Но ведь и весь контент хранится в БД. Каким образом происходит перевод контента? Берется из базы значение и в другой таблице записывается вариант на другом языке. Или не так? Есть компонент "География", он есть в коробке. Связать Ваш компонент с ним и... Ну, в общем, Вы поняли)) Не спешите только, и не бросайте все дела ради этого. Меня, признаться, вообще мультиязычность мало интересует. Просто вот интересно было, учли ли Вы этот нюанс.

Спасибо.
0
dwd dwd 7 лет назад #
Так я вам выше написал то же самое. Инструмент для перевода сделать не проблема. А вот перевести названия(причем перевести правильно) я бы не взялся. Протыкать мышкой 9к+ названий и получить автоперевод от Яндекса конечно можно, только боюсь, что после этого немцы и англичане будут очень долго искать свой город в списке с недоумением почесывая затылок.
0
&$!#% &$!#% 7 лет назад #
Ну ладно тогда)) Забудьте. Как удалить эти сообщения?))
+1
Денис Васильевич Денис Васильевич 7 лет назад #
А может быть компонент назвать: Мультиязычность? ))
А то например мне, образно представляется это
+4
dwd dwd 7 лет назад #
Компоненту Мультиязычность посвящен целый абзац текста, включая респект его автору. Но речь идет о компоненте с гораздо большими возможностями, нежели Мультиязычность. Если бы компонент Мультиязычность удовлетворял все мои потребности думаете стал бы я писать новый?
0
Денис Васильевич Денис Васильевич 7 лет назад #
думаете стал бы я писать новый?
Об это ли речь.. )))
0
Денис Васильевич Денис Васильевич 7 лет назад #
Например когда говорите Многоязычность, я понимаю суть но само по себе слово языки несёт другой образ ))
+2
dwd dwd 7 лет назад #
Что поделаешь ... "Бренд" уже занят.))))))
0
Алексей Т Алексей Т 7 лет назад #
Отличный компонент+ видео шикарное.
+1
dwd dwd 7 лет назад #
Ну это вы мне явно льстите. Мало того что писал видео первый раз так еще и без подготовки. Паузы и путаница в терминах оставляют желать лучшего.))))
0
Алексей Т Алексей Т 7 лет назад #
Сам делал видео и знаю как это трудно, сбиваешься, путаешься, делаешь паузы...в общем гуд.
0
Денис Васильевич Денис Васильевич 7 лет назад #
Аноним-минусадор с тобой явно не согласен! Поправил это дело своим скромным правом на плюс ))
0
Def Def 7 лет назад #
Отличное дополнение!

Еще бы, для облегчения первичного перевода сайта, можно было бы нажать один раз на кнопочку "перевести" и все перевелось бы автоматом, чтобы не надо было по 100500 раз кликать по флажкам http://prntscr.com/dldgzb

есть такая возможность работы с апи яндекса?)
+1
dwd dwd 7 лет назад #
Теоретически сделать можно все, что угодно. В том числе и то, о чем вы говорите. Однако вопрос в целесообразности. Я, если честно, смысла в этом не вижу. Если бы данное действие вам приходилось проделывать каждый день, то, возможно, это имело бы смысл. Ну а так, если вы делаете сайт не для ботов, а для людей, то думаю потратить 15 минут на вдумчивый перевод лучше, чем потом в куче переведенного текста пропустить кучу ошибок перевода. Ролик длится около 30 минут, при этом 70% времени я болтал языком и размахивал мышкой. Если не тратить на это время, то начальный перевод сайта занимает порядка 10-15 минут.
0
Def Def 7 лет назад #
На действующий сайт проблемное пост учить быстро, за то точно ничего не пропустишь
0
Jestik Jestik 7 лет назад #
Установил, очень понравилось!
0
Jestik Jestik 7 лет назад #
Но категории чего то все равно не переводяться...файлы залили из папки res. шаблон boxed, но там этих файлов нет, а значит они беруться из дефолта
+1
dwd dwd 7 лет назад #
Залейте в дефолтный шаблон с заменой существующих. Если проблема не исчезнет опишите проблему подробнее. Где именно не перевелись категории?
0
Jestik Jestik 7 лет назад #
Залил же ш. проверил код, в коде есть. Наборы и все остальное перевелось.

Не перевелись в виджете категорий. над списком записей перевелось. а вот в виджете нет
+2
dwd dwd 7 лет назад #
В виджете и не должны были перевестись. Этот функционал будет реализован в ближайших версиях. Если, конечно, это будет кому-либо нужно.
0
Jestik Jestik 7 лет назад #
Та я понял)
Сам попробовал. но что то не особо выходит.) Спасибо за такое дополнение)

А что все выводят категории над списком записей?
+1
dwd dwd 7 лет назад #
Специально для вас запилил на коленке. Для решения конкретно вашей задачи пойдет, но вообще надо искать другие пути. Вставьте этот код в самое начало файла templates/default/controllers/content/widgets/categories/categories.tpl.php и получите переведенные категории в виджете.

Код PHP:
  1. <?php # перевод категорий
  2. $system_lang = cmsCore::getLanguageName();
  3. $config = cmsConfig::getInstance();
  4. if(cmsCore::isControllerExists('languages') && $system_lang !== $config->language) {
  5. foreach($cats as $key=>$cat){
  6. $model = cmsCore::getModel('languages');
  7. $title = $model->filterEqual('item_id', $cat['id'])->filterEqual('lang', $system_lang)->getFieldFiltered('languages_cats', 'title');
  8. if($title) $cats[$key]['title'] = $title;
  9. }
  10. }
  11. # перевод категорий ?>
+1
Игорь Lu Игорь Lu 7 лет назад #
Пока всё супер, только было бы не плохо сделать переводимыми текстовые виджеты.
Потому что если надо вывести короткое описание, на пример на главной странице сайта, в текстовом виджете, то он остаётся не переведённым.
Если такая возможность будет, то это будет вообще просто Бомба joke
0
Владимир Владимир 7 лет назад #
Это и так Бомба. Великолепная и нужная работа, громадный шаг вперед для всей системы! Большое спасибо разработчику! И переводимыми текстовые виджеты сделать в обновлении просьба, действительно, их переводить нужно.
+3
dwd dwd 7 лет назад #
Сделаем, обязательно сделаем. Просто хотелось бы придумать более оригинальное решение, позволяющее переводить любые сторонние виджеты. Ведь не только текстовые виджеты содержат контент, но и виджеты категорий, тегов и т.д. Написать для каждого виджета свой код как тремя постами выше не проблема, но это называется словом "костыль". Хотелось бы придумать какое-то систематизированное решение.
0
Игорь Lu Игорь Lu 7 лет назад #
Хотелось бы придумать какое-то систематизированное решение
Это разумный подход.
Уверен, у Вас обязательно получится, а мы подождём! joke
0
Удалился Удалился 7 лет назад #
Отличная разработка smile
0
lezginka.ru lezginka.ru 7 лет назад #
+
0
Игорь Lu Игорь Lu 7 лет назад #
Обнаружил один баг.
Суть заключается в том, что если есть какая-либо статья в типе контента скрытая для публикации, то все остальные статьи которые следуют за закрытой не выводятся в компоненте «Языки» и их перевод становится невозможным.
Надеюсь, по возможности, будет исправлено :)
0
dwd dwd 7 лет назад #
Под понятием скрытая вы понимаете это?
0
dwd dwd 7 лет назад #
Проверил сейчас на сайте, но никакого бага не обнаружил.
Выключил, сделал приватными:

Вот вид на сайте:

Вот с переводом:
http://img-fotki.yandex.ru/get/56796/109657871.4/0_567d87_4df263cd_orig.png
Вот в интерфейсе компонента:
http://img-fotki.yandex.ru/get/29473/109657871.4/0_567d86_6786a30b_orig.png
Все переводится, все работает.
0
Игорь Lu Игорь Lu 7 лет назад #
Странно, но у меня почему-то нет в списке статей после той что выключена, а точнее, она на модерации и пока ещё даже не публиковалась, но те статьи, что идут после неё и уже опубликованы в списке не появились.
+1
dwd dwd 7 лет назад #
Да, наблюдается такой глюк со статьями, находящимися на модерации. В файле system/controllers/languages/backend/actions/content.php (строка 27) замените

Код PHP:
  1. $total = $model->getContentItemsCount($ctype);
на

Код PHP:
  1. $total = $model->getCount('con_'.$ctype);
Архив перезалью чуть позже.
0
Игорь Lu Игорь Lu 7 лет назад #
СПАСИБО ЗА ОПЕРАТИВНОСТЬ! :)
0
Нико Нико 7 лет назад #
Не знаю Баг это, но поля в профиле не переводятся и при добавление поля, не добавляются.
0
Нико Нико 7 лет назад #
В профиле вкладки тоже не переводит (
0
dwd dwd 7 лет назад #
Значит вы не произвели замены в файлах шаблона.
0
Iceman Iceman 7 лет назад #
Отличная разработка, но в моем случае сходу не заработала.
При попытке переключения языка идет переход на sitename/en но вместо английской версии выдает 404. Куда копать в этом случае?
Устанавливал сначала скопировав все содержимое папки package и дальше установив с пропуском копирования файлов. Все правки указанные в readme сделал.
0
Iceman Iceman 7 лет назад #
Пересмотрел видео и нашел, что забыл поставить разрешение на переключение языка пользователями. Теперь переключатель заработал.
0
Игорь Lu Игорь Lu 7 лет назад #
Ещё обнаружил один косячок. :)
Не знаю, может это только у меня, но при переводе компонент заменяет название сайта на главной странице подставляя название одного из типов контента, в моём случае это с объявлений.
0
dwd dwd 7 лет назад #
Попробовал повторить косячок ... не вышло. Посмотрите, как у вас в шаблоне выводится title, шаблон явно не дефолтный и наверняка проблема в этом. В дефолтном шаблоне вывод заголовка осуществляется строкой
Код PHP:
  1. <title><?php $this->title(); ?></title>
0
Игорь Lu Игорь Lu 7 лет назад #
Шаблон не дефолтный, но title выводится как в дефолтном.
Даже не знаю, кеш чистил, кеширование всё отключал, но результат остался.
+1
dwd dwd 7 лет назад #
В файле system/controllers/languages/hooks/content_before_list.php (строки 18-22)

Код PHP:
  1. foreach($ct_translate as $val){
  2. if (!empty($val['seo_title'])){ $this->cms_template->setPageTitle($val['seo_title']); }
  3. if (!empty($val['seo_keys'])){ $this->cms_template->setPageKeywords($val['seo_keys']); }
  4. if (!empty($val['seo_desc'])){ $this->cms_template->setPageDescription($val['seo_desc']); }
  5. }
замените на

Код PHP:
  1. foreach($ct_translate as $val){
  2. if($this->cms_core->controller != 'frontpage'){
  3. if (!empty($val['seo_title'])){ $this->cms_template->setPageTitle($val['seo_title']); }
  4. if (!empty($val['seo_keys'])){ $this->cms_template->setPageKeywords($val['seo_keys']); }
  5. if (!empty($val['seo_desc'])){ $this->cms_template->setPageDescription($val['seo_desc']); }
  6. }
  7. }
ну а перевод сео-описаний для главной страницы в следующих релизах уже.
0
Игорь Lu Игорь Lu 7 лет назад #
Отлично, всё помогло v
0
Игорь Lu Игорь Lu 7 лет назад #
А в каком файле указано ограничение количества символов в поле «content»?
Просто есть контент имеющий большое количество символов, перевожу его даже вручную и вставляю в поле контента, но контент в этом поле обрезается при сохранении перевода.
0
dwd dwd 7 лет назад #
Ни в каком, это ограничение Яндекс-переводчика:

При желании его можно обойти разбив текст на несколько запросов, но я этим не занимался, были более важные моменты.
0
Игорь Lu Игорь Lu 7 лет назад #
Я переводил вручную и вставлял просто текст, но но при сохранении половина обрезалась, а в таблице Базы Данных указано, что задано сильно много символов.
Я так подозреваю, что есть где-то ограничение. В самой БД думаю такого ограничения нет, ведь основной контент сохраняется без проблем. Вот я и подумал, что ограничение где-то задано в файлах.
0
dwd dwd 7 лет назад #
В компоненте таких ограничений нет. Вообще нет. Поля таблиц также идентичны.




Во время тестирования я сохранял текст объемом 9760 символов, подобных проблем не обнаружил. Как найду минутку попробую повторить ваш эксперимент.
0
Игорь Lu Игорь Lu 7 лет назад #
Как можно передать Вам мой код для эксперимента? Здесь и в личных сообщениях передать его не могу, тоже режет.
0
dwd dwd 7 лет назад #
почта есть в моем профиле. файликом передайте.
0
Radu Radu 7 лет назад #
А как добавить язык?
0
dwd dwd 7 лет назад #
Все языки, присутствующие в папке system/languages вашего сайта будут автоматически добавлены в компонент. Вам нет надобности что-либо создавать, просто загрузите файлы вашей локализации в папку languages.
0
Radu Radu 7 лет назад #
А от куда их взять? к примеру мне нужны файлы MD (молдавский)
+2
dwd dwd 7 лет назад #
Ну наверное сделать самому. Берете папочку system/languages/ru, копируете ее куда-нибудь, переименовываете из ru в md(или как будет молдавский, я не знаю) и ложите обратно в папку system/languages. Ну а после долго, но уверенно переводите содержимое всех ее файлов на молдавский язык. Также в системе присутствуют и другие файлы, нуждающиеся в таких правках. В каталоге дополнений есть украинская локализация, я бы при переводе отталкивался от нее. там видно какие файлы системы необходимо перевести.
+3
dwd dwd 7 лет назад #
Да, забыл сказать - когда закончите перевод не забудьте поделиться им с общественностью. И тогда такие вопросы как ваш будут иметь простой и быстрый ответ!
+1
Radu Radu 7 лет назад #
Точно так и начал делать но про украинскую не знал, попробую сделать. Спасибо!
0
Iceman Iceman 7 лет назад #
А возможно ли сделать перевод страницы добавления контента и соответственно содержимого полей, таких как например списки, что бы пользователь говорящий на другом языке смог полноценно добавлять контент?
В видео решение этой задачки не нашел.
+1
dwd dwd 7 лет назад #
Именно над этим в данный момент идет работа, готовность 70%, ожидайте.
0
Иван Шкута Иван Шкута 7 лет назад #
Если на сайте включено кеширование, то у посетителей возникает проблема с переключением языка. Для исправления нужно после
Код PHP:
  1. public function run(){
добавить:
Код PHP:
  1. $this->disableCache();
в файле /system/controllers/languages/widgets/switch/widget.php
0
RBJ RBJ 7 лет назад #
В файл templates/default/assets/ui/form.tpl.php (строка 138) СТРОКУ <?php echo $field->getInput($value); ?> ЗАМЕНИТЬ НА: <? # перевод содержимого форм if(cmsCore::isControllerExists('languages')) {

заменить на

<?php # перевод содержимого форм if(cmsCore::isControllerExists('languages'))

и в папке "res" в дефолтном шаблоне есть мелкие разбежности с шаблоном 2.6.1
0
dwd dwd 7 лет назад #
и в папке "res" в дефолтном шаблоне есть мелкие разбежности с шаблоном 2.6.1
Разве что в нумерации строк. Код идентичен. Все файлы взяты из установочного пакета 2.6.1

заменить на <?php # перевод содержимого форм if(cmsCore::isControllerExists('languages'))
Уже обсудили данный момент здесь
0
rbs rbs 7 лет назад #
Извините, а планируется дальнейшая разработка модуля "Языки"? SEO часть, мета и проч... ?
0
dwd dwd 7 лет назад #
Вы меня этим вопросом вогнали в ступор. Насколько мне известно в этой области пробелов перевода нет. Вот вам код среднестатистической страницы, скажите что в ней нужно перевести:
Спойлер

Еще от автора

Компонент «Продажа полей» для ICMS 2
Компонент для тотального управления продажей полей. Возможна оплата показа пользователями и самим автором. Масса типов продажи полей.
Компонент «Мотивация пользователей» для ICMS 2
Компонент предназначен для поощрения пользователей за систематическое посещение сайта.
Поле «Поддерживаю!» для ICMS 2
Поле «Поддерживаю!» предназначено для сбора голосов в решении какой-то задачи.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.