Дорогие коллеги, от всей души поздравляю вас с наступающим новым годом! Желаю взаимонимания, четких ТЗ, отсутствия дедлайнов и, конечно, позитивного настроения!)

Ну а теперь несколько слов о подарке.

Периодически встает задача сделать мультиязычный сайт, в котором 20-30 страниц от силы. Прикрутка решений вроде бабела достаточна гемморойна, кастомные решения тоже не всегда прокатывают, а виджет от гугла, который переводил страницы, куда-то делся в небытие(
При этом в 95% случаев достаточно и обычного, машинного перевода, но приходится каждый раз изобретать велосипед.Мне это порядком позанадоело, и в итоге я написал плагин, который использует апи яндекса и дает нам нужный язык.

Минусы данного решения:
  • Если мне не изменяет память в сутки можно переводить до 10к смволов (или 100к) чистого текста (html тэги не считаются, но для обычной визитки более чем)
  • Пока нет возможности правки переведенного текста
  • Решение достаточно сырое, может иметь баги


Плюсы:
  • Ставится за пять минут
  • Идеально подходит для, наверное, 90% типовых сайтов)

Установка:

Сперва обращаемся к Яндексу, и спрашиваем у него ключики для нашего перевода — https://tech.yandex.ru/keys/get/?service=trnsl
Далее, выполняем запрос к базе (можно через Инструменты — резервное копирование восстановить — Выполнить произвольную команду SQL)

CREATE TABLE IF NOT EXISTS `modx_language_page` (
  `did` int(11) NOT NULL,
  `lng` varchar(2) NOT NULL,
  `html` text NOT NULL,
  `get` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


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

Далее создаем плагин с произвольным название и вешаем его на события: OnCacheUpdate, OnWebPagePrerender

function getSubDomain($data) {
  
$tmp = explode('.', $data);
$tmp = array_slice($tmp, 0, -2);
$str = implode(".", $tmp);

return $str;
}


function translate($txt,$lng)
{
		
		$data = array('key' => 'trnsl.1.1.20161230T114408Z.22be0f0fe10f39f4.f550834d9bxxxxxxxxxxxxxxxxxxxxxx',
					  'text' => $txt,
					  'lang' => 'ru-'.$lng,
					  'format' => 'html',
					  'options' => 1
					 );
	
		$curlObject = curl_init(); 
		curl_setopt($curlObject, CURLOPT_URL, 'https://translate.yandex.net/api/v1.5/tr.json/translate'); 
		curl_setopt($curlObject, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curlObject, CURLOPT_SSL_VERIFYHOST, false); 
		curl_setopt($curlObject, CURLOPT_POST, true);
		curl_setopt($curlObject, CURLOPT_POSTFIELDS, http_build_query($data,'','&')); 
		curl_setopt($curlObject, CURLOPT_RETURNTRANSFER, true); 
		$responseData = curl_exec($curlObject); 
		curl_close($curlObject); 
		if ($responseData === false) {
			throw new Exception('Response false');
		}
		
		$arr = json_decode($responseData, true);	
		return $arr[text][0];		
}

$tbl = $modx->getFullTableName('language_page');  

$e =&$modx->Event;
$lng = getSubDomain($_SERVER[SERVER_NAME]); // Определение текущего языка, отличного от основного. Я делал через поддомен, вы можете сдеать как-либо по-другому, например через сессию, или ловя гет/пост запрос


if (($e->name=='OnWebPagePrerender') && ($lng))
{	
$content = $modx->Event->params['documentOutput'];
$id = $modx->documentIdentifier;
$get = $_SERVER[QUERY_STRING];
	
$html = $modx->db->getValue('Select `html` from '.$tbl.' where did='.$id.' and `get`="'.$get.'" and `lng`="'.$lng.'"');

if (!$html)
{
$html = translate($content,$lng);
$modx->db->insert(array('did'=>$id,'lng'=>$lng,'html'=>$modx->db->escape($html),'get'=>$get),$tbl);
}

$modx->Event->output($html);
}
if ($e->name=='OnCacheUpdate')
{
	$modx->db->query('TRUNCATE TABLE '.$tbl);
}


В коде меняем ключ на полученный от Яши. И каким либо образом определяем переменную $lng, которая должна иметь вид двух общепринятых символов.
Лично я создал поддомен en который ссылается на папку с сайтом. Вы, в зависимости от задач, можете как-то переиграть это определение.

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

Повторюсь, решение несколько сырое, но вполне рабочее. Вот такую штуку прикрутил на свой сайт: en.liber.pro

На праздниках попробую докрутить его до более серьезной версии)
На этом с вами прощаюсь в этом году и еще раз желаю все самого наилучшего и светлого от Ктулху!)