The site now exists in German (at the root, with /impressum and /datenschutz) and English (/en). A request without a language follows the visitor's choice from the language switch, then the browser language, then German; the old English legal addresses move to /en for good. All visible texts are data in src/content/de.ts and en.ts, so components hold none of their own. The header carries a DE/EN switch whose bit curtain covers the page while it is swapped and reopens at the same reading position. Title, description, canonical, hreflang, Open Graph, the share image, the sitemap and the structured data are per language. The privacy notice now describes the cookie that remembers the chosen language. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
236 lines
9.6 KiB
TypeScript
236 lines
9.6 KiB
TypeScript
import { EmailLink } from "@/src/components/EmailLink";
|
|
import { LegalSection } from "@/src/components/LegalPage";
|
|
import { OWNER } from "@/src/content/site";
|
|
import { LOCALE_COOKIE, type Locale } from "@/src/domain/locale";
|
|
import type { LegalText } from "./types";
|
|
|
|
const LINK = "font-bold text-slate-900 underline-offset-4 hover:underline";
|
|
|
|
const address = (country: string): string =>
|
|
`${OWNER.name}, ${OWNER.street}, ${OWNER.postalCode} ${OWNER.locality}, ${country}.`;
|
|
|
|
/**
|
|
* The privacy notice in both languages. It describes what the code actually
|
|
* processes; keep it in step with the code (the language cookie is set by
|
|
* LanguageSwitch, the detection happens in proxy.ts).
|
|
*/
|
|
export const PRIVACY: Readonly<Record<Locale, LegalText>> = {
|
|
de: {
|
|
title: "Datenschutz",
|
|
description: "Wie mintel.me mit personenbezogenen Daten umgeht.",
|
|
Body: () => (
|
|
<>
|
|
<LegalSection heading="Verantwortlicher">
|
|
<p>
|
|
{address("Deutschland")}
|
|
<br />
|
|
E-Mail: <EmailLink className={LINK} />
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Kurz gesagt">
|
|
<p>
|
|
Diese Website zeigt keine Werbung und bindet keine Inhalte von
|
|
Dritten ein. Schriften und Bilder werden von dieser Website selbst
|
|
ausgeliefert. Ein Cookie wird nur gesetzt, wenn Sie die Sprache
|
|
umschalten (siehe „Sprache“).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Server-Protokolle">
|
|
<p>
|
|
Wenn Sie eine Seite öffnen, verarbeitet der Server technische Daten,
|
|
die Ihr Browser sendet: Ihre IP-Adresse, den Zeitpunkt, die
|
|
angeforderte Seite und den Browsertyp. Das ist nötig, um die Website
|
|
auszuliefern und sicher zu betreiben. Rechtsgrundlage ist mein
|
|
berechtigtes Interesse am Betrieb der Website (Art. 6 Abs. 1 lit. f
|
|
DSGVO).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Sprache">
|
|
<p>
|
|
Die Website gibt es auf Deutsch und Englisch. Welche Sprache Sie
|
|
zuerst sehen, richtet sich nach der Spracheinstellung, die Ihr
|
|
Browser bei jedem Seitenaufruf mitsendet. Sie wird dafür nicht
|
|
gespeichert.
|
|
</p>
|
|
<p>
|
|
Wenn Sie die Sprache selbst umschalten, speichert die Website Ihre
|
|
Wahl in einem Cookie namens „{LOCALE_COOKIE}“, damit Sie nicht
|
|
wieder zurückgeleitet werden. Es enthält nur das Sprachkürzel („de“
|
|
oder „en“), gilt ein Jahr und wird für nichts anderes verwendet. Es
|
|
ist für die von Ihnen gewünschte Funktion erforderlich (§ 25 Abs. 2
|
|
Nr. 2 TDDDG).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Besucherstatistik">
|
|
<p>
|
|
Ich zähle Seitenaufrufe mit Umami, das ich auf meinem eigenen Server
|
|
betreibe. Es arbeitet ohne Cookies und erstellt keine Profile
|
|
einzelner Besucher. Die Daten werden nicht an Dritte weitergegeben.
|
|
Rechtsgrundlage ist mein berechtigtes Interesse zu verstehen, wie
|
|
die Website genutzt wird (Art. 6 Abs. 1 lit. f DSGVO).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Fehlerberichte">
|
|
<p>
|
|
Wenn auf dieser Website technisch etwas fehlschlägt, wird ein
|
|
Fehlerbericht an einen Dienst zur Fehlererfassung gesendet, den ich
|
|
auf meinem eigenen Server betreibe. Er enthält technische Angaben
|
|
wie die Seite, den Browser und die Fehlermeldung. Sitzungen werden
|
|
nicht aufgezeichnet. Rechtsgrundlage ist mein berechtigtes Interesse
|
|
an einer funktionierenden Website (Art. 6 Abs. 1 lit. f DSGVO).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Speicherung in Ihrem Browser">
|
|
<p>
|
|
Wenn das Laden einer Seite fehlschlägt, speichert die Website einen
|
|
Zeitstempel im Session Storage Ihres Browsers, damit sie nur einmal
|
|
neu lädt. Er wird gelöscht, wenn Sie den Tab schließen, und
|
|
nirgendwohin übertragen.
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Wenn Sie mir schreiben">
|
|
<p>
|
|
Wenn Sie mir eine E-Mail senden, verarbeite ich Ihre Nachricht und
|
|
Ihre Adresse, um Ihnen zu antworten und gegebenenfalls einen Vertrag
|
|
vorzubereiten (Art. 6 Abs. 1 lit. b DSGVO). Ich bewahre die
|
|
Korrespondenz so lange auf, wie es dafür nötig ist oder das Gesetz
|
|
es verlangt.
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Ihre Rechte">
|
|
<p>Sie haben das Recht,</p>
|
|
<ul>
|
|
<li>
|
|
Auskunft darüber zu verlangen, welche Daten ich über Sie habe
|
|
</li>
|
|
<li>unrichtige Daten berichtigen zu lassen</li>
|
|
<li>
|
|
Ihre Daten löschen oder deren Verarbeitung einschränken zu lassen
|
|
</li>
|
|
<li>
|
|
einer Verarbeitung zu widersprechen, die auf berechtigtem
|
|
Interesse beruht
|
|
</li>
|
|
<li>Ihre Daten in einem übertragbaren Format zu erhalten</li>
|
|
<li>sich bei einer Datenschutz-Aufsichtsbehörde zu beschweren</li>
|
|
</ul>
|
|
<p>
|
|
Um eines dieser Rechte auszuüben, schreiben Sie an{" "}
|
|
<EmailLink className={LINK} />.
|
|
</p>
|
|
</LegalSection>
|
|
</>
|
|
),
|
|
},
|
|
en: {
|
|
title: "Privacy",
|
|
description: "How mintel.me handles personal data.",
|
|
Body: () => (
|
|
<>
|
|
<LegalSection heading="Who is responsible">
|
|
<p>
|
|
{address("Germany")}
|
|
<br />
|
|
Email: <EmailLink className={LINK} />
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="In short">
|
|
<p>
|
|
This website shows no advertising and includes no content from third
|
|
parties. Fonts and images are served from this website itself. A
|
|
cookie is only set when you switch the language (see
|
|
"Language").
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Server logs">
|
|
<p>
|
|
When you open a page, the server processes technical data that your
|
|
browser sends: your IP address, the time, the page requested and the
|
|
browser type. This is necessary to deliver the website and to keep
|
|
it secure. The legal basis is my legitimate interest in running the
|
|
website (Article 6(1)(f) GDPR).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Language">
|
|
<p>
|
|
The website exists in German and English. Which language you see
|
|
first depends on the language setting your browser sends with every
|
|
page request. It is not stored for that.
|
|
</p>
|
|
<p>
|
|
If you switch the language yourself, the website stores your choice
|
|
in a cookie named "{LOCALE_COOKIE}" so that you are not
|
|
sent back. It contains only the language code ("de" or
|
|
"en"), lasts one year and is used for nothing else. It is
|
|
necessary for the function you asked for (section 25(2) no. 2
|
|
TDDDG).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Visitor statistics">
|
|
<p>
|
|
I count page views with Umami, which I run on my own server. It
|
|
works without cookies and does not create profiles of individual
|
|
visitors. The data is not passed on to third parties. The legal
|
|
basis is my legitimate interest in understanding how the website is
|
|
used (Article 6(1)(f) GDPR).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Error reports">
|
|
<p>
|
|
If something on this website fails technically, an error report is
|
|
sent to an error tracking service that I run on my own server. It
|
|
contains technical details such as the page, the browser and the
|
|
error message. Sessions are not recorded. The legal basis is my
|
|
legitimate interest in a working website (Article 6(1)(f) GDPR).
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Storage in your browser">
|
|
<p>
|
|
If loading a page fails, the website stores a timestamp in your
|
|
browser's session storage so that it reloads only once. It is
|
|
deleted when you close the tab and is not sent anywhere.
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="When you write to me">
|
|
<p>
|
|
If you send me an email, I process what you write and your address
|
|
in order to answer you and, if it comes to that, to prepare a
|
|
contract (Article 6(1)(b) GDPR). I keep the correspondence for as
|
|
long as it is needed for that purpose or as the law requires.
|
|
</p>
|
|
</LegalSection>
|
|
|
|
<LegalSection heading="Your rights">
|
|
<p>You have the right to:</p>
|
|
<ul>
|
|
<li>ask what data I hold about you</li>
|
|
<li>have incorrect data corrected</li>
|
|
<li>have your data deleted or its processing restricted</li>
|
|
<li>object to processing that is based on legitimate interest</li>
|
|
<li>receive your data in a portable format</li>
|
|
<li>complain to a data protection supervisory authority</li>
|
|
</ul>
|
|
<p>
|
|
To use any of these rights, write to <EmailLink className={LINK} />.
|
|
</p>
|
|
</LegalSection>
|
|
</>
|
|
),
|
|
},
|
|
};
|