10a7415d3SAndreas Gohr<?php 20a7415d3SAndreas Gohr/** 3af1904f9SAndreas Gohr * Translation Plugin: Simple multilanguage plugin 40a7415d3SAndreas Gohr * 50a7415d3SAndreas Gohr * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 60a7415d3SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 70a7415d3SAndreas Gohr * @author Guy Brand <gb@isis.u-strasbg.fr> 80a7415d3SAndreas Gohr */ 90a7415d3SAndreas Gohr 100a7415d3SAndreas Gohr// must be run within Dokuwiki 110a7415d3SAndreas Gohrif(!defined('DOKU_INC')) die(); 120a7415d3SAndreas Gohr 130a7415d3SAndreas Gohrif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 140a7415d3SAndreas Gohrrequire_once(DOKU_PLUGIN.'action.php'); 150a7415d3SAndreas Gohr 160a7415d3SAndreas Gohrclass action_plugin_translation extends DokuWiki_Action_Plugin { 170a7415d3SAndreas Gohr 180a7415d3SAndreas Gohr /** 19af1904f9SAndreas Gohr * for th helper plugin 20*cabcc95dSDominik Eckelmann * @var helper_plugin_translation 21af1904f9SAndreas Gohr */ 22af1904f9SAndreas Gohr var $hlp = null; 23af1904f9SAndreas Gohr 24ec6cbde6SDominik Eckelmann var $locale; 25ec6cbde6SDominik Eckelmann 26af1904f9SAndreas Gohr /** 27af1904f9SAndreas Gohr * Constructor. Load helper plugin 28af1904f9SAndreas Gohr */ 29af1904f9SAndreas Gohr function action_plugin_translation(){ 30af1904f9SAndreas Gohr $this->hlp =& plugin_load('helper', 'translation'); 31af1904f9SAndreas Gohr } 32af1904f9SAndreas Gohr 33af1904f9SAndreas Gohr /** 340a7415d3SAndreas Gohr * Registe the events 350a7415d3SAndreas Gohr */ 360a7415d3SAndreas Gohr function register(&$controller) { 370a7415d3SAndreas Gohr // should the lang be applied to UI? 38ec6cbde6SDominik Eckelmann $scriptName = basename($_SERVER['PHP_SELF']); 3934591120SDominik Eckelmann if($this->getConf('translateui')){ 40ec6cbde6SDominik Eckelmann switch ($scriptName) { 41ec6cbde6SDominik Eckelmann case 'js.php': 42ec6cbde6SDominik Eckelmann $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translation_js'); 43db7c51b4SAndreas Gohr $controller->register_hook('JS_CACHE_USE', 'BEFORE', $this, 'translation_jscache'); 44ec6cbde6SDominik Eckelmann break; 45ec6cbde6SDominik Eckelmann 46ec6cbde6SDominik Eckelmann case 'ajax.php': 47ec6cbde6SDominik Eckelmann $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translate_media_manager'); 48ec6cbde6SDominik Eckelmann break; 49ec6cbde6SDominik Eckelmann 50ec6cbde6SDominik Eckelmann case 'mediamanager.php': 51ec6cbde6SDominik Eckelmann $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); 52ec6cbde6SDominik Eckelmann break; 53ec6cbde6SDominik Eckelmann 54ec6cbde6SDominik Eckelmann default: 55ec6cbde6SDominik Eckelmann $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); 56ec6cbde6SDominik Eckelmann } 570a7415d3SAndreas Gohr } 5834591120SDominik Eckelmann 5934591120SDominik Eckelmann if ($scriptName !== 'js.php' && $scriptName !== 'ajax.php') { 6034591120SDominik Eckelmann $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'translation_hook'); 6134591120SDominik Eckelmann $controller->register_hook('MEDIAMANAGER_STARTED', 'BEFORE', $this, 'translation_hook'); 6234591120SDominik Eckelmann } 6334591120SDominik Eckelmann 64af1904f9SAndreas Gohr $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'translation_search'); 65*cabcc95dSDominik Eckelmann $controller->register_hook('COMMON_PAGETPL_LOAD', 'AFTER', $this, 'page_template_replacement'); 66*cabcc95dSDominik Eckelmann } 67*cabcc95dSDominik Eckelmann 68*cabcc95dSDominik Eckelmann function page_template_replacement(&$event, $args) { 69*cabcc95dSDominik Eckelmann global $ID; 70*cabcc95dSDominik Eckelmann $event->data['tpl'] = str_replace('@LANG@', $this->hlp->realLC(''), $event->data['tpl']); 71*cabcc95dSDominik Eckelmann $event->data['tpl'] = str_replace('@TRANS@', $this->hlp->getLangPart($ID), $event->data['tpl']); 720a7415d3SAndreas Gohr } 730a7415d3SAndreas Gohr 74ec6cbde6SDominik Eckelmann function setJsCacheKey(&$event, $args) { 75ec6cbde6SDominik Eckelmann if (!isset($this->locale)) return false; 76ec6cbde6SDominik Eckelmann $count = count($event->data['script']); 77ec6cbde6SDominik Eckelmann for ($i = 0; $i<$count; $i++) { 78ec6cbde6SDominik Eckelmann if (strpos($event->data['script'][$i]['src'], '/lib/exe/js.php') !== false) { 79db7c51b4SAndreas Gohr $event->data['script'][$i]['src'] .= '&lang='.hsc($this->locale); 80ec6cbde6SDominik Eckelmann } 81ec6cbde6SDominik Eckelmann } 82ec6cbde6SDominik Eckelmann 83ec6cbde6SDominik Eckelmann return false; 84ec6cbde6SDominik Eckelmann } 85ec6cbde6SDominik Eckelmann 86ec6cbde6SDominik Eckelmann function translation_js(&$event, $args) { 871797705cSDominik Eckelmann global $conf; 88db7c51b4SAndreas Gohr if(!isset($_GET['lang'])) return; 89db7c51b4SAndreas Gohr if(!in_array($_GET['lang'],$this->hlp->trans)) return; 90db7c51b4SAndreas Gohr $lang = $_GET['lang']; 91db7c51b4SAndreas Gohr $event->data = $lang; 92db7c51b4SAndreas Gohr $conf['lang'] = $lang; 93db7c51b4SAndreas Gohr } 94ec6cbde6SDominik Eckelmann 95db7c51b4SAndreas Gohr function translation_jscache(&$event, $args) { 96db7c51b4SAndreas Gohr if (!isset($_GET['lang'])) return; 97db7c51b4SAndreas Gohr if(!in_array($_GET['lang'],$this->hlp->trans)) return; 98db7c51b4SAndreas Gohr 99db7c51b4SAndreas Gohr $lang = $_GET['lang']; 100db7c51b4SAndreas Gohr // reuse the constructor to reinitialize the cache key 101db7c51b4SAndreas Gohr $event->data->cache( 102db7c51b4SAndreas Gohr $event->data->key . $lang, 103db7c51b4SAndreas Gohr $event->data->ext 104db7c51b4SAndreas Gohr ); 105ec6cbde6SDominik Eckelmann } 106ec6cbde6SDominik Eckelmann 107ec6cbde6SDominik Eckelmann function translate_media_manager(&$event, $args) { 108ec6cbde6SDominik Eckelmann global $conf; 109ec6cbde6SDominik Eckelmann if (isset($_REQUEST['ID'])) { 110ec6cbde6SDominik Eckelmann $id = getID(); 111ec6cbde6SDominik Eckelmann $lc = $this->hlp->getLangPart($id); 112ec6cbde6SDominik Eckelmann } elseif (isset($_SESSION[DOKU_COOKIE]['translationlc'])) { 113ec6cbde6SDominik Eckelmann $lc = $_SESSION[DOKU_COOKIE]['translationlc']; 114ec6cbde6SDominik Eckelmann } else { 115db7c51b4SAndreas Gohr return; 116ec6cbde6SDominik Eckelmann } 117ec6cbde6SDominik Eckelmann $conf['lang'] = $lc; 118ec6cbde6SDominik Eckelmann $event->data = $lc; 119ec6cbde6SDominik Eckelmann } 120ec6cbde6SDominik Eckelmann 1210a7415d3SAndreas Gohr /** 1220a7415d3SAndreas Gohr * Change the UI language in foreign language namespaces 1230a7415d3SAndreas Gohr */ 1240a7415d3SAndreas Gohr function translation_hook(&$event, $args) { 1250a7415d3SAndreas Gohr global $ID; 1260a7415d3SAndreas Gohr global $lang; 1270a7415d3SAndreas Gohr global $conf; 1287053cd66SAndreas Gohr global $ACT; 1297053cd66SAndreas Gohr // redirect away from start page? 1307053cd66SAndreas Gohr if($this->conf['redirectstart'] && $ID == $conf['start'] && $ACT == 'show'){ 1317053cd66SAndreas Gohr $lc = $this->hlp->getBrowserLang(); 1327053cd66SAndreas Gohr if(!$lc) $lc = $conf['lang']; 1337053cd66SAndreas Gohr header('Location: '.wl($lc.':'.$conf['start'],'',true,'&')); 1347053cd66SAndreas Gohr exit; 1357053cd66SAndreas Gohr } 1360a7415d3SAndreas Gohr 1370a7415d3SAndreas Gohr // check if we are in a foreign language namespace 138af1904f9SAndreas Gohr $lc = $this->hlp->getLangPart($ID); 139a526927fSAndreas Gohr 140f2279247SAndreas Gohr // store language in session (for page related views only) 141f2279247SAndreas Gohr if(in_array($ACT,array('show','recent','diff','edit','preview','source','subscribe'))){ 142f2279247SAndreas Gohr $_SESSION[DOKU_COOKIE]['translationlc'] = $lc; 143f2279247SAndreas Gohr } 144a526927fSAndreas Gohr if(!$lc) $lc = $_SESSION[DOKU_COOKIE]['translationlc']; 145a526927fSAndreas Gohr if(!$lc) return; 14634591120SDominik Eckelmann $this->locale = $lc; 14734591120SDominik Eckelmann 14834591120SDominik Eckelmann if (!$this->getConf('translateui')) { 14934591120SDominik Eckelmann return true; 15034591120SDominik Eckelmann } 1510a7415d3SAndreas Gohr 1520a7415d3SAndreas Gohr if(file_exists(DOKU_INC.'inc/lang/'.$lc.'/lang.php')) { 1530a7415d3SAndreas Gohr require(DOKU_INC.'inc/lang/'.$lc.'/lang.php'); 1540a7415d3SAndreas Gohr } 1550a7415d3SAndreas Gohr $conf['lang_before_translation'] = $conf['lang']; //store for later access in syntax plugin 1560a7415d3SAndreas Gohr $conf['lang'] = $lc; 1570a7415d3SAndreas Gohr 1580a7415d3SAndreas Gohr return true; 1590a7415d3SAndreas Gohr } 160af1904f9SAndreas Gohr 161af1904f9SAndreas Gohr /** 162af1904f9SAndreas Gohr * Resort page match results so that results are ordered by translation, having the 163af1904f9SAndreas Gohr * default language first 164af1904f9SAndreas Gohr */ 165af1904f9SAndreas Gohr function translation_search(&$event, $args) { 166d75e50bcSAndreas Gohr 167d75e50bcSAndreas Gohr if($event->data['has_titles']){ 168d75e50bcSAndreas Gohr // sort into translation slots 169d75e50bcSAndreas Gohr $res = array(); 170d75e50bcSAndreas Gohr foreach($event->result as $r => $t){ 171d75e50bcSAndreas Gohr $tr = $this->hlp->getLangPart($r); 172d75e50bcSAndreas Gohr if(!is_array($res["x$tr"])) $res["x$tr"] = array(); 173d75e50bcSAndreas Gohr $res["x$tr"][] = array($r,$t); 174d75e50bcSAndreas Gohr } 175d75e50bcSAndreas Gohr // sort by translations 176d75e50bcSAndreas Gohr ksort($res); 177d75e50bcSAndreas Gohr // combine 178d75e50bcSAndreas Gohr $event->result = array(); 179d75e50bcSAndreas Gohr foreach($res as $r){ 180d75e50bcSAndreas Gohr foreach($r as $l){ 181d75e50bcSAndreas Gohr $event->result[$l[0]] = $l[1]; 182d75e50bcSAndreas Gohr } 183d75e50bcSAndreas Gohr } 184d75e50bcSAndreas Gohr }else{ 185d75e50bcSAndreas Gohr # legacy support for old DokuWiki hooks 186d75e50bcSAndreas Gohr 187af1904f9SAndreas Gohr // sort into translation slots 188af1904f9SAndreas Gohr $res = array(); 189af1904f9SAndreas Gohr foreach($event->result as $r){ 190af1904f9SAndreas Gohr $tr = $this->hlp->getLangPart($r); 191af1904f9SAndreas Gohr if(!is_array($res["x$tr"])) $res["x$tr"] = array(); 192af1904f9SAndreas Gohr $res["x$tr"][] = $r; 193af1904f9SAndreas Gohr } 194af1904f9SAndreas Gohr // sort by translations 195af1904f9SAndreas Gohr ksort($res); 196af1904f9SAndreas Gohr // combine 197af1904f9SAndreas Gohr $event->result = array(); 198af1904f9SAndreas Gohr foreach($res as $r){ 199af1904f9SAndreas Gohr $event->result = array_merge($event->result,$r); 200af1904f9SAndreas Gohr } 201af1904f9SAndreas Gohr } 202d75e50bcSAndreas Gohr } 203af1904f9SAndreas Gohr 2040a7415d3SAndreas Gohr} 2050a7415d3SAndreas Gohr 206ec6cbde6SDominik Eckelmann//Setup VIM: ex: et ts=4 : 207