xref: /plugin/combo/ComboStrap/Lang.php (revision c3437056399326d621a01da73b649707fbb0ae69)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeau
437748cd8SNickeaunamespace ComboStrap;
537748cd8SNickeau
637748cd8SNickeau
737748cd8SNickeauuse dokuwiki\Cache\Cache;
837748cd8SNickeau
9*c3437056SNickeauclass Lang extends MetadataText
1037748cd8SNickeau{
1137748cd8SNickeau
12*c3437056SNickeau    public const PROPERTY_NAME = "lang";
13*c3437056SNickeau
1437748cd8SNickeau
1537748cd8SNickeau    /**
1637748cd8SNickeau     * Process the lang attribute
1737748cd8SNickeau     * https://www.w3.org/International/questions/qa-html-language-declarations
1837748cd8SNickeau     * @param TagAttributes $attributes
1937748cd8SNickeau     *
2037748cd8SNickeau     * Language supported:
2137748cd8SNickeau     * http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
2237748cd8SNickeau     *
2337748cd8SNickeau     * Common Locale Data Repository
2437748cd8SNickeau     * http://cldr.unicode.org/
2537748cd8SNickeau     * Data:
2637748cd8SNickeau     *   * http://www.unicode.org/Public/cldr/
2737748cd8SNickeau     *   * https://github.com/unicode-cldr/
2837748cd8SNickeau     *   * https://github.com/unicode-org/cldr-json
2937748cd8SNickeau     * The ''dir'' data is known as the ''characterOrder''
3037748cd8SNickeau     *
3137748cd8SNickeau     */
3237748cd8SNickeau    public static function processLangAttribute(&$attributes)
3337748cd8SNickeau    {
3437748cd8SNickeau
3537748cd8SNickeau
3637748cd8SNickeau        /**
3737748cd8SNickeau         * Adding the lang attribute
3837748cd8SNickeau         * if set
3937748cd8SNickeau         */
40*c3437056SNickeau        if ($attributes->hasComponentAttribute(self::PROPERTY_NAME)) {
41*c3437056SNickeau            $langValue = $attributes->getValueAndRemove(self::PROPERTY_NAME);
4237748cd8SNickeau            $attributes->addHtmlAttributeValue("lang", $langValue);
4337748cd8SNickeau
4437748cd8SNickeau            $languageDataCache = new Cache("combo_" . $langValue, ".json");
4537748cd8SNickeau            $cacheDataUsable = $languageDataCache->useCache();
4637748cd8SNickeau            if (!$cacheDataUsable) {
4737748cd8SNickeau
4837748cd8SNickeau                // Language about the data
4937748cd8SNickeau                $downloadUrl = "https://raw.githubusercontent.com/unicode-org/cldr-json/master/cldr-json/cldr-misc-modern/main/$langValue/layout.json";
5037748cd8SNickeau
5137748cd8SNickeau                $filePointer = @fopen($downloadUrl, 'r');
5237748cd8SNickeau                if ($filePointer != false) {
5337748cd8SNickeau
5437748cd8SNickeau                    $numberOfByte = @file_put_contents($languageDataCache->cache, $filePointer);
5537748cd8SNickeau                    if ($numberOfByte != false) {
56*c3437056SNickeau                        LogUtility::msg("The new language data ($langValue) was downloaded", LogUtility::LVL_MSG_INFO, self::PROPERTY_NAME);
5737748cd8SNickeau                        $cacheDataUsable = true;
5837748cd8SNickeau                    } else {
59*c3437056SNickeau                        LogUtility::msg("Internal error: The language data ($langValue) could no be written to ($languageDataCache->cache)", LogUtility::LVL_MSG_ERROR, self::PROPERTY_NAME);
6037748cd8SNickeau                    }
6137748cd8SNickeau
6237748cd8SNickeau                } else {
6337748cd8SNickeau
64*c3437056SNickeau                    LogUtility::msg("The data for the language ($langValue) could not be found at ($downloadUrl).", LogUtility::LVL_MSG_ERROR, self::PROPERTY_NAME);
6537748cd8SNickeau
6637748cd8SNickeau                }
6737748cd8SNickeau            }
6837748cd8SNickeau
6937748cd8SNickeau            if ($cacheDataUsable) {
7037748cd8SNickeau                $jsonAsArray = true;
7137748cd8SNickeau                $languageData = json_decode(file_get_contents($languageDataCache->cache), $jsonAsArray);
7237748cd8SNickeau                if ($languageData == null) {
73*c3437056SNickeau                    LogUtility::msg("We could not read the data from the language ($langValue). No direction was set.", LogUtility::LVL_MSG_ERROR, self::PROPERTY_NAME);
7437748cd8SNickeau                    return;
7537748cd8SNickeau                }
7637748cd8SNickeau                $characterOrder = $languageData["main"][$langValue]["layout"]["orientation"]["characterOrder"];
7737748cd8SNickeau                if ($characterOrder == "right-to-left") {
7837748cd8SNickeau                    $attributes->addHtmlAttributeValue("dir", "rtl");
7937748cd8SNickeau                } else {
8037748cd8SNickeau                    $attributes->addHtmlAttributeValue("dir", "ltr");
8137748cd8SNickeau                }
8237748cd8SNickeau            } else {
83*c3437056SNickeau                LogUtility::msg("The language direction cannot be set because no language data was found for the language ($langValue)", LogUtility::LVL_MSG_WARNING, self::PROPERTY_NAME);
8437748cd8SNickeau            }
8537748cd8SNickeau
8637748cd8SNickeau        }
8737748cd8SNickeau
8837748cd8SNickeau    }
8937748cd8SNickeau
90*c3437056SNickeau    public static function createForPage(Page $page)
91*c3437056SNickeau    {
92*c3437056SNickeau        return (new Lang())
93*c3437056SNickeau            ->setResource($page);
94*c3437056SNickeau    }
95*c3437056SNickeau
96*c3437056SNickeau    public function getTab(): ?string
97*c3437056SNickeau    {
98*c3437056SNickeau        return MetaManagerForm::TAB_LANGUAGE_VALUE;
99*c3437056SNickeau    }
100*c3437056SNickeau
101*c3437056SNickeau    /**
102*c3437056SNickeau     * @throws ExceptionCombo
103*c3437056SNickeau     */
104*c3437056SNickeau    public function setFromStoreValue($value): Metadata
105*c3437056SNickeau    {
106*c3437056SNickeau
107*c3437056SNickeau        $this->validityCheck($value);
108*c3437056SNickeau        return parent::setFromStoreValue($value);
109*c3437056SNickeau
110*c3437056SNickeau    }
111*c3437056SNickeau
112*c3437056SNickeau    /**
113*c3437056SNickeau     * @param string|null $value
114*c3437056SNickeau     * @return Metadata
115*c3437056SNickeau     * @throws ExceptionCombo
116*c3437056SNickeau     */
117*c3437056SNickeau    public function setValue($value): Metadata
118*c3437056SNickeau    {
119*c3437056SNickeau        $this->validityCheck($value);
120*c3437056SNickeau        return parent::setValue($value);
121*c3437056SNickeau    }
122*c3437056SNickeau
123*c3437056SNickeau
124*c3437056SNickeau    public function getDescription(): string
125*c3437056SNickeau    {
126*c3437056SNickeau        return "The language of the page";
127*c3437056SNickeau    }
128*c3437056SNickeau
129*c3437056SNickeau    public function getLabel(): string
130*c3437056SNickeau    {
131*c3437056SNickeau        return "Language";
132*c3437056SNickeau    }
133*c3437056SNickeau
134*c3437056SNickeau    public static function getName(): string
135*c3437056SNickeau    {
136*c3437056SNickeau        return self::PROPERTY_NAME;
137*c3437056SNickeau    }
138*c3437056SNickeau
139*c3437056SNickeau    public function getPersistenceType(): string
140*c3437056SNickeau    {
141*c3437056SNickeau        return Metadata::PERSISTENT_METADATA;
142*c3437056SNickeau    }
143*c3437056SNickeau
144*c3437056SNickeau    public function getMutable(): bool
145*c3437056SNickeau    {
146*c3437056SNickeau        return true;
147*c3437056SNickeau    }
148*c3437056SNickeau
149*c3437056SNickeau    public function getDefaultValue()
150*c3437056SNickeau    {
151*c3437056SNickeau        return Site::getLang();
152*c3437056SNickeau    }
153*c3437056SNickeau
154*c3437056SNickeau    /**
155*c3437056SNickeau     * @throws ExceptionCombo
156*c3437056SNickeau     */
157*c3437056SNickeau    private function validityCheck($value)
158*c3437056SNickeau    {
159*c3437056SNickeau        if ($value === "" || $value === null) {
160*c3437056SNickeau            return;
161*c3437056SNickeau        }
162*c3437056SNickeau        if (!StringUtility::match($value, "^[a-zA-Z]{2}$")) {
163*c3437056SNickeau            throw new ExceptionCombo("The lang value ($value) for the page ($this) does not have two letters", $this->getCanonical());
164*c3437056SNickeau        }
165*c3437056SNickeau    }
166*c3437056SNickeau
167*c3437056SNickeau    public function getCanonical(): string
168*c3437056SNickeau    {
169*c3437056SNickeau        return "lang";
170*c3437056SNickeau    }
171*c3437056SNickeau
172*c3437056SNickeau
17337748cd8SNickeau}
174