/** * Consolidate Translation * * @param int $translationId Translation id * * @return bool True on success */ public function consolidateTranslations($translationId) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId); $db = JFactory::getDbo(); $query = $db->getQuery(true); if (!empty($translation)) { $translationsToConsolidate = NenoContentElementTranslation::load(array('original_text' => $translation->getOriginalText(), 'language' => $translation->getLanguage(), 'id' => array('_field' => 'id', '_condition' => '<>', '_value' => $translation->getId()))); /* @var $translationToConsolidate NenoContentElementTranslation */ foreach ($translationsToConsolidate as $translationToConsolidate) { $translationToConsolidate->setString($translation->getString())->setState(NenoContentElementTranslation::TRANSLATED_STATE)->persist(); } } return true; }
/** * Consolidate Translation * * @param int $translationId Translation id * * @return bool True on success */ public function consolidateTranslations($translationId) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false, true); if (!empty($translation)) { $translationsToConsolidate = NenoContentElementTranslation::load(array('original_text' => $translation->getOriginalText(), 'language' => $translation->getLanguage(), 'id' => array('_field' => 'id', '_condition' => '<>', '_value' => $translation->getId())), false, true); // Making sure that is an array if (!is_array($translationsToConsolidate)) { $translationsToConsolidate = array($translationsToConsolidate); } /* @var $translationToConsolidate NenoContentElementTranslation */ foreach ($translationsToConsolidate as $translationToConsolidate) { $translationToConsolidate->setString($translation->getString())->setState(NenoContentElementTranslation::TRANSLATED_STATE)->persist(); } } return true; }
/** * Trash translations when the user click on the trash button * * @param NenoContentElementTable $table Table where the element was trashed * @param mixed $pk Primary key value * * @return void */ protected function trashTranslations(NenoContentElementTable $table, $pk) { $db = JFactory::getDbo(); $primaryKeys = $table->getPrimaryKeys(); $query = $db->getQuery(true); $query->select('tr.id')->from('#__neno_content_element_translations AS tr'); /* @var $primaryKey NenoContentElementField */ foreach ($primaryKeys as $key => $primaryKey) { $alias = 'ft' . $key; $query->where("exists(SELECT 1 FROM #__neno_content_element_fields_x_translations AS {$alias} WHERE {$alias}.translation_id = tr.id AND {$alias}.field_id = " . $primaryKey->getId() . " AND {$alias}.value = " . $db->quote($pk) . ")"); } $db->setQuery($query); $translationIds = $db->loadColumn(); foreach ($translationIds as $translationId) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId); $translation->remove(); } }
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(); }
public function refreshWordCount() { $input = $this->input; // Refresh content for groups $groups = $input->get('groups', array(), 'ARRAY'); $tables = $input->get('tables', array(), 'ARRAY'); $files = $input->get('files', array(), 'ARRAY'); $workingLanguage = NenoHelper::getWorkingLanguage(); /* @var $db NenoDatabaseDriverMysqlx */ $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('tr.id')->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('tr.state = ' . $db->quote(NenoContentElementTranslation::TRANSLATED_STATE), 'tr.language = ' . $db->quote($workingLanguage))); if (!empty($groups)) { $query->innerJoin('#__neno_content_element_groups AS g ON t.group_id = g.id')->where('g.id IN (' . implode(',', $db->quote($groups)) . ')'); } elseif (!empty($tables) || !empty($files)) { $where = array(); if (!empty($tables)) { $where[] = '(t.id IN (' . implode(',', $db->quote($tables)) . ') AND tr.content_type = ' . $db->quote(NenoContentElementTranslation::DB_STRING) . ')'; } if (!empty($files)) { $where[] = '(t.id IN (' . implode(',', $db->quote($tables)) . ') AND tr.content_type = ' . $db->quote(NenoContentElementTranslation::LANG_STRING) . ')'; } $query->where('(' . implode(' OR ', $where) . ')'); } $db->setQuery($query); $translationIds = $db->loadArray(); foreach ($translationIds as $translationId) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false, true); $translation->persist(); } JFactory::getApplication()->redirect('index.php?option=com_neno&view=groupselements'); }
/** * Process a file * * @return bool True on success, false otherwise */ public function processJobFinished() { $config = JFactory::getConfig(); $tmpPath = $config->get('tmp_path'); $filename = $this->getFileName(); $fileContents = json_decode(file_get_contents($tmpPath . '/' . $filename . '.json' . '/' . $filename . '.json'), true); if ($fileContents !== null) { foreach ($fileContents['strings'] as $translationId => $translationText) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId); $translation->setString($translationText); // Mark this translation method as completed $translation->markTranslationMethodAsCompleted($this->translationMethod->id); if ($translation->isBeingCompleted()) { $translation->setState(NenoContentElementTranslation::TRANSLATED_STATE); } $translation->persist(); } return true; } return false; }
/** * Save translation as completed * * @return void */ public function saveAsCompleted() { $input = $this->input; $translationId = $input->getInt('id'); $translationText = $input->get('text', '', 'RAW'); if ($this->saveTranslation($translationId, $translationText, NenoContentElementTranslation::TRANSLATED_STATE)) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false); $data = array('translation' => $translation->prepareDataForView()); $original_text = $translation->getOriginalText(); $model = $this->getModel(); $counter = $model->getSimilarTranslationsCounter($translationId, $translation->getLanguage(), $original_text); if ($counter != 0) { $data['message'] = JText::sprintf('COM_NENO_EDITOR_CONSOLIDATE_MESSAGE', $counter, NenoHelper::html2text($original_text, 200), NenoHelper::html2text($translationText, 200)); $data['counter'] = $counter; } echo json_encode($data); } JFactory::getApplication()->close(); }
/** * Apply filter to existing translations * * @return void */ public function applyFiltersToExistingContent() { $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('t.id')->from('#__neno_content_element_translations AS t')->where(array('t.content_type = ' . $db->quote('db_string'), 'EXISTS (SELECT 1 FROM #__neno_content_element_fields AS f ON t.content_id = f.id WHERE f.table_id = ' . (int) $this->id . ')')); $db->setQuery($query); $translationIds = $db->loadColumn(); $filters = $this->getTableFilters(); foreach ($translationIds as $translationId) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false, true); $sqlQuery = $translation->generateSQLStatement(); $sqlQuery->clear('select')->select('1'); foreach ($filters as $filter) { $query->where($db->quoteName($filter['field']) . ' ' . $filter['operator'] . ' ' . $db->quote($filter['value'])); } $db->setQuery($query); $result = $db->loadResult(); // If the translation does not meet this requirements, let's delete it if (empty($result)) { $translation->remove(); } } }
/** * Save translation as completed * * @return void */ public function saveAllAsCompleted() { // Get input and turn it into an array with objects $input = $this->input; $stringsJson = $input->get('strings', '', 'RAW'); $strings = json_decode($stringsJson); // Create an array to hold info about the translations $messages = array(); if (!empty($strings) && count($strings) > 0) { $checkedStrings = array(); foreach ($strings as $string) { $string->text = NenoHelper::cleanXssString($string->text); // Save the translation if ($this->saveTranslation($string->translation_id, $string->text, NenoContentElementTranslation::TRANSLATED_STATE)) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($string->translation_id, false); // Check for number of same translations to offer consolidation // Only check for one string once $counter = 0; $originalText = $translation->getOriginalText(); if (in_array(strtolower(trim($originalText)), $checkedStrings) === false) { $checkedStrings[] = strtolower(trim($originalText)); $model = $this->getModel(); $counter = $model->getSimilarTranslationsCounter($string->translation_id, $translation->getLanguage(), $originalText); } // If we found matches prepare data to return $message = array(); if ($counter != 0) { $message['translation_id'] = $string->translation_id; $message['message'] = '<div><input type="checkbox" class="consolidate-checkbox" value="' . $string->translation_id . '" checked="checked"> ' . JText::sprintf('COM_NENO_EDITOR_CONSOLIDATE_MESSAGE', $counter, NenoHelper::html2text($originalText, 200), NenoHelper::html2text($string->text, 200)) . '</div>'; $message['counter'] = $counter; } if (!empty($message)) { $messages[] = $message; } } } } // Echo any messages if (count($messages) > 0) { echo json_encode($messages); } JFactory::getApplication()->close(); }
/** * Process a file * * @return bool True on success, false otherwise */ public function processJobFinished() { $config = JFactory::getConfig(); $tmpPath = $config->get('tmp_path'); $filename = $this->getFileName(); $fileContents = json_decode(file_get_contents($tmpPath . '/' . $filename . '.json' . '/' . $filename . '.json'), true); if ($fileContents !== null) { foreach ($fileContents['strings'] as $translationId => $translationText) { /* @var $translation NenoContentElementTranslation */ $translation = NenoContentElementTranslation::load($translationId, false, true); if (!empty($translation)) { $translation->setString(NenoHelper::replaceTranslationsInHtmlTag($translation->getOriginalText(), html_entity_decode($translationText, ENT_COMPAT | ENT_HTML401, $this->getCorrectEncodingCharset($this->getToLanguage())))); // Mark this translation method as completed $translation->markTranslationMethodAsCompleted($this->translationMethod->id); if ($translation->isBeingCompleted()) { $translation->setState(NenoContentElementTranslation::TRANSLATED_STATE); } // Saving translation if ($translation->persist()) { // Move translation to the target even if it's not completed. Machine => Professional || Professional => Manual $translation->moveTranslationToTarget(); } } } // Ensure the shadow tables of the target language have their language column (if there's any) properly set. $tables = NenoContentElementTable::load(array('translate' => 1)); /* @var $table NenoContentElementTable */ foreach ($tables as $table) { $table->checkIntegrity($this->getToLanguage()); } return true; } return false; }