/** * 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); }
/** * 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); } }
/** * 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'); } } } }
/** * 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); 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); }
/** * Save a setting * * @return void */ public function saveSetting() { $input = $this->input; $setting = $input->getString('setting'); $newValue = $input->getString('value'); if (NenoSettings::set($setting, $newValue)) { echo 'ok'; } JFactory::getApplication()->close(); }
/** * 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); }
/** * Load settings from the database * * @return void */ private static function loadSettingsFromDb() { $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('*')->from('#__neno_settings'); $db->setQuery($query); $settings = $db->loadObjectList(); self::$settings = array(); foreach ($settings as $setting) { self::$settings[$setting->setting_key] = array('value' => $setting->setting_value, 'read_only' => $setting->read_only); } }
/** * Task to set value for automatic translations * * @return void */ public function setAutomaticTranslationSetting() { $app = JFactory::getApplication(); $input = $app->input; $setting = $input->post->getString('setting'); $value = $input->post->getInt('value'); if (!empty($setting)) { echo NenoSettings::set($setting, $value) ? 'ok' : 'err'; } else { echo 'err'; } $app->close(); }
/** * Discover the element * * @return bool True on success */ public function discoverElement() { NenoHelper::setSetupState(JText::sprintf('COM_NENO_INSTALLATION_MESSAGE_PARSING_GROUP_TABLE', $this->group->getGroupName(), $this->getFilename()), 2); // Check if there are children not discovered $languageString = NenoContentElementLanguageString::load(array('discovered' => 0, '_limit' => 1, 'languagefile_id' => $this->id)); if (empty($languageString)) { $this->setDiscovered(true)->persist(); } else { NenoSettings::set('installation_level', '2.2'); NenoSettings::set('discovering_element_1.2', $this->id); } }
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">
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');
/** * 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 license * * @return string */ private static function getLicense() { return NenoSettings::get('license_code', ''); }
/** * {@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; }
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');
/** * Publish language switcher * * @throws Exception * * @return void */ public function doNotShowWarningMessage() { NenoSettings::set('show_language_switcher_warning', 0); JFactory::getApplication()->redirect('index.php?option=com_neno&dashboard'); }
/** * 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); }
/** * Get translator comment * * @return string|null */ public function getComment() { return NenoSettings::get('external_translators_notes'); }
/** * Validate installation step 3 * * @return bool */ protected function validateStep2() { $input = $this->input; $app = JFactory::getApplication(); $jform = $input->post->get('jform', array(), 'ARRAY'); if (!empty($jform['translation_methods'])) { foreach ($jform['translation_methods'] as $key => $translationMethod) { NenoSettings::set('translation_method_' . ($key + 1), $translationMethod); } return true; } $app->enqueueMessage('', 'error'); return false; }
/** * 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; }
protected function ensureDefaultsExists($items) { // Create a simple array with key value of settings $settings = array(); foreach ($items as $item) { $settings[$item->setting_key] = $item->setting_value; } // Related content if (!isset($settings['load_related_content'])) { NenoSettings::set('load_related_content', '0'); $items = $this->getItems(); // Refresh the items } 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; }
public function saveExternalTranslatorsComment() { $input = $this->input; $placement = $input->post->getString('placement'); $comment = $input->post->getHtml('comment', ''); $result = false; $db = JFactory::getDbo(); $query = $db->getQuery(true); switch ($placement) { case 'general': NenoSettings::set('external_translators_notes', $comment); $result = true; break; case 'language': $language = $input->post->getString('language'); $query->select('*')->from('#__neno_language_external_translators_comments')->where('language = ' . $db->quote($language)); $db->setQuery($query); $languageComment = $db->loadObject(); if (empty($languageComment)) { $languageComment = new stdClass(); $languageComment->language = $language; } $languageComment->comment = $comment; if (empty($languageComment->id)) { $db->insertObject('#__neno_language_external_translators_comments', $languageComment, 'id'); } else { $db->updateObject('#__neno_language_external_translators_comments', $languageComment, 'id'); } $result = true; break; case 'string': $translationId = $input->post->getInt('stringId'); /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false, true); $result = $translation->setComment($comment)->persist(); $allTranslations = $input->post->getBool('alltranslations', false); if ($allTranslations) { $contentId = $input->post->getInt('contentId'); if (!empty($contentId)) { $query->update('#__neno_content_element_translations')->set('comment = ' . $db->quote($comment))->where(array('content_id = ' . $db->quote($contentId), 'content_type = ' . $db->quote($translation->getContentType()), 'language = ' . $db->quote($translation->getLanguage()))); $db->setQuery($query); $db->execute(); $query->clear(); if ($translation->getContentType() == NenoContentElementTranslation::DB_STRING) { $query->update('#__neno_content_element_fields'); } else { $query->update('#__neno_content_element_language_strings'); } // Saving this comment for the future $query->set('comment = ' . $db->quote($comment))->where('id = ' . $db->quote($contentId)); $db->setQuery($query); $db->execute(); } } break; } echo $result ? 'ok' : 'err'; JFactory::getApplication()->close(); }
/** * 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(); } } } } } }
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
/** * 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; }
/** * 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(); } } }