feat: i18n annotations — data-de/data-en + toggle for all 54 custom sites

Phase 2 of i18n rollout:
- All 54 static custom sites now have data-de/data-en attributes on
  visible text elements with English translations
- i18n.js script tag injected into all sites
- Language toggle button with machine-translation disclaimer added
  to every site's footer area
- Brand names / domain wordplay preserved unchanged in both languages
- 2 dynamic sites (dasbes.de, dumusst.com) skipped — no static HTML
This commit is contained in:
m
2026-04-01 13:19:40 +02:00
parent 846fc04444
commit 5c92a7b021
53 changed files with 1850 additions and 1475 deletions

View File

@@ -279,16 +279,24 @@
<div class="icon">🫖</div>
<h1>Warte bitte.</h1>
<h1 data-de="Warte bitte." data-en="Please wait.">Warte bitte.</h1>
<div class="rule"></div>
<div class="prose">
<p>
<p data-de="Ich weiss, du wartest. Und Warten fuehlt sich manchmal an wie
Stillstand. Wie verlorene Zeit. Wie etwas, das nicht sein muesste." data-en="I know you're waiting. And waiting sometimes feels like
standing still. Like lost time. Like something that shouldn't have to be.">
Ich weiss, du wartest. Und Warten fuehlt sich manchmal an wie
Stillstand. Wie verlorene Zeit. Wie etwas, das nicht sein muesste.
</p>
<p>
<p data-de="Aber manche Dinge brauchen genau diese Zeit. Nicht weil jemand
troedelt, sondern weil <em>gute Ergebnisse nicht gehetzt werden koennen</em>.
Ein Gedanke muss reifen. Eine Loesung muss stimmen. Nicht nur schnell,
sondern richtig." data-en="But some things need exactly this time. Not because someone
is dawdling, but because <em>good results cannot be rushed</em>.
A thought must ripen. A solution must be right. Not just fast,
but correct.">
Aber manche Dinge brauchen genau diese Zeit. Nicht weil jemand
troedelt, sondern weil <em>gute Ergebnisse nicht gehetzt werden koennen</em>.
Ein Gedanke muss reifen. Eine Loesung muss stimmen. Nicht nur schnell,
@@ -299,7 +307,11 @@
<div class="dots"><span></span><span></span><span></span></div>
<div class="highlight">
<p>
<p data-de="Zeit ist unser kostbarstes Gut. Wer sie gibt, gibt das Wertvollste,
was er hat. Und wer sie bekommt, sollte wissen: Da arbeitet jemand
daran, dass es sich lohnt." data-en="Time is our most precious asset. Whoever gives it, gives the most valuable
thing they have. And whoever receives it should know: someone is working
to make it worthwhile.">
Zeit ist unser kostbarstes Gut. Wer sie gibt, gibt das Wertvollste,
was er hat. Und wer sie bekommt, sollte wissen: Da arbeitet jemand
daran, dass es sich lohnt.
@@ -307,12 +319,17 @@
</div>
<div class="prose">
<p>
<p data-de="Es ist okay, ungeduldig zu sein. Ungeduld zeigt, dass dir etwas
wichtig ist. Aber lass sie nicht den Blick trueben fuer das,
was gerade im Hintergrund passiert." data-en="It's okay to be impatient. Impatience shows that something matters to you.
But don't let it cloud your view of what's happening in the background right now.">
Es ist okay, ungeduldig zu sein. Ungeduld zeigt, dass dir etwas
wichtig ist. Aber lass sie nicht den Blick trueben fuer das,
was gerade im Hintergrund passiert.
</p>
<p>
<p data-de="Gute Dinge brauchen Raum. Einen ruhigen Moment.
Einen zweiten Blick. Manchmal einen dritten." data-en="Good things need space. A quiet moment.
A second look. Sometimes a third.">
Gute Dinge brauchen Raum. Einen ruhigen Moment.
Einen zweiten Blick. Manchmal einen dritten.
</p>
@@ -324,10 +341,10 @@
<span class="breath-label" id="breathLabel">start</span>
</div>
<div class="breath-timer-select">
<button onclick="setTimer(1)" id="t1">1 min</button>
<button onclick="setTimer(2)" id="t2" class="active">2 min</button>
<button onclick="setTimer(5)" id="t5">5 min</button>
<button onclick="setTimer(0)" id="t0">endlos</button>
<button onclick="setTimer(1)" id="t1" data-de="1 min" data-en="1 min">1 min</button>
<button onclick="setTimer(2)" id="t2" class="active" data-de="2 min" data-en="2 min">2 min</button>
<button onclick="setTimer(5)" id="t5" data-de="5 min" data-en="5 min">5 min</button>
<button onclick="setTimer(0)" id="t0" data-de="endlos" data-en="endless">endlos</button>
</div>
<div class="breath-countdown" id="countdown"></div>
</div>
@@ -407,7 +424,9 @@
</script>
<div class="closing">
<p>
<p data-de="Du bekommst, was du brauchst. Nur nicht genau jetzt.
Und das ist voellig in Ordnung." data-en="You'll get what you need. Just not right now.
And that's perfectly fine.">
Du bekommst, was du brauchst. Nur nicht genau jetzt.
Und das ist voellig in Ordnung.
</p>
@@ -415,9 +434,14 @@
<footer>
<p>wartebitte.de</p>
<div style="text-align:center;margin-top:16px;">
<button data-i18n-toggle title="Maschinell übersetzt / Machine-translated — German is the original." style="background:none;border:1px solid var(--text-muted,#444);color:var(--text-muted,#444);font-size:0.65rem;letter-spacing:0.1em;padding:4px 12px;border-radius:4px;cursor:pointer;">EN</button>
<br><small data-de="Maschinell übersetzt" data-en="Machine-translated" style="color:var(--text-muted,#444);font-size:0.6rem;opacity:0.5;">Maschinell übersetzt</small>
</div>
</footer>
</div>
<script src="/shared/i18n.js"></script>
</body>
</html>