/** * 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); }
/** * 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); } }
/** * 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); } }
/** * 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); }
/** * 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); }
/** * 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); }
/** * 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'); } } } }
/** * 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(); }
/** * {@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; }
/** * 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); }
/** * 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); }
/** * 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; }
/** * 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; }
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">
/** * 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)); } }
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
/** * 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; }
/** * Get translator comment * * @return string|null */ public function getComment() { return NenoSettings::get('external_translators_notes'); }
/** * 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; }
/** * 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); }
/** * Get license * * @return string */ private static function getLicense() { return NenoSettings::get('license_code', ''); }
/** * 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(); } } }
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');
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');
/** * {@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; }
/** * 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; }
/** * 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(); } } } } } }
/** * 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; }
/** * 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; }
/** * 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; }