Viewing file: Translator.php (15.02 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php /* vim: set expandtab tabstop=4 shiftwidth=4: */ // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2002 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: nobody <nobody@localhost> | // +----------------------------------------------------------------------+ // // $Id: Translator.php,v 1.9 2006/06/26 00:59:40 alan_k Exp $ // // Controller Type Class providing translation faciliites // /*
usage :
$t = new HTML_Template_Flexy_Translator(array( 'baseLang' => 'en', 'targetLangs' => array('es','fr','zh'), 'appURL' => '/admin/translate.php',
)); $t->process(isset($_GET ? $_GET : array(),isset($_POST ? $_POST : array()); // read data.. etc. // you can replace this pretty easily with your own templates.. $t->outputDefautTemplate();
*/
class HTML_Template_Flexy_Translator { /** * Options for Translator tool. * * @var array * @access public */ var $options = array( 'baseLang' => 'en', // the language the templates are in. 'targetLangs' => array('fr'), // the language the templates are being translated to. 'templateDir' => '', // these are read from global config if not set. 'compileDir' => '', 'url_rewrite' => '', // for image rewriting.. -- needs better thinking through! 'appURL' => '', // url to translation too : eg. /admin/translator.php 'Translation2' => array( 'driver' => 'dataobjectsimple', 'options' => 'translations' ),
); /** * app URL (copied from above) * * @var string * @access public */ var $appURL; var $languages = array(); /** * Array of templates and the words found in each one. * * @var array * @access public */ var $words= array(); /** * Array of objects with name, md5's, has it been set, the translation etc. * * @var array * @access public */ var $status = array(); /** * The current language * * @var array * @access public */ var $translate = ''; // language being displayed /edited. /** * constructor * * Just set options (no checking done) * * * @param array see options array in file. * @return none * @access public */ function HTML_Template_Flexy_Translator($options= array()) { foreach($options as $k=>$v) { $this->options[$k] = $v; } if (!in_array($this->options['baseLang'], $this->options['targetLangs'])) { $this->options['targetLangs'][] = $this->options['baseLang']; } $o = PEAR::getStaticProperty('HTML_Template_Flexy','options'); if (!strlen($this->options['templateDir'])) { $this->options['templateDir'] = $o['templateDir']; } if (!strlen($this->options['compileDir'])) { $this->options['compileDir'] = $o['compileDir']; } if (!strlen($this->options['url_rewrite'])) { $this->options['url_rewrite'] = $o['url_rewrite']; } if (empty($this->options['Translation2'])) { $this->options['Translation2'] = $o['Translation2']; } $this->appURL = $this->options['appURL']; $this->languages = $this->options['targetLangs']; } /** * process the input * * * @param array $_GET; (translate = en) * @param array $_POST; (translate = en, en[{md5}] = translation) * @return none * @access public */ function process($get,$post) { //DB_DataObject::debugLevel(1); $displayLang = isset($get['translate']) ? $get['translate'] : (isset($post['translate']) ? $post['translate'] : false); if ($displayLang === false) { return; } require_once 'Translation2/Admin.php'; $driver = $this->options['Translation2']['driver']; $options = $this->options['Translation2']['options']; $usingGT = ($driver == 'gettext'); $usingDO = ($driver == 'dataobjectsimple'); $trd = &Translation2_Admin::factory($driver, $options); //$trd->setDecoratedLang('en'); foreach($this->options['targetLangs'] as $l) { $trd->addLang(array( 'lang_id' => $l )); } // back to parent if no language selected.. if (!in_array($displayLang, $this->options['targetLangs'] )) { require_once 'PEAR.php'; return PEAR::raiseError('Unknown Language :' .$displayLang); } $this->translate = $displayLang; if (isset($post['_apply'])) { $this->clearTemplateCache($displayLang); } $t = explode(' ',microtime()); $start= $t[0] + $t[1]; require_once 'Translation2.php'; $tr = &Translation2::factory($driver, $options); $tr->setLang($displayLang); if (!$usingDO) { $suggestions = &Translation2::factory($driver, $options); $suggestions->setLang($displayLang); } $this->compileAll(); //$tr->setPageID('test.html'); // delete them after we have compiled them!! if (isset($post['_apply'])) { $this->clearTemplateCache($displayLang); } //DB_DataObject::debugLevel(1); if ($usingDO) { $this->loadTranslations(); $this->loadTranslations($displayLang); } $all = array(); if ($usingGT) { $trd->storage->begin(); } $displayLangClean = str_replace('.', '_', $displayLang); foreach($this->words as $page=>$words) { $status[$page] = array(); $tr->setPageID($page); // pages.... if (isset($post['_clear']) && !PEAR::isError($p = $trd->getPage($page, $displayLang))) { $diff = array_diff(array_keys($p), $words); if (count($diff)) { foreach ($diff as $string) { $trd->remove($string, $page); } } }
foreach ($words as $word) { if (!strlen(trim($word))) { continue; } $md5 = md5($page.':'.$word); $value = $usingDO ? $this->getTranslation($page,$word,$displayLang) : $tr->get($word); // we posted something.. if (isset($post[$displayLangClean][$md5])) { // eak we shouldnt really deal with magic_quotes!!! $nval = str_replace("\r\n", "\n", get_magic_quotes_gpc() ? stripslashes($post[$_displayLang][$md5]) : $post[$_displayLang][$md5]); if ($value != $nval) { $trd->add($word,$page,array($displayLang=>$nval)); $value = $nval; } } if ($value == '') { // try the old gettext... if (isset($old[addslashes($word)])) { $trd->add($word,$page,array($displayLang=>$old[addslashes($word)])); $value = $old[addslashes($word)]; } } $add = new StdClass; $add->from = $word; $add->to = $value; if (!$add->to || ($add->from == $add->to)) { $add->untranslated = true; if ($usingDO) { $add->suggest = implode(', ', $this->getSuggestions($word, $displayLang)); } else { $suggest = $suggestions->get($word); if ($suggest && ($suggest != $word)) { $add->suggest = $suggest; } } }
$add->md5 = $md5; // show big or small text entry.. $add->short = (bool) (strlen($add->from) < 30 && strstr($add->from, "\n") === false); $status[$page][] = $add; } } if ($usingGT) { $trd->storage->commit(); } $t = explode(' ',microtime()); $total= $t[0] + $t[1] - $start; //printf("Built All in %0.2fs<BR>",$total); $this->status = $status; } var $translations = array(); var $translationMap = array(); /** * LoadTranslations - load all the translations from the database * into $this->translations[{lang}][{id}] = $translation; * * * @param string Language * @access public */ function loadTranslations ($lang= false) { $d = DB_DataObject::factory('translations'); $d->lang = ($lang == false) ? '-' : $lang; $d->find(); $this->translations[$d->lang] = array(); while ($d->fetch()) { $this->translations[$d->lang][$d->string_id] = $d->translation; if ($lang == false) { $this->translationMap[$d->page][$d->translation] = $d->string_id; } // suggestions:? } } function getSuggestions($string,$lang) { $ids = array(); //echo '<PRE>';print_r($this->translationMap); foreach($this->translationMap as $page=>$map) { if (isset($map[$string])) { $ids[] = $map[$string]; } } //echo '<PRE>';print_r(array($string,$lang,$ids,$this->translations[$lang])); //exit; if (!$ids) { return array(); } $ret = array(); foreach($ids as $id) { if (isset($this->translations[$lang][$id])) { $ret[] = $this->translations[$lang][$id]; } } // echo '<PRE>';print_r($ret); return $ret; } function getTranslation($page,$word,$lang) { if (!isset($this->translationMap[$page][$word])) { //echo "No string id for $page : $word\n"; return false; } if (!isset($this->translations[$lang][$this->translationMap[$page][$word]])) { return false; } return $this->translations[$lang][$this->translationMap[$page][$word]]; } /** * compile all the templates in a specified folder. * * * @param string subdirectory of templateDir or empty * @return none * @access public */
function compileAll($d='') { set_time_limit(0); // this could take quite a while!!! $words = array(); $dname = $d ? $this->options['templateDir'] .'/'.$d : $this->options['templateDir']; //echo "Open $dname<BR>"; $dh = opendir( $dname); require_once 'HTML/Template/Flexy.php'; $o = $this->options; $o['fatalError'] = PEAR_ERROR_RETURN; $o['locale'] = 'en'; while (($name = readdir($dh)) !== false) { $fname = $d ? $d .'/'. $name : $name; if ($name{0} == '.') { continue; } if (is_dir($this->options['templateDir'] . '/'. $fname)) { $this->compileAll($fname); continue; } if (!preg_match('/\.html$/',$name)) { continue; } $oo = $o;// $oo['debug'] = 1; $x = new HTML_Template_Flexy( $oo ); $r = $x->compile($fname); //printf(" %0.3fs : $fname<BR>", $time); if (is_a($r,'PEAR_Error')) { echo "compile failed on $fname<BR>"; echo $r->toString(); continue; } $this->words[$fname] = file_exists($x->getTextStringsFile) ? unserialize(file_get_contents($x->getTextStringsFile)) : array(); } //echo '<PRE>';print_R($words);exit; ksort($this->words); }
/** * delete all the compiled templates in a specified language * * * @param string language * @param string subdirectory of templateDir or empty * @return none * @access public */ function clearTemplateCache($lang='en',$d = '') { $dname = $d ? $this->options['templateDir'] .'/'.$d : $this->options['templateDir']; $dh = opendir($dname); while (($name = readdir($dh)) !== false) { $fname = $d ? $d .'/'. $name : $name; if ($name{0} == '.') { continue; } if (is_dir($this->options['templateDir'] . '/'. $fname)) { $this->clearTemplateCache($lang,$fname); continue; } if (!preg_match('/\.html$/',$name)) { continue; } $file = "{$this->options['compileDir']}/{$fname}.{$lang}.php"; if (file_exists($file)) { // echo "DELETE $file?"; unlink($file); } } clearstatcache(); } /** * output the default template with the editing facilities. * * @return none * @access public */ function outputDefaultTemplate() { $o = array( 'compileDir' => ini_get('session.save_path') . '/HTML_Template_Flexy_Translate', 'templateDir' => dirname(__FILE__).'/templates' ); $x = new HTML_Template_Flexy( $o ); $x->compile('translator.html'); $x->outputObject($this); }
}
|