xref: /plugin/combo/action/lang.php (revision ad54dffd2a785f08006601bf247e440e47fc7b18)
104fd306cSNickeau<?php
204fd306cSNickeau
3*ad54dffdSgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php');
4*ad54dffdSgerardnico
504fd306cSNickeauuse ComboStrap\DatabasePageRow;
604fd306cSNickeauuse ComboStrap\WikiPath;
704fd306cSNickeauuse ComboStrap\ExceptionNotFound;
804fd306cSNickeauuse ComboStrap\FileSystems;
904fd306cSNickeauuse ComboStrap\LogUtility;
1004fd306cSNickeauuse ComboStrap\MarkupPath;
1104fd306cSNickeauuse ComboStrap\PageUrlPath;
1204fd306cSNickeauuse ComboStrap\PluginUtility;
1304fd306cSNickeau
1404fd306cSNickeau
1504fd306cSNickeau/**
1604fd306cSNickeau *   * Change the lang of the page if present
1704fd306cSNickeau *   * Modify some style
1804fd306cSNickeau */
1904fd306cSNickeauclass action_plugin_combo_lang extends DokuWiki_Action_Plugin
2004fd306cSNickeau{
2104fd306cSNickeau
2204fd306cSNickeau    const CANONICAL = "lang";
2304fd306cSNickeau
2404fd306cSNickeau    /**
2504fd306cSNickeau     *
2604fd306cSNickeau     * hack as:
2704fd306cSNickeau     *   * {@link getID()} invoked later reads the id from the input variable
2804fd306cSNickeau     *   * {@link PluginUtility::getRequestedWikiId()} read it then also
2904fd306cSNickeau     *
3004fd306cSNickeau     * @param string $normalizedId
3104fd306cSNickeau     * @return void
3204fd306cSNickeau     */
3304fd306cSNickeau    private static function setNormalizedId(string $normalizedId)
3404fd306cSNickeau    {
3504fd306cSNickeau        global $INPUT;
3604fd306cSNickeau        $INPUT->set("id", $normalizedId);
3704fd306cSNickeau    }
3804fd306cSNickeau
3904fd306cSNickeau    public function register(Doku_Event_Handler $controller)
4004fd306cSNickeau    {
4104fd306cSNickeau
4204fd306cSNickeau        /**
4304fd306cSNickeau         * https://www.dokuwiki.org/devel:event:init_lang_load
4404fd306cSNickeau         */
4504fd306cSNickeau        $controller->register_hook('INIT_LANG_LOAD', 'BEFORE', $this, 'load_lang', array());
4604fd306cSNickeau        $controller->register_hook('INIT_LANG_LOAD', 'AFTER', $this, 'modifyRtlStyling', array());
4704fd306cSNickeau
4804fd306cSNickeau
4904fd306cSNickeau    }
5004fd306cSNickeau
5104fd306cSNickeau    public function load_lang(Doku_Event $event, $param)
5204fd306cSNickeau    {
5304fd306cSNickeau        /**
5404fd306cSNickeau         * On the test setup of Dokuwiki
5504fd306cSNickeau         * this event is send without any context
5604fd306cSNickeau         * data
5704fd306cSNickeau         *
5804fd306cSNickeau         * This event is send before DokuWiki environment has initialized
5904fd306cSNickeau         * unfortunately
6004fd306cSNickeau         *
6104fd306cSNickeau         * We don't have any ID and we can't set them because
6204fd306cSNickeau         * they will be overwritten by calling the {@link getID()} function
6304fd306cSNickeau         *
6404fd306cSNickeau         */
6504fd306cSNickeau        /**
6604fd306cSNickeau         * Arabic characters should not be deleted, otherwise the page id abbr becomes the last name
6704fd306cSNickeau         * when URL encoding is used with arabic language
6804fd306cSNickeau         * ie:
6904fd306cSNickeau         * locale:%F8%B5%F9%81%F8%AD%F8%A9-id1tgpx9
7004fd306cSNickeau         * becomes
7104fd306cSNickeau         * locale:id1tgpx9
7204fd306cSNickeau         */
7304fd306cSNickeau        $clean = false;
7404fd306cSNickeau        /** @noinspection PhpConditionAlreadyCheckedInspection */
7504fd306cSNickeau        $id = getID("id", $clean);
7604fd306cSNickeau        $id = WikiPath::normalizeWikiPath($id);
7704fd306cSNickeau        self::setNormalizedId($id);
7804fd306cSNickeau        $page = MarkupPath::createMarkupFromId($id);
7904fd306cSNickeau        if (!FileSystems::exists($page->getPathObject())) {
8004fd306cSNickeau            // Is it a permanent link
8104fd306cSNickeau            try {
8204fd306cSNickeau                $lastPartName = $page->getPathObject()->getLastNameWithoutExtension();
8304fd306cSNickeau            } catch (ExceptionNotFound $e) {
8404fd306cSNickeau                // only the root does not have any name, it should therefore never happen
8504fd306cSNickeau                LogUtility::internalError("No last name, we were unable to set the request id right", self::CANONICAL);
8604fd306cSNickeau                return;
8704fd306cSNickeau            }
8804fd306cSNickeau            $encodedPageId = PageUrlPath::getShortEncodedPageIdFromUrlId($lastPartName);
8904fd306cSNickeau            if ($encodedPageId !== null) {
9004fd306cSNickeau                $pageId = PageUrlPath::decodePageId($encodedPageId);
9104fd306cSNickeau                if ($pageId !== null) {
9204fd306cSNickeau                    $page = DatabasePageRow::createFromPageIdAbbr($pageId)->getMarkupPath();
9304fd306cSNickeau                    if ($page === null) {
9404fd306cSNickeau                        return;
9504fd306cSNickeau                    }
9604fd306cSNickeau                    if (!FileSystems::exists($page->getPathObject())) {
9704fd306cSNickeau                        return;
9804fd306cSNickeau                    }
9904fd306cSNickeau
10004fd306cSNickeau                    self::setNormalizedId($page->getPathObject()->getWikiId());
10104fd306cSNickeau
10204fd306cSNickeau                }
10304fd306cSNickeau            }
10404fd306cSNickeau        }
10504fd306cSNickeau        $pageLang = $page->getLangOrDefault();
10604fd306cSNickeau        global $conf;
10704fd306cSNickeau        $initialLang = $event->data;
10804fd306cSNickeau        if ($initialLang !== $pageLang) {
10904fd306cSNickeau            $conf['lang'] = $pageLang;
11004fd306cSNickeau            $event->data = $pageLang;
11104fd306cSNickeau        }
11204fd306cSNickeau
11304fd306cSNickeau
11404fd306cSNickeau    }
11504fd306cSNickeau
11604fd306cSNickeau    /**
11704fd306cSNickeau     *
11804fd306cSNickeau     *
11904fd306cSNickeau     * In case of a RTL lang, we put the secedit button to the left
12004fd306cSNickeau     *
12104fd306cSNickeau     * @param Doku_Event $event
12204fd306cSNickeau     * @param $params
12304fd306cSNickeau     *
12404fd306cSNickeau     */
12504fd306cSNickeau    function modifyRtlStyling(Doku_Event $event, $params)
12604fd306cSNickeau    {
12704fd306cSNickeau
12804fd306cSNickeau        /**
12904fd306cSNickeau         * Lang for a page
13004fd306cSNickeau         *
13104fd306cSNickeau         * https://www.w3.org/International/questions/qa-html-language-declarations
13204fd306cSNickeau         *   * Always use a language attribute on the html element.
13304fd306cSNickeau         *   * When serving XHTML 1.x (ie. using a MIME type such as application/xhtml+xml),
13404fd306cSNickeau         * use both the lang attribute and the xml:lang attribute together
13504fd306cSNickeau         *
13604fd306cSNickeau         * See also {@link \ComboStrap\Lang::processLangAttribute()} for the localization of an element
13704fd306cSNickeau         *
13804fd306cSNickeau         * put the button to the end when the page has a language direction of rtl
13904fd306cSNickeau         */
14004fd306cSNickeau        global $lang;
14104fd306cSNickeau        if ($lang['direction'] === "rtl") {
14204fd306cSNickeau            PluginUtility::getSnippetManager()->attachCssInternalStylesheet(self::CANONICAL . "-rtl");
14304fd306cSNickeau        }
14404fd306cSNickeau
14504fd306cSNickeau
14604fd306cSNickeau    }
14704fd306cSNickeau
14804fd306cSNickeau
14904fd306cSNickeau}
15004fd306cSNickeau
15104fd306cSNickeau
15204fd306cSNickeau
153