/** * generates a general information array * * @param string reference language * @param array language key array * @param object file object * @return array general information array * @see outputGeneral() */ public static function genGeneralInfoArray($refLang, $languages, $fileObj) { // reference language data informations $localRefLangData = $fileObj->getLocalLangData($refLang); // generate needed data foreach ($languages as $langKey) { // get origin data and meta informations $origin = $fileObj->getOriginLangData($langKey); $infos['default']['meta'] = $fileObj->getMetaData(); // language data $localLangData = $fileObj->getLocalLangData($langKey); // detailed constants informations $infos[$langKey]['numUntranslated'] = count(array_diff_key($localRefLangData, $localLangData)); $infos[$langKey]['numUnknown'] = count(array_diff_key($localLangData, $localRefLangData)); $infos[$langKey]['numTranslated'] = count(array_intersect_key($localLangData, $localRefLangData)); // get location type if ($fileObj->getVar('workspace') != 'xll') { $locType = typo3Lib::checkFileLocation($origin); if ($locType == 'local') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.local'); } elseif ($locType == 'global') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.global'); } elseif ($locType == 'system') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.system'); } elseif ($locType == 'l10n') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('lang.file.l10n'); $infos[$langKey]['type2'] = 'l10n'; } else { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.unknown'); } if ($infos[$langKey]['type2'] != 'l10n') { if ($fileObj->checkLocalizedFile(basename($origin), $langKey)) { $infos[$langKey]['type2'] = 'splitted'; } else { $infos[$langKey]['type2'] = 'merged'; } } } else { $infos[$langKey]['type'] = 'xll'; $infos[$langKey]['type2'] = 'merged'; } // set origin try { $infos[$langKey]['origin'] = '[-]'; if (!empty($origin)) { $infos[$langKey]['origin'] = typo3Lib::transTypo3File($origin, false); } } catch (Exception $e) { $infos[$langKey]['origin'] = sgLib::trimPath(PATH_site, $origin); } } return $infos; }
/** * prepares the final Content * * @return string prepared content (xml) */ private function prepareBackupContent() { // convert all values to utf-8 if ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] != 'utf-8') { $localLang = typo3Lib::utf8($this->localLang, true, array('default')); } else { $localLang = $this->localLang; } // set meta $phpArray['meta'] = $this->meta; // set array foreach ($this->originLang as $lang => $origin) { // set origin try { $phpArray['data'][$lang]['meta']['origin'] = typo3Lib::transTypo3File($origin, false); } catch (Exception $e) { $phpArray['data'][$lang]['meta']['origin'] = substr($origin, strlen(PATH_site)); } // set data if (is_array($localLang[$lang])) { foreach ($localLang[$lang] as $labelKey => $labelVal) { $phpArray['data'][$lang]['langData'][$labelKey] = $labelVal; } } } // define assocTagNames $options['parentTagMap'] = array('data' => 'languageKey', 'langData' => 'label'); // get xml return t3lib_div::array2xml($phpArray, '', 0, 'LFBackup', 0, $options); }
/** * generates output for management of backups * * @param array meta information data (only the extensions part) * @param string extension path (absolute) * @return string output (HTML code) */ public static function outputManageBackups($metaArray, $extPath) { // generate form $content .= '<input type="hidden" name="submitted" value="1" />'; $content .= '<input type="hidden" name="delete" value="0" />'; $content .= '<input type="hidden" name="restore" value="0" />'; $content .= '<input type="hidden" name="origDiff" value="0" />'; $content .= '<input type="hidden" name="deleteAll" value="0" />'; $content .= '<input type="hidden" name="file" value="" />'; $content .= '<input type="hidden" name="langFile" value="" />'; // begin table $content .= '<table id="tx-lfeditor-table" ' . 'summary="' . $GLOBALS['LANG']->getLL('table.backups') . '">'; // table header $content .= '<thead><tr>'; $content .= '<th class="bgColor5"> ' . $GLOBALS['LANG']->getLL('function.backupMgr.date') . ' </th>'; $content .= '<th class="bgColor5"> ' . $GLOBALS['LANG']->getLL('function.backupMgr.state') . ' </th>'; $content .= '<th class="bgColor5"> ' . $GLOBALS['LANG']->getLL('lang.file.file') . ' </th>'; $content .= '<th id="tx-lfeditor-table-markup1" class="bgColor5">' . '<a href="#" title="' . $GLOBALS['LANG']->getLL('function.backupMgr.deleteAll') . '" ' . 'onclick="submitBackupForm(\'\', \'\', 0, 0, 1, 0);">' . '<img src="../res/images/garbage.gif" alt="' . $GLOBALS['LANG']->getLL('function.backupMgr.delete') . '" /> </a> </th>'; $recover = strtoupper(substr($GLOBALS['LANG']->getLL('function.backupMgr.recover'), 0, 1)); $content .= '<th id="tx-lfeditor-table-markup2">' . $recover . '</th>'; $diff = strtoupper(substr($GLOBALS['LANG']->getLL('function.backupMgr.diff.diff'), 0, 1)); $content .= '<th id="tx-lfeditor-table-markup3">' . $diff . '</th>'; $content .= '</tr></thead>'; // table body $content .= '<tbody>'; $i = 0; $keys = array_keys($metaArray); foreach ($keys as $langFile) { foreach ($metaArray[$langFile] as $filename => $informations) { // get path to filename $backupPath = $informations['pathBackup']; $file = typo3Lib::fixFilePath(PATH_site . '/' . $backupPath . '/' . $filename); $origFile = typo3Lib::fixFilePath($extPath . '/' . $langFile); // check state $content .= '<tr>'; $stateBool = false; if (!is_file($file)) { $state = '<td class="tx-lfeditor-badMarkup bgColor4">' . $GLOBALS['LANG']->getLL('function.backupMgr.missing') . '</td>'; } elseif (!is_file($origFile)) { $state = '<td class="tx-lfeditor-badMarkup bgColor4">' . $GLOBALS['LANG']->getLL('lang.file.missing') . '</td>'; } else { $stateBool = true; $state = '<td class="tx-lfeditor-goodMarkup bgColor4">' . $GLOBALS['LANG']->getLL('function.backupMgr.ok') . '</td>'; } // generate row $content .= '<td class="bgColor4">' . date('Y-m-d<b\\r />H:i:s', $informations['createdAt']) . '</td>'; $content .= $state; $content .= '<td class="bgColor4">' . $langFile . '</td>'; // delete $name = $GLOBALS['LANG']->getLL('function.const.delete.delete'); $content .= '<td class="bgColor4"> <a href="#" title="' . $name . '" ' . 'onclick="submitBackupForm(\'' . $filename . '\', \'' . $langFile . '\', ' . '1, 0, 0, 0);"> <img src="../res/images/garbage.gif" title="' . $name . '" ' . 'alt="' . $name . '" /> </a> </td>'; // restore/diff if ($stateBool) { $name = $GLOBALS['LANG']->getLL('function.backupMgr.recover'); $content .= '<td class="bgColor4"> <a href="#" title="' . $name . '" ' . 'onclick="submitBackupForm(\'' . $filename . '\', \'' . $langFile . '\', ' . '0, 1, 0, 0);"> <img src="../res/images/recover.gif" title="' . $name . '" ' . 'alt="' . $name . '" /> </a> </td>'; $name = $GLOBALS['LANG']->getLL('function.backupMgr.diff.diff'); $content .= '<td class="bgColor4"> <a href="#" title="' . $name . '" ' . 'onclick="submitBackupForm(\'' . $filename . '\', \'' . $langFile . '\', ' . '0, 0, 0, 1);"> <img src="../res/images/diff.gif" title="' . $name . '" ' . 'alt="' . $name . '" /> </a> </td>'; $content .= '</tr>'; } else { $content .= '<td class="bgColor4">[-]</td><td class="bgColor4">[-]</td>'; } } } $content .= '</tbody></table>'; return $content; }
/** * code for output generation of function "backupMgr" * * @throws LFException raised if meta array is empty (no backup files) * @return string generated html content */ private function outputFuncBackupMgr() { // get vars $filename = t3lib_div::_POST('file'); $origDiff = t3lib_div::_POST('origDiff'); $extPath = $this->MOD_SETTINGS['extList']; // get output $metaArray = $this->backupObj->getMetaInfos(2); if (!count($metaArray)) { throw new LFException('failure.backup.noFiles', 1); } $content = tx_lfeditor_mod1_template::outputManageBackups($metaArray, $extPath); if ($origDiff) { // set backup file $metaArray = $this->backupObj->getMetaInfos(3); $informations = array('absPath' => typo3Lib::fixFilePath(PATH_site . '/' . $metaArray[$filename]['pathBackup']), 'relFile' => $filename); $this->backupObj->setVar($informations); // exec diff try { // read original file $this->initFileObject($this->backupObj->getVar('langFile'), PATH_site . '/' . $this->backupObj->getVar('extPath'), $this->MOD_SETTINGS['wsList']); // read backup file $this->backupObj->readFile(); // get language data $origLang = $this->fileObj->getLocalLangData(); $backupLocalLang = $this->backupObj->getLocalLangData(); // get meta data $origMeta = $this->fileObj->getMetaData(); $backupMeta = $this->backupObj->getMetaData(); $diff = tx_lfeditor_mod1_functions::getBackupDiff(0, $origLang, $backupLocalLang); $metaDiff = tx_lfeditor_mod1_functions::getMetaDiff(0, $origMeta, $backupMeta); } catch (LFException $e) { return $e->getMessage() . $content; } } // generate diff if (is_array($diff)) { $content .= tx_lfeditor_mod1_template::outputManageBackupsDiff($diff, $metaDiff, $this->fileObj->getLocalLangData(), $this->backupObj->getLocalLangData(), $this->fileObj->getOriginLangData(), $this->backupObj->getOriginLangData(), $this->fileObj->getMetaData(), $this->backupObj->getMetaData()); } return $content; }
/** * prepares the final xll content * * @return array xll file as key and content as value */ protected function prepareFileContents() { // convert all language values to utf-8 if ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] != 'utf-8') { $this->localLang = typo3Lib::utf8($this->localLang, true, array('default')); } $mainFileContent = array('meta' => $this->prepareMeta()); $languages = explode('|', TYPO3_languages); foreach ($languages as $langKey) { $mainFileContent = array_merge_recursive($mainFileContent, $this->getLangContent($this->localLang[$langKey], $langKey)); } // prepare Content for the main file $languageFiles[$this->absFile] = $this->array2xml($mainFileContent, 'T3locallang'); return $languageFiles; }
/** * prepares the final content * * @return array language files as key and content as value */ protected function prepareFileContents() { // convert all language values to utf-8 if ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] != 'utf-8') { $this->localLang = typo3Lib::utf8($this->localLang, true, array('default')); } // prepare Content $mainFileContent = array('meta' => $this->prepareMeta()); $languages = explode('|', TYPO3_languages); foreach ($languages as $lang) { // get content of localized and main file if ($this->checkLocalizedFile(basename($this->originLang[$lang]), $lang)) { if (is_array($this->localLang[$lang]) && count($this->localLang[$lang])) { $languageFiles[$this->originLang[$lang]] .= $this->array2xml($this->getLangContent($this->localLang[$lang], $lang), 'T3locallangExt'); } try { $mainFileContent['data'][$lang] = typo3Lib::transTypo3File($this->originLang[$lang], false); } catch (Exception $e) { if (!typo3Lib::checkFileLocation($this->originLang[$lang]) == 'l10n') { $mainFileContent['data'][$lang] = $this->originLang[$lang]; } } } else { $mainFileContent = array_merge_recursive($mainFileContent, $this->getLangContent($this->localLang[$lang], $lang)); } } // only a localized file? if ($this->checkLocalizedFile(basename($this->absFile), TYPO3_languages)) { return $languageFiles; } // prepare Content for the main file $languageFiles[$this->absFile] = $this->array2xml($mainFileContent, 'T3locallang'); return $languageFiles; }
/** * converts an absolute or relative typo3 style (EXT:) file path * * @throws Exception raised, if the conversion fails * @param string absolute file or an typo3 relative file (EXT:) * @param boolean generate to relative(false) or absolute file * @return string converted file path */ public static function transTypo3File($file, $mode) { $extType['local'] = typo3Lib::pathLocalExt; $extType['global'] = typo3Lib::pathGlobalExt; $extType['system'] = typo3Lib::pathSysExt; // relative to absolute if ($mode) { if (strpos($file, 'EXT:') === false) { throw new Exception('no typo3 relative path "' . $file . '"'); } $cleanFile = sgLib::trimPath('EXT:', $file); foreach ($extType as $type) { $path = typo3Lib::fixFilePath(PATH_site . '/' . $type . '/' . $cleanFile); if (is_dir(dirname($path))) { return $path; } } throw new Exception('cant convert typo3 relative file "' . $file . '"'); } else { foreach ($extType as $type) { if (strpos($file, $type) === false) { continue; } return 'EXT:' . sgLib::trimPath($type, sgLib::trimPath(PATH_site, $file)); } throw new Exception('cant convert absolute file "' . $file . '"'); } }
/** * sets informations * * structure: * $infos["absPath"] = absolute path to an extension or file * $infos["relFile"] = relative path with filename from "absPath" * $infos["workspace"] = workspace (base or xll) * $infos["fileType"] = file type (php or xml) * $infos["localLang"] = language data * $infos["originLang"] = origin language array * $infos["meta"] = meta data * * @param array informations (see above) * @return void */ public function setVar($informations) { // path and file informations if (!empty($informations['absPath'])) { $this->absPath = typo3Lib::fixFilePath($informations['absPath'] . '/'); } if (!empty($informations['relFile'])) { $this->relFile = typo3Lib::fixFilePath($informations['relFile']); } $this->absFile = $this->absPath . $this->relFile; // filetype and workspace if (!empty($informations['workspace'])) { $this->workspace = $informations['workspace']; } if (!empty($informations['fileType'])) { $this->fileType = $informations['fileType']; } // data arrays if (!count($this->localLang) && is_array($informations['localLang'])) { $this->localLang = $informations['localLang']; } if (!count($this->originLang) && is_array($informations['originLang'])) { $this->originLang = $informations['originLang']; } if (!count($this->meta) && is_array($informations['meta'])) { $this->meta = $informations['meta']; } }
/** * prepares the final content * * @return array language files as key and content as value */ protected function prepareFileContents() { // convert all language values from utf-8 to the original charset if ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] == 'utf-8') { $this->localLang = typo3Lib::utf8($this->localLang, false, array('default')); } // prepare Content unset($mainFileContent); $languages = explode('|', TYPO3_languages); foreach ($languages as $lang) { // get content of localized and main file if ($this->checkLocalizedFile(basename($this->originLang[$lang]), $lang)) { if (is_array($this->localLang[$lang]) && count($this->localLang[$lang])) { $languageFiles[$this->originLang[$lang]] = $this->getHeader(); $languageFiles[$this->originLang[$lang]] .= $this->getLangContentLoc($this->localLang[$lang], $lang); $languageFiles[$this->originLang[$lang]] .= $this->getFooter(); } $mainFileContent .= "\t'{$lang}' => 'EXT',\n"; } else { $mainFileContent .= $this->getLangContent($this->localLang[$lang], $lang); } } // only a localized file? if ($this->checkLocalizedFile(basename($this->absFile), TYPO3_languages)) { return $languageFiles; } // prepare Content for the main file $languageFiles[$this->absFile] = $this->getHeader(); $languageFiles[$this->absFile] .= '$LFMETA = array (' . "\n"; $languageFiles[$this->absFile] .= $this->prepareMeta(); $languageFiles[$this->absFile] .= ');' . "\n\n"; $languageFiles[$this->absFile] .= '$LOCAL_LANG = array (' . "\n"; $languageFiles[$this->absFile] .= $mainFileContent; $languageFiles[$this->absFile] .= ');' . "\n"; $languageFiles[$this->absFile] .= $this->getFooter(); return $languageFiles; }
/** * extends writing of language files for xll * * @throws LFException raised if parent method fails or the xll file cant be created * @return boolean always true */ public function writeFile() { // create xll directory try { sgLib::createDir($this->absPath, PATH_site); } catch (Exception $e) { throw new LFException('failure.failure', 0, '(' . $e->getMessage() . ')'); } // write xll file try { parent::writeFile(); } catch (LFException $e) { throw $e; } // set only new values in localconf if something changed $relXLLFile = sgLib::trimPath(PATH_site, $this->absFile); if ($GLOBALS['TYPO3_CONF_VARS']['BE']['XLLfile'][$this->typo3RelFile] == $relXLLFile) { return true; } try { $fileRef = substr($this->typo3RelFile, 0, strrpos($this->typo3RelFile, '.')); $addLine = '$TYPO3_CONF_VARS[\'BE\'][\'XLLfile\'][\'' . $fileRef . '.xml\']'; typo3Lib::writeLocalconf($addLine, $relXLLFile); $GLOBALS['TYPO3_CONF_VARS']['BE']['XLLfile'][$fileRef . '.xml'] = $relXLLFile; // create alternative $addLine = '$TYPO3_CONF_VARS[\'BE\'][\'XLLfile\'][\'' . $fileRef . '.php\']'; typo3Lib::writeLocalconf($addLine, $relXLLFile); $GLOBALS['TYPO3_CONF_VARS']['BE']['XLLfile'][$fileRef . '.php'] = $relXLLFile; } catch (Exception $e) { throw new LFException('failure.failure', 0, '(' . $e->getMessage() . ')'); } return true; }