familytree

A self-hosted family tree builder.
Log | Files | Refs | README

i18n.js (11217B)


      1 (function () {
      2   const TRANSLATIONS = {
      3     en: {
      4       // topbar
      5       'account':              'Account',
      6       'sign-out':             'Sign out',
      7       'toggle-sidebar':       'Toggle sidebar',
      8       // sidebar
      9       'sidebar-trees':        'Trees',
     10       'new-tree':             'New tree',
     11       // empty state
     12       'empty-title':          'No tree selected',
     13       'empty-sub':            'Create a tree or select one from the sidebar',
     14       'create-tree-btn':      'Create a tree',
     15       // toolbar
     16       'zoom-in':              'Zoom in',
     17       'zoom-out':             'Zoom out',
     18       'fit-screen':           'Fit to screen',
     19       'add-person':           'Add person',
     20       // detail panel buttons
     21       'btn-edit':             'Edit',
     22       'btn-delete':           'Delete',
     23       'btn-close':            'Close',
     24       // detail panel fields
     25       'born':                 'Born',
     26       'died':                 'Died',
     27       'buried':               'Buried',
     28       'biography':            'Biography',
     29       'partnerships':         'Partnerships',
     30       'children':             'Children',
     31       'parents':              'Parents',
     32       'siblings':             'Siblings',
     33       'add-relationship':     'Add relationship',
     34       'add-partnership-btn':  'Add partnership',
     35       'set-parents-btn':      'Set parents of this person',
     36       'add-child-btn':        'Add a child for this person',
     37       'rel-married':          'Married',
     38       'rel-separated':        'Separated',
     39       'rel-partner':          'Partner',
     40       // context menu
     41       'ctx-rename':           'Rename',
     42       'ctx-members':          'Manage members',
     43       'ctx-leave':            'Leave tree',
     44       'ctx-delete':           'Delete tree',
     45       // tree modal
     46       'new-tree-title':       'New tree',
     47       'rename-tree-title':    'Rename tree',
     48       'form-name':            'Name',
     49       'tree-name-ph':         'e.g. Smith family',
     50       'create':               'Create',
     51       'cancel':               'Cancel',
     52       'save':                 'Save',
     53       // person modal
     54       'add-person-title':     'Add person',
     55       'edit-person-title':    'Edit person',
     56       'form-first-name':      'First name',
     57       'form-last-name':       'Last name',
     58       'form-birth-date':      'Birth date',
     59       'form-death-date':      'Death date',
     60       'form-birth-place':     'Birth place',
     61       'form-burial-place':    'Burial place',
     62       'form-biography':       'Biography',
     63       'bio-ph':               'A short note…',
     64       // connect modal
     65       'connect-how':          'How would you like to add this person to the tree?',
     66       'connect-partner':      'Partner of someone',
     67       'connect-child':        'Child of someone',
     68       'connect-parent':       'Parent of someone',
     69       'connect-sibling':      'Sibling of someone',
     70       'skip-for-now':         'Skip for now',
     71       // partnership modal
     72       'add-partnership-title':'Add partnership',
     73       'sibling-of-title':     'Add as sibling of…',
     74       'form-person1':         'Person 1',
     75       'form-person2':         'Person 2',
     76       'form-type':            'Type',
     77       'type-married':         'Married',
     78       'type-partnered':       'Partnered',
     79       'type-separated':       'Separated',
     80       'form-start-date':      'Start date',
     81       'form-end-date':        'End date',
     82       'add-sibling-btn':      'Add as sibling',
     83       // parent link modal
     84       'add-parent-link-title':'Add parent link',
     85       'form-child':           'Child',
     86       'form-link-via':        'Link via',
     87       'link-partnership':     'Partnership (two parents)',
     88       'link-single-parent':   'Single parent',
     89       'form-partnership':     'Partnership',
     90       'form-parent':          'Parent',
     91       // members modal
     92       'members-title':        'Members',
     93       'add-by-username':      'Add by username',
     94       'username-ph':          'username',
     95       'role-editor':          'Editor',
     96       'role-viewer':          'Viewer',
     97       'invite-btn':           'Add',
     98       'done':                 'Done',
     99       'remove':               'Remove',
    100       'pending':              'Pending',
    101       // toolbar
    102       'download-pdf':         'PDF',
    103       // canvas
    104       'no-people-yet':        'No people yet — use “Add person” to get started',
    105       // roles in sidebar
    106       'role-owner':           'owner',
    107       // alerts / confirms
    108       'alert-first-name-req': 'First name is required',
    109       'alert-add-two-people': 'Add at least two people first.',
    110       'alert-select-diff':    'Select two different people.',
    111       'alert-no-parents':     'That person has no parents in the tree yet. Set their parents first, then add the sibling.',
    112       'confirm-delete-tree':  'Delete this tree and all its data?',
    113       'confirm-leave-tree':   'Leave this tree?',
    114       'confirm-delete-person':'Delete this person and all their relationships?',
    115     },
    116     de: {
    117       'account':              'Konto',
    118       'sign-out':             'Abmelden',
    119       'toggle-sidebar':       'Seitenleiste umschalten',
    120       'sidebar-trees':        'Stammbäume',
    121       'new-tree':             'Neuer Stammbaum',
    122       'empty-title':          'Kein Stammbaum ausgewählt',
    123       'empty-sub':            'Erstelle einen Stammbaum oder wähle einen aus der Seitenleiste',
    124       'create-tree-btn':      'Stammbaum erstellen',
    125       'zoom-in':              'Vergrößern',
    126       'zoom-out':             'Verkleinern',
    127       'fit-screen':           'Auf Bildschirm anpassen',
    128       'add-person':           'Person hinzufügen',
    129       'btn-edit':             'Bearbeiten',
    130       'btn-delete':           'Löschen',
    131       'btn-close':            'Schließen',
    132       'born':                 'Geboren',
    133       'died':                 'Gestorben',
    134       'buried':               'Begraben',
    135       'biography':            'Biografie',
    136       'partnerships':         'Partnerschaften',
    137       'children':             'Kinder',
    138       'parents':              'Eltern',
    139       'siblings':             'Geschwister',
    140       'add-relationship':     'Beziehung hinzufügen',
    141       'add-partnership-btn':  'Partnerschaft hinzufügen',
    142       'set-parents-btn':      'Eltern dieser Person festlegen',
    143       'add-child-btn':        'Kind dieser Person hinzufügen',
    144       'rel-married':          'Verheiratet',
    145       'rel-separated':        'Getrennt',
    146       'rel-partner':          'Partner',
    147       'ctx-rename':           'Umbenennen',
    148       'ctx-members':          'Mitglieder verwalten',
    149       'ctx-leave':            'Stammbaum verlassen',
    150       'ctx-delete':           'Stammbaum löschen',
    151       'new-tree-title':       'Neuer Stammbaum',
    152       'rename-tree-title':    'Stammbaum umbenennen',
    153       'form-name':            'Name',
    154       'tree-name-ph':         'z.B. Familie Müller',
    155       'create':               'Erstellen',
    156       'cancel':               'Abbrechen',
    157       'save':                 'Speichern',
    158       'add-person-title':     'Person hinzufügen',
    159       'edit-person-title':    'Person bearbeiten',
    160       'form-first-name':      'Vorname',
    161       'form-last-name':       'Nachname',
    162       'form-birth-date':      'Geburtsdatum',
    163       'form-death-date':      'Sterbedatum',
    164       'form-birth-place':     'Geburtsort',
    165       'form-burial-place':    'Begräbnisort',
    166       'form-biography':       'Biografie',
    167       'bio-ph':               'Eine kurze Notiz…',
    168       'connect-how':          'Wie möchtest du diese Person zum Stammbaum hinzufügen?',
    169       'connect-partner':      'Partner von jemandem',
    170       'connect-child':        'Kind von jemandem',
    171       'connect-parent':       'Elternteil von jemandem',
    172       'connect-sibling':      'Geschwister von jemandem',
    173       'skip-for-now':         'Vorerst überspringen',
    174       'add-partnership-title':'Partnerschaft hinzufügen',
    175       'sibling-of-title':     'Als Geschwister von…',
    176       'form-person1':         'Person 1',
    177       'form-person2':         'Person 2',
    178       'form-type':            'Typ',
    179       'type-married':         'Verheiratet',
    180       'type-partnered':       'Zusammen',
    181       'type-separated':       'Getrennt',
    182       'form-start-date':      'Startdatum',
    183       'form-end-date':        'Enddatum',
    184       'add-sibling-btn':      'Als Geschwister hinzufügen',
    185       'add-parent-link-title':'Elternteil-Verbindung hinzufügen',
    186       'form-child':           'Kind',
    187       'form-link-via':        'Verbinden über',
    188       'link-partnership':     'Partnerschaft (zwei Elternteile)',
    189       'link-single-parent':   'Alleinerziehend',
    190       'form-partnership':     'Partnerschaft',
    191       'form-parent':          'Elternteil',
    192       'members-title':        'Mitglieder',
    193       'add-by-username':      'Benutzername hinzufügen',
    194       'username-ph':          'Benutzername',
    195       'role-editor':          'Bearbeiter',
    196       'role-viewer':          'Betrachter',
    197       'invite-btn':           'Hinzufügen',
    198       'done':                 'Fertig',
    199       'remove':               'Entfernen',
    200       'pending':              'Ausstehend',
    201       'download-pdf':         'PDF',
    202       'no-people-yet':        'Noch keine Personen — verwende „Person hinzufügen“ um zu beginnen',
    203       'role-owner':           'Besitzer',
    204       'alert-first-name-req': 'Vorname ist erforderlich.',
    205       'alert-add-two-people': 'Füge zuerst mindestens zwei Personen hinzu.',
    206       'alert-select-diff':    'Wähle zwei verschiedene Personen.',
    207       'alert-no-parents':     'Diese Person hat noch keine Eltern im Stammbaum. Lege zuerst ihre Eltern fest.',
    208       'confirm-delete-tree':  'Diesen Stammbaum und alle Daten löschen?',
    209       'confirm-leave-tree':   'Diesen Stammbaum verlassen?',
    210       'confirm-delete-person':'Diese Person und alle ihre Beziehungen löschen?',
    211     },
    212   };
    213 
    214   window.getLang = function () {
    215     const m = document.cookie.match(/(?:^|;\s*)lang=([^;]*)/);
    216     return (m && (m[1] === 'en' || m[1] === 'de')) ? m[1] : 'en';
    217   };
    218 
    219   window.setLang = function (lang) {
    220     document.cookie = 'lang=' + lang + '; domain=.piribauer.ch; path=/; max-age=31536000; SameSite=Lax';
    221     applyTranslations(lang);
    222     document.dispatchEvent(new CustomEvent('langchange', { detail: { lang: lang } }));
    223   };
    224 
    225   window.t = function (key) {
    226     const lang = getLang();
    227     return (TRANSLATIONS[lang] && TRANSLATIONS[lang][key] !== undefined)
    228       ? TRANSLATIONS[lang][key]
    229       : (TRANSLATIONS.en[key] !== undefined ? TRANSLATIONS.en[key] : key);
    230   };
    231 
    232   function applyTranslations(lang) {
    233     const tr = TRANSLATIONS[lang] || TRANSLATIONS.en;
    234     document.querySelectorAll('[data-i18n]').forEach(function (el) {
    235       const v = tr[el.dataset.i18n];
    236       if (v !== undefined) el.textContent = v;
    237     });
    238     document.querySelectorAll('[data-i18n-title]').forEach(function (el) {
    239       const v = tr[el.dataset.i18nTitle];
    240       if (v !== undefined) el.title = v;
    241     });
    242     document.querySelectorAll('[data-i18n-placeholder]').forEach(function (el) {
    243       const v = tr[el.dataset.i18nPlaceholder];
    244       if (v !== undefined) el.placeholder = v;
    245     });
    246     document.querySelectorAll('.lang-opt').forEach(function (btn) {
    247       btn.classList.toggle('lang-active', btn.dataset.lang === lang);
    248     });
    249   }
    250 
    251   applyTranslations(getLang());
    252 })();