_header = array(); $this->_items = array(); $this->_cdataArr = array(); $this->_currentTarget = ""; $this->_currentLanguage = "en"; $this->_currentDir = "ltr"; $this->_header["major"] = 0; $this->_header["minor"] = 1; $this->_header["releasedate"] = date("Y-m-d"); } function setLanguage($language) { $this->_currentLanguage = $language; } function getLanguage() { return $this->_currentLanguage; } /* Loads XML string */ function loadXML($data) { // Check encoding on data preg_match('//m', $data, $matches); $encoding = "UTF-8"; // Found XML encoding if (count($matches) > 1) $encoding = strtoupper($matches[1]); $this->_encoding = $encoding; // OMG! PHP Xpath is crappy, cant detect CDATA, haxx! $data = preg_replace("/<\!\[CDATA\[/", "_parser = xml_parser_create($encoding); // Auto detect for PHP4/PHP5 xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, "_saxStartElement", "_saxEndElement"); xml_set_character_data_handler($this->_parser, "_saxCharacterData"); xml_parser_set_option($this->_parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); if (!xml_parse($this->_parser, $data, true)) trigger_error(sprintf("Language pack loading failed, XML error: %s at line %d.", xml_error_string(xml_get_error_code($this->_parser)), xml_get_current_line_number($this->_parser)), E_USER_ERROR); xml_parser_free($this->_parser); } /* Loads XML file */ function load($file) { if (($fp = @fopen($file, "r"))) { $data = ''; while (!feof($fp)) $data .= fread($fp, 8192); fclose($fp); if (ini_get("magic_quotes_gpc")) $data = stripslashes($data); $this->loadXML($data); } else trigger_error("Could not open XML: ". $file, E_USER_ERROR); } function save($file, $enc="UTF-8") { if (($fp = @fopen($file, "w"))) { fwrite($fp, $this->toString($enc)); fclose($fp); } else trigger_error("Could not open XML for writing: ". $file, E_USER_ERROR); } function getGroups() { return $this->_items[$this->_currentLanguage]["data"]; } function setGroups($groups) { $this->_items[$this->_currentLanguage]["data"] = $groups; } function getGroup($name) { return $this->_items[$this->_currentLanguage]["data"][$name]; } function get($target, $name) { return isset($this->_items[$this->_currentLanguage]["data"][$target][$name]) ? $this->_items[$this->_currentLanguage]["data"][$target][$name] : ("$" . $name . "$"); } function set($target, $name, $value, $cdata = 3) { if ($cdata != 3) { if (!isset($this->_cdataArr[$this->_currentLanguage])) $this->_cdataArr[$this->_currentLanguage] = array(); if (!isset($this->_cdataArr[$this->_currentLanguage][$target])) $this->_cdataArr[$this->_currentLanguage][$target] = array(); $this->_cdataArr[$this->_currentLanguage][$target][$name] = $cdata; } if (!isset($this->_items[$this->_currentLanguage]["data"][$target])) $this->_items[$this->_currentLanguage]["data"][$target] = array(); $this->_items[$this->_currentLanguage]["data"][$target][$name] = $value; } function getLanguageTitle() { return $this->_items[$this->_currentLanguage]["title"]; } function setAuthor($author) { $this->_header["author"] = $author; } function getAuthor() { return $this->_header["author"]; } function setVersion($major, $minor, $releasedate) { $this->_header["major"] = $major; $this->_header["minor"] = $minor; $this->_header["releasedate"] = $releasedate; } function getMinor() { return $this->_header["minor"]; } function getMajor() { return $this->_header["major"]; } function getReleaseDate() { return $this->_header["releasedate"]; } function getDescription() { return $this->_header["description"]; } function setDescription($description) { $this->_header["description"] = $description; } function createLanguage($lang, $dir, $title) { $this->_currentLanguage = $lang; $this->_items[$lang] = array("dir" => $dir, "title" => $title, "data" => array()); } function updateLanguage($target, $lang, $dir, $title) { $this->_currentLanguage = $lang; $this->_items[$lang] = $this->_items[$target]; unset($this->_items[$target]); $this->_items[$lang]["dir"] = $dir; $this->_items[$lang]["title"] = $title; $this->_cdataArr[$lang] = $this->_cdataArr[$target]; unset($this->_cdataArr[$target]); } // * * Private methods function _saxStartElement($parser, $name, $attrs) { $this->_tag = $name; $this->_tagAttrs = $attrs; $this->_tagContent = ""; switch($name) { case "LANGUAGE": $this->_currentLanguage = $this->_tagAttrs["CODE"]; $this->_currentDir = $this->_tagAttrs["DIR"]; $this->_items[$this->_currentLanguage] = array("dir" => $this->_currentDir, "title" => $this->_tagAttrs["TITLE"], "data" => array()); break; case "GROUP": $this->_currentTarget = $this->_tagAttrs["TARGET"]; $this->_items[$this->_currentLanguage]["data"][$this->_tagAttrs["TARGET"]] = array(); break; } } function _saxEndElement($parser, $name) { preg_match('/^#CDATA#/', $this->_tagContent, $matches); $this->_tagContent = preg_replace("/^#CDATA#/", "", $this->_tagContent); if (count($matches) == 0) $this->_tagContent = trim($this->_tagContent); switch($name) { case "ITEM": if (count($matches) != 0) { if (!isset($this->_cdataArr[$this->_currentLanguage])) $this->_cdataArr[$this->_currentLanguage] = array(); if (!isset($this->_cdataArr[$this->_currentLanguage][$this->_currentTarget])) $this->_cdataArr[$this->_currentLanguage][$this->_currentTarget] = array(); $this->_cdataArr[$this->_currentLanguage][$this->_currentTarget][$this->_tagAttrs["NAME"]] = true; } $this->_items[$this->_currentLanguage]["data"][$this->_currentTarget][$this->_tagAttrs["NAME"]] = $this->_tagContent; break; case "AUTHOR": $this->_header["author"] = $this->_tagContent; break; case "VERSION": $this->_header["minor"] = trim($this->_tagAttrs["MINOR"]); $this->_header["major"] = trim($this->_tagAttrs["MAJOR"]); $this->_header["releasedate"] = trim($this->_tagAttrs["RELEASEDATE"]); break; case "DESCRIPTION": $this->_header["description"] = $this->_tagContent; break; } // Clear memory! $this->_tagContent = ""; $this->_tag = ""; $this->_tagAttrs = ""; } function _saxCharacterData($parser, $data) { $this->_tagContent .= $data; } function xmlEncode($str) { if (strtolower($this->_encoding) == "utf-8") return utf8_encode(htmlspecialchars($str, ENT_QUOTES, $this->_encoding)); return htmlspecialchars($str, ENT_QUOTES, $this->_encoding); } function toString($enc = "") { $oldenc = ""; if ($enc == "") $enc = $this->_encoding; else { $oldenc = $this->_encoding; $this->_encoding = $enc; } $doc = ""; $doc .= ''. "\n"; $doc .= ''. "\n"; $doc .= '
'. "\n"; $doc .= ' '. $this->xmlEncode($this->_header["author"]) .''. "\n"; $doc .= ' '. "\n"; $doc .= ' '. $this->xmlEncode($this->_header["description"]) .''. "\n"; $doc .= '
'. "\n"; foreach($this->_items as $code => $language) { $doc .= ' '. "\n"; foreach($language["data"] as $target => $group) { $doc .= ' '. "\n"; foreach($group as $name => $item) { if (isset($this->_cdataArr[$code]) && isset($this->_cdataArr[$code][$target]) && isset($this->_cdataArr[$code][$target][$name]) && $this->_cdataArr[$code][$target][$name]) { $doc .= ' '. "\n"; } else $doc .= ' '. $this->xmlEncode($item) .''. "\n"; } $doc .= ' '. "\n"; } $doc .= ' '. "\n"; } $doc .= '
'. "\n"; if ($oldenc != "") $this->_encoding = $oldenc; return $doc; } } ?>