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.