SEO
This commit is contained in:
@@ -12,8 +12,8 @@ const faqs = [
|
||||
es: 'Como identifica GreenLens una planta?'
|
||||
},
|
||||
answer: {
|
||||
en: 'GreenLens analyzes the plant photo and combines that with app-side care guidance so you can move from scan to next steps faster.',
|
||||
de: 'GreenLens analysiert das Pflanzenfoto und verbindet das Ergebnis mit Pflegehinweisen in der App, damit du schneller zu klaren naechsten Schritten kommst.',
|
||||
en: 'GreenLens analyzes the plant photo and combines that with app-side care guidance so you can move from scan to next steps faster.',
|
||||
de: 'GreenLens analysiert das Pflanzenfoto und verbindet das Ergebnis mit Pflegehinweisen in der App, damit du schneller zu klaren nächsten Schritten kommst.',
|
||||
es: 'GreenLens analiza la foto de la planta y combina el resultado con indicaciones de cuidado dentro de la app para que avances mas rapido.'
|
||||
}
|
||||
},
|
||||
@@ -25,7 +25,7 @@ const faqs = [
|
||||
},
|
||||
answer: {
|
||||
en: 'GreenLens includes free functionality plus paid options such as subscriptions and credit top-ups for advanced AI features.',
|
||||
de: 'GreenLens bietet kostenlose Funktionen und zusaetzlich kostenpflichtige Optionen wie Abos und Credit-Top-ups fuer erweiterte KI-Funktionen.',
|
||||
de: 'GreenLens bietet kostenlose Funktionen und zusätzlich kostenpflichtige Optionen wie Abos und Credit-Top-ups für erweiterte KI-Funktionen.',
|
||||
es: 'GreenLens incluye funciones gratuitas y tambien opciones de pago como suscripciones y creditos para funciones de IA mas umfangreiche.'
|
||||
}
|
||||
},
|
||||
@@ -37,19 +37,19 @@ const faqs = [
|
||||
},
|
||||
answer: {
|
||||
en: 'Plant identification and health checks require an internet connection. Your saved collection, care notes, and watering reminders are available offline.',
|
||||
de: 'Pflanzenidentifikation und Gesundheitscheck benoetigen eine Internetverbindung. Deine gespeicherte Sammlung, Pflegenotizen und Giess-Erinnerungen sind offline verfuegbar.',
|
||||
de: 'Pflanzenidentifikation und Gesundheitscheck benötigen eine Internetverbindung. Deine gespeicherte Sammlung, Pflegenotizen und Gieß-Erinnerungen sind offline verfügbar.',
|
||||
es: 'La identificacion de plantas y el control de salud requieren conexion a internet. Tu coleccion guardada, notas de cuidado y recordatorios de riego estan disponibles sin conexion.'
|
||||
}
|
||||
},
|
||||
{
|
||||
question: {
|
||||
en: 'What kind of plants can I use GreenLens for?',
|
||||
de: 'Fuer welche Pflanzen kann ich GreenLens nutzen?',
|
||||
de: 'Für welche Pflanzen kann ich GreenLens nutzen?',
|
||||
es: 'Para que tipo de plantas puedo usar GreenLens?'
|
||||
},
|
||||
answer: {
|
||||
en: 'GreenLens covers 450+ plant species including houseplants, garden plants, and succulents. It is built for everyday plant owners who want identification and care guidance in one place.',
|
||||
de: 'GreenLens umfasst ueber 450 Pflanzenarten, darunter Zimmerpflanzen, Gartenpflanzen und Sukkulenten. Die App richtet sich an Pflanzenbesitzer, die Identifikation und Pflege an einem Ort wollen.',
|
||||
de: 'GreenLens umfasst über 450 Pflanzenarten, darunter Zimmerpflanzen, Gartenpflanzen und Sukkulenten. Die App richtet sich an Pflanzenbesitzer, die Identifikation und Pflege an einem Ort wollen.',
|
||||
es: 'GreenLens cubre mas de 450 especies de plantas, incluyendo plantas de interior, de jardin y suculentas. Esta pensada para quienes quieren identificacion y cuidado en un solo lugar.'
|
||||
}
|
||||
},
|
||||
@@ -61,14 +61,14 @@ const faqs = [
|
||||
},
|
||||
answer: {
|
||||
en: 'Start with a scan, review the result, and save the plant to your collection to keep notes, reminders, and follow-up care in one place.',
|
||||
de: 'Starte mit einem Scan, pruefe das Ergebnis und speichere die Pflanze in deiner Sammlung, damit Notizen, Erinnerungen und Pflege an einem Ort bleiben.',
|
||||
de: 'Starte mit einem Scan, prüfe das Ergebnis und speichere die Pflanze in deiner Sammlung, damit Notizen, Erinnerungen und Pflege an einem Ort bleiben.',
|
||||
es: 'Empieza con un escaneo, revisa el resultado y guarda la planta en tu coleccion para mantener notas, recordatorios y cuidado en un solo lugar.'
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
const TEXT = {
|
||||
de: { tag: 'Fragen', h2: ['Haeufig gestellte', 'Fragen'], desc: 'Alles, was du ueber GreenLens und den Einstieg wissen musst.' },
|
||||
de: { tag: 'Fragen', h2: ['Häufig gestellte', 'Fragen'], desc: 'Alles, was du über GreenLens und den Einstieg wissen musst.' },
|
||||
en: { tag: 'Questions', h2: ['Frequently Asked', 'Questions'], desc: 'Everything you need to know about GreenLens and getting started.' },
|
||||
es: { tag: 'Preguntas', h2: ['Preguntas', 'Frecuentes'], desc: 'Todo lo que necesitas saber sobre GreenLens y el inicio.' },
|
||||
}
|
||||
|
||||
@@ -57,14 +57,26 @@ export default function Footer() {
|
||||
|
||||
<div className="footer-col">
|
||||
<div className="footer-col-title">Pflanzen & Erkennen</div>
|
||||
<Link href="/">GreenLens auf Deutsch</Link>
|
||||
<Link href="/pflanzen-erkennen-kostenlos">Pflanzen erkennen kostenlos</Link>
|
||||
<Link href="/pflanzen-erkennen-app">Pflanzen erkennen App</Link>
|
||||
<Link href="/pflanzen-bestimmen">Pflanzen bestimmen</Link>
|
||||
<Link href="/blumen-scanner">Blumen Scanner</Link>
|
||||
<Link href="/blumen-scanner">Blumen per Foto erkennen</Link>
|
||||
<Link href="/zimmerpflanzen-bestimmen">Zimmerpflanzen bestimmen</Link>
|
||||
<Link href="/pflanzen-pflege-app">Pflanzen Pflege App</Link>
|
||||
<Link href="/pflanzen-krankheiten-erkennen">Pflanzenkrankheiten erkennen</Link>
|
||||
</div>
|
||||
|
||||
<div className="footer-col">
|
||||
<div className="footer-col-title">Español</div>
|
||||
<Link href="/es">GreenLens en español</Link>
|
||||
<Link href="/es/identificador-de-plantas">Identificador de plantas</Link>
|
||||
<Link href="/es/escaner-de-plantas">Escaner de plantas</Link>
|
||||
<Link href="/es/app-para-cuidar-plantas">App para cuidar plantas</Link>
|
||||
<Link href="/es/diagnosticar-enfermedades-plantas">Diagnosticar enfermedades</Link>
|
||||
<Link href="/es/comparar/google-lens">GreenLens vs Google Lens</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="footer-brand-xl" aria-hidden="true">GREENLENS</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ const STEPS = {
|
||||
],
|
||||
}
|
||||
|
||||
const TAG = { de: 'So funktionierts', en: 'How it works', es: 'Cómo funciona' }
|
||||
const TAG = { de: 'So funktioniert es', en: 'How it works', es: 'Cómo funciona' }
|
||||
const H2 = {
|
||||
de: ['Einfacher', 'als du', 'denkst.'],
|
||||
en: ['Simpler', 'than you', 'think.'],
|
||||
|
||||
@@ -23,7 +23,7 @@ const ICONS = [
|
||||
const ITEMS = {
|
||||
de: [
|
||||
{ title: 'Scan-basierte Erkennung', desc: 'Vom Foto zur besseren Einordnung in wenigen Schritten.' },
|
||||
{ title: 'Pflegeorientierte Hinweise', desc: 'Hilft dir, naechste Pflegeentscheidungen schneller zu treffen.' },
|
||||
{ title: 'Pflegeorientierte Hinweise', desc: 'Hilft dir, nächste Pflegeentscheidungen schneller zu treffen.' },
|
||||
{ title: 'Sammlung und Verlauf', desc: 'Behalte Scans, Pflanzen und Notizen an einem Ort.' },
|
||||
{ title: 'Lexikon und Suche', desc: 'Suche Pflanzen und vergleiche Informationen in einer App.' },
|
||||
],
|
||||
@@ -43,7 +43,7 @@ const ITEMS = {
|
||||
|
||||
const TAG_TEXT = { de: 'Technologie', en: 'Technology', es: 'Tecnologia' }
|
||||
const BODY_TEXT = {
|
||||
de: 'GreenLens verbindet Scan-Ergebnisse, Pflegekontext und Sammlungsverwaltung in einer App. So kommst du schneller von einem Pflanzenfoto zu einer verstaendlichen Entscheidung.',
|
||||
de: 'GreenLens verbindet Scan-Ergebnisse, Pflegekontext und Sammlungsverwaltung in einer App. So kommst du schneller von einem Pflanzenfoto zu einer verständlichen Entscheidung.',
|
||||
en: 'GreenLens combines scan results, care context, and collection management in one app, helping you move from plant photo to a clearer decision faster.',
|
||||
es: 'GreenLens combina resultados de escaneo, contexto de cuidado y gestion de coleccion en una sola app para ayudarte a pasar de una foto a una decision mas clara.',
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@ import { useEffect, useState } from 'react'
|
||||
import { useLang } from '@/context/LangContext'
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
|
||||
const LANGS: { code: Lang; label: string; flag: string }[] = [
|
||||
{ code: 'de', label: 'DE', flag: 'DE' },
|
||||
{ code: 'en', label: 'EN', flag: 'EN' },
|
||||
{ code: 'es', label: 'ES', flag: 'ES' },
|
||||
]
|
||||
const LANGS: { code: Lang; label: string; flag: string }[] = [
|
||||
{ code: 'de', label: 'DE', flag: 'DE' },
|
||||
{ code: 'en', label: 'EN', flag: 'EN' },
|
||||
{ code: 'es', label: 'ES', flag: 'ES' },
|
||||
]
|
||||
|
||||
export default function Navbar() {
|
||||
const [scrolled, setScrolled] = useState(false)
|
||||
@@ -45,10 +45,19 @@ export default function Navbar() {
|
||||
<button
|
||||
key={l.code}
|
||||
className={`lang-btn${lang === l.code ? ' lang-btn--active' : ''}`}
|
||||
onClick={() => {
|
||||
setLang(l.code)
|
||||
setMenuOpen(false)
|
||||
}}
|
||||
onClick={() => {
|
||||
setLang(l.code)
|
||||
setMenuOpen(false)
|
||||
if (l.code === 'de' && pathname !== '/') {
|
||||
window.location.href = '/'
|
||||
}
|
||||
if (l.code === 'es' && !pathname.startsWith('/es')) {
|
||||
window.location.href = '/es'
|
||||
}
|
||||
if (l.code === 'en' && (pathname.startsWith('/de') || pathname.startsWith('/es'))) {
|
||||
window.location.href = '/'
|
||||
}
|
||||
}}
|
||||
aria-label={`Switch to ${l.label}`}
|
||||
aria-pressed={lang === l.code}
|
||||
>
|
||||
|
||||
@@ -10,6 +10,63 @@ interface SeoCategoryPageProps {
|
||||
}
|
||||
|
||||
export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
const labels = {
|
||||
en: {
|
||||
heroTag: 'GreenLens',
|
||||
primaryCta: 'Try GreenLens',
|
||||
secondaryCta: 'See full comparison',
|
||||
definition: 'Definition',
|
||||
updated: 'Last updated:',
|
||||
tableTag: 'At a glance',
|
||||
bestFit: 'Best fit',
|
||||
chooseIf: 'Choose GreenLens if:',
|
||||
notBestFit: 'Not the best fit',
|
||||
notRightIf: 'GreenLens is not the right tool if:',
|
||||
faqTag: 'FAQ',
|
||||
faqTitle: 'Common questions answered directly.',
|
||||
related: 'Related',
|
||||
supportTag: 'Need help?',
|
||||
supportTitle: 'Talk to GreenLens support',
|
||||
supportCopy: 'Questions about scans, care plans, billing, or features? Use the support page.',
|
||||
},
|
||||
de: {
|
||||
heroTag: 'GreenLens',
|
||||
primaryCta: 'GreenLens testen',
|
||||
secondaryCta: 'Vergleich ansehen',
|
||||
definition: 'Definition',
|
||||
updated: 'Aktualisiert:',
|
||||
tableTag: 'Überblick',
|
||||
bestFit: 'Passt gut',
|
||||
chooseIf: 'Wähle GreenLens, wenn:',
|
||||
notBestFit: 'Nicht ideal',
|
||||
notRightIf: 'GreenLens ist nicht die richtige Wahl, wenn:',
|
||||
faqTag: 'FAQ',
|
||||
faqTitle: 'Häufige Fragen direkt beantwortet.',
|
||||
related: 'Verwandt',
|
||||
supportTag: 'Brauchst du Hilfe?',
|
||||
supportTitle: 'GreenLens Support kontaktieren',
|
||||
supportCopy: 'Fragen zu Scans, Pflegeplänen, Abrechnung oder Funktionen? Nutze die Support-Seite.',
|
||||
},
|
||||
es: {
|
||||
heroTag: 'GreenLens',
|
||||
primaryCta: 'Probar GreenLens',
|
||||
secondaryCta: 'Ver comparación',
|
||||
definition: 'Definición',
|
||||
updated: 'Actualizado:',
|
||||
tableTag: 'Resumen',
|
||||
bestFit: 'Mejor opción',
|
||||
chooseIf: 'Elige GreenLens si:',
|
||||
notBestFit: 'No es ideal',
|
||||
notRightIf: 'GreenLens no es la herramienta adecuada si:',
|
||||
faqTag: 'FAQ',
|
||||
faqTitle: 'Preguntas frecuentes respondidas directamente.',
|
||||
related: 'Relacionado',
|
||||
supportTag: '¿Necesitas ayuda?',
|
||||
supportTitle: 'Contacta con soporte de GreenLens',
|
||||
supportCopy: '¿Preguntas sobre escaneos, planes de cuidado, facturación o funciones? Usa la página de soporte.',
|
||||
},
|
||||
}[profile.locale ?? 'en']
|
||||
|
||||
const faqSchema = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
@@ -81,20 +138,20 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
<section className="comparison-hero">
|
||||
<div className="container comparison-hero-grid">
|
||||
<div className="comparison-hero-copy">
|
||||
<p className="tag">GreenLens</p>
|
||||
<p className="tag">{labels.heroTag}</p>
|
||||
<h1>{profile.h1}</h1>
|
||||
<p className="comparison-lead">{profile.tagline}</p>
|
||||
<p>{profile.directAnswer}</p>
|
||||
<div className="comparison-actions">
|
||||
<a href="#cta" className="btn-primary">Try GreenLens</a>
|
||||
<a href="#feature-table" className="btn-outline">See full comparison</a>
|
||||
<a href="#cta" className="btn-primary">{labels.primaryCta}</a>
|
||||
<a href="#feature-table" className="btn-outline">{labels.secondaryCta}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside className="comparison-hero-card">
|
||||
<p className="comparison-card-label">Definition</p>
|
||||
<p className="comparison-card-label">{labels.definition}</p>
|
||||
<p>{profile.definitionBlock}</p>
|
||||
<p className="comparison-verified">Last updated: {profile.lastUpdated}</p>
|
||||
<p className="comparison-verified">{labels.updated} {profile.lastUpdated}</p>
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
@@ -103,7 +160,7 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
<section className="comparison-table-section" id="feature-table">
|
||||
<div className="container">
|
||||
<div className="comparison-section-head">
|
||||
<p className="tag">At a glance</p>
|
||||
<p className="tag">{labels.tableTag}</p>
|
||||
<h2>{profile.featureTable.title}</h2>
|
||||
</div>
|
||||
|
||||
@@ -129,8 +186,8 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
<section className="comparison-fit">
|
||||
<div className="container comparison-fit-grid">
|
||||
<article className="comparison-fit-card comparison-fit-card--greenlens">
|
||||
<p className="tag">Best fit</p>
|
||||
<h2>Choose GreenLens if:</h2>
|
||||
<p className="tag">{labels.bestFit}</p>
|
||||
<h2>{labels.chooseIf}</h2>
|
||||
<ul className="comparison-bullet-list comparison-bullet-list--dark">
|
||||
{profile.greenLensIf.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
@@ -139,8 +196,8 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
</article>
|
||||
|
||||
<article className="comparison-fit-card">
|
||||
<p className="tag">Not the best fit</p>
|
||||
<h2>GreenLens is not the right tool if:</h2>
|
||||
<p className="tag">{labels.notBestFit}</p>
|
||||
<h2>{labels.notRightIf}</h2>
|
||||
<ul className="comparison-bullet-list comparison-bullet-list--dark">
|
||||
{profile.notBestIf.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
@@ -154,8 +211,8 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
<section className="comparison-faq">
|
||||
<div className="container">
|
||||
<div className="comparison-section-head">
|
||||
<p className="tag">FAQ</p>
|
||||
<h2>Common questions answered directly.</h2>
|
||||
<p className="tag">{labels.faqTag}</p>
|
||||
<h2>{labels.faqTitle}</h2>
|
||||
</div>
|
||||
|
||||
<div className="comparison-faq-grid">
|
||||
@@ -175,18 +232,16 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
<div className="container comparison-links-grid">
|
||||
{profile.relatedLinks.map((link) => (
|
||||
<Link key={link.href} href={link.href} className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Related</p>
|
||||
<p className="comparison-mini-label">{labels.related}</p>
|
||||
<h3>{link.label}</h3>
|
||||
<p>{link.description}</p>
|
||||
</Link>
|
||||
))}
|
||||
|
||||
<Link href="/support" className="comparison-link-card comparison-link-card--support">
|
||||
<p className="comparison-mini-label">Need help?</p>
|
||||
<h3>Talk to GreenLens support</h3>
|
||||
<p>
|
||||
Questions about scans, care plans, billing, or features? Use the support page.
|
||||
</p>
|
||||
<p className="comparison-mini-label">{labels.supportTag}</p>
|
||||
<h3>{labels.supportTitle}</h3>
|
||||
<p>{labels.supportCopy}</p>
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user