/** * 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'); } } } }
/** * 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(); } } } } } }
/** * {@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; }
/** * 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; }
/** * 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; }
/** * 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(); } } }
/** * 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; }
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(); } } }
/** * 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; }
/** * 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; }