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