'','mon'=>'','tue'=>'','wed'=>'','thu'=>'','fri'=>'','sat'=>''); var $months = array('jan'=>'','feb'=>'','mar'=>'','apr'=>'','may'=>'','jun'=>'','jul'=>'','aug'=>'','sep'=>'','oct'=>'','nov'=>'','dec'=>''); var $files = array(); function mamboLanguage($lang, $path = null) { $this->name = $lang; $this->path = $path; if (is_null($this->path)) $this->path = realpath('../language/') . DIRECTORY_SEPARATOR; $this->load(); } function &getInstance($lang, $path = null) { static $languages; if (!isset($languages[$lang]) || is_null($languages[$lang])) { $lobj = new mamboLanguage($lang, $path); $languages[$lang] = $lobj; } return $languages[$lang]; } function getFileName() { $file = $this->iso639; $file .= strlen($this->iso3166_2) == 2 ? '_' . $this->iso3166_2 : ''; return $file; } function get($var) { return isset($this->$var) ? $this->$var : null; } function set($var, $value) { if (isset($this->$var)) $this->$var = $value; } function save() { $this->updateFiles(); $fp = fopen($this->path . $this->getFileName() . '.xml', 'w+'); fwrite($fp, $this->toXML()); fclose($fp); } function getLanguages() { $langfiles = glob($this->path . "*.xml"); foreach($langfiles as $xml) { $xml = str_replace($this->path, '', $xml); if (substr($xml, 0, -4) != 'locales') { $lobj = &mamboLanguage::getInstance(substr($xml, 0, -4), $this->path) ; $langs[$lobj->name] = $lobj; } } return $langs; } function setPlurals($exp) { preg_match('/nplurals\s*=\s*(\d+)\s*;\s*plural\s*=\s*(.*)\s*;/', $exp, $plurals); $this->plural_form = array('nplurals' => $plurals[1], 'plural' => $plurals[2], 'expression' => $plurals[0]); } function getDate($format = null, $timestamp = null) { if (is_null($format)) $format = $this->date_format; if (is_null($timestamp)) { $timestamp = time(); } $days = array_values($this->days); $months = array_values($this->months); $date = preg_replace('/%[aA]/', $days[(int)strftime('%w', $timestamp)], $format); $date = preg_replace('/%[bB]/', $months[(int)strftime('%m', $timestamp)-1], $date); return strftime($date, $timestamp); } function load($load_catalogs = false) { if (is_readable($this->path . $this->name . ".xml")) { $p = xml_parser_create(); xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($p, implode("", file($this->path . $this->name . ".xml")), $values); xml_parser_free($p); foreach($values as $key => $value) { $tag = strtolower($value['tag']); switch ($tag) { case 'name': $this->title = $value['value']; break; case 'author': case 'creationdate': case 'copyright': case 'license': case 'authoremail': case 'authorurl': case 'version': case 'description': $this->$tag = $value['value']; break; case 'locale': if ($value['type'] == 'open') { foreach ($value['attributes'] as $k => $v) $this->$k = $v; } break; case 'date_format': $this->date_format = $value['value']; break; case 'plural_form': if (!empty($value['attributes']['expression'])) { $this->plural_form = $value['attributes']; } break; case 'charset': $this->codesets[] = $value['value']; break; case 'days': $this->days = $value['attributes']; break; case 'months': $this->months = $value['attributes']; break; case 'filename': if ($load_catalogs) { $file = $value['attributes']; $file['filename'] = $value['value']; $this->files[] = $file; } break; } } return true; } return false; } function updateFiles() { $dir = $this->path . $this->name . '/'; $langfiles = mosReadDirectory($dir, '.po$'); /*set_time_limit(360);*/ $admin = new PHPGettextAdmin(); $cmd = "msgcat --use-first -o $dir"."compendium.po ".$dir.implode(" $dir", $langfiles); $admin->execute($cmd); foreach ($langfiles as $lf) { $domain = substr($lf, 0, -3); $catalog = new PHPGettext_Catalog($domain, $this->path); $catalog->setproperty('lang', $this->name); $catalog->setproperty('mode', _MODE_PO_); $catalog->load(); $file['filename'] = "language/" . $this->name . '/' . $lf; $file['domain'] = $domain; $file['strings'] = count($catalog->strings); $file['percent'] = ''; $file['translated'] = 0; $file['fuzzy'] = 0; $pluralfuzz = false; foreach ($catalog->strings as $msg) { if (!is_array($msg->msgstr) && !empty($msg->msgstr) && !$msg->is_fuzzy) { $file['translated']++; } if ($msg->is_fuzzy) { $file['fuzzy']++; } } $nonfuzzy = $file['strings'] - $file['fuzzy']; if (!$nonfuzzy) $nonfuzzy = 1; $file['percent'] = round($file['translated'] * 100 / $nonfuzzy, 2); unset($nonfuzzy); $this->files[] = $file; } } function toXML() { $array[] = array('tag' => 'mosinstall', 'type' => 'open', 'level' => 1, 'attributes' => array('version' => '4.6', 'type' => 'language')); $array[] = array('tag' => 'name', 'type' => 'complete', 'level' => 2, 'value' => $this->title); $array[] = array('tag' => 'version', 'type' => 'complete', 'level' => 2, 'value' => $this->version); $array[] = array('tag' => 'description', 'type' => 'complete', 'level' => 2, 'value' => $this->description); $array[] = array('tag' => 'creationdate', 'type' => 'complete', 'level' => 2, 'value' => $this->creationdate); $array[] = array('tag' => 'author', 'type' => 'complete', 'level' => 2, 'value' => $this->author); $array[] = array('tag' => 'authorurl', 'type' => 'complete', 'level' => 2, 'value' => $this->authorurl); $array[] = array('tag' => 'authoremail', 'type' => 'complete', 'level' => 2, 'value' => $this->authoremail); $array[] = array('tag' => 'copyright', 'type' => 'complete', 'level' => 2, 'value' => $this->copyright); $array[] = array('tag' => 'license', 'type' => 'complete', 'level' => 2, 'value' => $this->license); $array[] = array('tag' => 'params', 'type' => 'open', 'level' => 2); $array[] = array('tag' => 'param', 'type' => 'complete', 'level' => 3, 'attributes' => array('name' => 'locale', 'type' => 'text', 'default' => $this->locale, 'label' => 'Locale String', 'description' => 'Locale string for setlocale() (eg. en, english)')); $array[] = array('tag' => 'param', 'type' => 'complete', 'level' => 3, 'attributes' => array('name' => 'charset', 'type' => 'text', 'default' => $this->charset, 'label' => 'Character Set', 'description' => 'Character set for this language.')); $array[] = array('tag' => 'param', 'type' => 'complete', 'level' => 3, 'attributes' => array('name' => 'text_direction', 'type' => 'text', 'default' => $this->text_direction, 'label' => 'Text Direction', 'description' => 'left-to-right or light-to-left')); $array[] = array('tag' => 'param', 'type' => 'complete', 'level' => 3, 'attributes' => array('name' => 'date_format', 'type' => 'text', 'default' => $this->date_format, 'label' => 'Date Format', 'description' => 'Date format for strftime() (eg. %A, %d %B %Y)')); $array[] = array('tag' => 'param', 'type' => 'complete', 'level' => 3, 'attributes' => array('name' => 'plural_form', 'type' => 'text', 'default' => htmlentities($this->plural_form['expression']), 'label' => 'Plural Forms', 'description' => 'Plural Forms expression')); $array[] = array('tag' => 'params', 'type' => 'close', 'level' => 2); $array[] = array('tag' => 'locale', 'type' => 'open', 'level' => 2, 'attributes' => array('name' => $this->name, 'title' => $this->title, 'territory' => $this->territory, 'locale' => $this->locale, 'text_direction' => $this->text_direction, 'iso639' => $this->iso639, 'iso3166_2' => $this->iso3166_2, 'iso3166_3' => $this->iso3166_3, 'charset' => $this->charset)); $array[] = array('tag' => 'plural_form', 'type' => 'complete', 'level' => 3, 'attributes' => array('nplurals' => $this->plural_form['nplurals'] , 'plural' => htmlentities($this->plural_form['plural']), 'expression' => htmlentities($this->plural_form['expression']))); $array[] = array('tag' => 'date_format', 'type' => 'complete', 'level' => 3, 'value' => $this->date_format); $array[] = array('tag' => 'codesets', 'type' => 'open', 'level' => 3); foreach ($this->codesets as $charset) $array[] = array('tag' => 'charset', 'type' => 'complete', 'level' => 4, 'value' => $charset); $array[] = array('tag' => 'codesets', 'type' => 'close', 'level' => 3); foreach ($this->days as $name => $day) $days[$name] = $day; $array[] = array('tag' => 'days', 'type' => 'complete', 'level' => 3, 'attributes' => $days); foreach ($this->months as $name => $month) $months[$name] = $month; $array[] = array('tag' => 'months', 'type' => 'complete', 'level' => 3, 'attributes' => $months); $array[] = array('tag' => 'locale', 'type' => 'close', 'level' => 2); $array[] = array('tag' => 'files', 'type' => 'open', 'level' => 2); foreach ($this->files as $file) { $array[] = array('tag' => 'filename', 'type' => 'complete', 'level' => 3, 'value' => $file['filename'], 'attributes' => array('domain' => $file['domain'] , 'strings' => $file['strings'] , 'translated' => $file['translated'] , 'fuzzy' => $file['fuzzy'] , 'percent' => $file['percent'])); } $array[] = array('tag' => 'files', 'type' => 'close', 'level' => 2); $array[] = array('tag' => 'mosinstall', 'type' => 'close', 'level' => 1); $xml = "charset\"?>\n"; if ((!empty($array)) AND (is_array($array))) { foreach ($array as $key => $value) { switch ($value["type"]) { case "open": $xml .= str_repeat("\t", $value["level"] - 1); $xml .= "<" . strtolower($value["tag"]); if (isset($value["attributes"])) { foreach ($value["attributes"] as $k => $v) { $xml .= sprintf(' %s="%s"', strtolower($k), $v); } } $xml .= ">\n"; break; case "complete": $xml .= str_repeat("\t", $value["level"] - 1); $xml .= "<" . strtolower($value["tag"]); if (isset($value["attributes"])) { foreach ($value["attributes"] as $k => $v) { $xml .= sprintf(' %s="%s"', strtolower($k), $v); } } $xml .= ">"; $xml .= isset($value['value']) ? $value['value'] : false; $xml .= "\n"; break; case "close": $xml .= str_repeat("\t", $value["level"] - 1); $xml .= "\n"; break; default: break; } } } return $xml; } } function getlocales() { $xmlfile = "../language/locales.xml"; $p = xml_parser_create(); xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($p, implode("", file($xmlfile)), $values); xml_parser_free($p); $locales = array(); foreach($values as $key => $value) { switch ($value['tag']) { case 'locale': if ($value['type'] == 'open') { $iso639 = $value['attributes']['iso639']; $language[$iso639] = $value['attributes']['title']; $locale[$iso639] = $value['attributes']; $directions[$iso639] = $value['attributes']['text_direction']; } break; case 'territory': $t['iso3166_2'] = $value['attributes']['iso3166_2']; $t['iso3166_3'] = $value['attributes']['iso3166_3']; $t['territory'] = $value['value']; $territories[$iso639][] = $t; break; case 'charset': $locale[$iso639]['codesets'][] = $codesets[$iso639][] = $value['value']; break; case 'date_format': $locale[$iso639]['dateformats'] = $dateformats[$iso639] = $value['value']; break; case 'days': $locale[$iso639]['days'] = $value['attributes']; break; case 'months': $locale[$iso639]['months'] = $value['attributes']; break; case 'plural_form': $exp = ''; if (!empty($value['attributes']['expression'])) { $locale[$iso639]['plural_form'] = $value['attributes']; $plural_forms[$iso639] = $value['attributes']['expression']; } break; } } $locales['locales'] = $locale; $locales['languages'] = $language; $locales['territories'] = $territories; $locales['codesets'] = $codesets; $locales['dateformats'] = $dateformats; $locales['directions'] = $directions; $locales['plural_forms'] = $plural_forms; return $locales; } ?>