feat: update common translations and add imprint page localizations
All checks were successful
Deploy Portfolio to VPS / deploy (push) Successful in 28s

This commit is contained in:
Chneemann 2026-08-06 11:21:50 +02:00
parent 3ad5aae40b
commit 5b525acf62
No known key found for this signature in database
5 changed files with 79 additions and 43 deletions

View file

@ -1,20 +1,27 @@
import Link from "next/link";
"use client";
import { useTranslations } from "next-intl";
import { Link } from "@/i18n/navigation";
/**
* Legal notice page pursuant to German telemedia law (§ 5 DDG & § 18 MStV)
*/
export default function ImprintPage() {
const tCommon = useTranslations("Common");
const tImprint = useTranslations("Imprint");
return (
<section className="relative pt-18 py-6 px-4 md:px-6 md:pt-24 max-w-5xl mx-auto">
{/* Page Heading & Back Navigation */}
<h1 className="text-3xl font-bold text-white mb-2 tracking-tight">
Legal Notice<span className="text-blue-500">.</span>
{tCommon("imprint")}
<span className="text-blue-500">.</span>
</h1>
<Link
href="/"
className="text-sm font-mono text-blue-400 hover:underline mb-8 inline-flex items-center gap-2 transition-colors"
>
Back to Homepage
{tCommon("backHome")}
</Link>
<div className="space-y-8 text-slate-300 leading-relaxed text-sm">
@ -23,16 +30,18 @@ export default function ImprintPage() {
<div className="absolute -top-12 -right-12 w-24 h-24 bg-blue-500/10 rounded-full blur-xl pointer-events-none" />
<h2 className="text-lg font-semibold text-white mb-2 flex items-center gap-2">
<span className="text-blue-500 font-mono text-sm">//</span>{" "}
Information Pursuant to § 5 DDG
{tImprint("section1Title")}
</h2>
<div className=" font-mono text-xs space-y-1 bg-slate-950/60 p-4 rounded-xl border border-slate-800/80">
<p className="font-semibold text-slate-100 text-sm">André Kempf</p>
<p className="text-blue-400">Full-Stack Web Developer</p>
<p className="text-blue-400">
{tCommon("rolePrefix")} {tCommon("roleSuffix")}
</p>
<p>Großschneidersweg 2a</p>
<p>76149 Karlsruhe, Germany</p>
</div>
<p className="text-slate-300 text-xs pt-1">
Also responsible for content pursuant to § 18 Abs. 2 MStV.
{tImprint("section1Sub")}
</p>
</div>
@ -40,11 +49,12 @@ export default function ImprintPage() {
<div className="group relative rounded-2xl border border-slate-700/60 bg-slate-900/95 p-6 shadow-2xl shadow-black/60 border-t-slate-600/50 space-y-3 overflow-hidden">
<div className="absolute -top-12 -right-12 w-24 h-24 bg-blue-500/10 rounded-full blur-xl pointer-events-none" />
<h2 className="text-lg font-semibold text-white flex items-center gap-2">
<span className="text-blue-500 font-mono text-sm">//</span> Contact
<span className="text-blue-500 font-mono text-sm">//</span>{" "}
{tImprint("section2Title")}
</h2>
<div className="p-4 rounded-xl bg-slate-950/60 border border-slate-800/80 font-mono text-xs">
<p className="text-slate-300">
<span className="text-slate-500">Email:</span>{" "}
<span className="text-slate-500">{tCommon("emailLabel")}:</span>{" "}
<span className="text-blue-400 hover:underline cursor-pointer">
dev@andre-kempf.com
</span>
@ -57,38 +67,31 @@ export default function ImprintPage() {
<div className="absolute -top-12 -right-12 w-24 h-24 bg-blue-500/10 rounded-full blur-xl pointer-events-none" />
<h2 className="text-lg font-semibold text-white flex items-center gap-2">
<span className="text-blue-500 font-mono text-sm">//</span>{" "}
Disclaimer & Legal Notes
{tImprint("section3Title")}
</h2>
<div className="space-y-1">
<h3 className="font-semibold">Liability for Content</h3>
<h3 className="font-semibold">
{tImprint("liabilityContentTitle")}
</h3>
<p className="text-slate-300 text-xs leading-relaxed">
As a service provider, I am responsible for my own content on
these pages according to general laws pursuant to § 7 Abs. 1 DDG.
However, according to §§ 8 to 10 DDG, I am not obligated to
monitor transmitted or stored third-party information or to
investigate circumstances that indicate illegal activity.
{tImprint("liabilityContentText")}
</p>
</div>
<div className="space-y-1 pt-2 border-t border-slate-800/60">
<h3 className="font-semibold">Liability for Links</h3>
<h3 className="font-semibold">{tImprint("liabilityLinksTitle")}</h3>
<p className="text-slate-300 text-xs leading-relaxed">
My website contains links to external third-party websites over
whose content I have no control. Therefore, I cannot accept any
liability for these external contents. The respective provider or
operator of the pages is always responsible for the content of the
linked pages.
{tImprint("liabilityLinksText")}
</p>
</div>
<div className="space-y-1 pt-2 border-t border-slate-800/60">
<h3 className="font-semibold text-slate-200">Copyright</h3>
<h3 className="font-semibold text-slate-200">
{tImprint("copyrightTitle")}
</h3>
<p className="text-slate-300 text-xs leading-relaxed">
The content and works created on these pages are subject to German
copyright law. Duplication, processing, distribution, or any form
of commercialization beyond the scope of copyright law require the
prior written consent of the author or creator.
{tImprint("copyrightText")}
</p>
</div>
</div>
@ -97,12 +100,11 @@ export default function ImprintPage() {
<div className="group relative rounded-2xl border border-slate-700/60 bg-slate-900/95 p-6 shadow-2xl shadow-black/60 border-t-slate-600/50 space-y-3 overflow-hidden">
<div className="absolute -top-12 -right-12 w-24 h-24 bg-blue-500/10 rounded-full blur-xl pointer-events-none" />
<h2 className="text-lg font-semibold text-white flex items-center gap-2">
<span className="text-blue-500 font-mono text-sm">//</span> Dispute
Resolution
<span className="text-blue-500 font-mono text-sm">//</span>{" "}
{tImprint("section4Title")}
</h2>
<p className="text-xs text-slate-400 leading-relaxed">
The European Commission provides a platform for online dispute
resolution (OS):{" "}
{tImprint("disputeText1")}{" "}
<a
href="https://ec.europa.eu/consumers/odr/"
target="_blank"
@ -111,8 +113,8 @@ export default function ImprintPage() {
>
https://ec.europa.eu/consumers/odr/
</a>
.<br />I am neither willing nor obligated to participate in dispute
resolution proceedings before a consumer arbitration board.
.<br />
{tImprint("disputeText2")}
</p>
</div>
</div>

View file

@ -198,7 +198,7 @@ export default function Contact() {
{/* Email Input */}
<div>
<label className="block text-xs mb-1.5" htmlFor="email">
{tContact("formEmail")}
{tCommon("emailLabel")}
</label>
<input
type="email"

View file

@ -24,9 +24,9 @@ export default function Hero() {
</h1>
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-semibold text-slate-400 tracking-tight">
{tHero("rolePrefix")}{" "}
{tCommon("rolePrefix")}{" "}
<span className="text-blue-400/80 font-medium">
{tHero("roleSuffix")}
{tCommon("roleSuffix")}
</span>
</h2>

View file

@ -5,15 +5,17 @@
"portfolio": "Portfolio",
"contact": "Kontakt",
"imprint": "Impressum",
"privacy": "Datenschutz"
"privacy": "Datenschutz",
"rolePrefix": "Full-Stack",
"roleSuffix": "Entwickler",
"emailLabel": "E-Mail",
"backHome": "Zurück zur Startseite"
},
"Header": {
"search": "Suchen"
},
"Hero": {
"greeting": "Hi, mein Name ist",
"rolePrefix": "Full-Stack",
"roleSuffix": "Entwickler",
"description": "Ich konzipiere und entwickle moderne Web-Anwendungen. Mit einem klaren Auge fürs Detail und einem Fokus auf sauberen Code erwecke ich digitale Ideen zum Leben.",
"downloadCv": "Lebenslauf"
},
@ -60,7 +62,6 @@
"successTitle": "Vielen Dank!",
"successText": "Deine Nachricht wurde erfolgreich gesendet. Ich melde mich schnellstmöglich bei dir!",
"formName": "Name",
"formEmail": "E-Mail",
"formMessage": "Nachricht",
"formMessagePlaceholder": "Hi André, ich würde gerne ein potenzielles Projekt besprechen...",
"errorMessage": "Ein Fehler ist aufgetreten. Bitte versuche es später erneut.",
@ -69,5 +70,21 @@
},
"Footer": {
"rights": "Alle Rechte vorbehalten."
},
"Imprint": {
"backHome": "Zurück zur Startseite",
"section1Title": "Angaben gemäß § 5 DDG",
"section1Sub": "Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV.",
"section2Title": "Kontakt",
"section3Title": "Haftungsausschluss",
"liabilityContentTitle": "Haftung für Inhalte",
"liabilityContentText": "Als Diensteanbieter bin ich gemäß § 7 Abs.1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG bin ich 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.",
"liabilityLinksTitle": "Haftung für Links",
"liabilityLinksText": "Mein Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich 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.",
"copyrightTitle": "Urheberrecht",
"copyrightText": "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.",
"section4Title": "Streitschlichtung",
"disputeText1": "Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit:",
"disputeText2": "Ich bin nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen."
}
}

View file

@ -5,15 +5,18 @@
"portfolio": "Portfolio",
"contact": "Contact me",
"imprint": "Legal Notice",
"privacy": "Privacy Policy"
"privacy": "Privacy Policy",
"rolePrefix": "Full-Stack",
"roleSuffix": "Developer",
"emailLabel": "Email",
"backHome": "Back to Homepage"
},
"Header": {
"search": "Search"
},
"Hero": {
"greeting": "Hi, my name is",
"rolePrefix": "Full-Stack",
"roleSuffix": "Developer",
"description": "I conceptualize and develop modern web applications. With a sharp eye for detail and a focus on clean code, I bring digital ideas to life.",
"downloadCv": "Download CV"
},
@ -60,7 +63,6 @@
"successTitle": "Thank you!",
"successText": "Your message has been sent successfully. I'll get back to you as soon as possible!",
"formName": "Name",
"formEmail": "Email",
"formMessage": "Message",
"formMessagePlaceholder": "Hi André, I would like to discuss a potential project...",
"errorMessage": "An error occurred. Please try again later.",
@ -69,5 +71,20 @@
},
"Footer": {
"rights": "All rights reserved."
},
"Imprint": {
"section1Title": "Information Pursuant to § 5 DDG",
"section1Sub": "Also responsible for content pursuant to § 18 Abs. 2 MStV.",
"section2Title": "Contact",
"section3Title": "Disclaimer & Legal Notes",
"liabilityContentTitle": "Liability for Content",
"liabilityContentText": "As a service provider, I am responsible for my own content on these pages according to general laws pursuant to § 7 Abs. 1 DDG. However, according to §§ 8 to 10 DDG, I am not obligated to monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity.",
"liabilityLinksTitle": "Liability for Links",
"liabilityLinksText": "My website contains links to external third-party websites over whose content I have no control. Therefore, I cannot accept any liability for these external contents. The respective provider or operator of the pages is always responsible for the content of the linked pages.",
"copyrightTitle": "Copyright",
"copyrightText": "The content and works created on these pages are subject to German copyright law. Duplication, processing, distribution, or any form of commercialization beyond the scope of copyright law require the prior written consent of the author or creator.",
"section4Title": "Dispute Resolution",
"disputeText1": "The European Commission provides a platform for online dispute resolution (OS):",
"disputeText2": "I am neither willing nor obligated to participate in dispute resolution proceedings before a consumer arbitration board."
}
}