xref: /plugin/combo/ComboStrap/Lang.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeau
4*37748cd8SNickeaunamespace ComboStrap;
5*37748cd8SNickeau
6*37748cd8SNickeau
7*37748cd8SNickeauuse dokuwiki\Cache\Cache;
8*37748cd8SNickeau
9*37748cd8SNickeauclass Lang
10*37748cd8SNickeau{
11*37748cd8SNickeau
12*37748cd8SNickeau    const CANONICAL = "lang";
13*37748cd8SNickeau    const LANG_ATTRIBUTES = "lang";
14*37748cd8SNickeau
15*37748cd8SNickeau    /**
16*37748cd8SNickeau     * Process the lang attribute
17*37748cd8SNickeau     * https://www.w3.org/International/questions/qa-html-language-declarations
18*37748cd8SNickeau     * @param TagAttributes $attributes
19*37748cd8SNickeau     *
20*37748cd8SNickeau     * Language supported:
21*37748cd8SNickeau     * http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
22*37748cd8SNickeau     *
23*37748cd8SNickeau     * Common Locale Data Repository
24*37748cd8SNickeau     * http://cldr.unicode.org/
25*37748cd8SNickeau     * Data:
26*37748cd8SNickeau     *   * http://www.unicode.org/Public/cldr/
27*37748cd8SNickeau     *   * https://github.com/unicode-cldr/
28*37748cd8SNickeau     *   * https://github.com/unicode-org/cldr-json
29*37748cd8SNickeau     * The ''dir'' data is known as the ''characterOrder''
30*37748cd8SNickeau     *
31*37748cd8SNickeau     */
32*37748cd8SNickeau    public static function processLangAttribute(&$attributes)
33*37748cd8SNickeau    {
34*37748cd8SNickeau
35*37748cd8SNickeau
36*37748cd8SNickeau        /**
37*37748cd8SNickeau         * Adding the lang attribute
38*37748cd8SNickeau         * if set
39*37748cd8SNickeau         */
40*37748cd8SNickeau        if ($attributes->hasComponentAttribute(self::LANG_ATTRIBUTES)) {
41*37748cd8SNickeau            $langValue = $attributes->getValueAndRemove(self::LANG_ATTRIBUTES);
42*37748cd8SNickeau            $attributes->addHtmlAttributeValue("lang", $langValue);
43*37748cd8SNickeau
44*37748cd8SNickeau            $languageDataCache = new Cache("combo_" . $langValue, ".json");
45*37748cd8SNickeau            $cacheDataUsable = $languageDataCache->useCache();
46*37748cd8SNickeau            if (!$cacheDataUsable) {
47*37748cd8SNickeau
48*37748cd8SNickeau                // Language about the data
49*37748cd8SNickeau                $downloadUrl = "https://raw.githubusercontent.com/unicode-org/cldr-json/master/cldr-json/cldr-misc-modern/main/$langValue/layout.json";
50*37748cd8SNickeau
51*37748cd8SNickeau                $filePointer = @fopen($downloadUrl, 'r');
52*37748cd8SNickeau                if ($filePointer != false) {
53*37748cd8SNickeau
54*37748cd8SNickeau                    $numberOfByte = @file_put_contents($languageDataCache->cache, $filePointer);
55*37748cd8SNickeau                    if ($numberOfByte != false) {
56*37748cd8SNickeau                        LogUtility::msg("The new language data ($langValue) was downloaded", LogUtility::LVL_MSG_INFO, self::CANONICAL);
57*37748cd8SNickeau                        $cacheDataUsable = true;
58*37748cd8SNickeau                    } else {
59*37748cd8SNickeau                        LogUtility::msg("Internal error: The language data ($langValue) could no be written to ($languageDataCache->cache)", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
60*37748cd8SNickeau                    }
61*37748cd8SNickeau
62*37748cd8SNickeau                } else {
63*37748cd8SNickeau
64*37748cd8SNickeau                    LogUtility::msg("The data for the language ($langValue) could not be found at ($downloadUrl).", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
65*37748cd8SNickeau
66*37748cd8SNickeau                }
67*37748cd8SNickeau            }
68*37748cd8SNickeau
69*37748cd8SNickeau            if ($cacheDataUsable) {
70*37748cd8SNickeau                $jsonAsArray = true;
71*37748cd8SNickeau                $languageData = json_decode(file_get_contents($languageDataCache->cache), $jsonAsArray);
72*37748cd8SNickeau                if($languageData==null){
73*37748cd8SNickeau                    LogUtility::msg("We could not read the data from the language ($langValue). No direction was set.", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
74*37748cd8SNickeau                    return;
75*37748cd8SNickeau                }
76*37748cd8SNickeau                $characterOrder = $languageData["main"][$langValue]["layout"]["orientation"]["characterOrder"];
77*37748cd8SNickeau                if ($characterOrder == "right-to-left") {
78*37748cd8SNickeau                    $attributes->addHtmlAttributeValue("dir", "rtl");
79*37748cd8SNickeau                } else {
80*37748cd8SNickeau                    $attributes->addHtmlAttributeValue("dir", "ltr");
81*37748cd8SNickeau                }
82*37748cd8SNickeau            } else {
83*37748cd8SNickeau                LogUtility::msg("The language direction cannot be set because no language data was found for the language ($langValue)", LogUtility::LVL_MSG_WARNING, self::CANONICAL);
84*37748cd8SNickeau            }
85*37748cd8SNickeau
86*37748cd8SNickeau        }
87*37748cd8SNickeau
88*37748cd8SNickeau    }
89*37748cd8SNickeau
90*37748cd8SNickeau}
91