예제 #1
0
 /**
  * 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);
				}
			}
		}
	}