1<?php
2
3/**
4 * DokuWiki Plugin translation (Admin Component)
5 *
6 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7 * @author  Andreas Gohr <andi@splitbrain.org>
8 */
9class admin_plugin_translation extends DokuWiki_Admin_Plugin
10{
11    /** @inheritdoc */
12    public function forAdminOnly()
13    {
14        return false;
15    }
16
17    /** @inheritdoc */
18    function handle()
19    {
20    }
21
22    /** @inheritdoc */
23    function html()
24    {
25
26        /** @var helper_plugin_translation $helper */
27        $helper = plugin_load('helper', "translation");
28        $default_language = $helper->defaultlang;
29
30        /** @var Doku_Renderer_xhtml $xhtml_renderer */
31        $xhtml_renderer = p_get_renderer('xhtml');
32
33        echo "<h1>" . $this->getLang("menu") . "</h1>";
34        echo "<table id='outdated_translations' class=\"inline\">";
35        echo "<tr><th>default: $default_language</th>";
36        if ($this->getConf('show_path')) {
37            echo "<th>" . $this->getLang('path') . "</th>";
38        }
39        foreach ($helper->translations as $t) {
40            if ($t === $default_language) {
41                continue;
42            }
43            echo "<th>$t</th>";
44        }
45        echo "</tr>";
46
47        $pages = $this->getAllPages();
48        foreach ($pages as $page) {
49            if ($helper->getLangPart($page["id"]) !== $default_language ||
50                !$helper->istranslatable($page["id"], false) ||
51                !page_exists($page["id"])
52            ) {
53                continue;
54            }
55            // We have an existing and translatable page in the default language
56            $showRow = false;
57            $row = "<tr><td>" . $xhtml_renderer->internallink($page['id'], null, null, true) . "</td>";
58            if ($this->getConf('show_path')) {
59                $row .= "<td>" . $xhtml_renderer->internallink($page['id'], $page['id'], null, true) . "</td>";
60            }
61
62            list(/* $lc */, $idpart) = $helper->getTransParts($page["id"]);
63
64            foreach ($helper->translations as $t) {
65                if ($t === $default_language) {
66                    continue;
67                }
68
69                list($translID, /* $name */) = $helper->buildTransID($t, $idpart);
70
71                $difflink = '';
72                if (!page_exists($translID)) {
73                    $class = "missing";
74                    $title = $this->getLang("missing");
75                    $showRow = true;
76                } else {
77                    $translfn = wikiFN($translID);
78                    if ($page['mtime'] > filemtime($translfn)) {
79                        $class = "outdated";
80                        $difflink = " <a href='";
81                        $difflink .= $helper->getOldDiffLink($page["id"], $page['mtime']);
82                        $difflink .= "'>(diff)</a>";
83                        $title = $this->getLang('old');
84                        $showRow = true;
85                    } else {
86                        $class = "current";
87                        $title = $this->getLang('current');
88                    }
89                }
90                $row .= "<td class='$class'>" . $xhtml_renderer->internallink($translID, $title, null,
91                        true) . $difflink . "</td>";
92            }
93            $row .= "</tr>";
94
95            if ($showRow) {
96                echo $row;
97            }
98
99        }
100        echo "</table>";
101
102    }
103
104    /**
105     * Get all pages in the translation namespace
106     *
107     * @return array
108     */
109    protected function getAllPages()
110    {
111        $namespace = $this->getConf("translationns");
112        $dir = dirname(wikiFN("$namespace:foo"));
113        $pages = array();
114        search($pages, $dir, 'search_allpages', array());
115        return $pages;
116    }
117}
118