PageSourceSearch

https://blarma.com/js/locale-runtime-260518.js

js blarma.com collected 2026-10-02 01:24:14 UTC 5,453 bytes, 132 lines download raw bytes

1(function () {
2    let currentLang = "en";
3    let translations = {};
4    let languages = [];
5    let onLanguageApplied = null;
6
7    function getCurrentLang() {
8        return currentLang;
9    }
10
11    function setLanguage(langCode) {
12        currentLang = langCode;
13        const dict = translations[langCode] || translations.en || {};
14
15        document.querySelectorAll("[data-i18n]").forEach((el) => {
16            const key = el.getAttribute("data-i18n");
17            const text = dict[key] || (translations.en && translations.en[key]);
18            if (!text) return;
19            if (text.includes("<")) el.innerHTML = text;
20            else el.innerText = text;
21        });
22
23        const params = new URLSearchParams(window.location.search);
24        params.delete("l");
25        const otherParamsStr = params.toString();
26        const newSearch = otherParamsStr ? `?${otherParamsStr}&l=${langCode}` : `?l=${langCode}`;
27        const newUrl = window.location.pathname + newSearch;
28        window.history.replaceState({}, "", newUrl);
29
30        updateMarquee();
31        updateFooterLangList();
32
33        const isRtl = ["ar", "ur", "fa"].includes(langCode);
34        document.documentElement.setAttribute("dir", isRtl ? "rtl" : "ltr");
35        document.documentElement.setAttribute("lang", langCode);
36
37        if (typeof onLanguageApplied === "function") onLanguageApplied(langCode);
38    }
39
40    function updateFooterLangList() {
41        const footerLangList = document.getElementById("footer-language-list");
42        const modalLangList = document.getElementById("modal-language-list");
43        const currentLangLabel = document.getElementById("current-lang-name");
44        const currentLangFlag = document.getElementById("current-lang-flag");
45
46        if (currentLangLabel) {
47            currentLangLabel.innerText = currentLang.toUpperCase();
48        }
49
50        if (currentLangFlag) {
51            const activeLang = languages.find((lang) => lang.code === currentLang);
52            const dict = translations[currentLang] || translations.en || {};
53            const nativeName = dict["lang_" + currentLang] || currentLang.toUpperCase();
54            const flagCode = activeLang ? activeLang.flag : "gb";
55            currentLangFlag.src = `https://flagcdn.com/w40/${flagCode}.png`;
56            currentLangFlag.alt = nativeName;
57        }
58
59        let footerHTML = "";
60        let modalHTML = "";
61
62        languages.forEach((lang) => {
63            const dict = translations[lang.code] || translations.en || {};
64            const nativeName = dict["lang_" + lang.code] || lang.code.toUpperCase();
65
66            const currentParams = new URLSearchParams(window.location.search);
67            currentParams.delete("l");
68            const otherParamsStr = currentParams.toString();
69            const dynamicHref = otherParamsStr ? `?${otherParamsStr}&l=${lang.code}` : `?l=${lang.code}`;
70
71            const action = `href="${dynamicHref}" onclick="event.preventDefault(); setLanguage('${lang.code}'); window.scrollTo(0, 0);"`;
72
73            footerHTML += `<a ${action} class="footer-lang-link">${nativeName}</a>`;
74            modalHTML += `
75            <a ${action} data-bs-dismiss="modal" class="modal-lang-item">
76                <img src="https://flagcdn.com/w40/${lang.flag}.png" loading="lazy" class="nav-flag" alt="${nativeName}" style="width:24px; height:18px; margin-right:12px; border-radius:3px;">
77                <span>${nativeName}</span>
78            </a>`;
79        });
80
81        if (footerLangList) footerLangList.innerHTML = footerHTML;
82        if (modalLangList) modalLangList.innerHTML = modalHTML;
83    }
84
85    function updateMarquee() {
86        const marqueeTrack = document.getElementById("dynamic-marquee");
87        if (!marqueeTrack) return;
88        const dict = translations[currentLang] || translations.en || {};
89
90        marqueeTrack.innerHTML = [...languages, ...languages]
91            .map((lang) => {
92                const langName = dict["lang_" + lang.code] || lang.code.toUpperCase();
93                return `<span class="lang-item"><img src="https://flagcdn.com/w40/${lang.flag}.png" loading="lazy" class="lang-flag"> <span>${langName}</span></span>`;
94            })
95            .join("");
96    }
97
98    function init(config) {
99        translations = config.translations || {};
100        languages = config.languages || [];
101        onLanguageApplied = config.onLanguageApplied || null;
102
103        const urlParams = new URLSearchParams(window.location.search);
104        const langParam = urlParams.get("l");
105        let targetLang = "en";
106
107        if (typeof config.resolveInitialLanguage === "function") {
108            const resolvedLang = config.resolveInitialLanguage({
109                langParam,
110                translations,
111                languages,
112                navigatorLanguages: navigator.languages || [navigator.language || navigator.userLanguage || ""]
113            });
114            targetLang = translations[resolvedLang] ? resolvedLang : "en";
115        } else if (langParam && translations[langParam]) {
116            targetLang = langParam;
117        } else {
118            const userLang = navigator.language || navigator.userLanguage;
119            const code = userLang.split("-")[0];
120            targetLang = translations[code] ? code : "en";
121        }
122
123        setLanguage(targetLang);
124    }
125
126    window.BlarmaLocaleRuntime = {
127        init,
128        setLanguage,
129        getCurrentLang
130    };
131    window.setLanguage = setLanguage;
132})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.