/** * @see \wcf\form\IForm::save() */ public function save() { AbstractForm::save(); $editor = new LanguageEditor($this->language); $editor->update(array('countryCode' => mb_strtolower($this->countryCode), 'languageName' => $this->languageName, 'languageCode' => mb_strtolower($this->languageCode))); LanguageFactory::getInstance()->clearCache(); $this->saved(); // show success message WCF::getTPL()->assign('success', true); }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); // send headers header('Content-Type: text/xml; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $this->language->languageCode . '.xml"'); $this->language->export($this->selectedPackages, $this->exportCustomValues); exit; }
/** * Loads category files. * * @param string $category * @return boolean */ protected function loadCategory($category) { if (!LanguageFactory::getInstance()->isValidCategory($category)) { return false; } // search language file $filename = WCF_DIR . 'language/' . $this->languageID . '_' . $category . '.php'; if (!@file_exists($filename)) { if ($this->editor === null) { $this->editor = new LanguageEditor($this); } // rebuild language file $languageCategory = LanguageFactory::getInstance()->getCategory($category); if ($languageCategory === null) { return false; } $this->editor->updateCategory($languageCategory); } // include language file @(include_once $filename); return true; }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); // save LanguageEditor::enableMultilingualism($this->enable == 1 ? $this->languageIDs : array()); // clear cache LanguageCacheBuilder::getInstance()->reset(); $this->saved(); // show success message WCF::getTPL()->assign('success', true); }
/** * Removes language cache and compiled templates. */ public function deleteLanguageCache() { LanguageEditor::deleteLanguageFiles(); foreach ($this->cache['languages'] as $language) { $languageEditor = new LanguageEditor($language); $languageEditor->deleteCompiledTemplates(); } }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { AbstractPackageInstallationPlugin::install(); // get language files $languageFiles = array(); $multipleFiles = false; $filename = $this->instruction['value']; if (strpos($filename, '*') !== false) { // wildcard syntax; import multiple files $multipleFiles = true; $files = $this->installation->getArchive()->getTar()->getContentList(); $pattern = str_replace("\\*", ".*", preg_quote($filename)); foreach ($files as $file) { if (preg_match('!' . $pattern . '!i', $file['filename'])) { if (preg_match('~([a-z-]+)\\.xml$~i', $file['filename'], $match)) { $languageFiles[$match[1]] = $file['filename']; } else { throw new SystemException("Can not determine language code of language file '" . $file['filename'] . "'"); } } } } else { if (!empty($this->instruction['attributes']['languagecode'])) { $languageCode = $this->instruction['attributes']['languagecode']; } else { if (!empty($this->instruction['attributes']['language'])) { $languageCode = $this->instruction['attributes']['language']; } else { if (preg_match('~([a-z-]+)\\.xml$~i', $filename, $match)) { $languageCode = $match[1]; } else { throw new SystemException("Can not determine language code of language file '" . $filename . "'"); } } } $languageFiles[$languageCode] = $filename; } // get installed languages $installedLanguages = array(); $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_language\n\t\t\tORDER BY\tisDefault DESC"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); while ($row = $statement->fetchArray()) { $installedLanguages[] = $row; } // install language $addedLanguageIDArray = array(); foreach ($installedLanguages as $installedLanguage) { $languageFile = null; if (isset($languageFiles[$installedLanguage['languageCode']])) { $languageFile = $languageFiles[$installedLanguage['languageCode']]; } else { if ($multipleFiles) { // use default language if (isset($languageFiles[$installedLanguages[0]['languageCode']])) { $languageFile = $languageFiles[$installedLanguages[0]['languageCode']]; } else { if (isset($languageFiles['en'])) { foreach ($installedLanguages as $installedLanguage2) { if ($installedLanguage2['languageCode'] == 'en') { $languageFile = $languageFiles['en']; break; } } } } // use any installed language if ($languageFile === null) { foreach ($installedLanguages as $installedLanguage2) { if (isset($languageFiles[$installedLanguage2['languageCode']])) { $languageFile = $languageFiles[$installedLanguage2['languageCode']]; break; } } } // use first delivered language if ($languageFile === null) { foreach ($languageFiles as $languageFile) { break; } } } } // save language if ($languageFile !== null) { if ($xml = $this->readLanguage($languageFile)) { // get language object $language = LanguageFactory::getInstance()->getLanguageByCode($installedLanguage['languageCode']); $languageEditor = new LanguageEditor($language); // import xml // don't update language files if package is an application $languageEditor->updateFromXML($xml, $this->installation->getPackageID(), !$this->installation->getPackage()->isApplication); // add language to this package $addedLanguageIDArray[] = $language->languageID; } } } // save package to language if (count($addedLanguageIDArray)) { $condition = ''; $statementParameters = array($this->installation->getPackageID()); foreach ($addedLanguageIDArray as $languageID) { if (!empty($condition)) { $condition .= ','; } $condition .= '?'; $statementParameters[] = $languageID; } $statementParameters[] = $this->installation->getPackageID(); $sql = "INSERT INTO\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t(languageID, packageID)\n\t\t\t\tSELECT\t\tlanguageID, ?\n\t\t\t\tFROM\t\twcf" . WCF_N . "_language\n\t\t\t\tWHERE\t\tlanguageID IN (" . $condition . ")\n\t\t\t\t\t\tAND languageID NOT IN (\n\t\t\t\t\t\t\tSELECT\tlanguageID\n\t\t\t\t\t\t\tFROM\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t\tWHERE\tpackageID = ?\n\t\t\t\t\t\t)"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($statementParameters); } }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); $this->language = LanguageEditor::create(array('countryCode' => mb_strtolower($this->countryCode), 'languageName' => $this->languageName, 'languageCode' => mb_strtolower($this->languageCode))); $languageEditor = new LanguageEditor($this->sourceLanguage); $languageEditor->copy($this->language); LanguageFactory::getInstance()->clearCache(); LanguageFactory::getInstance()->deleteLanguageCache(); $this->saved(); // show success message WCF::getTPL()->assign('success', true); }
/** * Searches in language items. * * @param string $search search query * @param string $replace * @param integer $languageID * @param boolean $useRegex * @param boolean $caseSensitive * @param boolean $searchVariableName * @return array */ public static function search($search, $replace = null, $languageID = null, $useRegex = 0, $searchVariableName = 0) { $results = array(); // build condition $conditionBuilder = new PreparedStatementConditionBuilder(); // search field $statementParameters = array(); if ($searchVariableName) { $searchCondition = 'languageItem '; } else { $searchCondition = 'languageItemValue '; } // regex if ($useRegex) { $searchCondition .= "REGEXP ?"; $statementParameters[] = $search; } else { $searchCondition .= "LIKE ?"; $statementParameters[] = '%' . $search . '%'; } if (!$searchVariableName) { $searchCondition .= ' OR languageCustomItemValue '; // regex if ($useRegex) { $searchCondition .= "REGEXP ?"; $statementParameters[] = $search; } else { $searchCondition .= "LIKE ?"; $statementParameters[] = '%' . $search . '%'; } } $conditionBuilder->add($searchCondition, $statementParameters); if ($languageID !== null) { $conditionBuilder->add("languageID = ?", array($languageID)); } // search $updatedItems = array(); $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_language_item\n\t\t\t" . $conditionBuilder; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($conditionBuilder->getParameters()); while ($row = $statement->fetchArray()) { if ($replace !== null) { // search and replace $matches = 0; if ($useRegex) { $newValue = preg_replace('~' . $search . '~s', $replace, $row['languageCustomItemValue'] ?: $row['languageItemValue'], -1, $matches); } else { $newValue = StringUtil::replaceIgnoreCase($search, $replace, $row['languageCustomItemValue'] ?: $row['languageItemValue'], $matches); } if ($matches > 0) { // update value if (!isset($updatedItems[$row['languageID']])) { $updatedItems[$row['languageID']] = array(); } if (!isset($updatedItems[$row['languageID']][$row['languageCategoryID']])) { $updatedItems[$row['languageID']][$row['languageCategoryID']] = array(); } $updatedItems[$row['languageID']][$row['languageCategoryID']][$row['languageItem']] = $newValue; // save matches $row['matches'] = $matches; } } $results[] = $row; } // save updates if (!empty($updatedItems)) { foreach ($updatedItems as $languageID => $categories) { $language = new LanguageEditor($languageID); foreach ($categories as $categoryID => $items) { $useCustom = array(); foreach (array_keys($items) as $item) { $useCustom[$item] = 1; } $category = new LanguageCategory($categoryID); $language->updateItems($items, $category, PACKAGE_ID, $useCustom); } } } return $results; }
$sql = "UPDATE wcf".WCF_N."_package_installation_file_log SET packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array(1)); $sql = "UPDATE wcf".WCF_N."_package_installation_sql_log SET packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array(1)); // update pips $sql = "UPDATE wcf".WCF_N."_package_installation_plugin SET packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array(1)); // group options $sql = "UPDATE wcf".WCF_N."_user_group_option SET packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array(1)); // reset all caches CacheHandler::getInstance()->flushAll(); // delete language files LanguageEditor::deleteLanguageFiles(); // delete all compiled templates ACPTemplateEngine::deleteCompiledTemplates(WCF_DIR.'acp/templates/compiled/');
/** * Installs the selected languages. */ protected function installLanguage() { $this->initDB(); foreach (self::$selectedLanguages as $language) { // get language.xml file name $filename = TMP_DIR . 'install/lang/' . $language . '.xml'; // check the file if (!file_exists($filename)) { throw new SystemException("unable to find language file '" . $filename . "'"); } // open the file $xml = new XML(); $xml->load($filename); // import xml LanguageEditor::importFromXML($xml, 0); } // set default language $language = LanguageFactory::getInstance()->getLanguageByCode(in_array(self::$selectedLanguageCode, self::$selectedLanguages) ? self::$selectedLanguageCode : self::$selectedLanguages[0]); LanguageFactory::getInstance()->makeDefault($language->languageID); // rebuild language cache LanguageCacheBuilder::getInstance()->reset(); // go to next step $this->gotoNextStep('createUser'); }
/** * Installs the selected languages. */ protected function installLanguage() { $this->initDB(); foreach (self::$selectedLanguages as $language) { // get language.xml file name $filename = TMP_DIR . 'install/lang/' . $language . '.xml'; // check the file if (!file_exists($filename)) { throw new SystemException("unable to find language file '" . $filename . "'"); } // open the file $xml = new XML(); $xml->load($filename); // import xml LanguageEditor::importFromXML($xml, 0); } // set default language $language = LanguageFactory::getInstance()->getLanguageByCode(in_array(self::$selectedLanguageCode, self::$selectedLanguages) ? self::$selectedLanguageCode : self::$selectedLanguages[0]); LanguageFactory::getInstance()->makeDefault($language->languageID); // assign all languages to package id 0 $sql = "SELECT\tlanguageID\n\t\t\tFROM\twcf" . WCF_N . "_language"; $statement = self::getDB()->prepareStatement($sql); $statement->execute(); $languages = array(); while ($row = $statement->fetchArray()) { $languages[] = $row['languageID']; } if (count($languages) > 0) { $sql = "INSERT INTO\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t(languageID)\n\t\t\t\tVALUES\t\t(?)"; $statement = self::getDB()->prepareStatement($sql); foreach ($languages as $languageID) { $statement->execute(array($languageID)); } } // rebuild language cache CacheHandler::getInstance()->clearResource('languages'); // go to next step $this->gotoNextStep('createUser'); }
/** * @see \wcf\form\IForm::validate() */ public function validate() { parent::validate(); // check file if (!file_exists($this->filename)) { throw new UserInputException('languageFile'); } // try to import try { // open xml document $xml = new XML(); $xml->load($this->filename); // import xml document $this->language = LanguageEditor::importFromXML($xml, -1); } catch (SystemException $e) { throw new UserInputException($this->importField, $e->getMessage()); } }
/** * Sets language as default */ public function setAsDefault() { $this->languageEditor->setAsDefault(); }
/** * Executes post-setup actions. */ public function completeSetup() { // remove archives $sql = "SELECT\tarchive\n\t\t\tFROM\twcf" . WCF_N . "_package_installation_queue\n\t\t\tWHERE\tprocessNo = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->queue->processNo)); while ($row = $statement->fetchArray()) { @unlink($row['archive']); } // delete queues $sql = "DELETE FROM\twcf" . WCF_N . "_package_installation_queue\n\t\t\tWHERE\t\tprocessNo = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->queue->processNo)); // clear language files once whole installation is completed LanguageEditor::deleteLanguageFiles(); // reset all caches CacheHandler::getInstance()->flushAll(); }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { AbstractPackageInstallationPlugin::install(); // get language files $languageFiles = array(); $multipleFiles = false; $filename = $this->instruction['value']; if (strpos($filename, '*') !== false) { // wildcard syntax; import multiple files $multipleFiles = true; $files = $this->installation->getArchive()->getTar()->getContentList(); $pattern = str_replace("\*", ".*", preg_quote($filename)); foreach ($files as $file) { if (preg_match('!'.$pattern.'!i', $file['filename'])) { if (preg_match('~([a-z-]+)\.xml$~i', $file['filename'], $match)) { $languageFiles[$match[1]] = $file['filename']; } else { throw new SystemException("Can not determine language code of language file '".$file['filename']."'"); } } } } else { if (!empty($this->instruction['attributes']['languagecode'])) { $languageCode = $this->instruction['attributes']['languagecode']; } else if (!empty($this->instruction['attributes']['language'])) { $languageCode = $this->instruction['attributes']['language']; } else if (preg_match('~([a-z-]+)\.xml$~i', $filename, $match)) { $languageCode = $match[1]; } else { throw new SystemException("Can not determine language code of language file '".$filename."'"); } $languageFiles[$languageCode] = $filename; } // get installed languages $installedLanguages = array(); $sql = "SELECT * FROM wcf".WCF_N."_language ORDER BY isDefault DESC"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); while ($row = $statement->fetchArray()) { $installedLanguages[] = $row; } // install language foreach ($installedLanguages as $installedLanguage) { $languageFile = null; if (isset($languageFiles[$installedLanguage['languageCode']])) { $languageFile = $languageFiles[$installedLanguage['languageCode']]; } else if ($multipleFiles) { // use default language if (isset($languageFiles[$installedLanguages[0]['languageCode']])) { $languageFile = $languageFiles[$installedLanguages[0]['languageCode']]; } // use english (if installed) else if (isset($languageFiles['en'])) { foreach ($installedLanguages as $installedLanguage2) { if ($installedLanguage2['languageCode'] == 'en') { $languageFile = $languageFiles['en']; break; } } } // use any installed language if ($languageFile === null) { foreach ($installedLanguages as $installedLanguage2) { if (isset($languageFiles[$installedLanguage2['languageCode']])) { $languageFile = $languageFiles[$installedLanguage2['languageCode']]; break; } } } // use first delivered language if ($languageFile === null) { foreach ($languageFiles as $languageFile) break; } } // save language if ($languageFile !== null) { if ($xml = $this->readLanguage($languageFile)) { // get language object $language = LanguageFactory::getInstance()->getLanguageByCode($installedLanguage['languageCode']); $languageEditor = new LanguageEditor($language); // import xml // don't update language files if package is an application $languageEditor->updateFromXML($xml, $this->installation->getPackageID(), !$this->installation->getPackage()->isApplication); } } } }
/** * Executes post-setup actions. */ public function completeSetup() { // mark queue as done $queueEditor = new PackageInstallationQueueEditor($this->queue); $queueEditor->update(array( 'done' => 1 )); // remove node data $this->nodeBuilder->purgeNodes(); // update package version if ($this->action == 'update') { $packageEditor = new PackageEditor($this->getPackage()); $packageEditor->update(array( 'updateDate' => TIME_NOW, 'packageVersion' => $this->getArchive()->getPackageInfo('version') )); } // clear language files once whole installation is completed LanguageEditor::deleteLanguageFiles(); // reset all caches CacheHandler::getInstance()->flushAll(); }
/** * @see wcf\form\Form::save() */ public function save() { parent::save(); if ($this->mode == 'copy') { $this->language = LanguageEditor::create(array( 'languageCode' => StringUtil::toLowerCase($this->languageCode) )); $languageEditor = new LanguageEditor($this->sourceLanguage); $languageEditor->copy($this->language); } LanguageFactory::getInstance()->clearCache(); LanguageFactory::getInstance()->deleteLanguageCache(); $this->saved(); // show success message WCF::getTPL()->assign('success', true); }