preparation release
This commit is contained in:
commit
f5e3a62ee8
196 changed files with 64314 additions and 0 deletions
472
HTML/Template/Flexy/Translator.php
Normal file
472
HTML/Template/Flexy/Translator.php
Normal file
|
|
@ -0,0 +1,472 @@
|
|||
<?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.8 2006/01/09 03:05:01 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);
|
||||
$this->loadTranslations();
|
||||
$this->loadTranslations($displayLang);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue