1 2// Using an existing one is too large for our purposes, let's create a small vanilla js version 3// instead as we are also aiming to remove reliance on jQuery eventually 4(function () { 5 const locales = { 6 en: { 7 justNow: 'just now', 8 seconds: 'seconds ago', 9 minute: 'a minute ago', 10 minutes: '%d minutes ago', 11 hour: 'an hour ago', 12 hours: '%d hours ago', 13 }, 14 us: { 15 justNow: 'just now', 16 seconds: 'seconds ago', 17 minute: 'a minute ago', 18 minutes: '%d minutes ago', 19 hour: 'an hour ago', 20 hours: '%d hours ago', 21 }, 22 nl: { 23 justNow: 'zojuist', 24 seconds: 'seconden geleden', 25 minute: 'een minuut geleden', 26 minutes: '%d minuten geleden', 27 hour: 'een uur geleden', 28 hours: '%d uur geleden', 29 } 30 }; 31 32 function getLocale(code) { 33 code = (code || '').toLowerCase(); 34 if (code.startsWith('nl')) return 'nl'; 35 if (code.startsWith('en')) return 'en'; 36 if (code.startsWith('us')) return 'us'; 37 return 'en'; 38 } 39 40 function formatDate(date, locale) { 41 const d = new Date(date); 42 if (locale === 'nl') { 43 const months = ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']; 44 return `${d.getDate()} ${months[d.getMonth()]} ${d.getFullYear()}`; 45 } else { 46 const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; 47 return `${months[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`; 48 } 49 } 50 51 function formatTimeAgo(date, locale) { 52 const now = Date.now(); 53 const seconds = Math.floor((now - date) / 1000); 54 const l = locales[locale] || locales['en']; 55 if (seconds < 10) return l.justNow; 56 if (seconds < 60) return l.seconds; 57 if (seconds < 120) return l.minute; 58 if (seconds < 3600) return l.minutes.replace('%d', Math.floor(seconds / 60)); 59 if (seconds < 7200) return l.hour; 60 if (seconds < 86400) return l.hours.replace('%d', Math.floor(seconds / 3600)); 61 // If more than 24 hours, show date 62 return formatDate(date, locale); 63 } 64 65 function updateTimeAgo() { 66 document.querySelectorAll('[data-time-ago]').forEach(function (el) { 67 const timestamp = parseInt(el.getAttribute('data-time-ago'), 10) * 1000; 68 const locale = getLocale(el.getAttribute('data-time-locale')); 69 el.textContent = formatTimeAgo(timestamp, locale); 70 }); 71 } 72 73 // Initial update 74 document.addEventListener('DOMContentLoaded', updateTimeAgo); 75 // Update every 60 seconds 76 setInterval(updateTimeAgo, 60000); 77 // Also update on page load (in case script loads after DOMContentLoaded) 78 updateTimeAgo(); 79})();
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.