Пример #1
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');
             }
         }
     }
 }
Пример #2
0
 /**
  * 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();
                     }
                 }
             }
         }
     }
 }
Пример #3
0
 /**
  * {@inheritdoc}
  *
  * @return boolean
  */
 public function persist()
 {
     $isNew = $this->isNew();
     $result = parent::persist();
     // Check if the saving process has been completed successfully
     if ($result) {
         NenoLog::log('Group data added or modified successfully', 2);
         if (!empty($this->extensions)) {
             $db = JFactory::getDbo();
             $deleteQuery = $db->getQuery(true);
             $deleteQuery->delete('#__neno_content_element_groups_x_extensions')->where('group_id = ' . $this->getId());
             $db->setQuery($deleteQuery);
             $db->execute();
             $insertQuery = $db->getQuery(true);
             $insertQuery->clear()->insert('#__neno_content_element_groups_x_extensions')->columns(array('extension_id', 'group_id'));
             foreach ($this->extensions as $extension) {
                 $insertQuery->values((int) $extension . ',' . $this->getId());
             }
             $db->setQuery($insertQuery);
             $db->execute();
         }
         // check whether or not this group should have translation methods (For unknown groups we set them as do not translate)
         if ($isNew && !empty($this->tables) && is_array($this->tables)) {
             $fileFound = false;
             /* @var $table NenoContentElementTable */
             foreach ($this->tables as $table) {
                 if (file_exists($table->getContentElementFilename())) {
                     $fileFound = true;
                     break;
                 }
             }
             // if it has no file, let's assign manual translation.
             if (!$fileFound) {
                 $this->assignedTranslationMethods = array();
                 $languages = NenoHelper::getLanguages(false);
                 foreach ($languages as $language) {
                     $translationMethod = new stdClass();
                     $translationMethod->lang = $language->lang_code;
                     $translationMethod->translation_method_id = 1;
                     $translationMethod->lang = 1;
                     $this->assignedTranslationMethods[] = $translationMethod;
                 }
             }
         }
         if (!empty($this->assignedTranslationMethods)) {
             $db = JFactory::getDbo();
             $deleteQuery = $db->getQuery(true);
             $insertQuery = $db->getQuery(true);
             $insert = false;
             $insertQuery->insert('#__neno_content_element_groups_x_translation_methods')->columns(array('group_id', 'lang', 'translation_method_id', 'ordering'));
             foreach ($this->assignedTranslationMethods as $translationMethod) {
                 if (!empty($translationMethod->lang)) {
                     $deleteQuery->clear()->delete('#__neno_content_element_groups_x_translation_methods')->where(array('group_id = ' . $this->id, 'lang = ' . $db->quote($translationMethod->lang)));
                     $db->setQuery($deleteQuery);
                     $db->execute();
                     if (!empty($translationMethod)) {
                         $insert = true;
                         $insertQuery->values($this->id . ',' . $db->quote($translationMethod->lang) . ', ' . $db->quote($translationMethod->translation_method_id) . ', ' . $db->quote($translationMethod->ordering));
                     }
                 }
             }
             if ($insert) {
                 $db->setQuery($insertQuery);
                 $db->execute();
             }
         }
         if (!empty($this->languageFiles)) {
             /* @var $languageFile NenoContentElementLanguageFile */
             foreach ($this->languageFiles as $languageFile) {
                 $languageFile->setGroup($this);
                 $languageFile->persist();
             }
         }
         if (!empty($this->tables)) {
             /* @var $table NenoContentElementTable */
             foreach ($this->tables as $table) {
                 $table->setGroup($this);
                 $table->persist();
             }
         }
     }
     return $result;
 }
Пример #4
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;
 }
Пример #5
0
 /**
  * Create the HTML for the fairly advanced title that allows changing the language you are working in
  *
  * @param   boolean $showLanguageDropDown If we should show the languages dropdown
  *
  * @return string
  */
 public static function setAdminTitle($showLanguageDropDown = false)
 {
     $app = JFactory::getApplication();
     $view = $app->input->getCmd('view', '');
     $document = $app->getDocument();
     $currentTitle = $document->getTitle();
     $document->setTitle($currentTitle . ' - ' . JText::_('COM_NENO_TITLE_' . strtoupper($view)));
     // If there is a language constant then start with that
     $displayData = array('view' => $view);
     if ($showLanguageDropDown) {
         $displayData['workingLanguage'] = NenoHelper::getWorkingLanguage();
         $displayData['targetLanguages'] = NenoHelper::getLanguages(false, false);
     }
     $adminTitleLayout = JLayoutHelper::render('toolbar', $displayData, JPATH_NENO_LAYOUTS);
     $layout = new JLayoutFile('joomla.toolbar.title');
     $html = $layout->render(array('title' => $adminTitleLayout, 'icon' => 'nope'));
     $app->JComponentTitle = $html;
 }
Пример #6
0
 /**
  * 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();
         }
     }
 }
Пример #7
0
 /**
  * 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(false);
         }
         $defaultLanguage = NenoSettings::get('source_language');
         $this->translations = array();
         $strings = $this->getStrings($recordId);
         $primaryKeyData = $this->getTable()->getPrimaryKey();
         $translationmethods = NenoHelper::getTranslationMethodsByTableId($this->table->getId());
         if (!empty($strings)) {
             foreach ($strings as $string) {
                 $progressCounters = $this->getProgressCounters();
                 if (!NenoSettings::get('installation_completed')) {
                     NenoHelper::setSetupState(JText::sprintf('COM_NENO_INSTALLATION_MESSAGE_PARSING_GROUP_TABLE_FIELD_PROGRESS', $this->getTable()->getGroup()->getGroupName(), $this->getTable()->getTableName(), $this->getFieldName(), $progressCounters['processed'], $progressCounters['total']), 3);
                 }
                 if ($string['state'] == 1 || $string['state'] == 0 && NenoSettings::get('copy_unpublished', 1) || $string['state'] == -2 && NenoSettings::get('copy_trashed', 0)) {
                     foreach ($languages as $language) {
                         if ($defaultLanguage !== $language->lang_code) {
                             $commonData['language'] = $language->lang_code;
                             $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();
                             $fieldBreakpoint = array();
                             foreach ($primaryKeyData as $primaryKey) {
                                 $field = self::getFieldByTableAndFieldName($this->getTable(), $primaryKey);
                                 $fieldData = array('field' => $field, 'value' => $string[$primaryKey]);
                                 $sourceData[] = $fieldData;
                                 $fieldBreakpoint[$primaryKey] = $string[$primaryKey];
                             }
                             // Save breakpoint into the database
                             NenoSettings::set('field_breakpoint', json_encode($fieldBreakpoint));
                             $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])) {
                                 if (!empty($translationmethods[$language->lang_code])) {
                                     $translationMethodsTr = $translationmethods[$language->lang_code];
                                     foreach ($translationMethodsTr as $translationMethodTr) {
                                         $translation->addTranslationMethod($translationMethodTr->translation_method_id);
                                     }
                                 }
                             }
                             $translation->persist();
                             $this->translations[] = $translation;
                         }
                     }
                 }
             }
             NenoSettings::set('field_breakpoint', null);
         }
     } else {
         for ($i = 0; $i < count($this->translations); $i++) {
             $translation = $this->translations[$i];
             /* @var $translation NenoContentElementTranslation */
             $translation->refresh();
             $this->translations[$i] = $translation;
         }
     }
     return true;
 }
Пример #8
0
 public function checkIntegrity($language = null)
 {
     /* @var $db NenoDatabaseDriverMysqlx */
     $db = JFactory::getDbo();
     $tableColumns = array_keys($db->getTableColumns($this->tableName));
     $languages = array();
     // If a language was passed, get languages otherwise
     if ($language !== null) {
         $languages[] = $language;
     } else {
         $languagesKnown = NenoHelper::getLanguages(false);
         foreach ($languagesKnown as $languageKnown) {
             $languages[] = $languageKnown->lang_code;
         }
     }
     if (in_array('language', $tableColumns)) {
         foreach ($languages as $language) {
             $shadowTable = $db->generateShadowTableName($this->tableName, $language);
             $query = $db->getQuery(true);
             $query->update($db->quoteName($shadowTable))->set('language = ' . $db->quote($language));
             $db->setQuery($query);
             $db->execute();
         }
     }
 }
Пример #9
0
 /**
  * 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;
 }
Пример #10
0
 /**
  * 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;
 }