PageRenderTime 50ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/4.6/includes/phpgettext/phpgettext.includes.php

http://miacms.googlecode.com/
PHP | 640 lines | 475 code | 60 blank | 105 comment | 63 complexity | 104739624f8f4046c01645eedde54f6e MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0, LGPL-2.0
  1. <?php
  2. defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
  3. /**
  4. * function phpgettext()
  5. *
  6. * static function (we only need one phpgettext instance)
  7. * loads a PHPGettext instance
  8. * will detect if gettext is available and load compatibility file if it isn't
  9. *
  10. */
  11. class ActionHandler
  12. {
  13. var $name;
  14. var $action;
  15. var $view;
  16. function ActionHandler($name)
  17. {
  18. $this->name = $name;
  19. $this->action = requestvar('action', '_default');
  20. $views = $this->name.'Views';
  21. if (class_exists($views)) {
  22. $this->view = new $views($this);
  23. } else {
  24. trigger_error("View class '$views' does not exist.", E_USER_ERROR);
  25. }
  26. }
  27. function run()
  28. {
  29. $method = $this->action;
  30. /*
  31. * do acl check here
  32. */
  33. if ($method && strlen($method) > 2 && method_exists($this, $method))
  34. return $this->$method();
  35. return false;
  36. }
  37. function redirect($url)
  38. {
  39. if (headers_sent()) {
  40. echo "<script>document.location.href='$url';</script>\n";
  41. } else {
  42. while (@ob_end_clean()); // clear output buffer
  43. header( "Location: $url" );
  44. }
  45. exit;
  46. }
  47. function &container($reset = false)
  48. {
  49. $name = '__com_' . $this->_name . '_container';
  50. if (!isset($_SESSION[$name]) || $reset) {
  51. $_SESSION[$name] = array();
  52. }
  53. return $_SESSION[$name];
  54. }
  55. }
  56. class phpgettextActions extends ActionHandler
  57. {
  58. function _default(){
  59. $this->view->_default();
  60. }
  61. function view(){
  62. require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  63. $mode = requestvar('mode');
  64. $lang = requestvar('lang');
  65. $domain = requestvar('domain');
  66. $textdomain = requestvar('textdomain');
  67. $catalog = new PHPGettext_catalog($domain, $textdomain);
  68. $catalog->setproperty('mode', $mode);
  69. $catalog->setproperty('lang', $lang);
  70. $catalog->load();
  71. $renderer =& renderer();
  72. $renderer->addbyref('catalog', $catalog);
  73. $renderer->addvar('mode', $mode);
  74. $renderer->addvar('comments', $catalog->comments);
  75. $renderer->addvar('headers', $catalog->headers);
  76. $renderer->addvar('strings', $catalog->strings);
  77. switch ($mode)
  78. {
  79. case 'mo':
  80. return $this->view->view();
  81. break;
  82. case 'po':
  83. return $this->view->form();
  84. break;
  85. case 'pot':
  86. return $this->view->view();
  87. break;
  88. default:
  89. trigger_error(__CLASS__.'->'.__FUNCTION__.' - mode not recognized', E_USER_ERROR);
  90. return false;
  91. break;
  92. }
  93. }
  94. function extract(){
  95. require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  96. $gettext =& phpgettext();
  97. $path = _site_path_;
  98. $args = "--keyword=T_ --default-domain=phpgettext ";
  99. $args .= '-o '.$path.'locale/phpgettext.pot ';
  100. $args .= $path.'includes/*.php '.$path.'templates/*.php';
  101. $gettext->xgettext($args);
  102. $catalog = new PHPGettext_catalog('phpgettext', $path.'locale/');
  103. $catalog->setproperty('mode', _MODE_POT_);
  104. $catalog->load();
  105. $renderer =& renderer();
  106. $renderer->addbyref('catalog', $catalog);
  107. $renderer->addvar('mode', 'pot');
  108. $renderer->addvar('comments', $catalog->comments);
  109. $renderer->addvar('headers', $catalog->headers);
  110. $renderer->addvar('strings', $catalog->strings);
  111. return $this->view->view();
  112. }
  113. function cleartests(){
  114. rmdirr('tests/locale/');
  115. mkdir('tests/locale');
  116. $this->redirect($_SERVER['PHP_SELF']);
  117. }
  118. function delpot(){
  119. $domain = requestvar('domain');
  120. $textdomain = requestvar('textdomain');
  121. @unlink($textdomain.'/'.$domain.'.pot');
  122. $this->redirect($_SERVER['PHP_SELF']);
  123. }
  124. function newfrompot(){
  125. require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  126. $locale = requestvar('locale');
  127. $domain = requestvar('domain');
  128. $textdomain = requestvar('textdomain');
  129. $catalog =& new PHPGettext_catalog($domain, $textdomain);
  130. $catalog->setproperty('mode', _MODE_POT_);
  131. $catalog->load();
  132. $catalog->setproperty('lang', $locale);
  133. $catalog->setproperty('mode', _MODE_PO_);
  134. $catalog->save();
  135. $renderer =& renderer();
  136. $renderer->addbyref('catalog', $catalog);
  137. $renderer->addvar('mode', _MODE_PO_);
  138. $renderer->addvar('comments', $catalog->comments);
  139. $renderer->addvar('headers', $catalog->headers);
  140. $renderer->addvar('strings', $catalog->strings);
  141. return $this->view->form();
  142. }
  143. function runtests(){
  144. ob_start();
  145. require_once('tests/simpletest/unit_tester.php');
  146. require_once('tests/simpletest/reporter.php');
  147. require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  148. /*
  149. $test = &new GroupTest('PHPGettext tests');
  150. $test->addTestFile('tests/gettext_test_cases.php');
  151. $test->run(new HtmlReporter());
  152. */
  153. $test = &new GroupTest('PHPGettext_Catalog tests');
  154. $test->addTestFile('tests/catalog_test_cases.php');
  155. $test->run(new HtmlReporter());
  156. $contents = ob_get_contents();
  157. ob_end_clean();
  158. $renderer =& renderer();
  159. $renderer->addvar('content', $contents);
  160. $this->view->display();
  161. }
  162. function save(){
  163. require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  164. $domain = trim(requestvar('domain'));
  165. $textdomain = trim(requestvar('textdomain'));
  166. $lang = trim(requestvar('lang'));
  167. $compile = trim(requestvar('compile'));
  168. $comments = trim(requestvar('comments'));
  169. $headers = requestvar('headers');
  170. $msgstr = requestvar('msgstr');
  171. $fuzzy = requestvar('is_fuzzy');
  172. $catalog =& new PHPGettext_catalog($domain, $textdomain, $lang);
  173. $catalog->setproperty('mode', 'po');
  174. $catalog->setproperty('lang', $lang);
  175. $catalog->load();
  176. if (isset($comments)) {
  177. $comments = explode("\n", $comments);
  178. if (is_array($comments)) {
  179. foreach ($comments as $comment) {
  180. if (strpos($comment, '#') == 1) {
  181. $catalog->comments .= $comment."\n";
  182. }
  183. }
  184. }
  185. }
  186. foreach ($headers as $key => $value) {
  187. $catalog->headers[$key] = $value;
  188. }
  189. foreach ($msgstr as $index => $string) {
  190. $catalog->strings[$index]->setmsgstr($string);
  191. if (isset($is_fuzzy[$index])) {
  192. $catalog->strings[$index]->setfuzzy(true);
  193. }
  194. }
  195. $catalog->save();
  196. if ($compile > 0) {
  197. $catalog->setproperty('mode', 'mo');
  198. $catalog->save();
  199. }
  200. $renderer =& renderer();
  201. $renderer->addbyref('catalog', $catalog);
  202. $renderer->addvar('mode', _MODE_MO_);
  203. $renderer->addvar('comments', $catalog->comments);
  204. $renderer->addvar('headers', $catalog->headers);
  205. $renderer->addvar('strings', $catalog->strings);
  206. return $this->view->view();
  207. }
  208. }
  209. class phpgettextViews
  210. {
  211. var $action;
  212. function phpgettextViews(&$action) {
  213. $this->action =& $action;
  214. }
  215. function _default()
  216. {
  217. $renderer =& renderer();
  218. $renderer->addvar('content', $renderer->fetch('home.tpl.php'));
  219. $this->display();
  220. }
  221. function display() {
  222. $renderer =& renderer();
  223. $renderer->addbyref('view', $this);
  224. $renderer->addbyref('t', phpgettext());
  225. $renderer->display('main.tpl.php');
  226. }
  227. function edit()
  228. {
  229. $renderer =& Renderer::instance('php');
  230. $renderer->display();
  231. }
  232. function view()
  233. {
  234. $renderer =& renderer();
  235. $renderer->addvar('content', $renderer->fetch('view.tpl.php'));
  236. $this->display();
  237. }
  238. function form()
  239. {
  240. $renderer =& renderer();
  241. $renderer->addvar('content', $renderer->fetch('form.tpl.php'));
  242. $this->display();
  243. }
  244. function dtree($return = false) {
  245. $textdomains = $this->gettextdomains(rtrim($_SERVER['DOCUMENT_ROOT'], '/'));
  246. $dtree = "<script type=\"text/javascript\">\n";
  247. $dtree .= "d = new dTree('d', '"._site_url_."img/');\n";
  248. $dtree .= "d.add(0,-1,'Text Domains');\n";
  249. $cnt = 1;
  250. foreach ($textdomains as $path) {
  251. $name = str_replace($_SERVER['DOCUMENT_ROOT'], "", $path);
  252. $name = str_replace(_gettext_dirname_, "", $name);
  253. $name = rtrim(ucwords($name), '/');
  254. if (strlen($name) < 1) {
  255. $name = T_("Main");
  256. }
  257. $dtree .= "d.add($cnt,0,'$name ($path)');\n"; // textdomains
  258. $td = $cnt;
  259. $cnt++;
  260. $translations = $this->getlanguages($path);
  261. if (is_array($translations)) {
  262. foreach ($translations as $lang => $files) {
  263. $dtree .= "d.add($cnt,$td,'$lang');\n"; // languages
  264. $lg = $cnt;
  265. $cnt++;
  266. if (is_array($files)) {
  267. foreach ($files as $file) {
  268. if (is_array($file)) {
  269. $dtree .= "d.add($cnt,$lg,'LC_MESSAGES');\n";
  270. $mo = $cnt;
  271. $cnt++;
  272. foreach ($file as $k => $v) {
  273. if (is_array($v)) {
  274. foreach ($v as $f) {
  275. $dom = substr($f, 0, -3);
  276. $dtree .= "d.add($cnt, $mo, '$f', '".$_SERVER['PHP_SELF']."?action=view&mode=mo&lang=$lang&domain=$dom&textdomain=$path', '', '', '"._site_url_."img/square.gif');\n";
  277. $cnt++;
  278. }
  279. }
  280. }
  281. } else {
  282. $dom = substr($file, 0, -3);
  283. $dtree .= "d.add($cnt,$lg,'$file', '".$_SERVER['PHP_SELF']."?action=view&mode=po&lang=$lang&domain=$dom&textdomain=$path', '', '', '"._site_url_."img/add_content.gif');\n";
  284. $cnt++;
  285. }
  286. }
  287. }
  288. }
  289. }
  290. $templates = $this->gettemplates($path);
  291. for ($a=0; $a<count($templates); $a++) {
  292. $dom = substr($templates[$a], 0, -4);
  293. $dtree .= "d.add($cnt,$td,'".$templates[$a]."', '".$_SERVER['PHP_SELF']."?action=view&mode=pot&domain=$dom&textdomain=$path');\n";
  294. $cnt++;
  295. }
  296. }
  297. $dtree .= "document.write(d);\n";
  298. $dtree .= "</script>\n";
  299. if ($return)
  300. return $dtree;
  301. echo $dtree;
  302. }
  303. function gettextdomains($path){
  304. static $domains;
  305. if ($handle=@opendir($path)) {
  306. while (($file = readdir($handle)) !== false) {
  307. if (is_dir("$path/$file") && $file!= "." && $file!= "..") {
  308. if (preg_match('/^'._gettext_dirname_.'$/', $file)) {
  309. $domains[] = "$path/$file";
  310. }
  311. $this->gettextdomains("$path/$file");
  312. }
  313. }
  314. closedir($handle);
  315. } else {
  316. trigger_error(get_class($this)." File ( $path ) not found.", E_USER_ERROR);
  317. }
  318. return isset($domains) ? $domains : array();
  319. }
  320. function getlanguages($domain) {
  321. if ($handle = opendir($domain)) {
  322. while (false !== ($file = readdir($handle))) {
  323. if (is_dir("$domain/$file") && $file!= "." && $file!= "..")
  324. $langs[$file] = $this->gettranslations("$domain/$file");
  325. }
  326. closedir($handle);
  327. }
  328. return (isset($langs) ? $langs : array());
  329. }
  330. function gettemplates($textdomain) {
  331. if ($handle=@opendir($textdomain)) {
  332. while (($file = readdir($handle)) !== false)
  333. if (preg_match('/.pot$/', $file))
  334. $templates[] = $file;
  335. closedir($handle);
  336. } else {
  337. trigger_error(get_class($this)." textdomain ( $path ) not found.", E_USER_ERROR);
  338. }
  339. return isset($templates) ? $templates : array();
  340. }
  341. function gettranslations($path) {
  342. $lang = basename($path);
  343. if (is_dir($path) && $handle=@opendir($path)) {
  344. while (($file = readdir($handle)) !== false) {
  345. if ($file== "LC_MESSAGES") {
  346. $po[]['LC_MESSAGES'] = $this->getbinaries($path.'/LC_MESSAGES');
  347. } elseif (preg_match('/.po$/', $file)) {
  348. $po[]= $file;
  349. }
  350. }
  351. closedir($handle);
  352. } else {
  353. trigger_error(get_class($this)." textdomain ( $path ) not found.", E_USER_ERROR);
  354. }
  355. return isset($po) ? $po : array();
  356. }
  357. function getbinaries($path) {
  358. if (is_dir($path) && $handle=@opendir($path)) {
  359. while (($file = readdir($handle)) !== false) {
  360. if (preg_match('/.mo$/', $file)) {
  361. $mo[] = $file;
  362. }
  363. }
  364. closedir($handle);
  365. } else {
  366. trigger_error(get_class($this)." textdomain ( $path ) not found.", E_USER_ERROR);
  367. }
  368. return isset($mo) ? $mo : array();
  369. }
  370. }
  371. class Renderer
  372. {
  373. var $dir;
  374. var $vars = array();
  375. var $engine = 'php';
  376. var $template = '';
  377. function Renderer(){}
  378. function display($template, $return = false){
  379. if ($template == NULL){
  380. $error = 'A template has not been specified';
  381. trigger_error($error, E_USER_ERROR);
  382. return false;
  383. }
  384. $this->template = $this->dir . $template;
  385. if (is_readable($this->template)) {
  386. extract($this->getvars());
  387. if ($return) {
  388. ob_start();
  389. include_once($this->template);
  390. $ret = ob_get_contents();
  391. ob_end_clean();
  392. return $ret;
  393. } else {
  394. include_once($this->template);
  395. }
  396. } else {
  397. $error = 'Template file ' . $template . ' does ' . 'not exist or is not readable';
  398. trigger_error($error, E_USER_ERROR);
  399. return false;
  400. }
  401. return false;
  402. }
  403. function fetch($template){
  404. return $this->display($template, true);
  405. }
  406. function &getengine(){
  407. return $this->engine;
  408. }
  409. function addvar($key, $value){
  410. $this->vars[$key] = $value;
  411. }
  412. function addbyref ($key, &$value) {
  413. $this->vars[$key] =& $value;
  414. }
  415. function getvars($name = false){
  416. return (isset($this->vars[$name])) ? $this->vars[$name] : $this->vars;
  417. }
  418. function setdir($dir){
  419. $this->dir = (substr($dir, -1) == DIRECTORY_SEPARATOR) ? $dir : $dir.DIRECTORY_SEPARATOR;
  420. }
  421. function getdir(){
  422. return $this->dir;
  423. }
  424. function template($template){
  425. $this->template = $template;
  426. }
  427. }
  428. // cleans out a directory recursively
  429. function rmdirr($dir) {
  430. if($objs = glob($dir."/*")){
  431. foreach($objs as $obj) {
  432. is_dir($obj)? rmdirr($obj) : unlink($obj);
  433. }
  434. }
  435. rmdir($dir);
  436. }
  437. function &renderer($engine = 'php') {
  438. static $renderer;
  439. if (is_null($renderer[$engine])) {
  440. if ($engine == 'php') {
  441. $renderer[$engine] = new Renderer();
  442. } else {
  443. $classname = $engine . 'Renderer';
  444. if (class_exists($classname))
  445. $renderer[$engine] = new $classname();
  446. }
  447. }
  448. return $renderer[$engine];
  449. }
  450. function dump($var) {
  451. $trace = debug_backtrace();
  452. echo "<div>dump() in {$trace[0]['file']}:{$trace[0]['line']}</div>";
  453. include_once 'Var_Dump.php';
  454. if (class_exists('Var_Dump')) {
  455. Var_Dump::displayInit(array('display_mode'=>'HTML4_Table'));
  456. Var_Dump::display($var);
  457. } else {
  458. echo "<pre>";
  459. var_dump($var);
  460. echo "</pre>";
  461. }
  462. }
  463. function error_handler($errno, $errmsg, $filename, $linenum) {
  464. $dt = date("Y-m-d H:i:s (T)");
  465. $errortype = array (
  466. E_ERROR => "Error",
  467. E_WARNING => "Warning",
  468. E_PARSE => "Parse Error",
  469. E_NOTICE => "Notice",
  470. E_CORE_ERROR => "Core Error",
  471. E_CORE_WARNING => "Core Warning",
  472. E_COMPILE_ERROR => "Compile Error",
  473. E_COMPILE_WARNING => "Compile Warning",
  474. E_USER_ERROR => "User Error",
  475. E_USER_WARNING => "User Warning",
  476. E_USER_NOTICE => "User Notice"
  477. );
  478. // set of errors for which a var trace will be saved
  479. //$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
  480. $output = <<<EOT
  481. <style type="text/css">
  482. <!--
  483. .red_bold {color:red; font-weight:bold;}
  484. .error { border: 1px solid grey; color: #000000;}
  485. .error p.errmsg { font-size: 1em; background-color: #990033; color: white; margin: 0 0 0 0;}
  486. .error p.errfile { font-size: .8em; font-style: italic; margin: 0 0 0 20px;}
  487. .error table.backtrace { }
  488. .error table.backtrace th { text-align: left; background-color: #339900; color: white}
  489. .error table.backtrace td { color: #000000; background-color: #E8E8E8;}
  490. .error table.backtrace span.function { font-weight: bold; }
  491. .error table.backtrace span.file { font-size: .8em; font-style: italic; }
  492. .error table.backtrace span.args { color: #000000; }
  493. -->
  494. </style>
  495. EOT;
  496. $output .= "<div class=\"error\">";
  497. $output .= "<p class=\"errmsg\">$errortype[$errno] : $errmsg</p>\n";
  498. $output .= "<p class=\"errfile\">in file $filename : $linenum</p>\n";
  499. $output .= backtrace();
  500. $output .= "</div>";
  501. echo $output;
  502. // save to the error log, and e-mail it if there is a critical user error
  503. /*
  504. error_log($err, 3, "/error.log");
  505. if ($errno == E_USER_ERROR) {
  506. mail("phpdev@example.com", "Critical User Error", $err);
  507. }
  508. */
  509. }
  510. function backtrace(){
  511. $backtrace = debug_backtrace();
  512. $output = "<table class=\"backtrace\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\">";
  513. $output .= "<tr><th>#</th><th>function / location</th><th>args</th></tr>";
  514. $count = 0;
  515. if (isset($backtrace[0]['line'])) {
  516. foreach ($backtrace as $bt) {
  517. $argstr = '';
  518. $class = isset($bt['class']) ? $bt['class'] : '';
  519. $type = isset($bt['type']) ? $bt['type'] : '';
  520. $function = isset($bt['function']) ? $bt['function'] : '';
  521. $file = isset($bt['file']) ? $bt['file'] : '';
  522. $line = isset($bt['line']) ? $bt['line'] : '';
  523. $args = isset($bt['args']) ? $bt['args'] : array();
  524. foreach ($args as $a) {
  525. if (!empty($args)) {
  526. $argstr .= ', ';
  527. }
  528. switch (gettype($a)) {
  529. case 'integer':
  530. case 'double':
  531. $argstr .= $a;
  532. break;
  533. case 'string':
  534. $a = htmlspecialchars($a);
  535. $argstr .= "\"$a\"";
  536. break;
  537. case 'array':
  538. $argstr .= 'Array('.count($a).')';
  539. break;
  540. case 'object':
  541. $argstr .= 'Object('.get_class($a).')';
  542. break;
  543. case 'resource':
  544. $argstr .= 'Resource('.strstr($a, '#').')';
  545. break;
  546. case 'boolean':
  547. $argstr .= $a ? 'True' : 'False';
  548. break;
  549. case 'NULL':
  550. $argstr .= 'Null';
  551. break;
  552. default:
  553. $argstr .= 'Unknown';
  554. }
  555. }
  556. if ($count > 1) {
  557. $output .= "<tr>\n";
  558. $output .= "<td><span>".($count-1)."</span></td>\n";
  559. $output .= "<td><span class=\"function\">{$class}{$type}{$function}()</span><br />\n";
  560. $output .= "<span class=\"file\">{$file}:{$line}</span></td>\n";
  561. $output .= "<td><span class=\"args\">$argstr<br /></span></td>\n";
  562. $output .= "</tr>\n";
  563. }
  564. $count++;
  565. }
  566. }
  567. $output .= "</table>\n";
  568. return $output;
  569. }
  570. ?>