示例#1
0
文件: api.php 项目: andresmaeso/neno
 /**
  * Execute API Call
  *
  * @param   string $apiCall    API Call
  * @param   string $method     Http Method
  * @param   array  $parameters API call parameters
  *
  * @return array
  */
 public static function makeApiCall($apiCall, $method = 'GET', $parameters = array())
 {
     self::getHttp();
     $apiEndpoint = NenoSettings::get('api_server_url');
     $licenseCode = NenoSettings::get('license_code');
     $response = null;
     $responseStatus = false;
     if (!empty($apiEndpoint) && !empty($licenseCode)) {
         $method = strtolower($method);
         if (method_exists(self::$httpClient, $method)) {
             if ($method === 'get') {
                 if (!empty($parameters)) {
                     $query = implode('/', $parameters);
                     $apiCall = $apiCall . '/' . $query;
                 }
                 $apiResponse = self::$httpClient->{$method}($apiEndpoint . $apiCall, array('Authorization' => $licenseCode));
             } else {
                 $apiResponse = self::$httpClient->{$method}($apiEndpoint . $apiCall, json_encode($parameters), array('Content-Type' => 'application/json', 'Authorization' => $licenseCode));
             }
             /* @var $apiResponse JHttpResponse */
             $data = $apiResponse->body;
             if ($apiResponse->headers['Content-Type'] === 'application/json') {
                 $data = json_decode($data, true);
             }
             $response = $data;
             if ($apiResponse->code == 200) {
                 $responseStatus = true;
             }
         }
     }
     return array($responseStatus, $response);
 }
示例#2
0
文件: yandex.php 项目: javigomez/neno
 /**
  * Translate text using yandex api
  *
  * @param   string $text   text to translate
  * @param   string $source source language
  * @param   string $target target language
  *
  * @return string
  *
  * @throws Exception
  */
 public function translate($text, $source, $target)
 {
     // Convert from JISO to ISO codes
     $target = $this->convertFromJisoToIso($target);
     // Language parameter for url
     $source = $this->convertFromJisoToIso($source);
     $lang = $source . "-" . $target;
     $apiKey = NenoSettings::get('translator_api_key');
     // For POST requests, the maximum size of the text being passed is 10000 characters.
     if (mb_strlen($text) <= 10000) {
         $url = 'https://translate.yandex.net/api/v1.5/tr.json/translate?key=' . $apiKey . '&lang=' . $lang;
         // Invoke the POST request.
         $response = $this->post($url, array('text' => $text));
         $text = null;
         // Log it if server response is not OK.
         if ($response->code != 200) {
             NenoLog::log('Yandex API failed with response: ' . $response->code, 1);
             $responseData = json_decode($response->body, true);
             throw new Exception(JText::_('COM_NENO_EDITOR_YANDEX_ERROR_CODE_' . $responseData['code']), $responseData['code']);
         } else {
             $responseBody = json_decode($response->body);
             $text = $responseBody->text[0];
         }
         return $text;
     } else {
         throw new Exception(JText::_('COM_NENO_EDITOR_YANDEX_ERROR_TEXT_TOO_LONG'), 413);
     }
 }
示例#3
0
文件: google.php 项目: javigomez/neno
 /**
  * Translate text using google api
  *
  * @param   string $text   text to translate
  * @param   string $source source language
  * @param   string $target target language
  *
  * @return string
  *
  * @throws Exception
  */
 public function translate($text, $source, $target)
 {
     // Convert from JISO to ISO codes
     $source = $this->convertFromJisoToIso($source);
     $target = $this->convertFromJisoToIso($target);
     $apiKey = NenoSettings::get('translator_api_key');
     $url = 'https://www.googleapis.com/language/translate/v2';
     if (mb_strlen($text) < 5000) {
         // Invoke the POST request.
         $response = $this->post($url, array('key' => $apiKey, 'q' => $text, 'source' => $source, 'target' => $target), array('X-HTTP-Method-Override' => 'GET'));
         $text = null;
         // Log it if server response is not OK.
         if ($response->code != 200) {
             NenoLog::log('Google API failed with response: ' . $response->code, 1);
             $responseData = json_decode($response->body, true);
             throw new Exception($responseData['error']['errors'][0]['message'] . ' (' . $responseData['error']['errors'][0]['reason'] . ')', $response->code);
         } else {
             $responseBody = json_decode($response->body);
             $text = $responseBody->data->translations[0]->translatedText;
         }
         return $text;
     } else {
         throw new Exception(JText::_('COM_NENO_EDITOR_GOOGLE_ERROR_TEXT_TOO_LONG'), 413);
     }
 }
示例#4
0
 /**
  * Translate text using yandex api
  *
  * @param   string $text   text to translate
  * @param   string $source source language
  * @param   string $target target language
  *
  * @return string
  *
  * @throws Exception
  */
 public function translate($text, $source, $target)
 {
     // Convert from JISO to ISO codes
     $target = $this->convertFromJisoToIso($target);
     // Language parameter for url
     $source = $this->convertFromJisoToIso($source);
     $lang = $source . "-" . $target;
     $apiKey = NenoSettings::get('translator_api_key');
     //Chunk the text if need be
     $chunks = NenoHelper::chunkHTMLString($text, 9900);
     $translatedChunks = array();
     foreach ($chunks as $chunk) {
         $url = 'https://translate.yandex.net/api/v1.5/tr.json/translate?key=' . $apiKey . '&lang=' . $lang;
         // Invoke the POST request.
         $response = $this->post($url, array('text' => $chunk));
         // Log it if server response is not OK.
         if ($response->code != 200) {
             NenoLog::log('Yandex API failed with response: ' . $response->code, 1);
             $responseData = json_decode($response->body, true);
             throw new Exception(JText::_('COM_NENO_EDITOR_YANDEX_ERROR_CODE_' . $responseData['code']), $responseData['code']);
         } else {
             $responseBody = json_decode($response->body);
             $translatedChunks[] = $responseBody->text[0];
         }
     }
     return implode(' ', $translatedChunks);
 }
示例#5
0
 /**
  * Translate text using google api
  *
  * @param   string $text   text to translate
  * @param   string $source source language
  * @param   string $target target language
  *
  * @return string
  *
  * @throws Exception
  */
 public function translate($text, $source, $target)
 {
     // Convert from JISO to ISO codes
     $source = $this->convertFromJisoToIso($source);
     $target = $this->convertFromJisoToIso($target);
     $apiKey = NenoSettings::get('translator_api_key');
     $url = 'https://www.googleapis.com/language/translate/v2';
     //Chunk the text if need be
     $chunks = NenoHelper::chunkHTMLString($text, 4900);
     $translatedChunks = array();
     foreach ($chunks as $chunk) {
         // Invoke the POST request.
         $response = $this->post($url, array('key' => $apiKey, 'q' => $chunk, 'source' => $source, 'target' => $target), array('X-HTTP-Method-Override' => 'GET'));
         // Log it if server response is not OK.
         if ($response->code != 200) {
             NenoLog::log('Google API failed with response: ' . $response->code, 1);
             $responseData = json_decode($response->body, true);
             throw new Exception($responseData['error']['errors'][0]['message'] . ' (' . $responseData['error']['errors'][0]['reason'] . ')', $response->code);
         } else {
             $responseBody = json_decode($response->body);
             $translatedChunks[] = $responseBody->data->translations[0]->translatedText;
         }
     }
     return implode(' ', $translatedChunks);
 }
示例#6
0
文件: bing.php 项目: andresmaeso/neno
 /**
  * Translate text using google api
  *
  * @param   string $text   text to translate
  * @param   string $source source language
  * @param   string $target target language
  *
  * @return string
  *
  * @throws Exception
  */
 public function translate($text, $source, $target)
 {
     // Convert from JISO to ISO codes
     $source = $this->convertFromJisoToIso($source);
     $target = $this->convertFromJisoToIso($target);
     list($clientId, $clientSecret) = explode(':', NenoSettings::get('translator_api_key'));
     $accessToken = $this->requestAccessToken($clientId, $clientSecret);
     $url = 'http://api.microsofttranslator.com/V2/Http.svc/Translate';
     //Chunk the text if need be
     $chunks = NenoHelper::chunkHTMLString($text, 4900);
     $translatedChunks = array();
     foreach ($chunks as $chunk) {
         $query = http_build_query(array('from' => $source, 'text' => $chunk, 'to' => $target));
         // Invoke the POST request.
         $response = $this->get($url . '?' . $query, array('Authorization' => 'Bearer ' . $accessToken));
         $responseBody = (array) simplexml_load_string($response->body);
         // Log it if server response is not OK.
         if ($response->code != 200) {
             NenoLog::log('Bing API failed with response: ' . $response->code, 1);
             throw new Exception((string) $responseBody['body']->p[1], $response->code);
         } else {
             $translatedChunks[] = $responseBody[0];
         }
     }
     return implode(' ', $translatedChunks);
 }
示例#7
0
 /**
  * Execute the task
  *
  * @param   array $taskData Task data
  *
  * @return bool True on success, false otherwise
  */
 public function run($taskData)
 {
     $languages = NenoHelper::getLanguages();
     $defaultLanguage = NenoSettings::get('source_language');
     $profiler = new JProfiler();
     foreach ($languages as $language) {
         if ($language->lang_code !== $defaultLanguage) {
             $profiler->mark('Before create job' . $language->lang_code . ' Method: Machine');
             $machineJob = NenoJob::createJob($language->lang_code, NenoContentElementTranslation::MACHINE_TRANSLATION_METHOD);
             $profiler->mark('After create job' . $language->lang_code . ' Method: Machine');
             // If there are translations for this language and for this translation method
             if ($machineJob !== null) {
                 NenoLog::add(count($machineJob->getTranslations()) . ' translations have been found to translate through machine translation');
             }
             $proJob = NenoJob::createJob($language->lang_code, NenoContentElementTranslation::PROFESSIONAL_TRANSLATION_METHOD);
             // If there are translations for this language and for this translation method
             if ($proJob !== null) {
                 NenoLog::add(count($proJob->getTranslations()) . ' translations have been found to translate through professional translation');
             }
             if ($machineJob !== null || $proJob !== null) {
                 NenoTaskMonitor::addTask('job_sender');
             }
         }
     }
 }
示例#8
0
文件: editor.php 项目: javigomez/neno
 /**
  * Method to handle ajax call for google translation
  *
  * @return string
  */
 public function translate()
 {
     $app = JFactory::getApplication();
     $input = $app->input;
     $text = html_entity_decode($input->getHtml('text'));
     $workingLanguage = NenoHelper::getWorkingLanguage();
     $defaultLanguage = NenoSettings::get('source_language');
     $translator = NenoSettings::get('translator');
     $result = array();
     try {
         /* @var $nenoTranslate NenoTranslateApi */
         $nenoTranslate = NenoTranslateApi::getAdapter($translator);
         try {
             $result['text'] = $nenoTranslate->translate($text, $defaultLanguage, $workingLanguage);
             $result['status'] = 'ok';
         } catch (Exception $e) {
             $result['text'] = $text;
             $result['status'] = 'err';
             $result['error'] = $e->getMessage();
         }
     } catch (UnexpectedValueException $e) {
         $result['text'] = $text;
         $result['status'] = 'err';
         $result['error'] = $e->getMessage();
     }
     echo json_encode($result);
     $app->close();
 }
示例#9
0
 /**
  * {@inheritdoc}
  *
  * @param   boolean $cachable  If Joomla should cache the response
  * @param   array   $urlParams URL parameters
  *
  * @return JController
  */
 public function display($cachable = false, $urlParams = array())
 {
     $input = $this->input;
     $view = $input->getCmd('view', 'dashboard');
     $app = JFactory::getApplication();
     if (NenoSettings::get('installation_completed') != 1 && $view != 'installation' && $view != 'debug' && $app->isAdmin()) {
         if ($view != 'dashboard') {
             $app->enqueueMessage(JText::_('COM_NENO_INSTALLATION_ERROR'), 'error');
         }
         $app->redirect('index.php?option=com_neno&view=installation');
     }
     $input->set('view', $view);
     // Ensure that a working language is set for some views
     $viewsThatRequireWorkingLanguage = array('groupselements', 'editor', 'strings');
     $showLanguagesDropDown = false;
     if (in_array($view, $viewsThatRequireWorkingLanguage)) {
         // Get working language
         $workingLanguage = NenoHelper::getWorkingLanguage();
         $languages = JFactory::getLanguage()->getKnownLanguages();
         $showLanguagesDropDown = true;
         if (empty($workingLanguage) || !in_array($workingLanguage, array_keys($languages))) {
             $url = JRoute::_('index.php?option=com_neno&view=setworkinglang&next=' . $view, false);
             $this->setRedirect($url);
             $this->redirect();
         }
     }
     NenoHelperBackend::setAdminTitle($showLanguagesDropDown);
     parent::display($cachable, $urlParams);
     return $this;
 }
示例#10
0
 /**
  * Check if the language switcher has been published already
  *
  * @param   bool $createdAndPublished True to check whether the module has created and published or just created.
  *
  * @return bool
  */
 public function getIsSwitcherPublished($createdAndPublished = true)
 {
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     $query->select(1)->from('#__modules')->where('module = ' . $db->quote('mod_languages'));
     if ($createdAndPublished) {
         $query->where(array('position <> \'\'', 'published = 1 '));
     }
     $db->setQuery($query);
     return $db->loadResult() == 1 || !NenoSettings::get('show_language_switcher_warning', 1);
 }
示例#11
0
 /**
  * Discover the element
  *
  * @return bool True on success
  */
 public function discoverElement()
 {
     // Save the hierarchy first,
     if ($this->isNew() || NenoSettings::get('discovering_element_0') == $this->id) {
         NenoHelper::setSetupState(JText::sprintf('COM_NENO_INSTALLATION_MESSAGE_PARSING_GROUP', $this->groupName));
         $level = '1.1';
     } else {
         $level = '1.2';
     }
     $this->persist();
     $elementId = $this->id;
     if (empty($this->tables) && empty($this->languageFiles)) {
         NenoHelper::setSetupState(JText::sprintf('COM_NENO_INSTALLATION_MESSAGE_CONTENT_NOT_DETECTED', $this->getGroupName()), 1, 'warning');
         $level = 0;
         $elementId = 0;
     }
     NenoSettings::set('installation_level', $level);
     NenoSettings::set('discovering_element_0', $elementId);
 }
示例#12
0
 /**
  * Move the translation to its place in the shadow table
  *
  * @return bool
  */
 public function moveTranslationToTarget()
 {
     /* @var $db NenoDatabaseDriverMysqlx */
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     // If the translation comes from database content, let's load it
     if ($this->contentType == self::DB_STRING) {
         $query->clear()->select(array('f.field_name', 't.table_name'))->from('`#__neno_content_element_fields` AS f')->innerJoin('`#__neno_content_element_tables` AS t ON f.table_id = t.id')->where('f.id = ' . $this->element->id);
         $db->setQuery($query);
         $row = $db->loadRow();
         list($fieldName, $tableName) = $row;
         // Ensure data integrity
         $this->string = NenoHelperData::ensureDataIntegrity($this->element->id, $this->string, $this->language);
         $query->clear()->select(array('f.field_name', 'ft.value'))->from('`#__neno_content_element_fields_x_translations` AS ft')->innerJoin('`#__neno_content_element_fields` AS f ON f.id = ft.field_id')->where('ft.translation_id = ' . $this->id);
         $db->setQuery($query);
         $whereValues = $db->loadAssocList('field_name');
         $shadowTableName = $db->generateShadowTableName($tableName, $this->language);
         $query->clear()->update($shadowTableName)->set($db->quoteName($fieldName) . ' = ' . $db->quote($this->string));
         foreach ($whereValues as $whereField => $where) {
             $query->where($db->quoteName($whereField) . ' = ' . $db->quote($where['value']));
         }
         $db->setQuery($query);
         $db->execute();
         return true;
     } else {
         $query->select(array('REPLACE(lf.filename, lf.language, ' . $db->quote($this->language) . ') AS filename', 'lf.filename as originalFilename', 'ls.constant'))->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_language_strings AS ls ON ls.id = tr.content_id')->innerJoin('#__neno_content_element_language_files AS lf ON ls.languagefile_id = lf.id')->where('tr.id = ' . (int) $this->id);
         $db->setQuery($query);
         $translationData = $db->loadAssoc();
         $existingStrings = array();
         if (!empty($translationData)) {
             $filePath = JPATH_ROOT . "/language/" . $this->language . '/' . $translationData['filename'];
             if (file_exists($filePath)) {
                 $existingStrings = NenoHelper::readLanguageFile($filePath);
             } else {
                 $defaultLanguage = NenoSettings::get('source_language');
                 if (file_exists(JPATH_ROOT . "/language/{$defaultLanguage}/" . $translationData['originalFilename'])) {
                     $existingStrings = NenoHelper::readLanguageFile(JPATH_ROOT . "/language/{$defaultLanguage}/" . $translationData['originalFilename']);
                 }
             }
             $existingStrings[$translationData['constant']] = $this->string;
             NenoHelper::saveIniFile($filePath, $existingStrings);
         }
     }
     return false;
 }
示例#13
0
 /**
  * Build an SQL query to load the list data.
  *
  * @return    JDatabaseQuery
  *
  * @since    1.6
  */
 protected function getListQuery()
 {
     $db = JFactory::getDbo();
     $workingLanguage = NenoHelper::getWorkingLanguage();
     // Create a new query object.
     $dbStrings = parent::getListQuery();
     $languageFileStrings = parent::getListQuery();
     $dbStrings->select(array('tr1.*', 'f.field_name AS `key`', 't.table_name AS element_name', 'g1.group_name AS `group`', 'CHAR_LENGTH(tr1.string) AS characters'))->from('`#__neno_content_element_translations` AS tr1')->innerJoin('`#__neno_content_element_fields` AS f ON tr1.content_id = f.id')->innerJoin('`#__neno_content_element_tables` AS t ON t.id = f.table_id')->innerJoin('`#__neno_content_element_groups` AS g1 ON t.group_id = g1.id ')->where(array('tr1.language = ' . $db->quote($workingLanguage), 'tr1.content_type = ' . $db->quote('db_string'), 'f.translate = 1'))->group(array('HEX(tr1.string)', 'tr1.state'))->order('tr1.id');
     $languageFileStrings->select(array('tr2.*', 'ls.constant AS `key`', 'lf.filename AS element_name', 'g2.group_name AS `group`', 'CHAR_LENGTH(tr2.string) AS characters'))->from('`#__neno_content_element_translations` AS tr2')->innerJoin('`#__neno_content_element_language_strings` AS ls ON tr2.content_id = ls.id')->innerJoin('`#__neno_content_element_language_files` AS lf ON lf.id = ls.languagefile_id')->innerJoin('`#__neno_content_element_groups` AS g2 ON lf.group_id = g2.id ')->where(array('tr2.language = ' . $db->quote($workingLanguage), 'tr2.content_type = ' . $db->quote('lang_string')))->group(array('HEX(tr2.string)', 'tr2.state'))->order('tr2.id');
     $queryWhereDb = array();
     /* @var $groups array */
     $groups = $this->getState('filter.group_id', array());
     /* @var $element array */
     $element = $this->getState('filter.element', array());
     /* @var $field array */
     $field = $this->getState('filter.field', array());
     /* @var $file array */
     $file = $this->getState('filter.files', array());
     $groupIdAdded = false;
     if (!is_array($groups)) {
         $groups = array($groups);
     }
     if (!empty($groups) && !in_array('none', $groups)) {
         $queryWhereDb[] = 't.group_id IN (' . implode(', ', $groups) . ')';
         $languageFileStrings->where('lf.group_id IN (' . implode(', ', $groups) . ')');
     }
     if (!empty($element)) {
         if ($groupIdAdded === false) {
             $languageFileStrings->select('g2.id AS group_id');
             $dbStrings->select('g1.id AS group_id');
             $groupIdAdded = true;
         }
         $queryWhereDb[] = 't.id IN (' . implode(', ', $element) . ')';
         // Do not show any strings for this language file
         if (empty($file)) {
             $languageFileStrings->where('lf.id = 0');
         }
     }
     if (!empty($field)) {
         if ($groupIdAdded === false) {
             $languageFileStrings->select('g2.id AS group_id');
             $dbStrings->select('g1.id AS group_id');
         }
         // Do not show any strings for this language file
         if (empty($file)) {
             $languageFileStrings->where('lf.id = 0');
         }
         $queryWhereDb[] = 'f.id IN (' . implode(', ', $field) . ')';
     }
     if (!empty($file)) {
         $languageFileStrings->where('lf.id IN (' . implode(',', $file) . ')');
         if (empty($field) && empty($element)) {
             $queryWhereDb[] = 'f.id = 0 AND t.id = 0';
         }
     }
     if (count($queryWhereDb)) {
         $dbStrings->where('(' . implode(' OR ', $queryWhereDb) . ')');
     }
     $method = (array) $this->getState('filter.translator_type', array());
     if (!empty($method) && !in_array('none', $method)) {
         $dbStrings->where('tr_x_tm1.translation_method_id IN ("' . implode('", "', $method) . '")')->leftJoin('`#__neno_content_element_translation_x_translation_methods` AS tr_x_tm1 ON tr1.id = tr_x_tm1.translation_id');
         $languageFileStrings->where('tr_x_tm2.translation_method_id IN ("' . implode('", "', $method) . '")')->leftJoin('`#__neno_content_element_translation_x_translation_methods` AS tr_x_tm2 ON tr2.id = tr_x_tm2.translation_id');
     }
     $status = (array) $this->getState('filter.translation_status', array());
     if (!empty($status) && $status[0] !== '' && !in_array('none', $status)) {
         $dbStrings->where('tr1.state IN (' . implode(', ', $status) . ')');
         $languageFileStrings->where('tr2.state IN (' . implode(', ', $status) . ')');
     }
     // Hide empty strings if the user wants to do that
     if (NenoSettings::get('hide_empty_strings', true)) {
         $dbStrings->where('tr1.original_text <> ' . $db->quote(''));
         $languageFileStrings->where('tr2.original_text <> ' . $db->quote(''));
     }
     $query = parent::getListQuery();
     $query->select('DISTINCT *')->from('((' . (string) $dbStrings . ') UNION (' . (string) $languageFileStrings . ')) AS a')->group('id');
     $search = $this->getState('filter.search');
     if (!empty($search)) {
         $search = $db->quote('%' . $search . '%');
         $query->where('(a.original_text LIKE ' . $search . ' OR a.string LIKE ' . $search . ')');
     }
     // Add the list ordering clause.
     $orderCol = $this->state->get('list.ordering');
     $orderDirection = $this->state->get('list.direction');
     if ($orderCol && $orderDirection) {
         $query->order($db->escape($orderCol . ' ' . $orderDirection));
     }
     return $query;
 }
示例#14
0
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_LANGUAGE_MODAL_ADD_TITLE', $item['lang_code']);
?>
</h3>

		<p><?php 
echo JText::_('COM_NENO_COMMENTS_TO_TRANSLATOR_MODAL_ADD_BODY_PRE');
?>
</p>

		<p><?php 
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_LANGUAGE_MODAL_ADD_BODY', JRoute::_('index.php?option=com_neno&view=externaltranslations&open=comment'));
?>
</p>

		<p><?php 
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_MODAL_ADD_BODY_POST', NenoSettings::get('source_language'), $item['lang_code']);
?>
</p>

		<p>
			<textarea class="comment-to-translator"
			          data-language="<?php 
echo $item['lang_code'];
?>
"><?php 
echo empty($item['comment']) ? '' : $item['comment'];
?>
</textarea>
		</p>
	</div>
	<div class="modal-footer">
示例#15
0
 /**
  * Init percents
  *
  * @return void
  */
 protected function initPercents()
 {
     $currentPercent = NenoSettings::get('current_percent', 0);
     if ($currentPercent == 0) {
         $db = JFactory::getDbo();
         $query = $db->getQuery(true);
         // This means to get a group that haven't been discovered yet
         $extensions = $db->quote(NenoHelper::whichExtensionsShouldBeTranslated());
         $query->clear()->select('COUNT(e.extension_id)')->from('`#__extensions` AS e')->where(array('e.type IN (' . implode(',', $extensions) . ')', 'e.name NOT LIKE \'%neno%\''))->order('name');
         $db->setQuery($query, 0, 1);
         $extensionsCounter = $db->loadResult();
         NenoSettings::set('percent_per_extension', 90 / ($extensionsCounter + 1));
     }
 }
示例#16
0
echo JText::_('COM_NENO_COMMENTS_TO_TRANSLATOR_GENERAL_MODAL_ADD_TITLE');
?>
</h3>

        <p><?php 
echo JText::_('COM_NENO_COMMENTS_TO_TRANSLATOR_MODAL_ADD_BODY_PRE');
?>
</p>

        <p><?php 
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_EDITOR_MODAL_ADD_BODY', JRoute::_('index.php?option=com_neno&view=externaltranslations&open=comment'), $translation->language, JRoute::_('index.php?option=com_neno&view=dashboard'));
?>
</p>

        <p><?php 
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_MODAL_ADD_BODY_POST', NenoSettings::get('source_language'), $translation->language);
?>
</p>

        <p><textarea class="comment-to-translator"><?php 
echo empty($translation->comment) ? '' : $translation->comment;
?>
</textarea></p>
    </div>
    <div class="modal-footer">
        <p>
            <input type="checkbox" id="comment-check-<?php 
echo $translation->id;
?>
" class="comment-check"
                   data-content-id="<?php 
示例#17
0
文件: job.php 项目: javigomez/neno
 /**
  * Create a job file
  *
  * @return bool True on success
  *
  * @throws Exception If something happens when the zip file is being created.
  */
 public function generateJobFile()
 {
     $filename = $this->getFileName();
     $jobData = array('jobId' => $this->getId(), 'job_create_time' => $this->getCreatedTime(true), 'file_name' => $filename, 'translation_method' => NenoHelper::convertTranslationMethodIdToName($this->getTranslationMethod()->id), 'from' => $this->getFromLanguage(), 'to' => $this->getToLanguage(), 'comment' => NenoSettings::get('external_translators_notes'), 'strings' => $this->getTranslations());
     $config = JFactory::getConfig();
     $tmpPath = $config->get('tmp_path');
     $fileData = array('name' => $filename . '.json', 'data' => json_encode($jobData));
     /* @var $zipArchiveAdapter JArchiveZip */
     $zipArchiveAdapter = JArchive::getAdapter('zip');
     $result = $zipArchiveAdapter->create($tmpPath . '/' . $filename . '.json.zip', array($fileData));
     $this->fileName = $filename;
     // If something happens in the process of creating the job file, let's throw an exception
     if (!$result) {
         throw new Exception('Error creating job file');
     }
     $this->persist();
     return $result;
 }
示例#18
0
 /**
  * Get translator comment
  *
  * @return string|null
  */
 public function getComment()
 {
     return NenoSettings::get('external_translators_notes');
 }
示例#19
0
 /**
  * Get all the strings related to this field
  *
  * @param   array|null $recordId Record id to just load that row
  *
  * @return array
  */
 protected function getStrings($recordId = null)
 {
     $rows = array();
     $primaryKey = $this->getTable()->getPrimaryKey();
     // If the table has primary key, let's go through them
     if (!empty($primaryKey)) {
         $db = JFactory::getDbo();
         $query = $db->getQuery(true);
         $filtersApplied = false;
         $primaryKeyData = $this->getTable()->getPrimaryKey();
         $breakpoint = NenoSettings::get('installation_completed') ? null : NenoSettings::get('field_breakpoint', null);
         if (!empty($breakpoint)) {
             $breakpoint = json_decode($breakpoint, true);
         }
         foreach ($primaryKeyData as $primaryKey) {
             $query->select($db->quoteName($primaryKey));
             if (!empty($recordId[$primaryKey])) {
                 $query->where($db->quoteName($primaryKey) . ' = ' . $recordId[$primaryKey]);
                 $filtersApplied = true;
             } elseif (!empty($breakpoint[$primaryKey])) {
                 $query->where($db->quoteName($primaryKey) . ' >= ' . $breakpoint[$primaryKey]);
                 $filtersApplied = true;
             }
             $query->order($db->quoteName($primaryKey) . ' ASC');
         }
         $query->select($db->quoteName($this->getFieldName(), 'string'))->from($this->getTable()->getTableName());
         if ($this->getTable()->hasState()) {
             $query->select('state');
         } else {
             $query->select('1 AS state');
         }
         // If there's no filter applied, let's applied the ones for the tables
         if (!$filtersApplied && $this->getTable()->isTranslate() == 2) {
             $filters = $this->getTable()->getTableFilters();
             foreach ($filters as $filter) {
                 if ($filter['operator'] == 'IN') {
                     $query->where($db->quoteName($filter['field']) . ' ' . $filter['operator'] . ' (' . $db->quote($filter['value']) . ')');
                 } else {
                     $query->where($db->quoteName($filter['field']) . ' ' . $filter['operator'] . ' ' . $db->quote($filter['value']));
                 }
             }
         }
         $db->setQuery($query);
         $rows = $db->loadAssocList();
     }
     return $rows;
 }
示例#20
0
文件: helper.php 项目: javigomez/neno
 /**
  * Installs a language and create necessary data.
  *
  * @param   integer $languageId     Language id
  * @param   bool    $publishContent Publish language content
  *
  * @return bool
  */
 public static function installLanguage($languageId, $publishContent = true)
 {
     // Loading language
     $language = JFactory::getLanguage();
     $language->load('com_installer');
     $languageData = self::getLanguageData($languageId);
     $jiso = str_replace('pkg_', '', $languageData['element']);
     // Registering some classes
     JLoader::register('InstallerModelLanguages', JPATH_ADMINISTRATOR . '/components/com_installer/models/languages.php');
     JLoader::register('LanguagesModelLanguage', JPATH_ADMINISTRATOR . '/components/com_languages/models/language.php');
     /* @var $languagesInstallerModel InstallerModelLanguages */
     $languagesInstallerModel = JModelLegacy::getInstance('Languages', 'InstallerModel');
     // Install language
     $languagesInstallerModel->install(array($languageId));
     if (self::isLanguageInstalled($jiso) && !self::hasContentCreated($languageData['element'])) {
         // Assign translation methods to that language
         $db = JFactory::getDbo();
         $query = $db->getQuery(true);
         $i = 1;
         $query->insert('#__neno_content_language_defaults')->columns(array('lang', 'translation_method_id', 'ordering'));
         while (($translationMethod = NenoSettings::get('translation_method_' . $i)) !== null) {
             $query->values($db->quote($jiso) . ', ' . $db->quote($translationMethod) . ',' . $db->quote($i));
             $i++;
         }
         $db->setQuery($query);
         $db->execute();
         return self::createContentRow($jiso, $languageData, $publishContent);
     }
     return self::isLanguageInstalled($jiso);
 }
示例#21
0
 /**
  * Get license
  *
  * @return string
  */
 private static function getLicense()
 {
     return NenoSettings::get('license_code', '');
 }
示例#22
0
文件: mysqlx.php 项目: javigomez/neno
 /**
  * Copy the content to a table that uses Joomla language field
  *
  * @param   string $tableName Table name
  *
  * @return void
  */
 public function copyContentElementsUsingJoomlaLanguageField($tableName)
 {
     $defaultLanguage = NenoSettings::get('source_language');
     $knownLanguages = NenoHelper::getLanguages();
     $columns = array_keys($this->getTableColumns($tableName));
     foreach ($columns as $key => $column) {
         if ($column == 'id') {
             unset($columns[$key]);
             break;
         }
     }
     foreach ($knownLanguages as $knownLanguage) {
         if ($knownLanguage->lang_code !== $defaultLanguage) {
             $selectColumns = $columns;
             foreach ($selectColumns as $key => $selectColumn) {
                 if ($selectColumn == 'language') {
                     $selectColumns[$key] = $this->quote($knownLanguage->lang_code);
                 } else {
                     $selectColumns[$key] = $this->quoteName($selectColumn);
                 }
             }
             $query = 'INSERT INTO ' . $tableName . ' (' . implode(',', $this->quoteName($columns)) . ') SELECT ' . implode(',', $selectColumns) . ' FROM ' . $tableName . ' WHERE language=' . $this->quote($defaultLanguage);
             $this->setQuery($query);
             $this->execute();
         }
     }
 }
示例#23
0
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_GENERAL_MODAL_ADD_TITLE');
?>
</h3>

			<p><?php 
echo JText::_('COM_NENO_COMMENTS_TO_TRANSLATOR_MODAL_ADD_BODY_PRE');
?>
</p>

			<p><?php 
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_GENERAL_MODAL_ADD_BODY', JRoute::_('index.php?option=com_neno&view=dashboard'), JRoute::_('index.php?option=com_neno&view=editor'));
?>
</p>

			<p><?php 
echo JText::sprintf('COM_NENO_COMMENTS_TO_TRANSLATOR_GENERAL_MODAL_ADD_BODY_POST', NenoSettings::get('source_language'));
?>
</p>

			<p>
			<textarea
				class="comment-to-translator"><?php 
echo empty($this->comment) ? '' : $this->comment;
?>
</textarea>
			</p>
		</div>
		<div class="modal-footer">
			<a href="#" class="btn" data-dismiss="modal"
				aria-hidden="true"><?php 
echo JText::_('COM_NENO_COMMENTS_TO_TRANSLATOR_MODAL_BTN_CLOSE');
示例#24
0
echo JText::_('COM_NENO_CONSOLIDATE_TRANSLATION_CONFIRM');
?>
</p>
			</div>
			<div class="modal-footer">
				<a href="#" class="btn btn-primary" id="consolidate-button-close" data-dismiss="modal" aria-hidden="true"><?php 
echo JText::_('JTOOLBAR_CLOSE');
?>
</a>
			</div>
		</div>
	</div>
</div>

<?php 
if (NenoSettings::get('translator') == '' || NenoSettings::get('translator_api_key') == '') {
    ?>

	<!-- Modal for translator API key -->
	<div id="translatorKeyModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="translatorKey"
		aria-hidden="true">
		<div class="modal-header">
			<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
			<h3 id="myModalLabel"><?php 
    echo JText::_('COM_NENO_EDITOR_NO_TRANSLATOR_HEADER');
    ?>
</h3>
		</div>
		<div class="modal-body">
			<p><?php 
    echo JText::_('COM_NENO_EDITOR_NO_TRANSLATOR_MESSAGE');
示例#25
0
文件: table.php 项目: javigomez/neno
 /**
  * {@inheritdoc}
  *
  * @return boolean
  */
 public function persist()
 {
     // If the table has been marked as translatable, let's check for the content element file
     if ($this->translate) {
         $this->checkTranslatableStatusFromContentElementFile();
     }
     $result = parent::persist();
     if ($result) {
         /* @var $db NenoDatabaseDriverMysqlx */
         $db = JFactory::getDbo();
         // If the table has been marked as translated
         if ($this->translate) {
             // Creates shadow tables and copy the content on it
             $db->createShadowTables($this->tableName);
         }
         /* @var $field NenoContentElementField */
         foreach ($this->fields as $field) {
             $field->setTable($this)->setTranslate($field->isTranslatable() && $this->isTranslate())->persist();
             if ($field->getFieldName() === 'language' && $this->isTranslate()) {
                 $languages = NenoHelper::getTargetLanguages();
                 $defaultLanguage = NenoSettings::get('source_language');
                 foreach ($languages as $language) {
                     if ($language->lang_code != $defaultLanguage) {
                         $db->deleteContentElementsFromSourceTableToShadowTables($this->tableName, $language->lang_code);
                     }
                 }
             }
         }
     }
     return $result;
 }
示例#26
0
文件: field.php 项目: javigomez/neno
 /**
  * Persist all the translations
  *
  * @param   array|null  $recordId Record id to just load that row
  * @param   string|null $language Language tag
  *
  * @return bool True on success
  */
 public function persistTranslations($recordId = null, $language = null)
 {
     if ($this->translate) {
         $commonData = array('contentType' => NenoContentElementTranslation::DB_STRING, 'contentId' => $this->getId(), 'content' => $this, 'state' => NenoContentElementTranslation::NOT_TRANSLATED_STATE, 'timeAdded' => new DateTime(), 'comment' => $this->comment);
         if ($language != null) {
             $languageData = new stdClass();
             $languageData->lang_code = $language;
             $languages = array($languageData);
         } else {
             $languages = NenoHelper::getLanguages();
         }
         $defaultLanguage = NenoSettings::get('source_language');
         $this->translations = array();
         $strings = $this->getStrings($recordId);
         $primaryKeyData = $this->getTable()->getPrimaryKey();
         /* @var $db NenoDatabaseDriverMysqlx */
         $db = JFactory::getDbo();
         $query = $db->getQuery(true);
         $query->select(array('gtm.lang', 'gtm.translation_method_id'))->from('#__neno_content_element_tables AS t')->innerJoin('#__neno_content_element_groups AS g ON t.group_id = g.id')->innerJoin('#__neno_content_element_groups_x_translation_methods AS gtm ON gtm.group_id = g.id')->where('t.id = ' . $this->table->getId());
         $db->setQuery($query);
         $translationmethods = $db->loadObjectListMultiIndex('lang');
         if (!empty($strings)) {
             foreach ($languages as $language) {
                 if ($defaultLanguage !== $language->lang_code) {
                     $commonData['language'] = $language->lang_code;
                     foreach ($strings as $string) {
                         if ($string['state'] == 1 || $string['state'] == 0 && NenoSettings::get('copy_unpublished', 1) || $string['state'] == -2 && NenoSettings::get('copy_trashed', 0)) {
                             $commonData['string'] = $string['string'];
                             // If the string is empty or is a number, let's mark as translated.
                             if (empty($string['string']) || is_numeric($string['string'])) {
                                 $commonData['state'] = NenoContentElementTranslation::TRANSLATED_STATE;
                             } else {
                                 $commonData['state'] = NenoContentElementTranslation::NOT_TRANSLATED_STATE;
                             }
                             $translation = new NenoContentElementTranslation($commonData);
                             $sourceData = array();
                             foreach ($primaryKeyData as $primaryKey) {
                                 $field = self::getFieldByTableAndFieldName($this->getTable(), $primaryKey);
                                 $fieldData = array('field' => $field, 'value' => $string[$primaryKey]);
                                 $sourceData[] = $fieldData;
                             }
                             $translation->setSourceElementData($sourceData);
                             // If the translation does not exists already, let's add it
                             if ($translation->existsAlready()) {
                                 $translation = NenoContentElementTranslation::getTranslationBySourceElementData($sourceData, $language->lang_code, $this->getId());
                                 $translation->setElement($this);
                                 if ($translation->refresh()) {
                                     $translation->persist();
                                 }
                             }
                             $translationMethods = $translation->getTranslationMethods();
                             if (empty($translationMethods[$language->lang_code])) {
                                 $translationMethodsTr = $translationmethods[$language->lang_code];
                                 if (!empty($translationMethodsTr)) {
                                     foreach ($translationMethodsTr as $translationMethodTr) {
                                         $translation->addTranslationMethod($translationMethodTr->translation_method_id);
                                     }
                                 }
                             }
                             $translation->persist();
                             $this->translations[] = $translation;
                         }
                     }
                 }
             }
         }
     } else {
         for ($i = 0; $i < count($this->translations); $i++) {
             $translation = $this->translations[$i];
             /* @var $translation NenoContentElementTranslation */
             $translation->setState(NenoContentElementTranslation::SOURCE_CHANGED_STATE);
             $this->translations[$i] = $translation;
         }
     }
     return true;
 }
示例#27
0
文件: neno.php 项目: andresmaeso/neno
 /**
  * This method will be executed once the content is save
  *
  * @param   string $context Save context
  * @param   JTable $content JTable class of the content
  * @param   bool   $isNew   If the record is new or not
  *
  * @return void
  */
 public function onContentAfterSave($context, $content, $isNew)
 {
     //  If the user has create a new menu item, let's create it.
     if ($context == 'com_menus.item' && $isNew) {
         NenoHelper::createMenuStructure();
     } elseif ($content instanceof JTable) {
         /* @var $db NenoDatabaseDriverMysqlx */
         $db = JFactory::getDbo();
         $tableName = $content->getTableName();
         /* @var $table NenoContentElementTable */
         $table = NenoContentElementTable::load(array('table_name' => $tableName), false);
         if (!empty($table)) {
             // If the record has changed the state to 'Trashed'
             if (isset($content->state) && $content->state == -2) {
                 $primaryKeys = $content->getPrimaryKey();
                 $this->trashTranslations($table, array($content->{$primaryKeys[0]}));
             } else {
                 $fields = $table->getFields(false, true);
                 /* @var $field NenoContentElementField */
                 foreach ($fields as $field) {
                     if ($field->isTranslatable()) {
                         $primaryKeyData = array();
                         foreach ($content->getPrimaryKey() as $primaryKeyName => $primaryKeyValue) {
                             $primaryKeyData[$primaryKeyName] = $primaryKeyValue;
                         }
                         $field->persistTranslations($primaryKeyData);
                     }
                 }
                 $languages = NenoHelper::getLanguages(false);
                 $defaultLanguage = NenoSettings::get('source_language');
                 foreach ($languages as $language) {
                     if ($language->lang_code != $defaultLanguage) {
                         $shadowTable = $db->generateShadowTableName($tableName, $language->lang_code);
                         $properties = $content->getProperties();
                         $query = 'REPLACE INTO ' . $db->quoteName($shadowTable) . ' (' . implode(',', $db->quoteName(array_keys($properties))) . ') VALUES(' . implode(',', $db->quote($properties)) . ')';
                         $db->setQuery($query);
                         $db->execute();
                     }
                 }
             }
         }
     }
 }
示例#28
0
 /**
  * Get language configuration data
  *
  * @return array
  */
 public static function getLanguageConfigurationData()
 {
     /* @var $db NenoDatabaseDriverMysqlx */
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     $default = NenoSettings::get('source_language');
     $subquery1 = $db->getQuery(true);
     $subquery2 = $db->getQuery(true);
     $subquery2->select('tr2.*')->from('#__neno_content_element_translations AS tr2')->where('content_type = ' . $db->quote('lang_string'));
     $subquery1->select('tr.*')->from('#__neno_content_element_translations AS tr')->innerJoin('#__neno_content_element_fields AS f ON tr.content_id = f.id')->innerJoin('#__neno_content_element_tables AS t ON t.id = f.table_id')->where(array('content_type = ' . $db->quote('db_string'), 'f.translate = 1', 't.translate = 1'))->union($subquery2);
     $query->select(array('l.lang_code', 'l.published', 'l.title', 'l.image', 'tr.state', 'SUM(tr.word_counter) AS word_count', 'lc.comment'))->from('#__languages AS l')->leftJoin('#__neno_language_external_translators_comments AS lc ON l.lang_code = lc.language')->leftJoin('(' . (string) $subquery1 . ') AS tr ON tr.language = l.lang_code')->where('l.lang_code <> ' . $db->quote($default))->group(array('l.lang_code', 'tr.state'))->order('lang_code');
     $db->setQuery($query);
     $languages = $db->loadObjectListMultiIndex('lang_code');
     $items = array();
     if (!empty($languages)) {
         foreach ($languages as $language) {
             $translated = 0;
             $queued = 0;
             $changed = 0;
             $untranslated = 0;
             $item = new stdClass();
             $item->lang_code = $language[0]->lang_code;
             $item->comment = $language[0]->comment;
             $item->published = $language[0]->published;
             $item->title = $language[0]->title;
             $item->image = $language[0]->image;
             $item->errors = NenoHelper::getLanguageErrors((array) $language[0]);
             $item->isInstalled = NenoHelper::isCompletelyInstall($item->lang_code);
             foreach ($language as $internalItem) {
                 switch ($internalItem->state) {
                     case NenoContentElementTranslation::TRANSLATED_STATE:
                         $translated = (int) $internalItem->word_count;
                         break;
                     case NenoContentElementTranslation::QUEUED_FOR_BEING_TRANSLATED_STATE:
                         $queued = (int) $internalItem->word_count;
                         break;
                     case NenoContentElementTranslation::SOURCE_CHANGED_STATE:
                         $changed = (int) $internalItem->word_count;
                         break;
                     case NenoContentElementTranslation::NOT_TRANSLATED_STATE:
                         $untranslated = (int) $internalItem->word_count;
                         break;
                 }
             }
             $item->wordCount = new stdClass();
             $item->wordCount->translated = $translated;
             $item->wordCount->queued = $queued;
             $item->wordCount->changed = $changed;
             $item->wordCount->untranslated = $untranslated;
             $item->wordCount->total = $translated + $queued + $changed + $untranslated;
             $item->translationMethods = NenoHelper::getLanguageDefault($item->lang_code);
             $items[] = $item;
         }
     }
     $languagesOnLanguageTable = array_keys($languages);
     $knownLanguages = JFactory::getLanguage()->getKnownLanguages();
     $defaultTranslationsMethods = NenoHelper::getDefaultTranslationMethods();
     foreach ($knownLanguages as $languageTag => $languageInfo) {
         if ($languageTag != $default && !in_array($languageTag, $languagesOnLanguageTable)) {
             $languagesData = new stdClass();
             $languagesData->lang_code = $languageInfo['tag'];
             $languagesData->title = $languageInfo['name'];
             $languagesData->translationMethods = $defaultTranslationsMethods;
             $languagesData->errors = NenoHelper::getLanguageErrors((array) $languagesData);
             $languagesData->placement = 'dashboard';
             $languagesData->image = NenoHelper::getLanguageImage($languageInfo['tag']);
             $languagesData->published = NenoHelper::isLanguagePublished($languageInfo['tag']);
             $languagesData->comment = NenoHelper::getLanguageTranslatorComment($languageInfo['tag']);
             $items[] = $languagesData;
         }
     }
     return $items;
 }
示例#29
0
 /**
  * Get languages
  *
  * @return array
  */
 public function getLanguages()
 {
     $languages = NenoHelper::getLanguages(false);
     $workingLanguage = NenoHelper::getWorkingLanguage();
     $defaultLanguage = NenoSettings::get('source_language');
     foreach ($languages as $key => $language) {
         if ($language->lang_code == $workingLanguage || $language->lang_code == $defaultLanguage) {
             unset($languages[$key]);
         }
     }
     return $languages;
 }
示例#30
0
文件: string.php 项目: javigomez/neno
 /**
  * Persist translations
  *
  * @param   string|null $language A language tag to persist only for language, null to persist on all the language known
  *
  * @return bool True on success
  */
 public function persistTranslations($language = null)
 {
     // If it doesn't have translations
     if (empty($this->translations)) {
         $this->translations = NenoContentElementTranslation::getTranslations($this);
     }
     if (empty($this->translations)) {
         $commonData = array('contentType' => NenoContentElementTranslation::LANG_STRING, 'element' => $this, 'contentId' => $this->getId(), 'state' => NenoContentElementTranslation::NOT_TRANSLATED_STATE, 'string' => $this->getString(), 'timeAdded' => new DateTime(), 'comment' => $this->comment);
         if ($language != null) {
             $languageData = new stdClass();
             $languageData->lang_code = $language;
             $languages = array($languageData);
         } else {
             $languages = NenoHelper::getLanguages();
         }
         $defaultLanguage = NenoSettings::get('source_language');
         $this->translations = array();
         foreach ($languages as $language) {
             if ($defaultLanguage !== $language->lang_code) {
                 // If the string is empty or is a number, let's mark as translated.
                 $string = $this->getString();
                 // If the string is empty or is a number, let's mark as translated.
                 if (empty($string['string']) || is_numeric($string['string'])) {
                     $commonData['state'] = NenoContentElementTranslation::TRANSLATED_STATE;
                 } else {
                     $commonData['state'] = NenoContentElementTranslation::NOT_TRANSLATED_STATE;
                 }
                 $commonData['language'] = $language->lang_code;
                 $translation = new NenoContentElementTranslation($commonData);
                 // If the translation does not exists already, let's add it
                 if (!$translation->existsAlready()) {
                     $translation->persist();
                     $this->translations[] = $translation;
                 }
             }
         }
     } elseif ($this->hasChanged) {
         for ($i = 0; $i < count($this->translations); $i++) {
             /* @var $translation NenoContentElementTranslation */
             $translation = $this->translations[$i];
             // If the state is queued or translate, let's mark it as out of sync
             if (in_array($translation->getState(), array(NenoContentElementTranslation::QUEUED_FOR_BEING_TRANSLATED_STATE, NenoContentElementTranslation::TRANSLATED_STATE))) {
                 $translation->setState(NenoContentElementTranslation::SOURCE_CHANGED_STATE);
             }
             $this->translations[$i] = $translation;
         }
     }
     return true;
 }