name = $name; $this->action = requestvar('action', '_default'); $views = $this->name.'Views'; if (class_exists($views)) { $this->view = new $views($this); } else { trigger_error("View class '$views' does not exist.", E_USER_ERROR); } } function run() { $method = $this->action; /* * do acl check here */ if ($method && strlen($method) > 2 && method_exists($this, $method)) return $this->$method(); return false; } function redirect($url) { if (headers_sent()) { echo "\n"; } else { while (@ob_end_clean()); // clear output buffer header( "Location: $url" ); } exit; } function &container($reset = false) { $name = '__com_' . $this->_name . '_container'; if (!isset($_SESSION[$name]) || $reset) { $_SESSION[$name] = array(); } return $_SESSION[$name]; } } class phpgettextActions extends ActionHandler { function _default(){ $this->view->_default(); } function view(){ require_once(dirname(__FILE__).'/phpgettext.catalog.php'); $mode = requestvar('mode'); $lang = requestvar('lang'); $domain = requestvar('domain'); $textdomain = requestvar('textdomain'); $catalog = new PHPGettext_catalog($domain, $textdomain); $catalog->setproperty('mode', $mode); $catalog->setproperty('lang', $lang); $catalog->load(); $renderer =& renderer(); $renderer->addbyref('catalog', $catalog); $renderer->addvar('mode', $mode); $renderer->addvar('comments', $catalog->comments); $renderer->addvar('headers', $catalog->headers); $renderer->addvar('strings', $catalog->strings); switch ($mode) { case 'mo': return $this->view->view(); break; case 'po': return $this->view->form(); break; case 'pot': return $this->view->view(); break; default: trigger_error(__CLASS__.'->'.__FUNCTION__.' - mode not recognized', E_USER_ERROR); return false; break; } } function extract(){ require_once(dirname(__FILE__).'/phpgettext.catalog.php'); $gettext =& phpgettext(); $path = _site_path_; $args = "--keyword=T_ --default-domain=phpgettext "; $args .= '-o '.$path.'locale/phpgettext.pot '; $args .= $path.'includes/*.php '.$path.'templates/*.php'; $gettext->xgettext($args); $catalog = new PHPGettext_catalog('phpgettext', $path.'locale/'); $catalog->setproperty('mode', _MODE_POT_); $catalog->load(); $renderer =& renderer(); $renderer->addbyref('catalog', $catalog); $renderer->addvar('mode', 'pot'); $renderer->addvar('comments', $catalog->comments); $renderer->addvar('headers', $catalog->headers); $renderer->addvar('strings', $catalog->strings); return $this->view->view(); } function cleartests(){ rmdirr('tests/locale/'); mkdir('tests/locale'); $this->redirect($_SERVER['PHP_SELF']); } function delpot(){ $domain = requestvar('domain'); $textdomain = requestvar('textdomain'); @unlink($textdomain.'/'.$domain.'.pot'); $this->redirect($_SERVER['PHP_SELF']); } function newfrompot(){ require_once(dirname(__FILE__).'/phpgettext.catalog.php'); $locale = requestvar('locale'); $domain = requestvar('domain'); $textdomain = requestvar('textdomain'); $catalog =& new PHPGettext_catalog($domain, $textdomain); $catalog->setproperty('mode', _MODE_POT_); $catalog->load(); $catalog->setproperty('lang', $locale); $catalog->setproperty('mode', _MODE_PO_); $catalog->save(); $renderer =& renderer(); $renderer->addbyref('catalog', $catalog); $renderer->addvar('mode', _MODE_PO_); $renderer->addvar('comments', $catalog->comments); $renderer->addvar('headers', $catalog->headers); $renderer->addvar('strings', $catalog->strings); return $this->view->form(); } function runtests(){ ob_start(); require_once('tests/simpletest/unit_tester.php'); require_once('tests/simpletest/reporter.php'); require_once(dirname(__FILE__).'/phpgettext.catalog.php'); /* $test = &new GroupTest('PHPGettext tests'); $test->addTestFile('tests/gettext_test_cases.php'); $test->run(new HtmlReporter()); */ $test = &new GroupTest('PHPGettext_Catalog tests'); $test->addTestFile('tests/catalog_test_cases.php'); $test->run(new HtmlReporter()); $contents = ob_get_contents(); ob_end_clean(); $renderer =& renderer(); $renderer->addvar('content', $contents); $this->view->display(); } function save(){ require_once(dirname(__FILE__).'/phpgettext.catalog.php'); $domain = trim(requestvar('domain')); $textdomain = trim(requestvar('textdomain')); $lang = trim(requestvar('lang')); $compile = trim(requestvar('compile')); $comments = trim(requestvar('comments')); $headers = requestvar('headers'); $msgstr = requestvar('msgstr'); $fuzzy = requestvar('is_fuzzy'); $catalog =& new PHPGettext_catalog($domain, $textdomain, $lang); $catalog->setproperty('mode', 'po'); $catalog->setproperty('lang', $lang); $catalog->load(); if (isset($comments)) { $comments = explode("\n", $comments); if (is_array($comments)) { foreach ($comments as $comment) { if (strpos($comment, '#') == 1) { $catalog->comments .= $comment."\n"; } } } } foreach ($headers as $key => $value) { $catalog->headers[$key] = $value; } foreach ($msgstr as $index => $string) { $catalog->strings[$index]->setmsgstr($string); if (isset($is_fuzzy[$index])) { $catalog->strings[$index]->setfuzzy(true); } } $catalog->save(); if ($compile > 0) { $catalog->setproperty('mode', 'mo'); $catalog->save(); } $renderer =& renderer(); $renderer->addbyref('catalog', $catalog); $renderer->addvar('mode', _MODE_MO_); $renderer->addvar('comments', $catalog->comments); $renderer->addvar('headers', $catalog->headers); $renderer->addvar('strings', $catalog->strings); return $this->view->view(); } } class phpgettextViews { var $action; function phpgettextViews(&$action) { $this->action =& $action; } function _default() { $renderer =& renderer(); $renderer->addvar('content', $renderer->fetch('home.tpl.php')); $this->display(); } function display() { $renderer =& renderer(); $renderer->addbyref('view', $this); $renderer->addbyref('t', phpgettext()); $renderer->display('main.tpl.php'); } function edit() { $renderer =& Renderer::instance('php'); $renderer->display(); } function view() { $renderer =& renderer(); $renderer->addvar('content', $renderer->fetch('view.tpl.php')); $this->display(); } function form() { $renderer =& renderer(); $renderer->addvar('content', $renderer->fetch('form.tpl.php')); $this->display(); } function dtree($return = false) { $textdomains = $this->gettextdomains(rtrim($_SERVER['DOCUMENT_ROOT'], '/')); $dtree = "\n"; if ($return) return $dtree; echo $dtree; } function gettextdomains($path){ static $domains; if ($handle=@opendir($path)) { while (($file = readdir($handle)) !== false) { if (is_dir("$path/$file") && $file!= "." && $file!= "..") { if (preg_match('/^'._gettext_dirname_.'$/', $file)) { $domains[] = "$path/$file"; } $this->gettextdomains("$path/$file"); } } closedir($handle); } else { trigger_error(get_class($this)." File ( $path ) not found.", E_USER_ERROR); } return isset($domains) ? $domains : array(); } function getlanguages($domain) { if ($handle = opendir($domain)) { while (false !== ($file = readdir($handle))) { if (is_dir("$domain/$file") && $file!= "." && $file!= "..") $langs[$file] = $this->gettranslations("$domain/$file"); } closedir($handle); } return (isset($langs) ? $langs : array()); } function gettemplates($textdomain) { if ($handle=@opendir($textdomain)) { while (($file = readdir($handle)) !== false) if (preg_match('/.pot$/', $file)) $templates[] = $file; closedir($handle); } else { trigger_error(get_class($this)." textdomain ( $path ) not found.", E_USER_ERROR); } return isset($templates) ? $templates : array(); } function gettranslations($path) { $lang = basename($path); if (is_dir($path) && $handle=@opendir($path)) { while (($file = readdir($handle)) !== false) { if ($file== "LC_MESSAGES") { $po[]['LC_MESSAGES'] = $this->getbinaries($path.'/LC_MESSAGES'); } elseif (preg_match('/.po$/', $file)) { $po[]= $file; } } closedir($handle); } else { trigger_error(get_class($this)." textdomain ( $path ) not found.", E_USER_ERROR); } return isset($po) ? $po : array(); } function getbinaries($path) { if (is_dir($path) && $handle=@opendir($path)) { while (($file = readdir($handle)) !== false) { if (preg_match('/.mo$/', $file)) { $mo[] = $file; } } closedir($handle); } else { trigger_error(get_class($this)." textdomain ( $path ) not found.", E_USER_ERROR); } return isset($mo) ? $mo : array(); } } class Renderer { var $dir; var $vars = array(); var $engine = 'php'; var $template = ''; function Renderer(){} function display($template, $return = false){ if ($template == NULL){ $error = 'A template has not been specified'; trigger_error($error, E_USER_ERROR); return false; } $this->template = $this->dir . $template; if (is_readable($this->template)) { extract($this->getvars()); if ($return) { ob_start(); include_once($this->template); $ret = ob_get_contents(); ob_end_clean(); return $ret; } else { include_once($this->template); } } else { $error = 'Template file ' . $template . ' does ' . 'not exist or is not readable'; trigger_error($error, E_USER_ERROR); return false; } return false; } function fetch($template){ return $this->display($template, true); } function &getengine(){ return $this->engine; } function addvar($key, $value){ $this->vars[$key] = $value; } function addbyref ($key, &$value) { $this->vars[$key] =& $value; } function getvars($name = false){ return (isset($this->vars[$name])) ? $this->vars[$name] : $this->vars; } function setdir($dir){ $this->dir = (substr($dir, -1) == DIRECTORY_SEPARATOR) ? $dir : $dir.DIRECTORY_SEPARATOR; } function getdir(){ return $this->dir; } function template($template){ $this->template = $template; } } // cleans out a directory recursively function rmdirr($dir) { if($objs = glob($dir."/*")){ foreach($objs as $obj) { is_dir($obj)? rmdirr($obj) : unlink($obj); } } rmdir($dir); } function &renderer($engine = 'php') { static $renderer; if (is_null($renderer[$engine])) { if ($engine == 'php') { $renderer[$engine] = new Renderer(); } else { $classname = $engine . 'Renderer'; if (class_exists($classname)) $renderer[$engine] = new $classname(); } } return $renderer[$engine]; } function dump($var) { $trace = debug_backtrace(); echo "
dump() in {$trace[0]['file']}:{$trace[0]['line']}
"; include_once 'Var_Dump.php'; if (class_exists('Var_Dump')) { Var_Dump::displayInit(array('display_mode'=>'HTML4_Table')); Var_Dump::display($var); } else { echo "
";
        var_dump($var);
        echo "
"; } } function error_handler($errno, $errmsg, $filename, $linenum) { $dt = date("Y-m-d H:i:s (T)"); $errortype = array ( E_ERROR => "Error", E_WARNING => "Warning", E_PARSE => "Parse Error", E_NOTICE => "Notice", E_CORE_ERROR => "Core Error", E_CORE_WARNING => "Core Warning", E_COMPILE_ERROR => "Compile Error", E_COMPILE_WARNING => "Compile Warning", E_USER_ERROR => "User Error", E_USER_WARNING => "User Warning", E_USER_NOTICE => "User Notice" ); // set of errors for which a var trace will be saved //$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $output = << EOT; $output .= "
"; $output .= "

$errortype[$errno] : $errmsg

\n"; $output .= "

in file $filename : $linenum

\n"; $output .= backtrace(); $output .= "
"; echo $output; // save to the error log, and e-mail it if there is a critical user error /* error_log($err, 3, "/error.log"); if ($errno == E_USER_ERROR) { mail("phpdev@example.com", "Critical User Error", $err); } */ } function backtrace(){ $backtrace = debug_backtrace(); $output = ""; $output .= ""; $count = 0; if (isset($backtrace[0]['line'])) { foreach ($backtrace as $bt) { $argstr = ''; $class = isset($bt['class']) ? $bt['class'] : ''; $type = isset($bt['type']) ? $bt['type'] : ''; $function = isset($bt['function']) ? $bt['function'] : ''; $file = isset($bt['file']) ? $bt['file'] : ''; $line = isset($bt['line']) ? $bt['line'] : ''; $args = isset($bt['args']) ? $bt['args'] : array(); foreach ($args as $a) { if (!empty($args)) { $argstr .= ', '; } switch (gettype($a)) { case 'integer': case 'double': $argstr .= $a; break; case 'string': $a = htmlspecialchars($a); $argstr .= "\"$a\""; break; case 'array': $argstr .= 'Array('.count($a).')'; break; case 'object': $argstr .= 'Object('.get_class($a).')'; break; case 'resource': $argstr .= 'Resource('.strstr($a, '#').')'; break; case 'boolean': $argstr .= $a ? 'True' : 'False'; break; case 'NULL': $argstr .= 'Null'; break; default: $argstr .= 'Unknown'; } } if ($count > 1) { $output .= "\n"; $output .= "\n"; $output .= "\n"; $output .= "\n"; $output .= "\n"; } $count++; } } $output .= "
#function / locationargs
".($count-1)."{$class}{$type}{$function}()
\n"; $output .= "{$file}:{$line}
$argstr
\n"; return $output; } ?>