1/* ÐеÑеклÑÑаÑÐµÐ»Ñ RU/EN. 2 3 РвÑÑÑÑке ÑловаÑÑ Ð±Ñл заÑÐ¸Ñ ÐºÐ¾Ð½ÑÑанÑой пÑÑмо в ÑкÑипÑ. ÐдеÑÑ Ð¾Ð½ пÑÐ¸ÐµÐ·Ð¶Ð°ÐµÑ 4 из Ð±Ð°Ð·Ñ (ÑаблиÑа s_translations, ÑкÑан админки «ÐеÑеводÑ») и кладÑÑÑÑ 5 Ñаблоном index.tpl в window.BD_I18N â инаÑе Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð½Ðµ Ñмог Ð±Ñ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ 6 ни Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ñапки без пÑавки Ñайла ÑемÑ. 7 8 ÐлÑÑ Ð±ÐµÐ· EN-пеÑевода намеÑенно ÐРподменÑеÑÑÑ: ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾ÑÑаÑÑÑÑ Ñ ÑÑÑÑким 9 ÑекÑÑом из ÑазмеÑки. ÐÑÑÑÐ°Ñ ÑÑÑока в ÑловаÑе ознаÑала Ð±Ñ Ð¿ÑÑÑое меÑÑо 10 на английÑкой веÑÑии. 11 12 ÐÐÐЫ ÐÐÐÐТÐÐ: 13 data-i18n â подменÑеÑÑÑ textContent в лÑбом ÑзÑке; 14 data-i18n-html â Ñо же, но знаÑением Ñ html-Ñегами (innerHTML); 15 data-i18n-en â подменÑеÑÑÑ Ð¢ÐÐЬÐРв EN. Так помеÑено Ñо, Ñей ÑÑÑÑкий 16 ÑекÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð¸Ð· наÑÑÑоек админки: инаÑе ÑловаÑÑ 17 заÑиÑал Ð±Ñ Ð·Ð½Ð°Ñение наÑÑÑойки пÑи каждой загÑÑзке; 18 data-i18n-attr â подменÑÑÑÑÑ ÐТРÐÐУТЫ. ÐнаÑение â ÑпиÑок Ð¿Ð°Ñ 19 «аÑÑибÑÑ:клÑÑ» ÑеÑез запÑÑÑÑ: 20 data-i18n-attr="placeholder:ph_name" 21 data-i18n-attr="aria-label:a11y_open_photo" 22 ÐÑжно Ð´Ð»Ñ placeholder полей ÑоÑÐ¼Ñ Ð¸ aria-label кнопок 23 (лайÑбокÑ, закÑÑÑие модалки, лиÑÑалка): Ð¸Ñ ÑекÑÑ Ð²Ð¸Ð´ÐµÐ½ 24 или ÑлÑÑен поÑеÑиÑелÑ, а textContent Ñ ÑÐ°ÐºÐ¸Ñ ÑлеменÑов 25 неÑ. Ðмена аÑÑибÑÑов беÑÑÑÑÑ Ð¢ÐÐЬÐРиз ÑазмеÑки, не из 26 ÑловаÑÑ â инаÑе ÑÑÑока из админки могла Ð±Ñ Ð¿Ð¾Ð´ÑÑавиÑÑ 27 href или on*. 28 29 ÐÐТЫ. ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑÑÑев пÑÐ¸Ñ Ð¾Ð´ÑÑ Ñ ÑеÑвеÑа Ñже по-ÑÑÑÑки (api/Events.php 30 Ð¸Ñ Ð½Ðµ пеÑеводиÑ: конÑÐµÐ½Ñ ÑÑÑноÑÑей на ÑайÑе не пеÑеводиÑÑÑ). ÐоÑÑÐ¾Ð¼Ñ 31 ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð¾Ð±Ð¾ÑаÑиваÑÑ Ð¼ÐµÑÑÑ Ð² ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ data-i18n="month_full_10" â 32 и в EN-Ñежиме он подменÑеÑÑÑ ÐºÐ°Ðº обÑÑÐ½Ð°Ñ ÑÑÑока ÑловаÑÑ. 33*/ 34(function(){ 35 36 var T = window.BD_I18N || {}; 37 38 if(!T.ru) T.ru = {}; 39 if(!T.en) T.en = {}; 40 41 var buttons = document.querySelectorAll('.lang-switch__btn'); 42 43 // ÐÑÑ Ð¾Ð´Ð½Ð°Ñ (ÑÑÑÑкаÑ) ÑазмеÑка â иÑÑоÑник иÑÑÐ¸Ð½Ñ Ð´Ð»Ñ ÐºÐ»ÑÑей без пеÑевода. 44 var fallback = new WeakMap(); 45 var attrFallback = new WeakMap(); 46 47 function remember(el, html){ 48 if(!fallback.has(el)) fallback.set(el, html); 49 return fallback.get(el); 50 } 51 52 function rememberAttr(el, attr, value){ 53 var map = attrFallback.get(el); 54 if(!map){ map = {}; attrFallback.set(el, map); } 55 if(!(attr in map)) map[attr] = value; 56 return map[attr]; 57 } 58 59 function setLang(lang){ 60 61 var d = T[lang] || T.ru; 62 63 document.documentElement.lang = lang; 64 65 /* og:locale деÑжим ÑоглаÑованнÑм Ñ lang. ÐÐ»Ñ ÑоÑÑеÑей ÑÑо мало ÑÑо даÑÑ: 66 кÑаÑÐ»ÐµÑ ÑиÑÐ°ÐµÑ ÑеÑвеÑнÑй HTML, а он вÑегда ÑÑÑÑкий. Ðо пÑоÑивоÑеÑие 67 внÑÑÑи оÑÑиÑованной ÑÑÑаниÑÑ («lang=en» пÑи «og:locale=ru_RU») лÑÑÑе 68 не оÑÑавлÑÑÑ. */ 69 var locale = document.querySelector('meta[property="og:locale"]'); 70 if(locale) locale.setAttribute('content', lang === 'en' ? 'en_US' : 'ru_RU'); 71 72 document.querySelectorAll('[data-i18n]').forEach(function(el){ 73 var base = remember(el, el.textContent); 74 var k = el.dataset.i18n; 75 el.textContent = (d[k] != null && d[k] !== '') ? d[k] : base; 76 }); 77 78 document.querySelectorAll('[data-i18n-html]').forEach(function(el){ 79 var base = remember(el, el.innerHTML); 80 var k = el.dataset.i18nHtml; 81 el.innerHTML = (d[k] != null && d[k] !== '') ? d[k] : base; 82 }); 83 84 /* data-i18n-en â «пеÑеводиÑÑ, но не подменÑÑÑ Ð¿Ð¾-ÑÑÑÑки». 85 Так помеÑÐµÐ½Ñ ÑлеменÑÑ, Ñей ÑÑÑÑкий ÑекÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð¸Ð· наÑÑÑоек админки 86 (гоÑод гÑÑппÑ, год наÑала). С обÑÑнÑм data-i18n пеÑеклÑÑаÑÐµÐ»Ñ Ð¿Ñи 87 загÑÑзке ÑÑÑаниÑÑ Ð·Ð°ÑиÑал Ð±Ñ Ð·Ð½Ð°Ñение наÑÑÑойки ÑÑÑокой из ÑловаÑÑ, 88 и Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не Ñвидел Ð±Ñ Ñвоей пÑавки. Ð EN-Ñежиме пеÑевод 89 нÑжен, поÑÑÐ¾Ð¼Ñ Ð·Ð´ÐµÑÑ Ð¾Ð½ пÑименÑеÑÑÑ, а пÑи возвÑаÑе на RU 90 воÑÑÑанавливаеÑÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð°Ñ ÑазмеÑка. */ 91 document.querySelectorAll('[data-i18n-en]').forEach(function(el){ 92 var base = remember(el, el.textContent); 93 var k = el.dataset.i18nEn; 94 var t = (T.en || {})[k]; 95 el.textContent = (lang !== 'ru' && t != null && t !== '') ? t : base; 96 }); 97 98 /* ÐÑÑибÑÑÑ: placeholder, aria-label, title, alt. РанÑÑе они оÑÑавалиÑÑ 99 ÑÑÑÑкими пÑи лÑбом ÑзÑке â пеÑеклÑÑаÑÐµÐ»Ñ ÑабоÑал ÑолÑко Ñ ÑекÑÑом 100 ÑлеменÑов, и в EN-веÑÑии подÑказки в полÑÑ ÑоÑÐ¼Ñ Ð¸ подпиÑи Ð´Ð»Ñ 101 ÑкÑинÑидеÑа бÑли на ÑÑÑÑком. */ 102 document.querySelectorAll('[data-i18n-attr]').forEach(function(el){ 103 104 el.dataset.i18nAttr.split(',').forEach(function(pair){ 105 106 var parts = pair.split(':'); 107 if(parts.length < 2) return; 108 109 var attr = parts[0].trim(); 110 var key = parts[1].trim(); 111 if(!attr || !key) return; 112 113 var base = rememberAttr(el, attr, el.getAttribute(attr) || ''); 114 el.setAttribute(attr, (d[key] != null && d[key] !== '') ? d[key] : base); 115 }); 116 }); 117 118 buttons.forEach(function(b){ 119 b.classList.toggle('is-active', b.dataset.lang === lang); 120 }); 121 122 try { localStorage.setItem('bd-lang', lang); } catch(e) {} 123 } 124 125 buttons.forEach(function(b){ 126 b.addEventListener('click', function(){ setLang(b.dataset.lang); }); 127 }); 128 129 var initial = 'ru'; 130 try { initial = localStorage.getItem('bd-lang') || 'ru'; } catch(e) {} 131 132 setLang(initial); 133})();
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.