xref: /plugin/combo/ComboStrap/Lang.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeau
437748cd8SNickeaunamespace ComboStrap;
537748cd8SNickeau
637748cd8SNickeau
737748cd8SNickeauuse dokuwiki\Cache\Cache;
837748cd8SNickeau
9c3437056SNickeauclass Lang extends MetadataText
1037748cd8SNickeau{
1137748cd8SNickeau
12c3437056SNickeau    public const PROPERTY_NAME = "lang";
13c3437056SNickeau
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         */
40c3437056SNickeau        if ($attributes->hasComponentAttribute(self::PROPERTY_NAME)) {
41c3437056SNickeau            $langValue = $attributes->getValueAndRemove(self::PROPERTY_NAME);
42*4cadd4f8SNickeau            $attributes->addOutputAttributeValue("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) {
56c3437056SNickeau                        LogUtility::msg("The new language data ($langValue) was downloaded", LogUtility::LVL_MSG_INFO, self::PROPERTY_NAME);
5737748cd8SNickeau                        $cacheDataUsable = true;
5837748cd8SNickeau                    } else {
59c3437056SNickeau                        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
64c3437056SNickeau                    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) {
73c3437056SNickeau                    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") {
78*4cadd4f8SNickeau                    $attributes->addOutputAttributeValue("dir", "rtl");
7937748cd8SNickeau                } else {
80*4cadd4f8SNickeau                    $attributes->addOutputAttributeValue("dir", "ltr");
8137748cd8SNickeau                }
8237748cd8SNickeau            } else {
83c3437056SNickeau                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
90c3437056SNickeau    public static function createForPage(Page $page)
91c3437056SNickeau    {
92c3437056SNickeau        return (new Lang())
93c3437056SNickeau            ->setResource($page);
94c3437056SNickeau    }
95c3437056SNickeau
96c3437056SNickeau    public function getTab(): ?string
97c3437056SNickeau    {
98c3437056SNickeau        return MetaManagerForm::TAB_LANGUAGE_VALUE;
99c3437056SNickeau    }
100c3437056SNickeau
101c3437056SNickeau    /**
102c3437056SNickeau     * @throws ExceptionCombo
103c3437056SNickeau     */
104c3437056SNickeau    public function setFromStoreValue($value): Metadata
105c3437056SNickeau    {
106c3437056SNickeau
107c3437056SNickeau        $this->validityCheck($value);
108c3437056SNickeau        return parent::setFromStoreValue($value);
109c3437056SNickeau
110c3437056SNickeau    }
111c3437056SNickeau
112c3437056SNickeau    /**
113c3437056SNickeau     * @param string|null $value
114c3437056SNickeau     * @return Metadata
115c3437056SNickeau     * @throws ExceptionCombo
116c3437056SNickeau     */
117c3437056SNickeau    public function setValue($value): Metadata
118c3437056SNickeau    {
119c3437056SNickeau        $this->validityCheck($value);
120c3437056SNickeau        return parent::setValue($value);
121c3437056SNickeau    }
122c3437056SNickeau
123c3437056SNickeau
124c3437056SNickeau    public function getDescription(): string
125c3437056SNickeau    {
126c3437056SNickeau        return "The language of the page";
127c3437056SNickeau    }
128c3437056SNickeau
129c3437056SNickeau    public function getLabel(): string
130c3437056SNickeau    {
131c3437056SNickeau        return "Language";
132c3437056SNickeau    }
133c3437056SNickeau
134c3437056SNickeau    public static function getName(): string
135c3437056SNickeau    {
136c3437056SNickeau        return self::PROPERTY_NAME;
137c3437056SNickeau    }
138c3437056SNickeau
139c3437056SNickeau    public function getPersistenceType(): string
140c3437056SNickeau    {
141c3437056SNickeau        return Metadata::PERSISTENT_METADATA;
142c3437056SNickeau    }
143c3437056SNickeau
144c3437056SNickeau    public function getMutable(): bool
145c3437056SNickeau    {
146c3437056SNickeau        return true;
147c3437056SNickeau    }
148c3437056SNickeau
149c3437056SNickeau    public function getDefaultValue()
150c3437056SNickeau    {
151c3437056SNickeau        return Site::getLang();
152c3437056SNickeau    }
153c3437056SNickeau
154c3437056SNickeau    /**
155c3437056SNickeau     * @throws ExceptionCombo
156c3437056SNickeau     */
157c3437056SNickeau    private function validityCheck($value)
158c3437056SNickeau    {
159c3437056SNickeau        if ($value === "" || $value === null) {
160c3437056SNickeau            return;
161c3437056SNickeau        }
162c3437056SNickeau        if (!StringUtility::match($value, "^[a-zA-Z]{2}$")) {
163c3437056SNickeau            throw new ExceptionCombo("The lang value ($value) for the page ($this) does not have two letters", $this->getCanonical());
164c3437056SNickeau        }
165c3437056SNickeau    }
166c3437056SNickeau
167c3437056SNickeau    public function getCanonical(): string
168c3437056SNickeau    {
169c3437056SNickeau        return "lang";
170c3437056SNickeau    }
171c3437056SNickeau
172c3437056SNickeau
17337748cd8SNickeau}
174