xref: /plugin/autotranslation/action.php (revision db7c51b46b8370cf073d5843b91e3097b3ea2cdb)
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');
43*db7c51b4SAndreas 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('MEDIAMANAGER_STARTED', 'BEFORE', $this, 'translation_hook');
52ec6cbde6SDominik Eckelmann                    $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey');
53ec6cbde6SDominik Eckelmann                    break;
54ec6cbde6SDominik Eckelmann
55ec6cbde6SDominik Eckelmann                default:
560a7415d3SAndreas Gohr                    $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'translation_hook');
57ec6cbde6SDominik Eckelmann                    $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'setJsCacheKey');
58ec6cbde6SDominik Eckelmann            }
590a7415d3SAndreas Gohr        }
60af1904f9SAndreas Gohr        $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'translation_search');
610a7415d3SAndreas Gohr    }
620a7415d3SAndreas Gohr
63ec6cbde6SDominik Eckelmann    function setJsCacheKey(&$event, $args) {
64ec6cbde6SDominik Eckelmann        if (!isset($this->locale)) return false;
65ec6cbde6SDominik Eckelmann        $count = count($event->data['script']);
66ec6cbde6SDominik Eckelmann        for ($i = 0; $i<$count; $i++) {
67ec6cbde6SDominik Eckelmann            if (strpos($event->data['script'][$i]['src'], '/lib/exe/js.php') !== false) {
68*db7c51b4SAndreas Gohr                $event->data['script'][$i]['src'] .= '&lang='.hsc($this->locale);
69ec6cbde6SDominik Eckelmann            }
70ec6cbde6SDominik Eckelmann        }
71ec6cbde6SDominik Eckelmann
72ec6cbde6SDominik Eckelmann        return false;
73ec6cbde6SDominik Eckelmann    }
74ec6cbde6SDominik Eckelmann
75ec6cbde6SDominik Eckelmann    function translation_js(&$event, $args) {
761797705cSDominik Eckelmann        global $conf;
77*db7c51b4SAndreas Gohr        if(!isset($_GET['lang'])) return;
78*db7c51b4SAndreas Gohr        if(!in_array($_GET['lang'],$this->hlp->trans)) return;
79*db7c51b4SAndreas Gohr        $lang = $_GET['lang'];
80*db7c51b4SAndreas Gohr        $event->data = $lang;
81*db7c51b4SAndreas Gohr        $conf['lang'] = $lang;
82*db7c51b4SAndreas Gohr    }
83ec6cbde6SDominik Eckelmann
84*db7c51b4SAndreas Gohr    function translation_jscache(&$event, $args) {
85*db7c51b4SAndreas Gohr        if (!isset($_GET['lang'])) return;
86*db7c51b4SAndreas Gohr        if(!in_array($_GET['lang'],$this->hlp->trans)) return;
87*db7c51b4SAndreas Gohr
88*db7c51b4SAndreas Gohr        $lang = $_GET['lang'];
89*db7c51b4SAndreas Gohr        // reuse the constructor to reinitialize the cache key
90*db7c51b4SAndreas Gohr        $event->data->cache(
91*db7c51b4SAndreas Gohr            $event->data->key . $lang,
92*db7c51b4SAndreas Gohr            $event->data->ext
93*db7c51b4SAndreas Gohr        );
94ec6cbde6SDominik Eckelmann    }
95ec6cbde6SDominik Eckelmann
96ec6cbde6SDominik Eckelmann    function translate_media_manager(&$event, $args) {
97ec6cbde6SDominik Eckelmann        global $conf;
98ec6cbde6SDominik Eckelmann        if (isset($_REQUEST['ID'])) {
99ec6cbde6SDominik Eckelmann            $id = getID();
100ec6cbde6SDominik Eckelmann            $lc = $this->hlp->getLangPart($id);
101ec6cbde6SDominik Eckelmann        } elseif (isset($_SESSION[DOKU_COOKIE]['translationlc'])) {
102ec6cbde6SDominik Eckelmann            $lc = $_SESSION[DOKU_COOKIE]['translationlc'];
103ec6cbde6SDominik Eckelmann        } else {
104*db7c51b4SAndreas Gohr            return;
105ec6cbde6SDominik Eckelmann        }
106ec6cbde6SDominik Eckelmann        $conf['lang'] = $lc;
107ec6cbde6SDominik Eckelmann        $event->data = $lc;
108ec6cbde6SDominik Eckelmann    }
109ec6cbde6SDominik Eckelmann
1100a7415d3SAndreas Gohr    /**
1110a7415d3SAndreas Gohr     * Change the UI language in foreign language namespaces
1120a7415d3SAndreas Gohr     */
1130a7415d3SAndreas Gohr    function translation_hook(&$event, $args) {
1140a7415d3SAndreas Gohr        global $ID;
1150a7415d3SAndreas Gohr        global $lang;
1160a7415d3SAndreas Gohr        global $conf;
1177053cd66SAndreas Gohr        global $ACT;
1187053cd66SAndreas Gohr        // redirect away from start page?
1197053cd66SAndreas Gohr        if($this->conf['redirectstart'] && $ID == $conf['start'] && $ACT == 'show'){
1207053cd66SAndreas Gohr            $lc = $this->hlp->getBrowserLang();
1217053cd66SAndreas Gohr            if(!$lc) $lc = $conf['lang'];
1227053cd66SAndreas Gohr            header('Location: '.wl($lc.':'.$conf['start'],'',true,'&'));
1237053cd66SAndreas Gohr            exit;
1247053cd66SAndreas Gohr        }
1250a7415d3SAndreas Gohr
1260a7415d3SAndreas Gohr        // check if we are in a foreign language namespace
127af1904f9SAndreas Gohr        $lc = $this->hlp->getLangPart($ID);
128a526927fSAndreas Gohr
129f2279247SAndreas Gohr        // store language in session (for page related views only)
130f2279247SAndreas Gohr        if(in_array($ACT,array('show','recent','diff','edit','preview','source','subscribe'))){
131f2279247SAndreas Gohr            $_SESSION[DOKU_COOKIE]['translationlc'] = $lc;
132f2279247SAndreas Gohr        }
133a526927fSAndreas Gohr        if(!$lc) $lc = $_SESSION[DOKU_COOKIE]['translationlc'];
134a526927fSAndreas Gohr        if(!$lc) return;
1350a7415d3SAndreas Gohr
1360a7415d3SAndreas Gohr        if(file_exists(DOKU_INC.'inc/lang/'.$lc.'/lang.php')) {
1370a7415d3SAndreas Gohr          require(DOKU_INC.'inc/lang/'.$lc.'/lang.php');
1380a7415d3SAndreas Gohr        }
1390a7415d3SAndreas Gohr        $conf['lang_before_translation'] = $conf['lang']; //store for later access in syntax plugin
1400a7415d3SAndreas Gohr        $conf['lang'] = $lc;
141ec6cbde6SDominik Eckelmann        $this->locale = $lc;
1420a7415d3SAndreas Gohr
1430a7415d3SAndreas Gohr        return true;
1440a7415d3SAndreas Gohr    }
145af1904f9SAndreas Gohr
146af1904f9SAndreas Gohr    /**
147af1904f9SAndreas Gohr     * Resort page match results so that results are ordered by translation, having the
148af1904f9SAndreas Gohr     * default language first
149af1904f9SAndreas Gohr     */
150af1904f9SAndreas Gohr    function translation_search(&$event, $args) {
151d75e50bcSAndreas Gohr
152d75e50bcSAndreas Gohr        if($event->data['has_titles']){
153d75e50bcSAndreas Gohr            // sort into translation slots
154d75e50bcSAndreas Gohr            $res = array();
155d75e50bcSAndreas Gohr            foreach($event->result as $r => $t){
156d75e50bcSAndreas Gohr                $tr = $this->hlp->getLangPart($r);
157d75e50bcSAndreas Gohr                if(!is_array($res["x$tr"])) $res["x$tr"] = array();
158d75e50bcSAndreas Gohr                $res["x$tr"][] = array($r,$t);
159d75e50bcSAndreas Gohr            }
160d75e50bcSAndreas Gohr            // sort by translations
161d75e50bcSAndreas Gohr            ksort($res);
162d75e50bcSAndreas Gohr            // combine
163d75e50bcSAndreas Gohr            $event->result = array();
164d75e50bcSAndreas Gohr            foreach($res as $r){
165d75e50bcSAndreas Gohr                foreach($r as $l){
166d75e50bcSAndreas Gohr                    $event->result[$l[0]] = $l[1];
167d75e50bcSAndreas Gohr                }
168d75e50bcSAndreas Gohr            }
169d75e50bcSAndreas Gohr        }else{
170d75e50bcSAndreas Gohr            # legacy support for old DokuWiki hooks
171d75e50bcSAndreas Gohr
172af1904f9SAndreas Gohr            // sort into translation slots
173af1904f9SAndreas Gohr            $res = array();
174af1904f9SAndreas Gohr            foreach($event->result as $r){
175af1904f9SAndreas Gohr                $tr = $this->hlp->getLangPart($r);
176af1904f9SAndreas Gohr                if(!is_array($res["x$tr"])) $res["x$tr"] = array();
177af1904f9SAndreas Gohr                $res["x$tr"][] = $r;
178af1904f9SAndreas Gohr            }
179af1904f9SAndreas Gohr            // sort by translations
180af1904f9SAndreas Gohr            ksort($res);
181af1904f9SAndreas Gohr            // combine
182af1904f9SAndreas Gohr            $event->result = array();
183af1904f9SAndreas Gohr            foreach($res as $r){
184af1904f9SAndreas Gohr                $event->result = array_merge($event->result,$r);
185af1904f9SAndreas Gohr            }
186af1904f9SAndreas Gohr        }
187d75e50bcSAndreas Gohr    }
188af1904f9SAndreas Gohr
1890a7415d3SAndreas Gohr}
1900a7415d3SAndreas Gohr
191ec6cbde6SDominik Eckelmann//Setup VIM: ex: et ts=4 :
192