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