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