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 20af1904f9SAndreas Gohr */ 21af1904f9SAndreas Gohr var $hlp = null; 22af1904f9SAndreas Gohr 23ec6cbde6SDominik Eckelmann var $locale; 24ec6cbde6SDominik Eckelmann 25af1904f9SAndreas Gohr /** 26af1904f9SAndreas Gohr * Constructor. Load helper plugin 27af1904f9SAndreas Gohr */ 28af1904f9SAndreas Gohr function action_plugin_translation(){ 29af1904f9SAndreas Gohr $this->hlp =& plugin_load('helper', 'translation'); 30af1904f9SAndreas Gohr } 31af1904f9SAndreas Gohr 32af1904f9SAndreas Gohr /** 330a7415d3SAndreas Gohr * Registe the events 340a7415d3SAndreas Gohr */ 350a7415d3SAndreas Gohr function register(&$controller) { 360a7415d3SAndreas Gohr // should the lang be applied to UI? 37ec6cbde6SDominik Eckelmann $scriptName = basename($_SERVER['PHP_SELF']); 38*34591120SDominik Eckelmann if($this->getConf('translateui')){ 39ec6cbde6SDominik Eckelmann switch ($scriptName) { 40ec6cbde6SDominik Eckelmann case 'js.php': 41ec6cbde6SDominik Eckelmann $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translation_js'); 42db7c51b4SAndreas Gohr $controller->register_hook('JS_CACHE_USE', 'BEFORE', $this, 'translation_jscache'); 43ec6cbde6SDominik Eckelmann break; 44ec6cbde6SDominik Eckelmann 45ec6cbde6SDominik Eckelmann case 'ajax.php': 46ec6cbde6SDominik Eckelmann $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translate_media_manager'); 47ec6cbde6SDominik Eckelmann break; 48ec6cbde6SDominik Eckelmann 49ec6cbde6SDominik Eckelmann case 'mediamanager.php': 50ec6cbde6SDominik Eckelmann $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); 51ec6cbde6SDominik Eckelmann break; 52ec6cbde6SDominik Eckelmann 53ec6cbde6SDominik Eckelmann default: 54ec6cbde6SDominik Eckelmann $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); 55ec6cbde6SDominik Eckelmann } 560a7415d3SAndreas Gohr } 57*34591120SDominik Eckelmann 58*34591120SDominik Eckelmann if ($scriptName !== 'js.php' && $scriptName !== 'ajax.php') { 59*34591120SDominik Eckelmann $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'translation_hook'); 60*34591120SDominik Eckelmann $controller->register_hook('MEDIAMANAGER_STARTED', 'BEFORE', $this, 'translation_hook'); 61*34591120SDominik Eckelmann } 62*34591120SDominik Eckelmann 63af1904f9SAndreas Gohr $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'translation_search'); 640a7415d3SAndreas Gohr } 650a7415d3SAndreas Gohr 66ec6cbde6SDominik Eckelmann function setJsCacheKey(&$event, $args) { 67ec6cbde6SDominik Eckelmann if (!isset($this->locale)) return false; 68ec6cbde6SDominik Eckelmann $count = count($event->data['script']); 69ec6cbde6SDominik Eckelmann for ($i = 0; $i<$count; $i++) { 70ec6cbde6SDominik Eckelmann if (strpos($event->data['script'][$i]['src'], '/lib/exe/js.php') !== false) { 71db7c51b4SAndreas Gohr $event->data['script'][$i]['src'] .= '&lang='.hsc($this->locale); 72ec6cbde6SDominik Eckelmann } 73ec6cbde6SDominik Eckelmann } 74ec6cbde6SDominik Eckelmann 75ec6cbde6SDominik Eckelmann return false; 76ec6cbde6SDominik Eckelmann } 77ec6cbde6SDominik Eckelmann 78ec6cbde6SDominik Eckelmann function translation_js(&$event, $args) { 791797705cSDominik Eckelmann global $conf; 80db7c51b4SAndreas Gohr if(!isset($_GET['lang'])) return; 81db7c51b4SAndreas Gohr if(!in_array($_GET['lang'],$this->hlp->trans)) return; 82db7c51b4SAndreas Gohr $lang = $_GET['lang']; 83db7c51b4SAndreas Gohr $event->data = $lang; 84db7c51b4SAndreas Gohr $conf['lang'] = $lang; 85db7c51b4SAndreas Gohr } 86ec6cbde6SDominik Eckelmann 87db7c51b4SAndreas Gohr function translation_jscache(&$event, $args) { 88db7c51b4SAndreas Gohr if (!isset($_GET['lang'])) return; 89db7c51b4SAndreas Gohr if(!in_array($_GET['lang'],$this->hlp->trans)) return; 90db7c51b4SAndreas Gohr 91db7c51b4SAndreas Gohr $lang = $_GET['lang']; 92db7c51b4SAndreas Gohr // reuse the constructor to reinitialize the cache key 93db7c51b4SAndreas Gohr $event->data->cache( 94db7c51b4SAndreas Gohr $event->data->key . $lang, 95db7c51b4SAndreas Gohr $event->data->ext 96db7c51b4SAndreas Gohr ); 97ec6cbde6SDominik Eckelmann } 98ec6cbde6SDominik Eckelmann 99ec6cbde6SDominik Eckelmann function translate_media_manager(&$event, $args) { 100ec6cbde6SDominik Eckelmann global $conf; 101ec6cbde6SDominik Eckelmann if (isset($_REQUEST['ID'])) { 102ec6cbde6SDominik Eckelmann $id = getID(); 103ec6cbde6SDominik Eckelmann $lc = $this->hlp->getLangPart($id); 104ec6cbde6SDominik Eckelmann } elseif (isset($_SESSION[DOKU_COOKIE]['translationlc'])) { 105ec6cbde6SDominik Eckelmann $lc = $_SESSION[DOKU_COOKIE]['translationlc']; 106ec6cbde6SDominik Eckelmann } else { 107db7c51b4SAndreas Gohr return; 108ec6cbde6SDominik Eckelmann } 109ec6cbde6SDominik Eckelmann $conf['lang'] = $lc; 110ec6cbde6SDominik Eckelmann $event->data = $lc; 111ec6cbde6SDominik Eckelmann } 112ec6cbde6SDominik Eckelmann 1130a7415d3SAndreas Gohr /** 1140a7415d3SAndreas Gohr * Change the UI language in foreign language namespaces 1150a7415d3SAndreas Gohr */ 1160a7415d3SAndreas Gohr function translation_hook(&$event, $args) { 1170a7415d3SAndreas Gohr global $ID; 1180a7415d3SAndreas Gohr global $lang; 1190a7415d3SAndreas Gohr global $conf; 1207053cd66SAndreas Gohr global $ACT; 1217053cd66SAndreas Gohr // redirect away from start page? 1227053cd66SAndreas Gohr if($this->conf['redirectstart'] && $ID == $conf['start'] && $ACT == 'show'){ 1237053cd66SAndreas Gohr $lc = $this->hlp->getBrowserLang(); 1247053cd66SAndreas Gohr if(!$lc) $lc = $conf['lang']; 1257053cd66SAndreas Gohr header('Location: '.wl($lc.':'.$conf['start'],'',true,'&')); 1267053cd66SAndreas Gohr exit; 1277053cd66SAndreas Gohr } 1280a7415d3SAndreas Gohr 1290a7415d3SAndreas Gohr // check if we are in a foreign language namespace 130af1904f9SAndreas Gohr $lc = $this->hlp->getLangPart($ID); 131a526927fSAndreas Gohr 132f2279247SAndreas Gohr // store language in session (for page related views only) 133f2279247SAndreas Gohr if(in_array($ACT,array('show','recent','diff','edit','preview','source','subscribe'))){ 134f2279247SAndreas Gohr $_SESSION[DOKU_COOKIE]['translationlc'] = $lc; 135f2279247SAndreas Gohr } 136a526927fSAndreas Gohr if(!$lc) $lc = $_SESSION[DOKU_COOKIE]['translationlc']; 137a526927fSAndreas Gohr if(!$lc) return; 138*34591120SDominik Eckelmann $this->locale = $lc; 139*34591120SDominik Eckelmann 140*34591120SDominik Eckelmann if (!$this->getConf('translateui')) { 141*34591120SDominik Eckelmann return true; 142*34591120SDominik Eckelmann } 1430a7415d3SAndreas Gohr 1440a7415d3SAndreas Gohr if(file_exists(DOKU_INC.'inc/lang/'.$lc.'/lang.php')) { 1450a7415d3SAndreas Gohr require(DOKU_INC.'inc/lang/'.$lc.'/lang.php'); 1460a7415d3SAndreas Gohr } 1470a7415d3SAndreas Gohr $conf['lang_before_translation'] = $conf['lang']; //store for later access in syntax plugin 1480a7415d3SAndreas Gohr $conf['lang'] = $lc; 1490a7415d3SAndreas Gohr 1500a7415d3SAndreas Gohr return true; 1510a7415d3SAndreas Gohr } 152af1904f9SAndreas Gohr 153af1904f9SAndreas Gohr /** 154af1904f9SAndreas Gohr * Resort page match results so that results are ordered by translation, having the 155af1904f9SAndreas Gohr * default language first 156af1904f9SAndreas Gohr */ 157af1904f9SAndreas Gohr function translation_search(&$event, $args) { 158d75e50bcSAndreas Gohr 159d75e50bcSAndreas Gohr if($event->data['has_titles']){ 160d75e50bcSAndreas Gohr // sort into translation slots 161d75e50bcSAndreas Gohr $res = array(); 162d75e50bcSAndreas Gohr foreach($event->result as $r => $t){ 163d75e50bcSAndreas Gohr $tr = $this->hlp->getLangPart($r); 164d75e50bcSAndreas Gohr if(!is_array($res["x$tr"])) $res["x$tr"] = array(); 165d75e50bcSAndreas Gohr $res["x$tr"][] = array($r,$t); 166d75e50bcSAndreas Gohr } 167d75e50bcSAndreas Gohr // sort by translations 168d75e50bcSAndreas Gohr ksort($res); 169d75e50bcSAndreas Gohr // combine 170d75e50bcSAndreas Gohr $event->result = array(); 171d75e50bcSAndreas Gohr foreach($res as $r){ 172d75e50bcSAndreas Gohr foreach($r as $l){ 173d75e50bcSAndreas Gohr $event->result[$l[0]] = $l[1]; 174d75e50bcSAndreas Gohr } 175d75e50bcSAndreas Gohr } 176d75e50bcSAndreas Gohr }else{ 177d75e50bcSAndreas Gohr # legacy support for old DokuWiki hooks 178d75e50bcSAndreas Gohr 179af1904f9SAndreas Gohr // sort into translation slots 180af1904f9SAndreas Gohr $res = array(); 181af1904f9SAndreas Gohr foreach($event->result as $r){ 182af1904f9SAndreas Gohr $tr = $this->hlp->getLangPart($r); 183af1904f9SAndreas Gohr if(!is_array($res["x$tr"])) $res["x$tr"] = array(); 184af1904f9SAndreas Gohr $res["x$tr"][] = $r; 185af1904f9SAndreas Gohr } 186af1904f9SAndreas Gohr // sort by translations 187af1904f9SAndreas Gohr ksort($res); 188af1904f9SAndreas Gohr // combine 189af1904f9SAndreas Gohr $event->result = array(); 190af1904f9SAndreas Gohr foreach($res as $r){ 191af1904f9SAndreas Gohr $event->result = array_merge($event->result,$r); 192af1904f9SAndreas Gohr } 193af1904f9SAndreas Gohr } 194d75e50bcSAndreas Gohr } 195af1904f9SAndreas Gohr 1960a7415d3SAndreas Gohr} 1970a7415d3SAndreas Gohr 198ec6cbde6SDominik Eckelmann//Setup VIM: ex: et ts=4 : 199