@@ -6,6 +6,7 @@ import { getLangFromUrl, useTranslations } from '../../i18n/utils';
66import { getLocaleStaticPaths } from " ../../i18n/locales" ;
77import { Icon } from " astro-icon/components" ;
88import scheduleData from " ../../data/schedule.json" ;
9+ import sessionsData from " ../../data/sessions.json" ;
910
1011export function getStaticPaths() {
1112 return getLocaleStaticPaths ();
@@ -129,7 +130,7 @@ const t = useTranslations(lang);
129130 </div >
130131</Layout >
131132
132- <script define:vars ={ { scheduleData }} >
133+ <script define:vars ={ { scheduleData , sessionsData }} >
133134 // Global timezone state
134135 let useLocalTime = false;
135136 let localTimezoneName = '';
@@ -140,10 +141,14 @@ const t = useTranslations(lang);
140141 // Global array of event times for scrollbar
141142 let eventTimes = [];
142143
143- // Collect all events from all days
144+ // Collect all events from all days and enrich with session data
144145 const daysData = Object.entries(scheduleData.days);
145146 daysData.forEach(([date, day]) => {
146147 day.events.forEach((event) => {
148+ // Enrich event with language from sessions data
149+ if (event.code && sessionsData[event.code]) {
150+ event.language = sessionsData[event.code].language;
151+ }
147152 allEvents.push(event);
148153 });
149154 });
@@ -185,6 +190,25 @@ const t = useTranslations(lang);
185190 return date.toLocaleDateString('en-US', options);
186191 }
187192
193+ // Get language name from code
194+ function getLanguageName(langCode) {
195+ const languages = {
196+ 'en': 'English',
197+ 'es': 'Español',
198+ 'pt': 'Português',
199+ 'fr': 'Français',
200+ 'ja': '日本語',
201+ 'ko': '한국어',
202+ 'zh': '中文',
203+ 'de': 'Deutsch',
204+ 'it': 'Italiano',
205+ 'ru': 'Русский',
206+ 'ar': 'العربية',
207+ 'hi': 'हिन्दी'
208+ };
209+ return languages[langCode] || langCode?.toUpperCase() || '';
210+ }
211+
188212 function toRelativeUrl(url) {
189213 if (!url) return '';
190214 try {
@@ -378,7 +402,7 @@ const t = useTranslations(lang);
378402 <svg class="w-5 h-5 text-purple-600 dark:text-purple-400" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.579 2 2 6.579 2 12s4.579 10 10 10 10-4.579 10-10S17.421 2 12 2zm0 5c1.727 0 3 1.272 3 3s-1.273 3-3 3c-1.726 0-3-1.272-3-3s1.274-3 3-3zm-5.106 9.772c.897-1.32 2.393-2.2 4.106-2.2h2c1.714 0 3.209.88 4.106 2.2C15.828 18.14 14.015 19 12 19s-3.828-.86-5.106-2.228z"></path></svg>
379403 ${event.speakers.map((speaker) => `
380404 <a href="${toRelativeUrl(speaker.website_url)}" class="flex items-center gap-2 group/speaker">
381- ${speaker.avatar ? `<img src="${speaker.avatar}" alt="${speaker.name}" class="w-8 h-8 rounded-full border-2 border-purple-500" />` : ''}
405+ ${speaker.avatar ? `<img src="${speaker.avatar}" alt="${speaker.name}" class="w-8 h-8 rounded-full border-2 border-purple-500 object-cover " />` : ''}
382406 <span class =" font-medium text-gray-700 dark:text-gray-300 group-hover/speaker:text-purple-600 dark:group-hover/speaker:text-purple-400 transition-colors" >${ speaker .name } </span >
383407 </a >
384408 `).join('')}
@@ -412,6 +436,10 @@ const t = useTranslations(lang);
412436 ${ event .session_type }
413437 </span >
414438 ${ event .level ? ` <span class="px-3 py-1 rounded-full text-xs font-semibold text-white ${levelColor }">${event .level }</span> ` : ' ' }
439+ ${ event .language ? ` <span class="px-3 py-1 rounded-full text-xs font-semibold bg-teal-100 dark:bg-teal-900 text-teal-800 dark:text-teal-200 flex items-center gap-1">
440+ <svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path></svg>
441+ ${getLanguageName (event .language )}
442+ </span> ` : ' ' }
415443 <span class =" md:hidden px-3 py-1 rounded-full text-xs font-semibold bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300" >
416444 ${ event .duration } min
417445 </span >
@@ -489,6 +517,15 @@ const t = useTranslations(lang);
489517 }
490518
491519 function initializeSchedulePage() {
520+ // Load timezone preference from localStorage
521+ const savedTimezone = localStorage .getItem (' preferredTimezone' );
522+
523+ if (savedTimezone === ' local' ) {
524+ useLocalTime = true ;
525+ } else if (savedTimezone === ' utc' ) {
526+ useLocalTime = false ;
527+ }
528+
492529 // Get local timezone name
493530 try {
494531 localTimezoneName = Intl .DateTimeFormat ().resolvedOptions ().timeZone ;
@@ -507,6 +544,7 @@ const t = useTranslations(lang);
507544 if (utcBtn ) {
508545 utcBtn .addEventListener (' click' , () => {
509546 useLocalTime = false ;
547+ localStorage .setItem (' preferredTimezone' , ' utc' );
510548 updateTimezoneButtons ();
511549 updateAllTimes ();
512550 });
@@ -515,6 +553,7 @@ const t = useTranslations(lang);
515553 if (localBtn ) {
516554 localBtn .addEventListener (' click' , () => {
517555 useLocalTime = true ;
556+ localStorage .setItem (' preferredTimezone' , ' local' );
518557 updateTimezoneButtons ();
519558 updateAllTimes ();
520559 });
@@ -703,7 +742,7 @@ const t = useTranslations(lang);
703742 // Initial update
704743 updateScrollIndicator ();
705744 updateTimeTooltip ();
706- reorganizeSchedule ();
745+ updateTimezoneButtons (); // This will apply the saved state
707746 }
708747
709748 // Call initialization onboth DOMContentLoaded and Astro page load
0 commit comments