/** * Imports language items from an XML file into a new or a current language. * Updates the relevant language files automatically. * * @param \wcf\util\XML $xml * @param integer $packageID * @return \wcf\data\language\LanguageEditor */ public static function importFromXML(XML $xml, $packageID) { $languageCode = self::readLanguageCodeFromXML($xml); // try to find an existing language with the given language code $language = LanguageFactory::getInstance()->getLanguageByCode($languageCode); // create new language if ($language === null) { $countryCode = self::readCountryCodeFromXML($xml); $languageName = self::readLanguageNameFromXML($xml); $language = self::create(array('countryCode' => $countryCode, 'languageCode' => $languageCode, 'languageName' => $languageName)); } // import xml $languageEditor = new LanguageEditor($language); $languageEditor->updateFromXML($xml, $packageID); // return language object return $languageEditor; }
/** * @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\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); } } } }