TTikotok V4
This commit is contained in:
96
greenlns-landing/lib/localeRoutes.ts
Normal file
96
greenlns-landing/lib/localeRoutes.ts
Normal file
@@ -0,0 +1,96 @@
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
|
||||
/**
|
||||
* Zentrale Sprach-Architektur.
|
||||
*
|
||||
* `routeGroups`: echte Übersetzungspaare. Sie steuern den Sprachumschalter
|
||||
* UND erzeugen die hreflang-Alternates in der Metadata.
|
||||
*
|
||||
* `fuzzyTargets`: thematisch nächstliegende Seite, wenn es keine echte
|
||||
* Übersetzung gibt. Nur der Umschalter nutzt sie — hreflang ignoriert sie,
|
||||
* damit Google keine falschen Übersetzungspaare gemeldet bekommt.
|
||||
*
|
||||
* Neue Subpage? Echte Übersetzung in routeGroups eintragen, sonst
|
||||
* fuzzyTargets ergänzen (oder weglassen, dann geht's zur Locale-Startseite).
|
||||
*/
|
||||
const routeGroups: Partial<Record<Lang, string>>[] = [
|
||||
{ de: '/', en: '/en', es: '/es' },
|
||||
{ de: '/pflanzen-erkennen-app', en: '/plant-identifier-app', es: '/es/identificador-de-plantas' },
|
||||
{ de: '/blumen-scanner', en: '/flower-scanner' },
|
||||
{ de: '/pflanzen-bestimmen', en: '/identify-plant-photo' },
|
||||
{ de: '/zimmerpflanzen-bestimmen', en: '/houseplant-identifier' },
|
||||
{ de: '/pflanzen-pflege-app', en: '/plant-care-app', es: '/es/app-para-cuidar-plantas' },
|
||||
{ de: '/pflanzen-krankheiten-erkennen', en: '/plant-disease-identifier', es: '/es/diagnosticar-enfermedades-plantas' },
|
||||
{ de: '/pflanzen-erkennen-kostenlos', en: '/best-plant-identification-app' },
|
||||
{ en: '/plant-scanner', es: '/es/escaner-de-plantas' },
|
||||
{ de: '/vs/google-lens', es: '/es/comparar/google-lens' },
|
||||
]
|
||||
|
||||
const fuzzyTargets: Record<string, Partial<Record<Lang, string>>> = {
|
||||
'/blumen-scanner': { es: '/es/escaner-de-plantas' },
|
||||
'/flower-scanner': { es: '/es/escaner-de-plantas' },
|
||||
'/plant-scanner': { de: '/blumen-scanner' },
|
||||
'/pflanzen-bestimmen': { es: '/es/identificador-de-plantas' },
|
||||
'/identify-plant-photo': { es: '/es/identificador-de-plantas' },
|
||||
'/zimmerpflanzen-bestimmen': { es: '/es/identificador-de-plantas' },
|
||||
'/houseplant-identifier': { es: '/es/identificador-de-plantas' },
|
||||
'/pflanzen-erkennen-kostenlos': { es: '/es/identificador-de-plantas' },
|
||||
'/best-plant-identification-app': { es: '/es/identificador-de-plantas' },
|
||||
'/giess-erinnerung-app': { en: '/plant-care-app', es: '/es/app-para-cuidar-plantas' },
|
||||
'/plant-health-app': { de: '/pflanzen-krankheiten-erkennen', es: '/es/diagnosticar-enfermedades-plantas' },
|
||||
'/succulent-identifier': { de: '/zimmerpflanzen-bestimmen', es: '/es/identificador-de-plantas' },
|
||||
'/es/escaner-de-plantas': { de: '/blumen-scanner' },
|
||||
'/es/identificador-de-plantas': { de: '/pflanzen-erkennen-app' },
|
||||
'/vs/picturethis': { de: '/pflanzen-erkennen-app', es: '/es/identificador-de-plantas' },
|
||||
'/vs/plantum': { de: '/pflanzen-erkennen-app', es: '/es/identificador-de-plantas' },
|
||||
'/vs/inaturalist': { de: '/pflanzen-erkennen-app', es: '/es/identificador-de-plantas' },
|
||||
}
|
||||
|
||||
/** Seiten, die in allen Sprachen unter derselben URL leben (Client-Übersetzung). */
|
||||
const sharedPaths = new Set(['/support', '/imprint', '/privacy', '/terms'])
|
||||
|
||||
export const localeHome: Record<Lang, string> = { de: '/', en: '/en', es: '/es' }
|
||||
|
||||
const englishPaths = new Set([
|
||||
'/en',
|
||||
'/best-plant-identification-app',
|
||||
'/plant-identifier-app',
|
||||
'/plant-scanner',
|
||||
'/flower-scanner',
|
||||
'/houseplant-identifier',
|
||||
'/succulent-identifier',
|
||||
'/identify-plant-photo',
|
||||
'/plant-disease-identifier',
|
||||
'/plant-health-app',
|
||||
'/plant-care-app',
|
||||
])
|
||||
|
||||
export function getLocaleForPath(pathname: string): Lang {
|
||||
if (pathname === '/es' || pathname.startsWith('/es/')) return 'es'
|
||||
if (pathname === '/vs/google-lens') return 'de'
|
||||
if (englishPaths.has(pathname) || pathname.startsWith('/vs/')) return 'en'
|
||||
return 'de'
|
||||
}
|
||||
|
||||
function findGroup(pathname: string): Partial<Record<Lang, string>> | undefined {
|
||||
return routeGroups.find((group) => Object.values(group).includes(pathname))
|
||||
}
|
||||
|
||||
/** Ziel-URL beim Sprachwechsel: Übersetzung, thematischer Fallback oder Locale-Home. */
|
||||
export function getAlternatePath(pathname: string, target: Lang): string {
|
||||
if (sharedPaths.has(pathname)) return pathname
|
||||
if (getLocaleForPath(pathname) === target) return pathname
|
||||
return findGroup(pathname)?.[target] ?? fuzzyTargets[pathname]?.[target] ?? localeHome[target]
|
||||
}
|
||||
|
||||
/** hreflang-Alternates für die Metadata einer Seite (nur echte Übersetzungen). */
|
||||
export function getHreflangAlternates(pathname: string): Record<string, string> | undefined {
|
||||
const group = findGroup(pathname)
|
||||
if (!group || Object.keys(group).length < 2) return undefined
|
||||
return {
|
||||
...(group.de && { de: group.de }),
|
||||
...(group.en && { en: group.en }),
|
||||
...(group.es && { es: group.es }),
|
||||
'x-default': group.de ?? group.en ?? '/',
|
||||
}
|
||||
}
|
||||
61
greenlns-landing/lib/seoPageFactory.tsx
Normal file
61
greenlns-landing/lib/seoPageFactory.tsx
Normal file
@@ -0,0 +1,61 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getHreflangAlternates } from '@/lib/localeRoutes'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
/**
|
||||
* Template für SEO-Subpages. Neue Seite in 3 Schritten:
|
||||
*
|
||||
* 1. Profil in `lib/seoPages.ts` anlegen (SeoPageProfile) und den Slug
|
||||
* bei deutschen Seiten in `germanSeoPageSlugs` eintragen — damit landen
|
||||
* Sitemap-Eintrag und /de/<slug>-Redirect automatisch.
|
||||
* Englische Seiten zusätzlich in `app/sitemap.ts` ergänzen.
|
||||
* 2. `app/<slug>/page.tsx` anlegen:
|
||||
*
|
||||
* import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
*
|
||||
* export const metadata = buildSeoPageMetadata('<slug>')
|
||||
* export default createSeoPage('<slug>')
|
||||
*
|
||||
* 3. Interne Links setzen: `relatedLinks` thematisch passender Profile
|
||||
* auf die neue Seite zeigen lassen.
|
||||
*/
|
||||
export function buildSeoPageMetadata(slug: string): Metadata {
|
||||
const profile = getSeoPageBySlug(slug)
|
||||
|
||||
if (!profile) {
|
||||
return {}
|
||||
}
|
||||
|
||||
const languages = getHreflangAlternates(profile.canonical)
|
||||
|
||||
return {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical, ...(languages && { languages }) },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export function createSeoPage(slug: string) {
|
||||
const profile = getSeoPageBySlug(slug)
|
||||
|
||||
return function SeoPage() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
}
|
||||
@@ -349,6 +349,7 @@ const seoPageProfiles: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-erkennen-app': {
|
||||
slug: 'pflanzen-erkennen-app',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen erkennen App kostenlos: Foto scannen | GreenLens',
|
||||
metaDescription:
|
||||
'Erkenne Pflanzen per Foto: Artname, Pflegeplan, Gießerinnerung und Diagnose in einer App. Kostenlos starten mit GreenLens für iPhone.',
|
||||
@@ -638,6 +639,7 @@ const additionalSeoPages: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-bestimmen': {
|
||||
slug: 'pflanzen-bestimmen',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen bestimmen per Foto kostenlos | GreenLens',
|
||||
metaDescription:
|
||||
'Pflanze fotografieren und kostenlos bestimmen: GreenLens liefert Artname, Pflegeplan, Gießerinnerung und Gesundheitscheck ohne Google-Umweg.',
|
||||
@@ -1023,6 +1025,7 @@ const englishSeoPages: Record<string, SeoPageProfile> = {
|
||||
const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
'pflanzen-krankheiten-erkennen': {
|
||||
slug: 'pflanzen-krankheiten-erkennen',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzenkrankheiten erkennen & diagnostizieren per Foto | GreenLens',
|
||||
metaDescription:
|
||||
'Pflanzenkrankheit erkennen: gelbe Blätter, braune Flecken, Schädlinge oder Wurzelfäule per Foto analysieren und sofort den nächsten richtigen Schritt erhalten.',
|
||||
@@ -1143,9 +1146,10 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-pflege-app': {
|
||||
slug: 'pflanzen-pflege-app',
|
||||
metaTitle: 'Pflanzen gießen Erinnerung App | GreenLens Pflege',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen Pflege App: Pflegeplan pro Pflanze | GreenLens',
|
||||
metaDescription:
|
||||
'Pflanzen gießen Erinnerung, Pflegeplan und Push-Hinweise pro Pflanze: GreenLens hilft bei Standort, Licht, Wasser und Diagnose.',
|
||||
'Pflegeplan, Gießerinnerung und Push-Hinweise pro Pflanze: Die GreenLens Pflanzen Pflege App hilft bei Standort, Licht, Wasser und Diagnose.',
|
||||
canonical: '/pflanzen-pflege-app',
|
||||
h1: 'Pflanzen Pflege App',
|
||||
tagline: 'Pflegepläne und Gießerinnerungen, die zu jeder Pflanze passen.',
|
||||
@@ -1272,6 +1276,11 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/giess-erinnerung-app',
|
||||
label: 'Gieß-Erinnerung App',
|
||||
description: 'Nie wieder Gießen vergessen — Push-Erinnerungen pro Pflanze.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-bestimmen',
|
||||
label: 'Pflanzen bestimmen',
|
||||
@@ -1295,8 +1304,170 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
],
|
||||
},
|
||||
|
||||
'giess-erinnerung-app': {
|
||||
slug: 'giess-erinnerung-app',
|
||||
locale: 'de',
|
||||
metaTitle: 'Gieß-Erinnerung App: Pflanzen gießen Erinnerung | GreenLens',
|
||||
metaDescription:
|
||||
'Nie wieder Gießen vergessen: GreenLens erinnert dich pro Pflanze ans Gießen — mit Gießplan nach Pflanzenart, Standort und Jahreszeit. Kostenlos starten.',
|
||||
canonical: '/giess-erinnerung-app',
|
||||
h1: 'Gieß-Erinnerung App',
|
||||
tagline: 'Nie wieder Gießen vergessen — Erinnerungen, die zu jeder Pflanze passen.',
|
||||
directAnswer:
|
||||
'GreenLens ist eine Gieß-Erinnerung App für iOS und Android. Pflanze scannen, und die App legt automatisch einen Gießplan mit Push-Erinnerung an — abgestimmt auf Art, Standort und Jahreszeit statt auf einen starren Timer.',
|
||||
definitionBlock:
|
||||
'Eine Gieß-Erinnerung App erinnert dich daran, deine Pflanzen zu gießen, bevor sie vertrocknen oder überwässert werden. GreenLens erstellt die Erinnerung nicht aus einem festen Intervall, sondern aus dem Scan-Ergebnis: Die erkannte Art bestimmt den Wasserbedarf, Standort und Jahreszeit passen den Rhythmus an, und der Gesundheitscheck greift ein, wenn die Pflanze Stresssignale zeigt.',
|
||||
lastUpdated: 'Juli 2026',
|
||||
includeAppSchema: true,
|
||||
featureTable: {
|
||||
title: 'GreenLens vs. Timer- und Kalender-Erinnerungen',
|
||||
alternativeLabel: 'Timer- und Kalender-Apps',
|
||||
rows: [
|
||||
{
|
||||
feature: 'Gießerinnerung einrichten',
|
||||
greenlens:
|
||||
'Pflanze scannen — der Gießplan mit Erinnerung wird automatisch aus der erkannten Art erstellt.',
|
||||
alternative:
|
||||
'Intervall selbst recherchieren und für jede Pflanze manuell eintragen.',
|
||||
},
|
||||
{
|
||||
feature: 'Gießintervall',
|
||||
greenlens:
|
||||
'Passt sich an Pflanzenart, Standort, Licht und Jahreszeit an — Sukkulente und Monstera bekommen unterschiedliche Rhythmen.',
|
||||
alternative:
|
||||
'Festes Intervall (z.B. alle 7 Tage), unabhängig davon, was die Pflanze braucht.',
|
||||
},
|
||||
{
|
||||
feature: 'Mehrere Pflanzen',
|
||||
greenlens:
|
||||
'Jede Pflanze hat ein eigenes Profil mit Foto, Notizen und eigener Erinnerung.',
|
||||
alternative:
|
||||
'Eine lange Erinnerungsliste ohne Pflanzenkontext — leicht zu verwechseln.',
|
||||
},
|
||||
{
|
||||
feature: 'Überwässerung',
|
||||
greenlens:
|
||||
'Gesundheitscheck erkennt Überwässerungssymptome und passt die Empfehlung an, statt stur weiter zu erinnern.',
|
||||
alternative:
|
||||
'Der Timer läuft weiter, auch wenn die Pflanze bereits zu nass steht.',
|
||||
},
|
||||
{
|
||||
feature: 'Mehr als Gießen',
|
||||
greenlens:
|
||||
'Erinnert auch an Düngen und Umtopfen — abgestimmt auf die erkannte Art.',
|
||||
alternative:
|
||||
'Jede weitere Erinnerung muss separat angelegt und gepflegt werden.',
|
||||
},
|
||||
],
|
||||
},
|
||||
greenLensIf: [
|
||||
'Du vergisst regelmäßig das Gießen und willst Push-Erinnerungen pro Pflanze statt eines Standard-Timers.',
|
||||
'Du hast Pflanzen mit unterschiedlichem Wasserbedarf — Sukkulenten, Zimmerpflanzen, Balkonkästen — und willst sie getrennt verwalten.',
|
||||
'Du willst, dass die Erinnerung sich anpasst, wenn eine Pflanze gestresst aussieht, statt blind weiterzulaufen.',
|
||||
],
|
||||
notBestIf: [
|
||||
'Du hast nur eine einzige robuste Pflanze und ein Wecker reicht dir völlig.',
|
||||
'Du suchst Bewässerungssteuerung für Sensoren oder automatische Bewässerungssysteme — GreenLens arbeitet mit Erinnerungen, nicht mit Hardware.',
|
||||
],
|
||||
contentSections: [
|
||||
{
|
||||
eyebrow: 'So funktioniert es',
|
||||
title: 'Vom Scan zur Gießerinnerung in unter einer Minute.',
|
||||
body:
|
||||
'Statt Gießintervalle zu googeln und manuell einzutragen, scannst du die Pflanze einmal. GreenLens erkennt die Art, legt ein Profil an und erstellt daraus den Gießplan mit Push-Erinnerung — für jede Pflanze einzeln.',
|
||||
bullets: [
|
||||
'Pflanze fotografieren — Art und Wasserbedarf werden automatisch erkannt.',
|
||||
'Gießplan pro Pflanze, angepasst an Standort, Licht und Jahreszeit.',
|
||||
'Push-Erinnerung, wenn eine Pflanze dran ist — mit Foto, damit nichts verwechselt wird.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Zu viel oder zu wenig',
|
||||
title: 'Die Erinnerung, die auch vor Überwässerung schützt.',
|
||||
body:
|
||||
'Die meisten Zimmerpflanzen sterben nicht am Vergessen, sondern am zu häufigen Gießen. Zeigt eine Pflanze gelbe Blätter oder weiche Stiele, prüfst du sie mit dem Gesundheitscheck — GreenLens erkennt Überwässerung und passt die Empfehlung an, statt die nächste Erinnerung zu erzwingen.',
|
||||
},
|
||||
{
|
||||
eyebrow: 'Urlaub und Alltag',
|
||||
title: 'Gießerinnerungen, die deinen Rhythmus mitmachen.',
|
||||
body:
|
||||
'Ob Urlaubsvorbereitung, Umzug ans andere Fenster oder Winterruhe: Gießintervalle lassen sich pro Pflanze jederzeit anpassen. Die Pflegehistorie zeigt dir, wann zuletzt gegossen wurde — auch wenn mehrere Personen im Haushalt gießen.',
|
||||
},
|
||||
],
|
||||
faqs: [
|
||||
{
|
||||
question: 'Welche App erinnert mich ans Pflanzen gießen?',
|
||||
answer:
|
||||
'GreenLens erinnert dich per Push-Nachricht ans Gießen — für jede Pflanze einzeln. Nach dem Scan wird der Gießplan automatisch aus der erkannten Art erstellt und an Standort und Jahreszeit angepasst.',
|
||||
},
|
||||
{
|
||||
question: 'Ist die Gieß-Erinnerung in GreenLens kostenlos?',
|
||||
answer:
|
||||
'Ja. Pflanzensammlung, Gießpläne und Gieß-Erinnerungen sind in der kostenlosen Version enthalten. Kostenpflichtig sind nur erweiterte KI-Gesundheitschecks und unbegrenzte Scans.',
|
||||
},
|
||||
{
|
||||
question: 'Woher weiß die App, wie oft meine Pflanze Wasser braucht?',
|
||||
answer:
|
||||
'Beim Scan erkennt GreenLens die Pflanzenart und leitet daraus den Wasserbedarf ab. Der Gießplan berücksichtigt zusätzlich Standort, Licht und Jahreszeit — eine Sukkulente am Südfenster bekommt einen anderen Rhythmus als ein Farn im Bad.',
|
||||
},
|
||||
{
|
||||
question: 'Kann ich für jede Pflanze eine eigene Gießerinnerung einstellen?',
|
||||
answer:
|
||||
'Ja. Jede gespeicherte Pflanze hat ein eigenes Profil mit Foto, Notizen und eigenem Gießintervall. Du kannst jedes Intervall manuell anpassen, wenn du es anders willst als vorgeschlagen.',
|
||||
},
|
||||
{
|
||||
question: 'Erinnert die App auch an Düngen und Umtopfen?',
|
||||
answer:
|
||||
'Ja. GreenLens-Pflegepläne umfassen Gießen, Düngen und Umtopfen. Jeder Erinnerungstyp lässt sich pro Pflanze einzeln aktivieren und anpassen.',
|
||||
},
|
||||
{
|
||||
question: 'Was passiert, wenn ich eine Gießerinnerung verpasse?',
|
||||
answer:
|
||||
'Die Erinnerung bleibt offen, bis du das Gießen bestätigst — nichts verschiebt sich stillschweigend. Die Pflegehistorie zeigt dir jederzeit, wann jede Pflanze zuletzt gegossen wurde.',
|
||||
},
|
||||
{
|
||||
question: 'Hilft die App auch gegen Überwässerung?',
|
||||
answer:
|
||||
'Ja. Überwässerung ist die häufigste Todesursache bei Zimmerpflanzen. Zeigt eine Pflanze weiche Stiele oder gelbe Blätter, erkennt der GreenLens-Gesundheitscheck Überwässerung und empfiehlt eine Gießpause, statt weiter zu erinnern.',
|
||||
},
|
||||
{
|
||||
question: 'Funktioniert die Gieß-Erinnerung auch für Balkon- und Gartenpflanzen?',
|
||||
answer:
|
||||
'Ja. GreenLens unterstützt Innen- und Außenpflanzen. Balkonkästen und Gartenpflanzen bekommen eigene Profile mit Intervallen, die zur Saison passen.',
|
||||
},
|
||||
{
|
||||
question: 'Brauche ich für die Erinnerungen eine Internetverbindung?',
|
||||
answer:
|
||||
'Nein. Scannen erfordert eine Verbindung, aber deine Pflanzensammlung, Gießpläne und Erinnerungen funktionieren auch offline.',
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/pflanzen-pflege-app',
|
||||
label: 'Pflanzen Pflege App',
|
||||
description: 'Der komplette Pflegeplan: Gießen, Düngen, Standort und Gesundheitscheck in einer App.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-bestimmen',
|
||||
label: 'Pflanzen bestimmen',
|
||||
description: 'Pflanze per Foto bestimmen — die Grundlage für den automatischen Gießplan.',
|
||||
},
|
||||
{
|
||||
href: '/zimmerpflanzen-bestimmen',
|
||||
label: 'Zimmerpflanzen bestimmen',
|
||||
description: 'Zimmerpflanzen erkennen und direkt passende Gießerinnerungen einrichten.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-krankheiten-erkennen',
|
||||
label: 'Pflanzenkrankheiten erkennen',
|
||||
description: 'Gelbe Blätter trotz Gießplan? Symptome per Foto analysieren.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
'zimmerpflanzen-bestimmen': {
|
||||
slug: 'zimmerpflanzen-bestimmen',
|
||||
locale: 'de',
|
||||
metaTitle: 'Zimmerpflanzen bestimmen per Foto kostenlos | GreenLens',
|
||||
metaDescription:
|
||||
'Bestimme Zimmerpflanzen per Foto: Monstera, Efeutute, Ficus, Orchideen und Sukkulenten erkennen, Pflegeplan erhalten und richtig gießen.',
|
||||
@@ -1402,6 +1573,11 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/giess-erinnerung-app',
|
||||
label: 'Gieß-Erinnerung App',
|
||||
description: 'Gießerinnerungen pro Zimmerpflanze — automatisch aus dem Scan.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-pflege-app',
|
||||
label: 'Pflanzen Pflege App',
|
||||
@@ -1961,6 +2137,7 @@ const highVolumeSeoPages: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-erkennen-kostenlos': {
|
||||
slug: 'pflanzen-erkennen-kostenlos',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen erkennen kostenlos — App mit Pflegeplan | GreenLens',
|
||||
metaDescription:
|
||||
'GreenLens erkennt Pflanzen kostenlos per Foto und liefert direkt Artname, Pflegeplan und Gießerinnerungen — ohne Umweg und ohne Paywall bei der Erkennung.',
|
||||
@@ -2095,6 +2272,7 @@ export const germanSeoPageSlugs = [
|
||||
'zimmerpflanzen-bestimmen',
|
||||
'pflanzen-pflege-app',
|
||||
'pflanzen-krankheiten-erkennen',
|
||||
'giess-erinnerung-app',
|
||||
] as const
|
||||
|
||||
export function getSeoPageBySlug(slug: string): SeoPageProfile | undefined {
|
||||
|
||||
412
greenlns-landing/lib/seoTemplateCopy.ts
Normal file
412
greenlns-landing/lib/seoTemplateCopy.ts
Normal file
@@ -0,0 +1,412 @@
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
|
||||
/** Statische, lokalisierte Texte des SEO-Subpage-Templates. */
|
||||
export interface SeoTemplateCopy {
|
||||
nav: {
|
||||
features: string
|
||||
tech: string
|
||||
faq: string
|
||||
how: string
|
||||
support: string
|
||||
download: string
|
||||
}
|
||||
hero: {
|
||||
eyebrow: string
|
||||
ctaPrimary: string
|
||||
ctaSecondary: string
|
||||
stat1Title: string
|
||||
stat1Label: string
|
||||
stat2Title: string
|
||||
stat2Label: string
|
||||
floatTitle: string
|
||||
floatLabel: string
|
||||
imageAlt: string
|
||||
}
|
||||
advantage: {
|
||||
eyebrow: string
|
||||
heading: string
|
||||
updated: string
|
||||
}
|
||||
didYouKnow: {
|
||||
title: string
|
||||
items: { title: string; body: string }[]
|
||||
}
|
||||
methodology: {
|
||||
eyebrow: string
|
||||
title: string
|
||||
lead: string
|
||||
steps: { title: string; body: string }[]
|
||||
}
|
||||
comparison: {
|
||||
eyebrow: string
|
||||
title: string
|
||||
lead: string
|
||||
greenlens: string
|
||||
alternative: string
|
||||
tipTitle: string
|
||||
tipBody: string
|
||||
}
|
||||
bestFit: {
|
||||
chooseTag: string
|
||||
chooseTitle: string
|
||||
notTag: string
|
||||
notTitle: string
|
||||
}
|
||||
faq: {
|
||||
title: string
|
||||
}
|
||||
related: {
|
||||
tag: string
|
||||
title: string
|
||||
}
|
||||
footer: {
|
||||
downloadTag: string
|
||||
ctaLine1: string
|
||||
ctaLine2: string
|
||||
ctaEm: string
|
||||
ctaBody: string
|
||||
storeNote: string
|
||||
supportLabel: string
|
||||
brandBody: string
|
||||
productTitle: string
|
||||
companyTitle: string
|
||||
legalTitle: string
|
||||
useCasesTitle: string
|
||||
germanTitle: string
|
||||
spanishTitle: string
|
||||
imprint: string
|
||||
privacy: string
|
||||
terms: string
|
||||
copy: string
|
||||
}
|
||||
}
|
||||
|
||||
export const seoTemplateCopy: Record<Lang, SeoTemplateCopy> = {
|
||||
de: {
|
||||
nav: {
|
||||
features: 'Funktionen',
|
||||
tech: 'Technologie',
|
||||
faq: 'FAQ',
|
||||
how: 'So funktioniert es',
|
||||
support: 'Support',
|
||||
download: 'App laden',
|
||||
},
|
||||
hero: {
|
||||
eyebrow: 'KI-Pflanzenerkennung',
|
||||
ctaPrimary: 'App laden',
|
||||
ctaSecondary: 'So funktioniert es',
|
||||
stat1Title: 'KI-gestützt',
|
||||
stat1Label: 'Sofortige Analyse',
|
||||
stat2Title: 'Ganzheitlich',
|
||||
stat2Label: 'Erkennung & Pflegeplan',
|
||||
floatTitle: 'Indische Lotosblume',
|
||||
floatLabel: 'Erkannt in 0,8s',
|
||||
imageAlt: 'Smartphone scannt eine Lotusblüte',
|
||||
},
|
||||
advantage: {
|
||||
eyebrow: '— Der Vorteil',
|
||||
heading: 'Mehr als nur Erkennung. Ein ganzheitlicher Ansatz für Pflanzenpflege.',
|
||||
updated: 'Algorithmen aktualisiert',
|
||||
},
|
||||
didYouKnow: {
|
||||
title: 'Wusstest du schon?',
|
||||
items: [
|
||||
{
|
||||
title: 'Überwässerung ist Todesursache Nr. 1',
|
||||
body: 'Die meisten Zimmerpflanzen sterben an Wurzelfäule durch zu häufiges Gießen. GreenLens berechnet präzise Trocknungszeiten.',
|
||||
},
|
||||
{
|
||||
title: 'Lichtintensität fällt rasant ab',
|
||||
body: 'Schon 1 Meter vom Fenster entfernt sinkt die Lichtintensität um 50 %. Pflegehinweise berücksichtigen den Standort.',
|
||||
},
|
||||
{
|
||||
title: 'Pflanzen reinigen die Raumluft',
|
||||
body: 'Bestimmte Arten können einen Großteil der Schadstoffe aus der Luft filtern. GreenLens hebt luftreinigende Pflanzen hervor.',
|
||||
},
|
||||
],
|
||||
},
|
||||
methodology: {
|
||||
eyebrow: '— Die Technologie',
|
||||
title: 'Unsere Methodik',
|
||||
lead: 'Wie GreenLens aus einem einfachen Handyfoto eine vollständige botanische Analyse macht.',
|
||||
steps: [
|
||||
{
|
||||
title: 'Bildaufnahme',
|
||||
body: 'Die hochauflösende Aufnahme analysiert Blattmorphologie, Blattadern und Stängelstruktur. Unscharfe Bilder werden aussortiert.',
|
||||
},
|
||||
{
|
||||
title: 'Merkmals-Extraktion',
|
||||
body: 'Das neuronale Netz isoliert über 120 spezifische Merkmale und vergleicht sie mit einer umfangreichen botanischen Datenbank.',
|
||||
},
|
||||
{
|
||||
title: 'Diagnose',
|
||||
body: 'Ein zweiter Durchlauf sucht gezielt nach Verfärbungen, Schädlingsspuren und Welke — basierend auf typischen Krankheiten der jeweiligen Art.',
|
||||
},
|
||||
{
|
||||
title: 'Plan-Erstellung',
|
||||
body: 'Aus Erkennung und Gesundheitszustand entsteht ein individueller Pflegeplan, angepasst an Standort und Lichtverhältnisse.',
|
||||
},
|
||||
],
|
||||
},
|
||||
comparison: {
|
||||
eyebrow: '— Im Vergleich',
|
||||
title: 'GreenLens vs. einfache Apps',
|
||||
lead: 'Warum ernsthafte Pflanzenfans auf unsere Plattform statt auf Standard-Erkennungstools setzen: verwertbare Daten statt bloßer Namen.',
|
||||
greenlens: 'GreenLens',
|
||||
alternative: 'Einfache Apps',
|
||||
tipTitle: 'Botanik-Tipp',
|
||||
tipBody: 'Regelmäßige Pflege ist besser als seltene Intensiv-Pflege. Nutze Erinnerungen für eine gute Routine.',
|
||||
},
|
||||
bestFit: {
|
||||
chooseTag: 'Passt gut',
|
||||
chooseTitle: 'Wähle GreenLens, wenn:',
|
||||
notTag: 'Nicht ideal',
|
||||
notTitle: 'GreenLens ist nicht die richtige Wahl, wenn:',
|
||||
},
|
||||
faq: {
|
||||
title: 'Häufige Fragen',
|
||||
},
|
||||
related: {
|
||||
tag: 'Verwandt',
|
||||
title: 'Weitere Guides',
|
||||
},
|
||||
footer: {
|
||||
downloadTag: 'Download',
|
||||
ctaLine1: 'Bereit für',
|
||||
ctaLine2: 'bessere',
|
||||
ctaEm: 'Pflanzenpflege?',
|
||||
ctaBody: 'GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Bei Fragen erreichst du uns über die Support-Seite.',
|
||||
storeNote: 'Die App ist in den Stores verfügbar.',
|
||||
supportLabel: 'Support',
|
||||
brandBody: 'Die App für Pflanzenfans, die Analyse, Erkennung und Pflege an einem Ort vereint.',
|
||||
productTitle: 'Produkt',
|
||||
companyTitle: 'Unternehmen',
|
||||
legalTitle: 'Rechtliches',
|
||||
useCasesTitle: 'Use Cases',
|
||||
germanTitle: 'Pflanzen erkennen',
|
||||
spanishTitle: 'En español',
|
||||
imprint: 'Impressum',
|
||||
privacy: 'Datenschutz',
|
||||
terms: 'Nutzungsbedingungen',
|
||||
copy: '© 2026 GreenLens. Alle Rechte vorbehalten.',
|
||||
},
|
||||
},
|
||||
en: {
|
||||
nav: {
|
||||
features: 'Features',
|
||||
tech: 'Technology',
|
||||
faq: 'FAQ',
|
||||
how: 'How it works',
|
||||
support: 'Support',
|
||||
download: 'Get the App',
|
||||
},
|
||||
hero: {
|
||||
eyebrow: 'AI plant identification',
|
||||
ctaPrimary: 'Get the App',
|
||||
ctaSecondary: 'How it works',
|
||||
stat1Title: 'AI-powered',
|
||||
stat1Label: 'Instant analysis',
|
||||
stat2Title: 'Holistic',
|
||||
stat2Label: 'Identification & care plans',
|
||||
floatTitle: 'Sacred lotus',
|
||||
floatLabel: 'Identified in 0.8s',
|
||||
imageAlt: 'Phone scanning a lotus flower',
|
||||
},
|
||||
advantage: {
|
||||
eyebrow: '— The Advantage',
|
||||
heading: 'More than identification. A holistic approach to plant care.',
|
||||
updated: 'Algorithms updated',
|
||||
},
|
||||
didYouKnow: {
|
||||
title: 'Did you know?',
|
||||
items: [
|
||||
{
|
||||
title: 'Overwatering is the #1 cause of death',
|
||||
body: 'Most houseplants die from root rot caused by overwatering. GreenLens calculates precise drying times.',
|
||||
},
|
||||
{
|
||||
title: 'Light intensity drops fast',
|
||||
body: 'Light intensity drops by 50% just 1 meter from the window. Care guidance takes placement into account.',
|
||||
},
|
||||
{
|
||||
title: 'Plants purify indoor air',
|
||||
body: 'Certain species can filter a large share of airborne toxins. GreenLens highlights air-purifying plants.',
|
||||
},
|
||||
],
|
||||
},
|
||||
methodology: {
|
||||
eyebrow: '— The Technology',
|
||||
title: 'Our Methodology',
|
||||
lead: 'How GreenLens turns a simple phone photo into a complete botanical analysis.',
|
||||
steps: [
|
||||
{
|
||||
title: 'Image Capture',
|
||||
body: 'High-resolution capture analyzes leaf morphology, veins, and stem structure. Blurry images are discarded to ensure accuracy.',
|
||||
},
|
||||
{
|
||||
title: 'Feature Extraction',
|
||||
body: 'Our neural network isolates over 120 specific features and matches them against a vast botanical database.',
|
||||
},
|
||||
{
|
||||
title: 'Diagnosis',
|
||||
body: 'A second pass looks specifically for discoloration, pest traces, and wilting — based on diseases typical for the species.',
|
||||
},
|
||||
{
|
||||
title: 'Plan Generation',
|
||||
body: 'Identification and health status combine into an individual care plan adapted to local light and placement.',
|
||||
},
|
||||
],
|
||||
},
|
||||
comparison: {
|
||||
eyebrow: '— Perspective',
|
||||
title: 'GreenLens vs. Basic Apps',
|
||||
lead: 'Why serious plant enthusiasts trust our platform over standard identification tools: actionable data, not just trivia.',
|
||||
greenlens: 'GreenLens',
|
||||
alternative: 'Basic apps',
|
||||
tipTitle: 'Botanical Tip',
|
||||
tipBody: 'Regular care beats infrequent intensive care. Use reminders to build a good routine.',
|
||||
},
|
||||
bestFit: {
|
||||
chooseTag: 'Best fit',
|
||||
chooseTitle: 'Choose GreenLens if:',
|
||||
notTag: 'Not the best fit',
|
||||
notTitle: 'GreenLens is not the right tool if:',
|
||||
},
|
||||
faq: {
|
||||
title: 'Frequently Asked Questions',
|
||||
},
|
||||
related: {
|
||||
tag: 'Related',
|
||||
title: 'More guides',
|
||||
},
|
||||
footer: {
|
||||
downloadTag: 'Download',
|
||||
ctaLine1: 'Ready for',
|
||||
ctaLine2: 'better',
|
||||
ctaEm: 'plant care?',
|
||||
ctaBody: 'GreenLens helps you identify, understand, and care for your plants. Questions? Reach us via the support page.',
|
||||
storeNote: 'The app is available in the stores.',
|
||||
supportLabel: 'Support',
|
||||
brandBody: 'The app for plant lovers that combines analysis, identification, and care in one place.',
|
||||
productTitle: 'Product',
|
||||
companyTitle: 'Company',
|
||||
legalTitle: 'Legal',
|
||||
useCasesTitle: 'Use Cases',
|
||||
germanTitle: 'Auf Deutsch',
|
||||
spanishTitle: 'En español',
|
||||
imprint: 'Imprint',
|
||||
privacy: 'Privacy Policy',
|
||||
terms: 'Terms of Service',
|
||||
copy: '© 2026 GreenLens. All rights reserved.',
|
||||
},
|
||||
},
|
||||
es: {
|
||||
nav: {
|
||||
features: 'Funciones',
|
||||
tech: 'Tecnología',
|
||||
faq: 'FAQ',
|
||||
how: 'Cómo funciona',
|
||||
support: 'Soporte',
|
||||
download: 'Descargar la App',
|
||||
},
|
||||
hero: {
|
||||
eyebrow: 'Identificación de plantas por IA',
|
||||
ctaPrimary: 'Descargar App',
|
||||
ctaSecondary: 'Cómo funciona',
|
||||
stat1Title: 'Impulsado por IA',
|
||||
stat1Label: 'Análisis instantáneo',
|
||||
stat2Title: 'Holístico',
|
||||
stat2Label: 'Identificación y planes',
|
||||
floatTitle: 'Loto sagrado',
|
||||
floatLabel: 'Identificada en 0,8s',
|
||||
imageAlt: 'Teléfono escaneando una flor de loto',
|
||||
},
|
||||
advantage: {
|
||||
eyebrow: '— La Ventaja',
|
||||
heading: 'Más que solo identificación. Un enfoque holístico para el cuidado de las plantas.',
|
||||
updated: 'Algoritmos actualizados',
|
||||
},
|
||||
didYouKnow: {
|
||||
title: '¿Sabías que?',
|
||||
items: [
|
||||
{
|
||||
title: 'El exceso de riego es la causa n.º 1 de muerte',
|
||||
body: 'La mayoría de las plantas de interior mueren por pudrición de la raíz debido al exceso de riego. GreenLens calcula tiempos de secado precisos.',
|
||||
},
|
||||
{
|
||||
title: 'La intensidad de la luz disminuye rápidamente',
|
||||
body: 'La intensidad de la luz disminuye un 50 % a solo 1 metro de la ventana. Los consejos de cuidado tienen en cuenta la ubicación.',
|
||||
},
|
||||
{
|
||||
title: 'Las plantas purifican el aire interior',
|
||||
body: 'Ciertas especies pueden filtrar gran parte de las toxinas del aire. GreenLens destaca las plantas purificadoras.',
|
||||
},
|
||||
],
|
||||
},
|
||||
methodology: {
|
||||
eyebrow: '— La Tecnología',
|
||||
title: 'Nuestra Metodología',
|
||||
lead: 'Cómo GreenLens convierte una simple foto de teléfono en un análisis botánico completo.',
|
||||
steps: [
|
||||
{
|
||||
title: 'Captura de Imagen',
|
||||
body: 'La captura de alta resolución analiza la morfología de las hojas, las venas y la estructura del tallo. Se descartan las imágenes borrosas.',
|
||||
},
|
||||
{
|
||||
title: 'Extracción de Características',
|
||||
body: 'Nuestra red neuronal aísla más de 120 características específicas y las compara con una enorme base de datos botánica.',
|
||||
},
|
||||
{
|
||||
title: 'Diagnóstico',
|
||||
body: 'Una segunda pasada busca decoloración, rastros de plagas y marchitamiento, según las enfermedades típicas de cada especie.',
|
||||
},
|
||||
{
|
||||
title: 'Generación de Plan',
|
||||
body: 'La identificación y el estado de salud se combinan en un plan de cuidado individual adaptado al clima y la luz locales.',
|
||||
},
|
||||
],
|
||||
},
|
||||
comparison: {
|
||||
eyebrow: '— Perspectiva',
|
||||
title: 'GreenLens vs. Apps Básicas',
|
||||
lead: 'Por qué los entusiastas serios de las plantas confían en nuestra plataforma más que en herramientas estándar: datos procesables, no solo curiosidades.',
|
||||
greenlens: 'GreenLens',
|
||||
alternative: 'Apps básicas',
|
||||
tipTitle: 'Consejo Botánico',
|
||||
tipBody: 'El cuidado regular es mejor que el cuidado intensivo y poco frecuente. Usa recordatorios para una buena rutina.',
|
||||
},
|
||||
bestFit: {
|
||||
chooseTag: 'Mejor opción',
|
||||
chooseTitle: 'Elige GreenLens si:',
|
||||
notTag: 'No es ideal',
|
||||
notTitle: 'GreenLens no es la herramienta adecuada si:',
|
||||
},
|
||||
faq: {
|
||||
title: 'Preguntas Frecuentes',
|
||||
},
|
||||
related: {
|
||||
tag: 'Relacionado',
|
||||
title: 'Más guías',
|
||||
},
|
||||
footer: {
|
||||
downloadTag: 'Download',
|
||||
ctaLine1: '¿Listo para',
|
||||
ctaLine2: 'un mejor',
|
||||
ctaEm: 'cuidado de plantas?',
|
||||
ctaBody: 'GreenLens te ayuda a identificar, comprender y cuidar tus plantas. ¿Preguntas? Contáctanos a través de la página de soporte.',
|
||||
storeNote: 'La aplicación ya está disponible en las tiendas.',
|
||||
supportLabel: 'Soporte',
|
||||
brandBody: 'La app para los amantes de las plantas que combina análisis, identificación y cuidado en un solo lugar.',
|
||||
productTitle: 'Producto',
|
||||
companyTitle: 'Empresa',
|
||||
legalTitle: 'Legal',
|
||||
useCasesTitle: 'Use Cases',
|
||||
germanTitle: 'Auf Deutsch',
|
||||
spanishTitle: 'En español',
|
||||
imprint: 'Aviso Legal',
|
||||
privacy: 'Privacidad',
|
||||
terms: 'Términos de uso',
|
||||
copy: '© 2026 GreenLens. Todos los derechos reservados.',
|
||||
},
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user