calendar

A HTML/PHP project for a self-hosted (family)-calendar.
Log | Files | Refs | README

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 })();