// HTML349 lines · 20112 chars
| 1 | <!DOCTYPE html> |
| 2 | <html lang="de"> |
| 3 | <head> |
| 4 | <meta charset="UTF-8" /> |
| 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| 6 | <meta name="robots" content="noindex, nofollow" /> |
| 7 | <title>Impressum</title> |
| 8 | <style> |
| 9 | :root { |
| 10 | --bg: #f4f4f5; |
| 11 | --surface: #ffffff; |
| 12 | --text: #18181b; |
| 13 | --muted: #6b7280; |
| 14 | --accent: #3b82f6; |
| 15 | --border: #e4e4e7; |
| 16 | --shadow: 0 1px 3px rgba(0,0,0,.06), 0 8px 24px rgba(0,0,0,.04); |
| 17 | --radius: 12px; |
| 18 | } |
| 19 | html[data-theme="dark"] { |
| 20 | --bg: #09090b; |
| 21 | --surface: #161618; |
| 22 | --text: #fafafa; |
| 23 | --muted: #a1a1aa; |
| 24 | --accent: #60a5fa; |
| 25 | --border: #27272a; |
| 26 | --shadow: 0 1px 3px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.3); |
| 27 | } |
| 28 | *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } |
| 29 | html { -webkit-text-size-adjust: 100%; } |
| 30 | body { |
| 31 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; |
| 32 | background: var(--bg); |
| 33 | color: var(--text); |
| 34 | line-height: 1.75; |
| 35 | padding: 1.5rem 1rem 4rem; |
| 36 | transition: background .25s ease, color .25s ease; |
| 37 | } |
| 38 | .topbar { |
| 39 | max-width: 780px; |
| 40 | margin: 0 auto 1.25rem; |
| 41 | display: flex; |
| 42 | align-items: center; |
| 43 | justify-content: space-between; |
| 44 | gap: .75rem; |
| 45 | flex-wrap: wrap; |
| 46 | } |
| 47 | .lang-switcher { display: flex; gap: .35rem; flex-wrap: wrap; } |
| 48 | .lang-btn { |
| 49 | background: var(--surface); |
| 50 | border: 1px solid var(--border); |
| 51 | color: var(--muted); |
| 52 | border-radius: 7px; |
| 53 | padding: .3rem .65rem; |
| 54 | font-size: .78rem; |
| 55 | font-weight: 600; |
| 56 | cursor: pointer; |
| 57 | transition: background .15s, color .15s, border-color .15s; |
| 58 | letter-spacing: .03em; |
| 59 | font-family: inherit; |
| 60 | } |
| 61 | .lang-btn:hover { border-color: var(--accent); color: var(--accent); } |
| 62 | .lang-btn.active { background: var(--accent); border-color: var(--accent); color: #fff; } |
| 63 | .theme-btn { |
| 64 | background: var(--surface); |
| 65 | border: 1px solid var(--border); |
| 66 | border-radius: 7px; |
| 67 | width: 38px; |
| 68 | height: 32px; |
| 69 | font-size: 1rem; |
| 70 | cursor: pointer; |
| 71 | line-height: 1; |
| 72 | transition: background .15s, border-color .15s; |
| 73 | display: inline-flex; |
| 74 | align-items: center; |
| 75 | justify-content: center; |
| 76 | } |
| 77 | .theme-btn:hover { border-color: var(--accent); } |
| 78 | main { |
| 79 | max-width: 780px; |
| 80 | margin: 0 auto; |
| 81 | background: var(--surface); |
| 82 | border-radius: var(--radius); |
| 83 | padding: 2.75rem 2.5rem; |
| 84 | box-shadow: var(--shadow); |
| 85 | border: 1px solid var(--border); |
| 86 | transition: background .25s ease, border-color .25s ease; |
| 87 | } |
| 88 | .domain-badge { |
| 89 | display: inline-block; |
| 90 | background: var(--bg); |
| 91 | border: 1px solid var(--border); |
| 92 | color: var(--muted); |
| 93 | border-radius: 99px; |
| 94 | padding: .25rem .8rem; |
| 95 | font-size: .76rem; |
| 96 | font-weight: 600; |
| 97 | margin-bottom: 1.5rem; |
| 98 | letter-spacing: .04em; |
| 99 | font-variant-numeric: tabular-nums; |
| 100 | } |
| 101 | h1 { font-size: 1.9rem; font-weight: 700; margin-bottom: 1rem; letter-spacing: -.01em; } |
| 102 | .domains-note { |
| 103 | background: var(--bg); |
| 104 | border: 1px solid var(--border); |
| 105 | border-radius: 8px; |
| 106 | padding: .75rem 1rem; |
| 107 | font-size: .88rem; |
| 108 | color: var(--text) !important; |
| 109 | margin-bottom: 1.5rem; |
| 110 | } |
| 111 | h2 { font-size: 1.05rem; font-weight: 600; margin: 1.85rem 0 .55rem; } |
| 112 | p { margin-bottom: .9rem; color: var(--muted); font-size: .93rem; } |
| 113 | p strong { color: var(--text); } |
| 114 | a { color: var(--accent); text-decoration: none; } |
| 115 | a:hover { text-decoration: underline; } |
| 116 | .contact-line { |
| 117 | margin-top: 1.75rem; |
| 118 | padding-top: 1.25rem; |
| 119 | border-top: 1px solid var(--border); |
| 120 | font-size: .88rem; |
| 121 | } |
| 122 | footer { |
| 123 | text-align: center; |
| 124 | margin-top: 2rem; |
| 125 | font-size: .78rem; |
| 126 | color: var(--muted); |
| 127 | } |
| 128 | @media (max-width: 560px) { |
| 129 | main { padding: 1.75rem 1.3rem; } |
| 130 | h1 { font-size: 1.55rem; } |
| 131 | } |
| 132 | </style> |
| 133 | </head> |
| 134 | <body> |
| 135 | <div class="topbar"> |
| 136 | <nav class="lang-switcher" id="langSwitcher" aria-label="Sprache / Language"></nav> |
| 137 | <button class="theme-btn" id="themeBtn" type="button" aria-label="Theme umschalten">🌙</button> |
| 138 | </div> |
| 139 | |
| 140 | <main id="content"> |
| 141 | <noscript> |
| 142 | <h1>Impressum</h1> |
| 143 | <p>Diese Seite benötigt JavaScript für die mehrsprachige Anzeige. Kontakt: admin@durchdacht.me</p> |
| 144 | </noscript> |
| 145 | </main> |
| 146 | |
| 147 | <script> |
| 148 | "use strict"; |
| 149 | |
| 150 | /* ── Übersetzungen (alle Texte als Template-Strings → keine Quote-Konflikte) ── */ |
| 151 | const T = { |
| 152 | de: { |
| 153 | title: `Impressum`, |
| 154 | domainsNote: `Dieses Impressum gilt für die Websites <strong>durchdacht.me</strong>, <strong>empty.tokyo</strong> und <strong>fld.wtf</strong>.`, |
| 155 | tmgHead: `Angaben gemäß § 5 TMG`, |
| 156 | tmgBody: `<strong>ENTFALLEN</strong>, weil: Meine Website dient lediglich dem Eigeninteresse.`, |
| 157 | tmgNote: `Wenn Sie Ihre Webseite ausschließlich zu privaten Zwecken betreiben, müssen Sie keine rechtlichen Formalien für die Gestaltung Ihres Impressums einhalten. § 5 TMG spricht explizit von „geschäftsmäßigen Online-Diensten", die ein verpflichtendes Impressum vorsehen. Einige Internetseiten weisen einen eindeutig privaten Charakter auf. Zu diesen zählen in erster Linie Blogs, in denen Sie Ihre privaten Erfahrungen und Gedanken mit anderen Nutzern teilen. Auch Webseiten über Ihr liebstes Hobby oder Fan-Seiten werden häufig als rein privates Projekt angesehen.`, |
| 158 | disclaimerHead: `Haftungsausschluss (Disclaimer)`, |
| 159 | contentHead: `Haftung für Inhalte`, |
| 160 | contentBody: `Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.`, |
| 161 | linksHead: `Haftung für Links`, |
| 162 | linksBody: `Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.`, |
| 163 | copyrightHead: `Urheberrecht`, |
| 164 | copyrightBody: `Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.`, |
| 165 | contact: `Kontakt`, |
| 166 | source: `Quelle`, |
| 167 | }, |
| 168 | en: { |
| 169 | title: `Legal Notice`, |
| 170 | domainsNote: `This legal notice applies to the websites <strong>durchdacht.me</strong>, <strong>empty.tokyo</strong> and <strong>fld.wtf</strong>.`, |
| 171 | tmgHead: `Information pursuant to § 5 TMG`, |
| 172 | tmgBody: `<strong>NOT APPLICABLE</strong>, because: This website serves personal interest only.`, |
| 173 | tmgNote: `If you operate your website exclusively for private purposes, you are not required to comply with any legal formalities regarding your legal notice. § 5 TMG explicitly refers to "commercially operated online services" that require a mandatory legal notice. Some websites have a clearly private character — primarily blogs in which you share personal experiences and thoughts, websites about your favourite hobby, or fan pages, which are generally regarded as purely private projects.`, |
| 174 | disclaimerHead: `Disclaimer`, |
| 175 | contentHead: `Liability for Content`, |
| 176 | contentBody: `As a service provider, we are responsible for our own content on these pages in accordance with § 7 para. 1 TMG under general law. According to §§ 8 to 10 TMG, however, we are not obligated to monitor transmitted or stored third-party information or to investigate circumstances indicating illegal activity. Obligations to remove or block the use of information under general law remain unaffected. Liability in this regard is only possible from the point in time at which we become aware of a specific legal violation. Upon becoming aware of corresponding violations, we will remove this content immediately.`, |
| 177 | linksHead: `Liability for Links`, |
| 178 | linksBody: `Our website contains links to external third-party websites over whose content we have no influence. Therefore we cannot assume any liability for these external contents. The respective provider or operator of the linked pages is always responsible for their content. The linked pages were checked for possible legal violations at the time of linking. Illegal content was not recognisable at the time of linking. Permanent monitoring of the linked pages without concrete evidence of a legal violation is, however, not reasonable. Upon becoming aware of legal violations, we will remove such links immediately.`, |
| 179 | copyrightHead: `Copyright`, |
| 180 | copyrightBody: `The content and works on these pages created by the site operator are subject to German copyright law. Duplication, processing, distribution, and any form of commercialisation of such material beyond the scope of copyright law require the prior written consent of the respective author or creator. Downloads and copies of this site are only permitted for private, non-commercial use. Insofar as content on this site was not created by the operator, the copyrights of third parties are respected and third-party content is identified as such. Should you become aware of a copyright infringement, please inform us accordingly. We will remove such content immediately upon becoming aware of any violations.`, |
| 181 | contact: `Contact`, |
| 182 | source: `Source`, |
| 183 | }, |
| 184 | ru: { |
| 185 | title: `Выходные данные`, |
| 186 | domainsNote: `Эти выходные данные распространяются на сайты <strong>durchdacht.me</strong>, <strong>empty.tokyo</strong> и <strong>fld.wtf</strong>.`, |
| 187 | tmgHead: `Сведения согласно § 5 TMG`, |
| 188 | tmgBody: `<strong>НЕ ПРИМЕНЯЕТСЯ</strong>, поскольку: Данный сайт служит исключительно личным интересам.`, |
| 189 | tmgNote: `Если вы ведёте сайт исключительно в личных целях, вы не обязаны соблюдать юридические формальности при оформлении выходных данных. § 5 TMG прямо указывает на «коммерческие онлайн-сервисы», для которых обязательно наличие выходных данных. Некоторые сайты носят явно личный характер — прежде всего блоги, в которых вы делитесь личным опытом и мыслями, сайты о вашем хобби или фан-страницы, которые обычно рассматриваются как сугубо личные проекты.`, |
| 190 | disclaimerHead: `Отказ от ответственности`, |
| 191 | contentHead: `Ответственность за содержание`, |
| 192 | contentBody: `Как поставщик услуг мы несём ответственность за собственный контент на этих страницах в соответствии с § 7 абз. 1 TMG. Согласно §§ 8–10 TMG мы не обязаны отслеживать передаваемую или хранимую информацию третьих лиц или расследовать обстоятельства, указывающие на противоправную деятельность. Обязанности по удалению или блокировке информации согласно общему праву остаются в силе. Ответственность возможна лишь с момента получения сведений о конкретном нарушении закона. При обнаружении соответствующих нарушений мы незамедлительно удалим такой контент.`, |
| 193 | linksHead: `Ответственность за ссылки`, |
| 194 | linksBody: `Наш сайт содержит ссылки на внешние сайты третьих лиц, на содержание которых мы не имеем влияния, и поэтому не можем принять на себя ответственность за эти материалы. Ответственность за содержание связанных страниц всегда несёт соответствующий поставщик или оператор. Связанные страницы были проверены на предмет возможных правовых нарушений на момент создания ссылки — незаконных материалов обнаружено не было. Постоянный контроль без конкретных признаков нарушения закона не представляется целесообразным. При обнаружении нарушений мы незамедлительно удалим такие ссылки.`, |
| 195 | copyrightHead: `Авторские права`, |
| 196 | copyrightBody: `Контент и произведения, созданные операторами сайта, подпадают под действие германского авторского права. Тиражирование, обработка, распространение и любые виды коммерческого использования таких материалов требуют предварительного письменного согласия соответствующего автора. Загрузки и копии сайта разрешены только для частного некоммерческого использования. Контент, созданный третьими лицами, обозначен как таковой, и их авторские права соблюдаются. Если вы обнаружите нарушение авторских прав, просим сообщить нам — мы незамедлительно удалим соответствующий контент.`, |
| 197 | contact: `Контакт`, |
| 198 | source: `Источник`, |
| 199 | }, |
| 200 | zh: { |
| 201 | title: `法律声明`, |
| 202 | domainsNote: `本法律声明适用于以下网站:<strong>durchdacht.me</strong>、<strong>empty.tokyo</strong> 和 <strong>fld.wtf</strong>。`, |
| 203 | tmgHead: `根据 § 5 TMG 的信息披露`, |
| 204 | tmgBody: `<strong>不适用</strong>,原因如下:本网站仅供个人兴趣使用。`, |
| 205 | tmgNote: `如果您仅出于私人目的运营网站,则无需遵守有关法律声明的任何法律形式要求。§ 5 TMG 明确指的是需要强制性法律声明的"商业在线服务"。部分网站具有明显的私人性质,主要包括您与他人分享私人经历和想法的博客,以及关于您爱好的网站或粉丝页面,这些通常被视为纯粹的私人项目。`, |
| 206 | disclaimerHead: `免责声明`, |
| 207 | contentHead: `内容责任`, |
| 208 | contentBody: `作为服务提供商,我们根据 § 7 第 1 款 TMG 对本页面上的自有内容负责。然而,根据 §§ 8 至 10 TMG,我们没有义务监控传输或存储的第三方信息,也没有义务调查表明非法活动的情况。依据一般法律删除或封锁信息的义务不受影响。但此方面的责任仅在知晓具体违法行为后才可能产生。一旦获悉相应违规行为,我们将立即删除相关内容。`, |
| 209 | linksHead: `链接责任`, |
| 210 | linksBody: `我们的网站包含指向第三方外部网站的链接,我们对其内容没有任何影响,因此不对这些外部内容承担任何责任。链接页面的内容始终由相应提供商或运营商负责。链接页面在链接时已检查是否存在潜在违法行为,链接时未发现违法内容。但在没有具体侵权迹象的情况下,对链接页面进行持续监控是不合理的。一旦获悉违法行为,我们将立即删除此类链接。`, |
| 211 | copyrightHead: `版权`, |
| 212 | copyrightBody: `本网站运营商在本页面上创建的内容和作品受德国版权法保护。在版权法范围之外对此类材料进行复制、处理、分发及任何形式的商业利用,均需获得相应作者或创作者的书面许可。本网站的下载和副本仅允许用于私人、非商业目的。如本网站内容非运营商所创建,则尊重第三方版权,并特别标注第三方内容。如您发现版权侵权问题,请及时通知我们。一旦获悉违法行为,我们将立即删除相关内容。`, |
| 213 | contact: `联系方式`, |
| 214 | source: `来源`, |
| 215 | }, |
| 216 | }; |
| 217 | |
| 218 | const LANGS = [ |
| 219 | { code: "de", label: "DE" }, |
| 220 | { code: "en", label: "EN" }, |
| 221 | { code: "ru", label: "RU" }, |
| 222 | { code: "zh", label: "中文" }, |
| 223 | ]; |
| 224 | |
| 225 | /* Land → Sprache */ |
| 226 | const COUNTRY_LANG = { |
| 227 | DE:"de", AT:"de", CH:"de", LI:"de", LU:"de", |
| 228 | RU:"ru", BY:"ru", KZ:"ru", KG:"ru", TJ:"ru", UZ:"ru", AM:"ru", AZ:"ru", GE:"ru", MD:"ru", UA:"ru", |
| 229 | CN:"zh", TW:"zh", HK:"zh", MO:"zh", SG:"zh", |
| 230 | }; |
| 231 | |
| 232 | const htmlEl = document.documentElement; |
| 233 | |
| 234 | /* ── Theme ── */ |
| 235 | const themeBtn = document.getElementById("themeBtn"); |
| 236 | function applyTheme(t) { |
| 237 | htmlEl.setAttribute("data-theme", t); |
| 238 | themeBtn.textContent = t === "dark" ? "☀️" : "🌙"; |
| 239 | try { localStorage.setItem("theme", t); } catch (e) {} |
| 240 | } |
| 241 | (function initTheme() { |
| 242 | let saved = null; |
| 243 | try { saved = localStorage.getItem("theme"); } catch (e) {} |
| 244 | if (saved === "dark" || saved === "light") { applyTheme(saved); return; } |
| 245 | const prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches; |
| 246 | applyTheme(prefersDark ? "dark" : "light"); |
| 247 | })(); |
| 248 | themeBtn.addEventListener("click", function () { |
| 249 | applyTheme(htmlEl.getAttribute("data-theme") === "dark" ? "light" : "dark"); |
| 250 | }); |
| 251 | /* Folge dem System, solange keine manuelle Wahl gespeichert ist */ |
| 252 | if (window.matchMedia) { |
| 253 | window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", function (e) { |
| 254 | let saved = null; |
| 255 | try { saved = localStorage.getItem("theme"); } catch (err) {} |
| 256 | if (!saved) applyTheme(e.matches ? "dark" : "light"); |
| 257 | }); |
| 258 | } |
| 259 | |
| 260 | /* ── Sprache ── */ |
| 261 | let savedLang = null; |
| 262 | try { savedLang = localStorage.getItem("lang"); } catch (e) {} |
| 263 | let currentLang = (savedLang && T[savedLang]) ? savedLang : "de"; |
| 264 | |
| 265 | const switcher = document.getElementById("langSwitcher"); |
| 266 | LANGS.forEach(function (l) { |
| 267 | const btn = document.createElement("button"); |
| 268 | btn.type = "button"; |
| 269 | btn.className = "lang-btn"; |
| 270 | btn.textContent = l.label; |
| 271 | btn.dataset.code = l.code; |
| 272 | btn.addEventListener("click", function () { setLang(l.code, true); }); |
| 273 | switcher.appendChild(btn); |
| 274 | }); |
| 275 | |
| 276 | function highlightLang() { |
| 277 | switcher.querySelectorAll(".lang-btn").forEach(function (b) { |
| 278 | b.classList.toggle("active", b.dataset.code === currentLang); |
| 279 | }); |
| 280 | } |
| 281 | |
| 282 | function setLang(code, persist) { |
| 283 | if (!T[code]) code = "en"; |
| 284 | currentLang = code; |
| 285 | if (persist) { try { localStorage.setItem("lang", code); } catch (e) {} } |
| 286 | htmlEl.lang = code; |
| 287 | highlightLang(); |
| 288 | renderContent(); |
| 289 | } |
| 290 | |
| 291 | /* ── Domain ── */ |
| 292 | function getDomain() { |
| 293 | const h = (window.location.hostname || "").toLowerCase(); |
| 294 | if (h.indexOf("empty.tokyo") !== -1) return "empty.tokyo"; |
| 295 | if (h.indexOf("fld.wtf") !== -1) return "fld.wtf"; |
| 296 | return "durchdacht.me"; |
| 297 | } |
| 298 | |
| 299 | /* ── Render ── */ |
| 300 | function renderContent() { |
| 301 | const t = T[currentLang]; |
| 302 | const domain = getDomain(); |
| 303 | document.title = t.title + " · " + domain; |
| 304 | document.getElementById("content").innerHTML = |
| 305 | '<span class="domain-badge">' + domain + '</span>' + |
| 306 | '<h1>' + t.title + '</h1>' + |
| 307 | '<p class="domains-note">' + t.domainsNote + '</p>' + |
| 308 | '<h2>' + t.tmgHead + '</h2>' + |
| 309 | '<p>' + t.tmgBody + '</p>' + |
| 310 | '<p>' + t.tmgNote + '</p>' + |
| 311 | '<h2>' + t.disclaimerHead + '</h2>' + |
| 312 | '<h2>' + t.contentHead + '</h2>' + |
| 313 | '<p>' + t.contentBody + '</p>' + |
| 314 | '<h2>' + t.linksHead + '</h2>' + |
| 315 | '<p>' + t.linksBody + '</p>' + |
| 316 | '<h2>' + t.copyrightHead + '</h2>' + |
| 317 | '<p>' + t.copyrightBody + '</p>' + |
| 318 | '<p class="contact-line">' + t.contact + |
| 319 | ': <a href="mailto:admin@durchdacht.me">admin@durchdacht.me</a></p>' + |
| 320 | '<footer>' + t.source + |
| 321 | ': <a href="https://www.e-recht24.de" target="_blank" rel="noopener noreferrer">e-recht24.de</a></footer>'; |
| 322 | } |
| 323 | |
| 324 | /* Sofort rendern – Seite ist nie leer */ |
| 325 | highlightLang(); |
| 326 | renderContent(); |
| 327 | |
| 328 | /* ── IP-Spracherkennung (nur Erstbesuch ohne gespeicherte Wahl) ── */ |
| 329 | (function detectLangByIP() { |
| 330 | if (savedLang && T[savedLang]) return; |
| 331 | const ctrl = new AbortController(); |
| 332 | const timer = setTimeout(function () { ctrl.abort(); }, 3000); |
| 333 | fetch("https://api.country.is/", { signal: ctrl.signal }) |
| 334 | .then(function (r) { return r.json(); }) |
| 335 | .then(function (d) { |
| 336 | clearTimeout(timer); |
| 337 | const lang = COUNTRY_LANG[(d && d.country) || ""] || "en"; |
| 338 | setLang(lang, false); |
| 339 | }) |
| 340 | .catch(function () { |
| 341 | clearTimeout(timer); |
| 342 | /* Fallback: Browsersprache, sonst Englisch */ |
| 343 | const nav = (navigator.language || "en").slice(0, 2).toLowerCase(); |
| 344 | setLang(T[nav] ? nav : "en", false); |
| 345 | }); |
| 346 | })(); |
| 347 | </script> |
| 348 | </body> |
| 349 | </html> |