feat: add localized footer section
All checks were successful
Deploy Portfolio to VPS / deploy (push) Successful in 28s

This commit is contained in:
Chneemann 2026-08-05 16:42:23 +02:00
parent 2a9ee6c667
commit a1cf111ff3
No known key found for this signature in database
3 changed files with 21 additions and 5 deletions

View file

@ -1,18 +1,24 @@
"use client"; "use client";
import Link from "next/link"; import Link from "next/link";
import { useTranslations } from "next-intl";
import AnalyticsWidget from "./AnalyticsWidget"; import AnalyticsWidget from "./AnalyticsWidget";
/** /**
* Page footer with copyright notice, live analytics widget, and legal links * Page footer with copyright notice, live analytics widget, and legal links
*/ */
export default function Footer() { export default function Footer() {
const tCommon = useTranslations("Common");
const tFooter = useTranslations("Footer");
const currentYear = new Date().getFullYear();
return ( return (
<footer className="w-full bg-slate-950/50 text-xs text-slate-500 px-4 py-4 border-t border-slate-900/40"> <footer className="w-full bg-slate-950/50 text-xs text-slate-500 px-4 py-4 border-t border-slate-900/40">
<div className="max-w-5xl mx-auto flex flex-col md:flex-row justify-between items-center gap-4"> <div className="max-w-5xl mx-auto flex flex-col md:flex-row justify-between items-center gap-4">
{/* Left: Copyright Notice */} {/* Left: Copyright Notice */}
<p className="order-1 md:order-1"> <p className="order-1 md:order-1">
© {new Date().getFullYear()} André Kempf. All rights reserved. &copy; {currentYear} André Kempf. {tFooter("rights")}
</p> </p>
{/* Center: Live System Metrics Badge */} {/* Center: Live System Metrics Badge */}
@ -26,14 +32,14 @@ export default function Footer() {
href="/imprint" href="/imprint"
className="hover:text-slate-300 transition-colors" className="hover:text-slate-300 transition-colors"
> >
Legal Notice {tCommon("imprint")}
</Link> </Link>
<span className="text-slate-800">|</span> <span className="text-slate-800">|</span>
<Link <Link
href="/privacy" href="/privacy"
className="hover:text-slate-300 transition-colors" className="hover:text-slate-300 transition-colors"
> >
Privacy Policy {tCommon("privacy")}
</Link> </Link>
</div> </div>
</div> </div>

View file

@ -3,7 +3,9 @@
"about": "Über mich", "about": "Über mich",
"skills": "Fähigkeiten", "skills": "Fähigkeiten",
"portfolio": "Portfolio", "portfolio": "Portfolio",
"contact": "Kontakt" "contact": "Kontakt",
"imprint": "Impressum",
"privacy": "Datenschutz"
}, },
"Header": { "Header": {
"search": "Suchen" "search": "Suchen"
@ -64,5 +66,8 @@
"errorMessage": "Ein Fehler ist aufgetreten. Bitte versuche es später erneut.", "errorMessage": "Ein Fehler ist aufgetreten. Bitte versuche es später erneut.",
"submitting": "Wird gesendet...", "submitting": "Wird gesendet...",
"submit": "Nachricht senden" "submit": "Nachricht senden"
},
"Footer": {
"rights": "Alle Rechte vorbehalten."
} }
} }

View file

@ -3,7 +3,9 @@
"about": "About me", "about": "About me",
"skills": "My Skills", "skills": "My Skills",
"portfolio": "Portfolio", "portfolio": "Portfolio",
"contact": "Contact me" "contact": "Contact me",
"imprint": "Legal Notice",
"privacy": "Privacy Policy"
}, },
"Header": { "Header": {
"search": "Search" "search": "Search"
@ -64,5 +66,8 @@
"errorMessage": "An error occurred. Please try again later.", "errorMessage": "An error occurred. Please try again later.",
"submitting": "Sending...", "submitting": "Sending...",
"submit": "Send Message" "submit": "Send Message"
},
"Footer": {
"rights": "All rights reserved."
} }
} }