1(function ($, Drupal, drupalSettings) { 2 function isDebugEnabled() { 3 return localStorage.getItem('PM_DEBUG') === 'true'; 4 } 5 6 Drupal.behaviors.languageSwitcherParams = { 7 attach: function (context, settings) { 8 if (isDebugEnabled()) console.log('[Language Switcher] Behavior attached'); 9 attachLanguageSwitcherHandler(); 10 } 11 }; 12 13 var allowedParams = [ 14 'display', 'id', 'lang', 'loc', 'lsf', 'page', 't', 15 'sort_by', 'sort_order', 'combine', 16 'field_date_released_value', 'field_date_released_value_1', 17 'field_date_released_value_min', 'field_date_released_value_max', 18 'field_tag_target_id', 'field_tag_target_id[]', 19 'field_tag_target_id[0]', 'field_tag_target_id[][value]', 20 'webform', 'token', '_token', 'destination', 'fid', 21 'Apply', 'apply', 'Appliquer', 'appliquer', 'Reset', 'reset', 'Reinitialiser', 'reinitialiser', 22 'auHash' 23 ]; 24 25 function isAllowedDestination(value) { 26 try { 27 var destUrl = new URL(value, window.location.origin); 28 var host = destUrl.hostname; 29 var isSameDomain = host === window.location.hostname; 30 var isCanadaCa = /\.canada\.ca$/i.test(host); 31 var isGcCa = /\.gc\.ca$/i.test(host); 32 return isSameDomain || isCanadaCa || isGcCa; 33 } 34 catch (e) { 35 return false; 36 } 37 } 38 39 function getTargetLanguage(link) { 40 return link.getAttribute('lang') || 'en'; 41 } 42 43 function translateButtonParam(key, value, targetLang) { 44 var enToFr = { 45 'Apply': 'Appliquer', 46 'apply': 'appliquer', 47 'Reset': 'Reinitialiser', 48 'reset': 'reinitialiser' 49 }; 50 var frToEn = { 51 'Appliquer': 'Apply', 52 'appliquer': 'apply', 53 'Reinitialiser': 'Reset', 54 'reinitialiser': 'reset' 55 }; 56 57 if (targetLang === 'fr' && enToFr[value]) { 58 return enToFr[value]; 59 } 60 if (targetLang === 'en' && frToEn[value]) { 61 return frToEn[value]; 62 } 63 return value; 64 } 65 66 function attachLanguageSwitcherHandler() { 67 var langSwitchLinks = document.querySelectorAll('.language-link'); 68 if (isDebugEnabled()) console.log('[Language Switcher] Found links:', langSwitchLinks.length); 69 70 langSwitchLinks.forEach(function(link) { 71 if (link.dataset.langSwitchAttached) return; 72 link.dataset.langSwitchAttached = 'true'; 73 var targetLang = getTargetLanguage(link); 74 75 function updateHref() { 76 var currentHref = link.getAttribute('href'); 77 if (isDebugEnabled()) console.log('[Language Switcher] Processing href:', currentHref); 78 79 if (currentHref.indexOf('=') !== -1) { 80 if (isDebugEnabled()) console.log('[Language Switcher] Skipping - already has query params'); 81 return; 82 } 83 84 var urlParams = new URLSearchParams(window.location.search); 85 var params = []; 86 urlParams.forEach(function(value, key) { 87 var keyLower = key.toLowerCase(); 88 if (allowedParams.indexOf(key) === -1 && 89 allowedParams.indexOf(keyLower) === -1 && 90 key !== 'field_tag_target_id[]' && 91 keyLower !== 'field_tag_target_id[]') { 92 return; 93 } 94 if (key === 'page' && (value === '0' || value === '0,0')) { 95 return; 96 } 97 if (key === 'destination' && !isAllowedDestination(value)) { 98 return; 99 } 100 if (value !== '') { 101 var translatedValue = translateButtonParam(key, value, targetLang); 102 params.push(key + '=' + encodeURIComponent(translatedValue)); 103 } 104 }); 105 106 if (params.length > 0) { 107 var separator = currentHref.indexOf('?') === -1 ? '?' : '&'; 108 var newHref = currentHref + separator + params.join('&'); 109 if (isDebugEnabled()) { 110 console.log('[Language Switcher] Params will be added:', params.join(', ')); 111 console.log('[Language Switcher] New href:', newHref); 112 } 113 link.setAttribute('href', newHref); 114 } 115 else { 116 if (isDebugEnabled()) console.log('[Language Switcher] No params to add for:', currentHref); 117 } 118 } 119 120 updateHref(); 121 122 link.addEventListener('click', updateHref); 123 }); 124 } 125 126 window.PMLanguageSwitcher = { 127 allowedParams: allowedParams, 128 isAllowedDestination: isAllowedDestination, 129 attachLanguageSwitcherHandler: attachLanguageSwitcherHandler 130 }; 131})(jQuery, Drupal, drupalSettings);
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.