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 23*ec6cbde6SDominik Eckelmann var $locale; 24*ec6cbde6SDominik 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? 370a7415d3SAndreas Gohr if($this->getConf('translateui')){ 38*ec6cbde6SDominik Eckelmann $scriptName = basename($_SERVER['PHP_SELF']); 39*ec6cbde6SDominik Eckelmann 40*ec6cbde6SDominik Eckelmann switch ($scriptName) { 41*ec6cbde6SDominik Eckelmann case 'js.php': 42*ec6cbde6SDominik Eckelmann $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translation_js'); 43*ec6cbde6SDominik Eckelmann break; 44*ec6cbde6SDominik Eckelmann 45*ec6cbde6SDominik Eckelmann case 'ajax.php': 46*ec6cbde6SDominik Eckelmann $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'translate_media_manager'); 47*ec6cbde6SDominik Eckelmann break; 48*ec6cbde6SDominik Eckelmann 49*ec6cbde6SDominik Eckelmann case 'mediamanager.php': 50*ec6cbde6SDominik Eckelmann $controller->register_hook('MEDIAMANAGER_STARTED', 'BEFORE', $this, 'translation_hook'); 51*ec6cbde6SDominik Eckelmann $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); 52*ec6cbde6SDominik Eckelmann break; 53*ec6cbde6SDominik Eckelmann 54*ec6cbde6SDominik Eckelmann default: 550a7415d3SAndreas Gohr $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'translation_hook'); 56*ec6cbde6SDominik Eckelmann $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey'); 57*ec6cbde6SDominik Eckelmann } 580a7415d3SAndreas Gohr } 59af1904f9SAndreas Gohr $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'translation_search'); 600a7415d3SAndreas Gohr } 610a7415d3SAndreas Gohr 62*ec6cbde6SDominik Eckelmann function setJsCacheKey(&$event, $args) { 63*ec6cbde6SDominik Eckelmann if (!isset($this->locale)) return false; 64*ec6cbde6SDominik Eckelmann $count = count($event->data['script']); 65*ec6cbde6SDominik Eckelmann for ($i = 0; $i<$count; $i++) { 66*ec6cbde6SDominik Eckelmann if (strpos($event->data['script'][$i]['src'], '/lib/exe/js.php') !== false) { 67*ec6cbde6SDominik Eckelmann $event->data['script'][$i]['src'] .= "&cacheKey=$this->locale"; 68*ec6cbde6SDominik Eckelmann } 69*ec6cbde6SDominik Eckelmann } 70*ec6cbde6SDominik Eckelmann 71*ec6cbde6SDominik Eckelmann return false; 72*ec6cbde6SDominik Eckelmann } 73*ec6cbde6SDominik Eckelmann 74*ec6cbde6SDominik Eckelmann function translation_js(&$event, $args) { 75*ec6cbde6SDominik Eckelmann if (!isset($_GET['cacheKey'])) return false; 76*ec6cbde6SDominik Eckelmann 77*ec6cbde6SDominik Eckelmann $key = $_GET['cacheKey']; 78*ec6cbde6SDominik Eckelmann $event->data = $key; 79*ec6cbde6SDominik Eckelmann $conf['lang'] = $key; 80*ec6cbde6SDominik Eckelmann return false; 81*ec6cbde6SDominik Eckelmann } 82*ec6cbde6SDominik Eckelmann 83*ec6cbde6SDominik Eckelmann function translate_media_manager(&$event, $args) { 84*ec6cbde6SDominik Eckelmann global $conf; 85*ec6cbde6SDominik Eckelmann if (isset($_REQUEST['ID'])) { 86*ec6cbde6SDominik Eckelmann $id = getID(); 87*ec6cbde6SDominik Eckelmann $lc = $this->hlp->getLangPart($id); 88*ec6cbde6SDominik Eckelmann } elseif (isset($_SESSION[DOKU_COOKIE]['translationlc'])) { 89*ec6cbde6SDominik Eckelmann $lc = $_SESSION[DOKU_COOKIE]['translationlc']; 90*ec6cbde6SDominik Eckelmann } else { 91*ec6cbde6SDominik Eckelmann return false; 92*ec6cbde6SDominik Eckelmann } 93*ec6cbde6SDominik Eckelmann $conf['lang'] = $lc; 94*ec6cbde6SDominik Eckelmann $event->data = $lc; 95*ec6cbde6SDominik Eckelmann return false; 96*ec6cbde6SDominik Eckelmann } 97*ec6cbde6SDominik Eckelmann 980a7415d3SAndreas Gohr /** 990a7415d3SAndreas Gohr * Change the UI language in foreign language namespaces 1000a7415d3SAndreas Gohr */ 1010a7415d3SAndreas Gohr function translation_hook(&$event, $args) { 1020a7415d3SAndreas Gohr global $ID; 1030a7415d3SAndreas Gohr global $lang; 1040a7415d3SAndreas Gohr global $conf; 1057053cd66SAndreas Gohr global $ACT; 1067053cd66SAndreas Gohr // redirect away from start page? 1077053cd66SAndreas Gohr if($this->conf['redirectstart'] && $ID == $conf['start'] && $ACT == 'show'){ 1087053cd66SAndreas Gohr $lc = $this->hlp->getBrowserLang(); 1097053cd66SAndreas Gohr if(!$lc) $lc = $conf['lang']; 1107053cd66SAndreas Gohr header('Location: '.wl($lc.':'.$conf['start'],'',true,'&')); 1117053cd66SAndreas Gohr exit; 1127053cd66SAndreas Gohr } 1130a7415d3SAndreas Gohr 1140a7415d3SAndreas Gohr // check if we are in a foreign language namespace 115af1904f9SAndreas Gohr $lc = $this->hlp->getLangPart($ID); 116a526927fSAndreas Gohr 117a526927fSAndreas Gohr // store language in session 1184616cf2cSAndreas Gohr if($ACT == 'show') $_SESSION[DOKU_COOKIE]['translationlc'] = $lc; 119a526927fSAndreas Gohr if(!$lc) $lc = $_SESSION[DOKU_COOKIE]['translationlc']; 120a526927fSAndreas Gohr if(!$lc) return; 1210a7415d3SAndreas Gohr 1220a7415d3SAndreas Gohr if(file_exists(DOKU_INC.'inc/lang/'.$lc.'/lang.php')) { 1230a7415d3SAndreas Gohr require(DOKU_INC.'inc/lang/'.$lc.'/lang.php'); 1240a7415d3SAndreas Gohr } 1250a7415d3SAndreas Gohr $conf['lang_before_translation'] = $conf['lang']; //store for later access in syntax plugin 1260a7415d3SAndreas Gohr $conf['lang'] = $lc; 127*ec6cbde6SDominik Eckelmann $this->locale = $lc; 1280a7415d3SAndreas Gohr 1290a7415d3SAndreas Gohr return true; 1300a7415d3SAndreas Gohr } 131af1904f9SAndreas Gohr 132af1904f9SAndreas Gohr /** 133af1904f9SAndreas Gohr * Resort page match results so that results are ordered by translation, having the 134af1904f9SAndreas Gohr * default language first 135af1904f9SAndreas Gohr */ 136af1904f9SAndreas Gohr function translation_search(&$event, $args) { 137d75e50bcSAndreas Gohr 138d75e50bcSAndreas Gohr if($event->data['has_titles']){ 139d75e50bcSAndreas Gohr // sort into translation slots 140d75e50bcSAndreas Gohr $res = array(); 141d75e50bcSAndreas Gohr foreach($event->result as $r => $t){ 142d75e50bcSAndreas Gohr $tr = $this->hlp->getLangPart($r); 143d75e50bcSAndreas Gohr if(!is_array($res["x$tr"])) $res["x$tr"] = array(); 144d75e50bcSAndreas Gohr $res["x$tr"][] = array($r,$t); 145d75e50bcSAndreas Gohr } 146d75e50bcSAndreas Gohr // sort by translations 147d75e50bcSAndreas Gohr ksort($res); 148d75e50bcSAndreas Gohr // combine 149d75e50bcSAndreas Gohr $event->result = array(); 150d75e50bcSAndreas Gohr foreach($res as $r){ 151d75e50bcSAndreas Gohr foreach($r as $l){ 152d75e50bcSAndreas Gohr $event->result[$l[0]] = $l[1]; 153d75e50bcSAndreas Gohr } 154d75e50bcSAndreas Gohr } 155d75e50bcSAndreas Gohr }else{ 156d75e50bcSAndreas Gohr # legacy support for old DokuWiki hooks 157d75e50bcSAndreas Gohr 158af1904f9SAndreas Gohr // sort into translation slots 159af1904f9SAndreas Gohr $res = array(); 160af1904f9SAndreas Gohr foreach($event->result as $r){ 161af1904f9SAndreas Gohr $tr = $this->hlp->getLangPart($r); 162af1904f9SAndreas Gohr if(!is_array($res["x$tr"])) $res["x$tr"] = array(); 163af1904f9SAndreas Gohr $res["x$tr"][] = $r; 164af1904f9SAndreas Gohr } 165af1904f9SAndreas Gohr // sort by translations 166af1904f9SAndreas Gohr ksort($res); 167af1904f9SAndreas Gohr // combine 168af1904f9SAndreas Gohr $event->result = array(); 169af1904f9SAndreas Gohr foreach($res as $r){ 170af1904f9SAndreas Gohr $event->result = array_merge($event->result,$r); 171af1904f9SAndreas Gohr } 172af1904f9SAndreas Gohr } 173d75e50bcSAndreas Gohr } 174af1904f9SAndreas Gohr 1750a7415d3SAndreas Gohr} 1760a7415d3SAndreas Gohr 177*ec6cbde6SDominik Eckelmann//Setup VIM: ex: et ts=4 : 178