xref: /plugin/combo/action/lang.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeauuse ComboStrap\DatabasePageRow;
4*04fd306cSNickeauuse ComboStrap\WikiPath;
5*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
6*04fd306cSNickeauuse ComboStrap\FileSystems;
7*04fd306cSNickeauuse ComboStrap\LogUtility;
8*04fd306cSNickeauuse ComboStrap\MarkupPath;
9*04fd306cSNickeauuse ComboStrap\PageUrlPath;
10*04fd306cSNickeauuse ComboStrap\PluginUtility;
11*04fd306cSNickeau
12*04fd306cSNickeau
13*04fd306cSNickeau/**
14*04fd306cSNickeau *   * Change the lang of the page if present
15*04fd306cSNickeau *   * Modify some style
16*04fd306cSNickeau */
17*04fd306cSNickeauclass action_plugin_combo_lang extends DokuWiki_Action_Plugin
18*04fd306cSNickeau{
19*04fd306cSNickeau
20*04fd306cSNickeau    const CANONICAL = "lang";
21*04fd306cSNickeau
22*04fd306cSNickeau    /**
23*04fd306cSNickeau     *
24*04fd306cSNickeau     * hack as:
25*04fd306cSNickeau     *   * {@link getID()} invoked later reads the id from the input variable
26*04fd306cSNickeau     *   * {@link PluginUtility::getRequestedWikiId()} read it then also
27*04fd306cSNickeau     *
28*04fd306cSNickeau     * @param string $normalizedId
29*04fd306cSNickeau     * @return void
30*04fd306cSNickeau     */
31*04fd306cSNickeau    private static function setNormalizedId(string $normalizedId)
32*04fd306cSNickeau    {
33*04fd306cSNickeau        global $INPUT;
34*04fd306cSNickeau        $INPUT->set("id", $normalizedId);
35*04fd306cSNickeau    }
36*04fd306cSNickeau
37*04fd306cSNickeau    public function register(Doku_Event_Handler $controller)
38*04fd306cSNickeau    {
39*04fd306cSNickeau
40*04fd306cSNickeau        /**
41*04fd306cSNickeau         * https://www.dokuwiki.org/devel:event:init_lang_load
42*04fd306cSNickeau         */
43*04fd306cSNickeau        $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'load_lang', array());
44*04fd306cSNickeau        $controller->register_hook('INIT_LANG_LOAD', 'AFTER', $this, 'modifyRtlStyling', array());
45*04fd306cSNickeau
46*04fd306cSNickeau
47*04fd306cSNickeau    }
48*04fd306cSNickeau
49*04fd306cSNickeau    public function load_lang(Doku_Event $event, $param)
50*04fd306cSNickeau    {
51*04fd306cSNickeau        /**
52*04fd306cSNickeau         * On the test setup of Dokuwiki
53*04fd306cSNickeau         * this event is send without any context
54*04fd306cSNickeau         * data
55*04fd306cSNickeau         *
56*04fd306cSNickeau         * This event is send before DokuWiki environment has initialized
57*04fd306cSNickeau         * unfortunately
58*04fd306cSNickeau         *
59*04fd306cSNickeau         * We don't have any ID and we can't set them because
60*04fd306cSNickeau         * they will be overwritten by calling the {@link getID()} function
61*04fd306cSNickeau         *
62*04fd306cSNickeau         */
63*04fd306cSNickeau        /**
64*04fd306cSNickeau         * Arabic characters should not be deleted, otherwise the page id abbr becomes the last name
65*04fd306cSNickeau         * when URL encoding is used with arabic language
66*04fd306cSNickeau         * ie:
67*04fd306cSNickeau         * locale:%F8%B5%F9%81%F8%AD%F8%A9-id1tgpx9
68*04fd306cSNickeau         * becomes
69*04fd306cSNickeau         * locale:id1tgpx9
70*04fd306cSNickeau         */
71*04fd306cSNickeau        $clean = false;
72*04fd306cSNickeau        /** @noinspection PhpConditionAlreadyCheckedInspection */
73*04fd306cSNickeau        $id = getID("id", $clean);
74*04fd306cSNickeau        $id = WikiPath::normalizeWikiPath($id);
75*04fd306cSNickeau        self::setNormalizedId($id);
76*04fd306cSNickeau        $page = MarkupPath::createMarkupFromId($id);
77*04fd306cSNickeau        if (!FileSystems::exists($page->getPathObject())) {
78*04fd306cSNickeau            // Is it a permanent link
79*04fd306cSNickeau            try {
80*04fd306cSNickeau                $lastPartName = $page->getPathObject()->getLastNameWithoutExtension();
81*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
82*04fd306cSNickeau                // only the root does not have any name, it should therefore never happen
83*04fd306cSNickeau                LogUtility::internalError("No last name, we were unable to set the request id right", self::CANONICAL);
84*04fd306cSNickeau                return;
85*04fd306cSNickeau            }
86*04fd306cSNickeau            $encodedPageId = PageUrlPath::getShortEncodedPageIdFromUrlId($lastPartName);
87*04fd306cSNickeau            if ($encodedPageId !== null) {
88*04fd306cSNickeau                $pageId = PageUrlPath::decodePageId($encodedPageId);
89*04fd306cSNickeau                if ($pageId !== null) {
90*04fd306cSNickeau                    $page = DatabasePageRow::createFromPageIdAbbr($pageId)->getMarkupPath();
91*04fd306cSNickeau                    if ($page === null) {
92*04fd306cSNickeau                        return;
93*04fd306cSNickeau                    }
94*04fd306cSNickeau                    if (!FileSystems::exists($page->getPathObject())) {
95*04fd306cSNickeau                        return;
96*04fd306cSNickeau                    }
97*04fd306cSNickeau
98*04fd306cSNickeau                    self::setNormalizedId($page->getPathObject()->getWikiId());
99*04fd306cSNickeau
100*04fd306cSNickeau                }
101*04fd306cSNickeau            }
102*04fd306cSNickeau        }
103*04fd306cSNickeau        $pageLang = $page->getLangOrDefault();
104*04fd306cSNickeau        global $conf;
105*04fd306cSNickeau        $initialLang = $event->data;
106*04fd306cSNickeau        if ($initialLang !== $pageLang) {
107*04fd306cSNickeau            $conf['lang'] = $pageLang;
108*04fd306cSNickeau            $event->data = $pageLang;
109*04fd306cSNickeau        }
110*04fd306cSNickeau
111*04fd306cSNickeau
112*04fd306cSNickeau    }
113*04fd306cSNickeau
114*04fd306cSNickeau    /**
115*04fd306cSNickeau     *
116*04fd306cSNickeau     *
117*04fd306cSNickeau     * In case of a RTL lang, we put the secedit button to the left
118*04fd306cSNickeau     *
119*04fd306cSNickeau     * @param Doku_Event $event
120*04fd306cSNickeau     * @param $params
121*04fd306cSNickeau     *
122*04fd306cSNickeau     */
123*04fd306cSNickeau    function modifyRtlStyling(Doku_Event $event, $params)
124*04fd306cSNickeau    {
125*04fd306cSNickeau
126*04fd306cSNickeau        /**
127*04fd306cSNickeau         * Lang for a page
128*04fd306cSNickeau         *
129*04fd306cSNickeau         * https://www.w3.org/International/questions/qa-html-language-declarations
130*04fd306cSNickeau         *   * Always use a language attribute on the html element.
131*04fd306cSNickeau         *   * When serving XHTML 1.x (ie. using a MIME type such as application/xhtml+xml),
132*04fd306cSNickeau         * use both the lang attribute and the xml:lang attribute together
133*04fd306cSNickeau         *
134*04fd306cSNickeau         * See also {@link \ComboStrap\Lang::processLangAttribute()} for the localization of an element
135*04fd306cSNickeau         *
136*04fd306cSNickeau         * put the button to the end when the page has a language direction of rtl
137*04fd306cSNickeau         */
138*04fd306cSNickeau        global $lang;
139*04fd306cSNickeau        if ($lang['direction'] === "rtl") {
140*04fd306cSNickeau            PluginUtility::getSnippetManager()->attachCssInternalStylesheet(self::CANONICAL . "-rtl");
141*04fd306cSNickeau        }
142*04fd306cSNickeau
143*04fd306cSNickeau
144*04fd306cSNickeau    }
145*04fd306cSNickeau
146*04fd306cSNickeau
147*04fd306cSNickeau}
148*04fd306cSNickeau
149*04fd306cSNickeau
150*04fd306cSNickeau
151