diff options
Diffstat (limited to 'platform/www/lib/plugins/translation/action.php')
-rw-r--r-- | platform/www/lib/plugins/translation/action.php | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/translation/action.php b/platform/www/lib/plugins/translation/action.php new file mode 100644 index 0000000..6c79a70 --- /dev/null +++ b/platform/www/lib/plugins/translation/action.php @@ -0,0 +1,302 @@ +<?php +/** + * Translation Plugin: Simple multilanguage plugin + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Andreas Gohr <andi@splitbrain.org> + * @author Guy Brand <gb@isis.u-strasbg.fr> + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Class action_plugin_translation + */ +class action_plugin_translation extends DokuWiki_Action_Plugin { + + /** + * For the helper plugin + * @var helper_plugin_translation + */ + var $helper = null; + + var $locale; + + /** + * Constructor. Load helper plugin + */ + function __construct() { + $this->helper = plugin_load('helper', 'translation'); + } + + /** + * Registers a callback function for a given event + * + * @param Doku_Event_Handler $controller + */ + function register(Doku_Event_Handler $controller) { + $scriptName = basename($_SERVER['PHP_SELF']); + + // should the lang be applied to UI? + if($this->getConf('translateui')) { + switch($scriptName) { + case 'js.php': + $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translation_js'); + $controller->register_hook('JS_CACHE_USE', 'BEFORE', $this, 'translation_jscache'); + break; + + case 'ajax.php': + $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translate_media_manager'); + break; + + case 'mediamanager.php': + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); + break; + + default: + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); + } + } + + if($scriptName !== 'js.php' && $scriptName !== 'ajax.php') { + $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'translation_hook'); + $controller->register_hook('DETAIL_STARTED', 'BEFORE', $this, 'translation_hook'); + $controller->register_hook('MEDIAMANAGER_STARTED', 'BEFORE', $this, 'translation_hook'); + } + + $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'translation_search'); + $controller->register_hook('COMMON_PAGETPL_LOAD', 'AFTER', $this, 'page_template_replacement'); + } + + /** + * Hook Callback. Make current language available as page template placeholder and handle + * original language copying + * + * @param Doku_Event $event + * @param $args + */ + function page_template_replacement(Doku_Event $event, $args) { + global $ID; + + // load orginal content as template? + if($this->getConf('copytrans') && $this->helper->istranslatable($ID, false)) { + // look for existing translations + $translations = $this->helper->getAvailableTranslations($ID); + if($translations) { + // find original language (might've been provided via parameter or use first translation) + $orig = (string) $_REQUEST['fromlang']; + if(!$orig) $orig = array_shift(array_keys($translations)); + + // load file + $origfile = $translations[$orig]; + $event->data['tpl'] = io_readFile(wikiFN($origfile)); + + // prefix with warning + $warn = io_readFile($this->localFN('totranslate')); + if($warn) $warn .= "\n\n"; + $event->data['tpl'] = $warn . $event->data['tpl']; + + // show user a choice of translations if any + if(count($translations) > 1) { + $links = array(); + foreach($translations as $t => $l) { + $links[] = '<a href="' . wl($ID, array('do' => 'edit', 'fromlang' => $t)) . '">' . $this->helper->getLocalName($t) . '</a>'; + } + + msg( + sprintf( + $this->getLang('transloaded'), + $this->helper->getLocalName($orig), + join(', ', $links) + ) + ); + } + + } + } + + // apply placeholders + $event->data['tpl'] = str_replace('@LANG@', $this->helper->realLC(''), $event->data['tpl']); + $event->data['tpl'] = str_replace('@TRANS@', $this->helper->getLangPart($ID), $event->data['tpl']); + } + + /** + * Hook Callback. Load correct translation when loading JavaScript + * + * @param Doku_Event $event + * @param $args + */ + function translation_js(Doku_Event $event, $args) { + global $conf; + if(!isset($_GET['lang'])) return; + if(!in_array($_GET['lang'], $this->helper->translations)) return; + $lang = $_GET['lang']; + $event->data = $lang; + $conf['lang'] = $lang; + } + + /** + * Hook Callback. Pass language code to JavaScript dispatcher + * + * @param Doku_Event $event + * @param $args + * @return bool + */ + function setJsCacheKey(Doku_Event $event, $args) { + if(!isset($this->locale)) return false; + $count = count($event->data['script']); + for($i = 0; $i < $count; $i++) { + if(strpos($event->data['script'][$i]['src'], '/lib/exe/js.php') !== false) { + $event->data['script'][$i]['src'] .= '&lang=' . hsc($this->locale); + } + } + + return false; + } + + /** + * Hook Callback. Make sure the JavaScript is translation dependent + * + * @param Doku_Event $event + * @param $args + */ + function translation_jscache(Doku_Event $event, $args) { + if(!isset($_GET['lang'])) return; + if(!in_array($_GET['lang'], $this->helper->translations)) return; + + $lang = $_GET['lang']; + // reuse the constructor to reinitialize the cache key + if(method_exists($event->data, '__construct')) { + // New PHP 5 style constructor + $event->data->__construct( + $event->data->key . $lang, + $event->data->ext + ); + } else { + // Old PHP 4 style constructor - deprecated + $event->data->cache( + $event->data->key . $lang, + $event->data->ext + ); + } + } + + /** + * Hook Callback. Translate the AJAX loaded media manager + * + * @param Doku_Event $event + * @param $args + */ + function translate_media_manager(Doku_Event $event, $args) { + global $conf; + if(isset($_REQUEST['ID'])) { + $id = getID(); + $lc = $this->helper->getLangPart($id); + } elseif(isset($_SESSION[DOKU_COOKIE]['translationlc'])) { + $lc = $_SESSION[DOKU_COOKIE]['translationlc']; + } else { + return; + } + if(!$lc) return; + + $conf['lang'] = $lc; + $event->data = $lc; + } + + /** + * Hook Callback. Change the UI language in foreign language namespaces + * + * @param Doku_Event $event + * @param $args + * @return bool + */ + function translation_hook(Doku_Event $event, $args) { + global $ID; + /** @noinspection PhpUnusedLocalVariableInspection we include the language file later on */ + global $lang; + global $conf; + global $ACT; + // redirect away from start page? + if($this->getConf('redirectstart') && $ID == $conf['start'] && $ACT == 'show') { + $lc = $this->helper->getBrowserLang(); + + list($translatedStartpage,) = $this->helper->buildTransID($lc, $conf['start']); + if (cleanID($translatedStartpage) !== cleanID($ID)) { + send_redirect(wl($translatedStartpage, '', true)); + } + } + + // check if we are in a foreign language namespace + $lc = $this->helper->getLangPart($ID); + + // store language in session (for page related views only) + if(in_array($ACT, array('show', 'recent', 'diff', 'edit', 'preview', 'source', 'subscribe'))) { + $_SESSION[DOKU_COOKIE]['translationlc'] = $lc; + } + if(!$lc) $lc = $_SESSION[DOKU_COOKIE]['translationlc']; + if(!$lc) return false; + $this->locale = $lc; + + if(!$this->getConf('translateui')) { + return true; + } + + if(file_exists(DOKU_INC . 'inc/lang/' . $lc . '/lang.php')) { + require(DOKU_INC . 'inc/lang/' . $lc . '/lang.php'); + } + $conf['lang_before_translation'] = $conf['lang']; //store for later access in syntax plugin + $conf['lang'] = $lc; + + return true; + } + + /** + * Hook Callback. Resort page match results so that results are ordered by translation, having the + * default language first + * + * @param Doku_Event $event + * @param $args + */ + function translation_search(Doku_Event $event, $args) { + + if($event->data['has_titles']) { + // sort into translation slots + $res = array(); + foreach($event->result as $r => $t) { + $tr = $this->helper->getLangPart($r); + if(!is_array($res["x$tr"])) $res["x$tr"] = array(); + $res["x$tr"][] = array($r, $t); + } + // sort by translations + ksort($res); + // combine + $event->result = array(); + foreach($res as $r) { + foreach($r as $l) { + $event->result[$l[0]] = $l[1]; + } + } + } else { + # legacy support for old DokuWiki hooks + + // sort into translation slots + $res = array(); + foreach($event->result as $r) { + $tr = $this->helper->getLangPart($r); + if(!is_array($res["x$tr"])) $res["x$tr"] = array(); + $res["x$tr"][] = $r; + } + // sort by translations + ksort($res); + // combine + $event->result = array(); + foreach($res as $r) { + $event->result = array_merge($event->result, $r); + } + } + } + +} + +//Setup VIM: ex: et ts=4 : |