xref: /plugin/autotranslation/action.php (revision 34591120382526d245bea04fea65e5791cb1b355)
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