verbesserte Copy

This commit is contained in:
2026-07-26 23:16:29 +02:00
parent c7c1864fc6
commit 50c0f33dd7
26 changed files with 1476 additions and 142 deletions

View File

@@ -7,6 +7,7 @@ import {
SeoComparison,
SeoContentSections,
SeoBestFit,
SeoOfferBlock,
SeoFaq,
SeoRelated,
} from '@/components/seo/SeoSections'
@@ -43,18 +44,67 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: siteConfig.name,
operatingSystem: 'iOS, Android',
operatingSystem: 'iOS',
applicationCategory: 'LifestyleApplication',
description: profile.directAnswer,
...(hasIosStoreUrl && { downloadUrl: siteConfig.iosAppStoreUrl }),
// Kein pauschaler Nullpreis: Der Download ist kostenlos, die Nutzung nach
// vier Scans nicht. Apple liefert die regionalen Preise selbst aus.
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'EUR',
category: 'Free trial, then subscription',
priceSpecification: {
'@type': 'PriceSpecification',
description:
'One scan free without an account, three more after signing up, then a monthly or yearly GreenLens Pro subscription. Current regional pricing is shown in the App Store.',
},
},
}
: null
// HowTo: bevorzugtes Format vieler KI-Antwortsysteme fuer "Wie erkenne ich ..."-Fragen
const howToSchema =
profile.howToSteps && profile.howToSteps.length > 0
? {
'@context': 'https://schema.org',
'@type': 'HowTo',
name: profile.howToName ?? profile.h1,
description: profile.directAnswer,
inLanguage: locale,
totalTime: 'PT5M',
step: profile.howToSteps.map((item, index) => ({
'@type': 'HowToStep',
position: index + 1,
name: item.name,
text: item.text,
})),
}
: null
// WebPage mit Aenderungsdatum, Autor und Sprache — Frische- und E-E-A-T-Signale
const webPageSchema = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: profile.h1,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
inLanguage: locale,
dateModified: profile.lastUpdatedIso ?? undefined,
primaryImageOfPage: profile.heroImage
? { '@type': 'ImageObject', url: `${siteConfig.domain}${profile.heroImage}`, caption: profile.heroImageAlt }
: undefined,
isPartOf: {
'@type': 'WebSite',
name: siteConfig.name,
url: siteConfig.domain,
},
publisher: {
'@type': 'Organization',
name: siteConfig.name,
url: siteConfig.domain,
},
}
const breadcrumbSchema = {
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
@@ -90,6 +140,16 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbSchema) }}
/>
{howToSchema && (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(howToSchema) }}
/>
)}
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(webPageSchema) }}
/>
<SeoNavbar locale={locale} methodologyHref={usesPhotoAnalysis ? '#methodology' : '#comparison'} />
@@ -111,6 +171,7 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
{usesPhotoAnalysis && <SeoMethodology copy={copy} intent={templateIntent} />}
<SeoComparison profile={profile} copy={copy} intent={templateIntent} />
<SeoBestFit profile={profile} copy={copy} />
<SeoOfferBlock profile={profile} />
<SeoFaq profile={profile} copy={copy} />
<SeoRelated profile={profile} copy={copy} />
</main>