1/* ========================================================================= 2 i18n.js â client-side пеÑеводÑик Ð´Ð»Ñ AG3-Ñаблона 3 Default: English. 9 ÑзÑков. ÐоддеÑжка RTL Ð´Ð»Ñ Ð°ÑабÑкого. 4 ÐÑименÑÐµÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ ÐºÐ°Ðº можно ÑанÑÑе (до DOMContentLoaded) ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ 5 меÑÑÐ°Ð½Ð¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑекÑÑа. 6 ========================================================================= */ 7(function () { 8 'use strict'; 9 10 var DEFAULT_LANG = 'en'; 11 var DICT = window.i18n || {}; 12 var META = window.i18n_meta || {}; 13 var SUPPORTED = Object.keys(DICT); 14 var STORAGE_KEY = 'siteLang'; 15 var STORAGE_MANUAL = 'siteLangManual'; 16 17 /* ÐеÑÑм пеÑвÑй поддеÑживаемÑй ÑзÑк из navigator.languages (маÑÑив Ñ fallback'ами), 18 инаÑе из navigator.language. "en-US" â "en", "zh-CN" â "zh", "ar-SA" â "ar". */ 19 function browserLang() { 20 var list = []; 21 if (navigator.languages && navigator.languages.length) { 22 list = navigator.languages; 23 } else if (navigator.language) { 24 list = [navigator.language]; 25 } else if (navigator.userLanguage) { 26 list = [navigator.userLanguage]; 27 } 28 for (var i = 0; i < list.length; i++) { 29 var code = (list[i] + '').slice(0, 2).toLowerCase(); 30 if (SUPPORTED.indexOf(code) !== -1) return code; 31 } 32 return null; 33 } 34 35 /* ÐÑиоÑиÑеÑ: 36 1) URL ?lang=xx â пÑÑÐ¼Ð°Ñ ÑÑÑлка на ÑзÑк (Ð´Ð»Ñ ÑеÑинга) 37 2) localStorage â ТÐÐЬÐРеÑли ÑÐ·ÐµÑ Ð¯ÐÐРкликал на Ñлаг (siteLangManual=1) 38 3) navigator.languages â navigator.language â авÑодеÑÐµÐºÑ Ð±ÑаÑзеÑа 39 4) "en" â английÑкий по ÑмолÑÐ°Ð½Ð¸Ñ */ 40 function detectLang() { 41 try { 42 var u = new URLSearchParams(location.search).get('lang'); 43 if (u && SUPPORTED.indexOf(u) !== -1) return u; 44 } catch (e) {} 45 try { 46 if (localStorage.getItem(STORAGE_MANUAL) === '1') { 47 var s = localStorage.getItem(STORAGE_KEY); 48 if (s && SUPPORTED.indexOf(s) !== -1) return s; 49 } 50 } catch (e) {} 51 var b = browserLang(); 52 if (b) return b; 53 return DEFAULT_LANG; 54 } 55 56 function applyTranslations(lang) { 57 var dict = DICT[lang] || DICT[DEFAULT_LANG] || {}; 58 var meta = META[lang] || META[DEFAULT_LANG] || {}; 59 60 /* TextContent Ð´Ð»Ñ [data-i18n] */ 61 var nodes = document.querySelectorAll('[data-i18n]'); 62 for (var i = 0; i < nodes.length; i++) { 63 var key = nodes[i].getAttribute('data-i18n'); 64 if (dict[key] !== undefined) { 65 nodes[i].textContent = dict[key]; 66 } 67 } 68 69 /* ÐÑÑибÑÑÑ ÑеÑез [data-i18n-attr="placeholder:key,title:key"] */ 70 var attrNodes = document.querySelectorAll('[data-i18n-attr]'); 71 for (var j = 0; j < attrNodes.length; j++) { 72 var pairs = attrNodes[j].getAttribute('data-i18n-attr').split(','); 73 for (var k = 0; k < pairs.length; k++) { 74 var parts = pairs[k].split(':'); 75 if (parts.length === 2) { 76 var attr = parts[0].trim(); 77 var akey = parts[1].trim(); 78 if (dict[akey] !== undefined) { 79 attrNodes[j].setAttribute(attr, dict[akey]); 80 } 81 } 82 } 83 } 84 85 /* <html lang> + dir */ 86 document.documentElement.lang = lang; 87 document.documentElement.dir = meta.rtl ? 'rtl' : 'ltr'; 88 if (meta.rtl) document.documentElement.classList.add('rtl'); 89 else document.documentElement.classList.remove('rtl'); 90 91 /* ÐкÑÐ¸Ð²Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° в гоÑизонÑалÑной полоÑе ÑзÑков */ 92 var btns = document.querySelectorAll('.lang-btn'); 93 for (var b = 0; b < btns.length; b++) { 94 btns[b].classList.toggle('active', btns[b].getAttribute('data-lang') === lang); 95 } 96 } 97 98 function changeLang(lang) { 99 if (SUPPORTED.indexOf(lang) === -1) return; 100 applyTranslations(lang); 101 /* Ð¡Ð¾Ñ ÑанÑем вÑÐ±Ð¾Ñ + помеÑаем как ÑвнÑй (manual) â ÑепеÑÑ localStorage 102 бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¿ÑиоÑиÑÐµÑ Ð½Ð°Ð´ авÑодеÑекÑом пÑи ÑледÑÑÑÐ¸Ñ Ð²Ð¸Ð·Ð¸ÑÐ°Ñ . */ 103 try { 104 localStorage.setItem(STORAGE_KEY, lang); 105 localStorage.setItem(STORAGE_MANUAL, '1'); 106 } catch (e) {} 107 /* ÐбновлÑем URL без пеÑезагÑÑзки */ 108 try { 109 var url = new URL(location.href); 110 url.searchParams.set('lang', lang); 111 history.replaceState(null, '', url); 112 } catch (e) {} 113 } 114 115 /* ÐниÑиализаÑиÑ: ÑзÑк Ñже задеÑекÑен inline-ÑкÑипÑом в <head> ÑеÑез 116 window.__i18nLang. ÐÑо пÑедоÑвÑаÑÐ°ÐµÑ Ð¼ÐµÑÑание ÑекÑÑа (FOUC). 117 ÐÑли пеÑеменной Ð½ÐµÑ (напÑÐ¸Ð¼ÐµÑ inline-ÑкÑÐ¸Ð¿Ñ Ð½Ðµ вÑполнилÑÑ) â деÑекÑим заново. */ 118 var initialLang = (window.__i18nLang && SUPPORTED.indexOf(window.__i18nLang) !== -1) 119 ? window.__i18nLang 120 : detectLang(); 121 document.documentElement.lang = initialLang; 122 if ((META[initialLang] || {}).rtl) { 123 document.documentElement.dir = 'rtl'; 124 document.documentElement.classList.add('rtl'); 125 } 126 127 function bindUI() { 128 /* Ðнопки вÑбоÑа ÑзÑка в гоÑизонÑалÑной полоÑе */ 129 var btns = document.querySelectorAll('.lang-btn'); 130 for (var i = 0; i < btns.length; i++) { 131 btns[i].addEventListener('click', function (e) { 132 e.preventDefault(); 133 var lang = this.getAttribute('data-lang'); 134 changeLang(lang); 135 }); 136 } 137 } 138 139 if (document.readyState === 'loading') { 140 document.addEventListener('DOMContentLoaded', function () { 141 applyTranslations(initialLang); 142 bindUI(); 143 }); 144 } else { 145 applyTranslations(initialLang); 146 bindUI(); 147 } 148
149 /* ÐкÑпоÑÑ */ 150 window.changeLang = changeLang; 151 window.applyTranslations = applyTranslations; 152 window.detectLang = detectLang; 153})();
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.