(function () { const ALLOWED = ['en', 'fr']; const params = new URLSearchParams(location.search); const param = (params.get('language') || '').toLowerCase(); const paramLang = ALLOWED.includes(param) ? param : null; const hasParam = !!paramLang; // helpers function setCookie(name, value) { try { document.cookie = `${name}=${value}; path=/; max-age=31536000; SameSite=Lax`; } catch (e) { } } function clearCookie(name) { try { document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;`; } catch (e) { } } function setCookiesFor(lang) { if (!lang) return; setCookie('gtranslate_lng', lang); setCookie('googtrans', `/en/${lang}`); } function parseCookieLang() { const m = document.cookie.match(/(?:googtrans=\/\w+\/|gtranslate_lng=)([a-zA-Z-]+)/); return m ? m[1] : null; } function storageGet() { try { const ls = localStorage.getItem('selected_language'); if (ls && ALLOWED.includes(ls)) return ls; } catch (e) { } return parseCookieLang(); } function storageSet(lang) { if (!lang) return; try { localStorage.setItem('selected_language', lang); } catch (e) { } setCookiesFor(lang); } function storageClear() { try { localStorage.removeItem('selected_language'); } catch (e) { } clearCookie('gtranslate_lng'); clearCookie('googtrans'); } // widget settings (leave default_language stable) window.gtranslateSettings = { default_language: 'en', detect_browser_language: true, languages: ALLOWED, wrapper_selector: '.gtranslate_wrapper', horizontal_position: 'right', vertical_position: 'bottom' }; // detect current UI language from available controls function detectUILang() { const google = document.querySelector('.goog-te-combo'); if (google && google.value) return google.value; const gtSel = document.querySelector('.gt_selector'); if (gtSel && gtSel.value) { const parts = gtSel.value.split('|'); return parts[parts.length - 1]; } const activeLink = document.querySelector('a[data-gt-lang].active') || document.querySelector('a[data-gt-lang].selected'); if (activeLink) return activeLink.getAttribute('data-gt-lang'); return parseCookieLang(); } // apply language via available methods function applyLang(lang) { if (!lang) return false; // gtranslate API if (window.gtranslate && typeof window.gtranslate.translate === 'function') { try { window.gtranslate.translate(lang); } catch (e) { return false; } return true; } // data-gt-lang links const link = document.querySelector(`a[data-gt-lang="${lang}"]`); if (link) { link.click(); return true; } // GTranslate select const gtSel = document.querySelector('.gt_selector'); if (gtSel) { const opt = Array.from(gtSel.options).find(o => (o.value || '').endsWith(`|${lang}`) || (o.value || '').includes(`|${lang}`) || o.value === lang); if (opt) { gtSel.value = opt.value; gtSel.dispatchEvent(new Event('change')); return true; } } // official Google select const google = document.querySelector('.goog-te-combo'); if (google) { google.value = lang; google.dispatchEvent(new Event('change')); return true; } return false; } // decide target const stored = storageGet(); const target = hasParam ? paramLang : (stored || 'en'); if (hasParam) { if (target === 'en') storageClear(); else storageSet(target); } else { if (stored && stored !== 'en') storageSet(stored); } // poll until widget ready then apply window.addEventListener('load', () => { const START = performance.now(), TIMEOUT = 5000, INTERVAL = 150; (function poll() { if (hasParam) { if ((target !== 'en' && applyLang(target)) || (target === 'en' && applyLang('en'))) return; } else { if (stored && stored !== 'en' && applyLang(stored)) return; } if (performance.now() - START < TIMEOUT) setTimeout(poll, INTERVAL); })(); // persist user's selection from any on-page control (only when no URL param) if (!hasParam) { document.addEventListener('click', e => { const el = e.target.closest('[data-gt-lang], .gt_selector, .goog-te-combo'); if (!el) return; setTimeout(() => { const cur = detectUILang(); if (cur && ALLOWED.includes(cur)) storageSet(cur); }, 300); }, true); // also observe DOM class change (some widgets mark translated state) const obs = new MutationObserver(() => { const cur = detectUILang(); if (cur && ALLOWED.includes(cur)) storageSet(cur); }); obs.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); } }); })();