From 049dda8dc5a09b6bf45a86b77380cfa84afea0a1 Mon Sep 17 00:00:00 2001 From: denshooter Date: Sun, 19 Apr 2026 15:47:22 +0200 Subject: [PATCH] feat: improve SEO with locale-specific metadata, structured data, and keywords MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add locale-specific title/description for DE and EN homepage - Expand keywords with local SEO terms (Webentwicklung Osnabrück, Informatik, etc.) - Add WebSite schema and enhance Person schema with knowsAbout, alternateName - Add hreflang alternates for DE/EN - Update projects page with locale-specific metadata - Keep visible titles short, move SEO terms to description/structured data --- app/[locale]/page.tsx | 16 ++++++++++++ app/[locale]/projects/page.tsx | 5 ++++ app/_ui/HomePageServer.tsx | 39 ++++++++++++++++++++++++++-- app/layout.tsx | 47 ++++++++++++++++++++++------------ messages/de.json | 2 +- messages/en.json | 2 +- 6 files changed, 91 insertions(+), 20 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 6e59d5e..b721155 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -2,6 +2,19 @@ import type { Metadata } from "next"; import HomePageServer from "../_ui/HomePageServer"; import { getLanguageAlternates, toAbsoluteUrl } from "@/lib/seo"; +const localeMetadata: Record = { + de: { + title: "Dennis Konkol – Webentwickler Osnabrück", + description: + "Dennis Konkol – Software Engineer & Webentwickler in Osnabrück. Webentwicklung, Fullstack-Apps, Docker, Next.js, Flutter. Projekte ansehen und Kontakt aufnehmen.", + }, + en: { + title: "Dennis Konkol – Web Developer Osnabrück", + description: + "Dennis Konkol – Software Engineer & Web Developer in Osnabrück, Germany. Web development, fullstack apps, Docker, Next.js, Flutter.", + }, +}; + export async function generateMetadata({ params, }: { @@ -9,7 +22,10 @@ export async function generateMetadata({ }): Promise { const { locale } = await params; const languages = getLanguageAlternates({ pathWithoutLocale: "" }); + const meta = localeMetadata[locale] ?? localeMetadata.en; return { + title: meta.title, + description: meta.description, alternates: { canonical: toAbsoluteUrl(`/${locale}`), languages, diff --git a/app/[locale]/projects/page.tsx b/app/[locale]/projects/page.tsx index 179164c..471d605 100644 --- a/app/[locale]/projects/page.tsx +++ b/app/[locale]/projects/page.tsx @@ -13,7 +13,12 @@ export async function generateMetadata({ }): Promise { const { locale } = await params; const languages = getLanguageAlternates({ pathWithoutLocale: "projects" }); + const isDe = locale === "de"; return { + title: isDe ? "Projekte – Dennis Konkol" : "Projects – Dennis Konkol", + description: isDe + ? "Webentwicklung, Fullstack-Apps und Mobile-Projekte von Dennis Konkol. Next.js, Flutter, Docker und mehr – Osnabrück." + : "Web development, fullstack apps and mobile projects by Dennis Konkol. Next.js, Flutter, Docker and more – Osnabrück.", alternates: { canonical: toAbsoluteUrl(`/${locale}/projects`), languages, diff --git a/app/_ui/HomePageServer.tsx b/app/_ui/HomePageServer.tsx index f29c486..833e830 100644 --- a/app/_ui/HomePageServer.tsx +++ b/app/_ui/HomePageServer.tsx @@ -31,20 +31,41 @@ export default async function HomePageServer({ locale }: HomePageServerProps) { return (