i18n.js (7126B)
1 (function () { 2 const TRANSLATIONS = { 3 en: { 4 // topbar 5 'account': 'Account', 6 'sign-out': 'Sign out', 7 // sidebar 8 'sidebar-calendars': 'Calendars', 9 'new-calendar': 'New calendar', 10 'upcoming-7days': 'Next 7 days', 11 'upcoming-later': 'Later', 12 'upcoming-today': 'Today', 13 'upcoming-tomorrow': 'Tomorrow', 14 'upcoming-empty': 'Nothing scheduled', 15 // monthly view 16 'toggle-sidebar': 'Toggle sidebar', 17 'prev-month': 'Previous month', 18 'next-month': 'Next month', 19 'weekday-mon': 'Mon', 'weekday-tue': 'Tue', 'weekday-wed': 'Wed', 20 'weekday-thu': 'Thu', 'weekday-fri': 'Fri', 'weekday-sat': 'Sat', 21 'weekday-sun': 'Sun', 22 // daily view 23 'add-event': '+ Add event', 24 'close': 'Close', 25 // event modal 26 'new-event': 'New event', 27 'edit-event': 'Edit event', 28 'form-title': 'Title', 29 'form-calendar': 'Calendar', 30 'form-start-date': 'Start date', 31 'form-start-time': 'Start time', 32 'form-end-date': 'End date', 33 'form-end-time': 'End time', 34 'form-notes': 'Notes', 35 'form-attendees': 'Attendees', 36 'event-title-ph': 'Event title', 37 'notes-ph': 'Optional notes…', 38 'delete': 'Delete', 39 'cancel': 'Cancel', 40 'save': 'Save', 41 // calendar modal 42 'new-cal-title': 'New calendar', 43 'edit-cal-title': 'Edit calendar', 44 'invite-members-title': 'Add members', 45 'form-name': 'Name', 46 'cal-name-ph': 'Calendar name', 47 'form-color': 'Color', 48 'add-by-username': 'Add by username', 49 'username-ph': 'username', 50 'members-title': 'Members', 51 'invite-btn': 'Add', 52 'done': 'Done', 53 'remove': 'Remove', 54 // context menu 55 'ctx-edit': 'Edit', 56 'ctx-invite': 'Add members', 57 'ctx-delete': 'Delete', 58 'ctx-leave-cal': 'Leave calendar', 59 'ctx-edit-name-color': 'Edit name / color', 60 // toggle visibility 61 'hide': 'Hide', 62 'show': 'Show', 63 // alerts 64 'alert-enter-name': 'Please enter a name.', 65 'alert-enter-title': 'Please enter a title.', 66 'alert-fill-times': 'Please fill in start and end times.', 67 'alert-end-after-start':'End must be after start.', 68 'form-all-day': 'All day', 69 'all-day-label': 'all day', 70 'alert-fill-dates': 'Please fill in start and end date.', 71 }, 72 de: { 73 'account': 'Konto', 74 'sign-out': 'Abmelden', 75 'sidebar-calendars': 'Kalender', 76 'new-calendar': 'Neuer Kalender', 77 'upcoming-7days': 'Nächste 7 Tage', 78 'upcoming-later': 'Später', 79 'upcoming-today': 'Heute', 80 'upcoming-tomorrow': 'Morgen', 81 'upcoming-empty': 'Nichts geplant', 82 'toggle-sidebar': 'Seitenleiste umschalten', 83 'prev-month': 'Vorheriger Monat', 84 'next-month': 'Nächster Monat', 85 'weekday-mon': 'Mo', 'weekday-tue': 'Di', 'weekday-wed': 'Mi', 86 'weekday-thu': 'Do', 'weekday-fri': 'Fr', 'weekday-sat': 'Sa', 87 'weekday-sun': 'So', 88 'add-event': '+ Termin hinzufügen', 89 'close': 'Schließen', 90 'new-event': 'Neuer Termin', 91 'edit-event': 'Termin bearbeiten', 92 'form-title': 'Titel', 93 'form-calendar': 'Kalender', 94 'form-start-date': 'Startdatum', 95 'form-start-time': 'Startzeit', 96 'form-end-date': 'Enddatum', 97 'form-end-time': 'Endzeit', 98 'form-notes': 'Notizen', 99 'form-attendees': 'Teilnehmer', 100 'event-title-ph': 'Termintitel', 101 'notes-ph': 'Optionale Notizen…', 102 'delete': 'Löschen', 103 'cancel': 'Abbrechen', 104 'save': 'Speichern', 105 'new-cal-title': 'Neuer Kalender', 106 'edit-cal-title': 'Kalender bearbeiten', 107 'invite-members-title': 'Mitglieder hinzufügen', 108 'form-name': 'Name', 109 'cal-name-ph': 'Kalendername', 110 'form-color': 'Farbe', 111 'add-by-username': 'Benutzername hinzufügen', 112 'username-ph': 'Benutzername', 113 'members-title': 'Mitglieder', 114 'invite-btn': 'Hinzufügen', 115 'done': 'Fertig', 116 'remove': 'Entfernen', 117 'ctx-edit': 'Bearbeiten', 118 'ctx-invite': 'Mitglieder hinzufügen', 119 'ctx-delete': 'Löschen', 120 'ctx-leave-cal': 'Kalender verlassen', 121 'ctx-edit-name-color': 'Name / Farbe bearbeiten', 122 'hide': 'Ausblenden', 123 'show': 'Einblenden', 124 'alert-enter-name': 'Bitte gib einen Namen ein.', 125 'alert-enter-title': 'Bitte gib einen Titel ein.', 126 'alert-fill-times': 'Bitte fülle Start- und Endzeit aus.', 127 'alert-end-after-start':'Das Ende muss nach dem Start liegen.', 128 'form-all-day': 'Ganztägig', 129 'all-day-label': 'ganztägig', 130 'alert-fill-dates': 'Bitte Start- und Enddatum ausfüllen.', 131 }, 132 }; 133 134 window.getLang = function () { 135 const m = document.cookie.match(/(?:^|;\s*)lang=([^;]*)/); 136 return (m && (m[1] === 'en' || m[1] === 'de')) ? m[1] : 'en'; 137 }; 138 139 window.setLang = function (lang) { 140 document.cookie = 'lang=' + lang + '; domain=.piribauer.ch; path=/; max-age=31536000; SameSite=Lax'; 141 applyTranslations(lang); 142 document.dispatchEvent(new CustomEvent('langchange', { detail: { lang: lang } })); 143 }; 144 145 window.t = function (key) { 146 const lang = getLang(); 147 return (TRANSLATIONS[lang] && TRANSLATIONS[lang][key] !== undefined) 148 ? TRANSLATIONS[lang][key] 149 : (TRANSLATIONS.en[key] !== undefined ? TRANSLATIONS.en[key] : key); 150 }; 151 152 function applyTranslations(lang) { 153 const tr = TRANSLATIONS[lang] || TRANSLATIONS.en; 154 document.querySelectorAll('[data-i18n]').forEach(function (el) { 155 const v = tr[el.dataset.i18n]; 156 if (v !== undefined) el.textContent = v; 157 }); 158 document.querySelectorAll('[data-i18n-title]').forEach(function (el) { 159 const v = tr[el.dataset.i18nTitle]; 160 if (v !== undefined) el.title = v; 161 }); 162 document.querySelectorAll('[data-i18n-placeholder]').forEach(function (el) { 163 const v = tr[el.dataset.i18nPlaceholder]; 164 if (v !== undefined) el.placeholder = v; 165 }); 166 document.querySelectorAll('.lang-opt').forEach(function (btn) { 167 btn.classList.toggle('lang-active', btn.dataset.lang === lang); 168 }); 169 } 170 171 applyTranslations(getLang()); 172 })();