Блог

/

Инструкции

/

Машинный перевод в Open Real Estate CMS

Машинный перевод в Open Real Estate CMS

Машинный перевод в нашем скрипте используется при клике на кнопку "Перевести"

При этом с помощью cUrl отправляется запрос в Google Translate и возвращается строка c переводом. Вопрос качества такого перевода рассматривать не будем.

С недавних пор такая функция перестала работать.

Дело в том, что официально Google Translate API был закрыт ещё в 2011 году. Однако, при помощи библиотеки GoogleTranslate перевод работал ещё несколько лет.

Даже, если не брать в расчёт тот факт, что использование Google Translate API небесплатно (https://cloud.google.com/translate/v2/pricing), чтобы настроить использование переводчика Google придётся сделать несколько шагов по настройке. Для неопытных пользователей эта процедура будет несколько сложна, а то и вовсе невыполнима.

Поэтому мы решили отказаться от использования Google Translate API в пользу MyMemory API

В запросе на перевод можно отправить до 500 байт информации (http://mymemory.translated.net/doc/spec.php). Это означает, что длина строки может составлять от 80 до 500 символов (в зависимости от языка и некоторых параметров).

Для бесплатного использования не требуется регистрироваться и получать ключ, что в реалиях пользования продукта является большим плюсом.

Однако, при бесплатном использовании сервиса существует ограничение: не более 1000 слов в сутки (http://mymemory.translated.net/doc/usagelimits.php)



Чтобы начать использовать новый переводчик нужно выполнить следующие действия:

  • Скачать файл MyMemoryTranslated.php
  • Зайти на FTP сайта
  • Скопировать файл MyMemoryTranslated.php в папку protected/components
  • Содержимое файла protected\modules\lang\controllers\MainController.php заменить на:

    <?php
    /* * ********************************************************************************************
    *								Open Real Estate
    *								----------------
    * 	version				:	%TAG%
    * 	copyright			:	(c) %YEAR% Monoray
    * 							https://monoray.net
    *							https://monoray.ru
    *
    * 	website				:	https://open-real-estate.info/en
    *
    * 	contact us			:	https://open-real-estate.info/en/contact-us
    *
    * 	license:			:	https://open-real-estate.info/en/license
    * 							https://open-real-estate.info/ru/license
    *
    * This file is part of Open Real Estate
    *
    * ********************************************************************************************* */
     
    class MainController extends ModuleUserController {
    public $modelName = 'Lang';
     
    public function actionAjaxTranslate(){
    if(!Yii::app()->request->isAjaxRequest)
    throw404();
     
    $fromLang = Yii::app()->request->getPost('fromLang');
    $fields = Yii::app()->request->getPost('fields');
    $errors = false;
    $translateField = array();
     
    if(!$fromLang || !$fields)
    throw new CException('Lang no req data');
     
    $translate = new MyMemoryTranslated();
    $fromVal = $fields[$fromLang];
     
    foreach($fields as $lang=>$val){
    if($lang == $fromLang)
    continue;
     
    if ($answer = $translate->translateText($fromVal, $fromLang, $lang))
    $translateField[$lang] = $answer;
    else
    $errors = true;
    }
     
    if ($errors) {
    echo json_encode(array(
    'result' => 'no',
    'fields' => ''
    ));
    }
    else {
    echo json_encode(array(
    'result' => 'ok',
    'fields' => $translateField
    ));
    }
    Yii::app()->end();
    }
    }



Для версий < 1.15.0 ( 1.14.x, 1.12.x, 1.11.x и т.д ) необходимо в конец файла protected\helpers\common.php вставить следующий код:

function getRemoteDataInfo($apiURL, $returnWithRes = false){
$rawData = '';
if( function_exists('curl_version')  ){
$ch = curl_init();
 
if(strtolower(substr($apiURL, 0, 5))=="https"){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}		
curl_setopt($ch, CURLOPT_URL, $apiURL);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
 
$rawData = curl_exec($ch);
 
if (!$returnWithRes)
curl_close($ch);
}
else {
$ctx = stream_context_create(array('http'=>
array(
'timeout' => 10, // 10 Seconds
)
));
$rawData = @file_get_contents($apiURL, false, $ctx);
}
 
 
if ($returnWithRes && isset($ch) && $ch) {
$answer = curl_getinfo($ch, $returnWithRes);
curl_close($ch);
return compact("rawData", "answer");
}
 
return $rawData;
}

Перед заменой файлов рекомендуется сделать бэкап (сохранить резервные копии старых файлов).