1/** 2 * DualLang WP â ÑÑонÑовий ÑкÑипÑ. 3 * 4 * 1) Ðова Ð´Ð»Ñ AJAX/REST. Ðа ÑÑоÑÑнÑÑ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ð¾Ñ Ð¼Ð¾Ð²Ð¸ кожен Ð·Ð°Ð¿Ð¸Ñ Ñеми до 5 * admin-ajax.php Ñи /wp-json/ Ñого ж ÑайÑÑ Ð¾ÑÑимÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº X-DualLang-Lang. 6 * Ðез нÑого «ÐаванÑажиÑи Ñе», ÑÑлÑÑÑи, живий поÑÑк вÑддавали б конÑÐµÐ½Ñ 7 * оÑÐ½Ð¾Ð²Ð½Ð¾Ñ Ð¼Ð¾Ð²Ð¾Ñ Ð¹ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð±ÐµÐ· /xx/. ÐаÑÑимо XMLHttpRequest (його 8 * викоÑиÑÑовÑÑ jQuery.ajax) Ñ fetch â ÑÑого доÑÑаÑнÑо Ð´Ð»Ñ Ð±ÑдÑ-ÑÐºÐ¾Ñ Ñеми. 9 * 10 * 2) Ðипадний пеÑÐµÐ¼Ð¸ÐºÐ°Ñ (вÑджеÑ/ÑоÑÑкод): вÑдкÑиÑÑÑ ÐºÐ»Ñком/доÑиком/клавÑаÑÑÑоÑ, 11 * закÑиÑÑÑ ÐºÐ»Ñком поза межами або Escape. ÐÑнкÑи в Ð¼ÐµÐ½Ñ Ñеми обÑоблÑÑ Ñама 12 * Ñема â ÑÑ Ñей код не ÑÑпаÑ. 13 */ 14(function () { 15 'use strict'; 16 17 var cfg = window.DualLangWP || {}; 18 var lang = cfg.lang || ''; 19 var primary = cfg.primary || ''; 20 var header = cfg.header || 'X-DualLang-Lang'; 21 22 function sameOrigin(url) { 23 if (!url) { return false; } 24 try { 25 var u = new URL(String(url), window.location.href); 26 return u.origin === window.location.origin; 27 } catch (e) { 28 return false; 29 } 30 } 31 32 if (lang && lang !== primary) { 33 // XMLHttpRequest 34 if (window.XMLHttpRequest && XMLHttpRequest.prototype) { 35 var origOpen = XMLHttpRequest.prototype.open; 36 var origSend = XMLHttpRequest.prototype.send; 37 XMLHttpRequest.prototype.open = function (method, url) { 38 this.__duallangSame = sameOrigin(url); 39 return origOpen.apply(this, arguments); 40 }; 41 XMLHttpRequest.prototype.send = function () { 42 if (this.__duallangSame) { 43 try { this.setRequestHeader(header, lang); } catch (e) { /* заголовок Ñже виÑÑавлено або Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ вÑдкÑиÑо */ } 44 } 45 return origSend.apply(this, arguments); 46 }; 47 } 48 // fetch 49 if (window.fetch) { 50 var origFetch = window.fetch; 51 window.fetch = function (input, init) { 52 try { 53 var url = (typeof input === 'string') ? input : (input && input.url); 54 if (sameOrigin(url)) { 55 init = init || {}; 56 var h = new Headers(init.headers || (typeof input !== 'string' && input && input.headers) || undefined); 57 if (!h.has(header)) { h.set(header, lang); } 58 init.headers = h; 59 } 60 } catch (e) { /* не Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ â вÑддаÑмо Ñк Ñ */ } 61 return origFetch.call(this, input, init); 62 }; 63 } 64 } 65 66 // ââ Ðипадний пеÑÐµÐ¼Ð¸ÐºÐ°Ñ âââââââââââââââââââââââââââââââââââââââââââââââââ 67 function closeAll(except) { 68 var open = document.querySelectorAll('.duallang-language-switcher .duallang-menu-dropdown.active'); 69 for (var i = 0; i < open.length; i++) { 70 if (open[i] !== except) { 71 open[i].classList.remove('active'); 72 var t = open[i].querySelector('.duallang-dropdown-toggle'); 73 if (t) { t.setAttribute('aria-expanded', 'false'); } 74 } 75 } 76 } 77 78 document.addEventListener('click', function (e) { 79 var toggle = e.target.closest ? e.target.closest('.duallang-language-switcher .duallang-dropdown-toggle') : null; 80 if (toggle) { 81 e.preventDefault(); 82 var li = toggle.parentNode; 83 var willOpen = !li.classList.contains('active'); 84 closeAll(li); 85 li.classList.toggle('active', willOpen); 86 toggle.setAttribute('aria-expanded', willOpen ? 'true' : 'false'); 87 return; 88 } 89 if (!(e.target.closest && e.target.closest('.duallang-language-switcher'))) { 90 closeAll(null); 91 } 92 }); 93 94 document.addEventListener('keydown', function (e) { 95 if (e.key === 'Escape' || e.key === 'Esc') { closeAll(null); } 96 }); 97})();
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.