Editorial-Frontend: oeffentliche Unterseiten, Preise & Linkpflege
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled

Oeffentliche Strecke durchgaengig auf das Editorial-Design umgestellt und
datengetrieben gemacht:

- Newsrooms-Verzeichnis + Newsroom-Detailseiten (Suche, Pagination)
- Preise-Seite neu (Abos via Plan, Einzel-PM via config/billing, Add-ons via
  config/credits); Texte ausgelagert nach lang/{de,en}/pricing.php
- Pricing-Teaser-Komponente auf den Startseiten + Preise-Link in Header/Footer
- Statische Seiten im Editorial-Design ueber neue Komponente x-web.static-page:
  impressum, datenschutz, agb, cookies, faq (Akkordeon), hilfe, kontakt,
  ueber-uns, api (altes Theme/gradient-hero entfernt)
- Header/Footer-Linkpflege: tote #-Anker raus, FAQ/Hilfe/Cookies verlinkt,
  "Anmelden" fuehrt in den Hub
- Legacy-URL-Redirects (.html, presskit->newsroom, Regionen)
- Datums-Bugfix in Feed-Komponenten

Tests: NewsroomPage, PreisePage, PricingTeaser, StaticPages, NavigationLinks,
LegacyRedirect. Doku in docs/frontend aktualisiert.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-06-17 16:08:46 +00:00
parent 82abdf6bd6
commit 028b059975
34 changed files with 2842 additions and 3102 deletions

103
lang/de/pricing.php Normal file
View file

@ -0,0 +1,103 @@
<?php
/*
|--------------------------------------------------------------------------
| Preise-Seite (öffentliches Portal) — ausgelagerte Inhalte
|--------------------------------------------------------------------------
|
| Alle Texte der öffentlichen Preise-Seite (resources/views/web/preise.blade.php).
| Bewusst zentral hier, damit Portal-Seite, Hub und ggf. das User-Backend
| dieselben Formulierungen ziehen können. Zahlen/Preise kommen NICHT aus dieser
| Datei, sondern aus dem System (Plan-Modell, config/billing.php, config/credits.php).
|
| HINWEIS: Die korrespondierende In-App-Buchungsseite
| (resources/views/livewire/customer/bookings.blade.php) wird gerade überarbeitet.
| Teile dieser Texte (v. a. Add-on-Lineup) können sich noch ändern.
|
*/
return [
'meta_title' => 'Preise & Tarife – Pressemitteilungen veröffentlichen',
'meta_description' => 'Transparente Tarife für Pressemitteilungen: Abo mit Monatskontingent, Einzelveröffentlichung und flexible Add-ons. Alle Preise netto zzgl. USt.',
'eyebrow' => 'Tarife & Preise',
'headline' => 'Transparente Preise für jede Reichweite',
'intro' => 'Veröffentlichen Sie regelmäßig im Abo mit monatlichem Kontingent oder einzeln ohne Bindung. Add-ons buchen Sie flexibel dazu. Alle Preise sind Nettopreise zzgl. gesetzlicher USt.',
// 1. Abo-Tarife (Daten: Plan::active())
'plans' => [
'eyebrow' => 'Abo-Tarife',
'title' => 'Abo-Tarife mit Monatskontingent',
'subtitle' => 'Monatlich kündbar. Im Jahrestarif sind zwei Monate gratis enthalten.',
'per_month' => '/ Monat',
'per_year' => '/ Jahr',
'net' => 'netto zzgl. USt.',
'yearly_hint' => ':price € / Jahr · 2 Monate gratis',
'quota' => ':count Pressemitteilungen / Monat',
'daily_limit' => 'max. :count Veröffentlichungen / Tag',
'no_daily_limit' => 'Ohne Tageslimit',
'included' => 'Redaktionelle Prüfung & Veröffentlichung inklusive',
'cta' => 'Tarif wählen',
'popular' => 'Beliebt',
'empty' => 'Tarife werden in Kürze veröffentlicht.',
// TODO: Enterprise-Kontaktadresse zentralisieren, sobald final.
'enterprise' => 'Mehr Veröffentlichungen, mehrere Marken oder Sonderkonditionen? Enterprise-Konditionen erhalten Sie auf Anfrage über den Support.',
],
// 2. Einzel-Pressemitteilung (Daten: config('billing.single_pm_price_cents'))
'single' => [
'eyebrow' => 'Ohne Abo',
'title' => 'Einzel-Pressemitteilung',
'description' => 'Genau eine Veröffentlichung inklusive redaktioneller Prüfung. Bezahlt wird erst bei Veröffentlichung – abgelehnte Mitteilungen kosten nichts.',
'price_suffix' => 'pro Veröffentlichung',
'net' => 'netto zzgl. USt.',
'cta' => 'Einzeln veröffentlichen',
],
// 3. Add-ons & Einzelkosten (Daten: config('credits'))
'addons' => [
'eyebrow' => 'Add-ons',
'title' => 'Add-ons & Einzelkosten',
'subtitle' => '1 Credit = 1 €. Add-ons buchen Sie flexibel aus Ihrem Guthaben – größere Credit-Pakete enthalten Bonus-Guthaben.',
'credits_unit' => 'Credits',
'from' => 'ab',
'extra_pm' => [
'title' => 'Extra-Pressemitteilung',
'description' => 'Eine weitere Veröffentlichung, wenn das Monatskontingent ausgeschöpft ist – ohne Tarifwechsel. Der Preis sinkt mit höherem Tarif.',
'tier_label' => 'Tarif',
'price_label' => 'Preis je PM',
],
'boost' => [
'title' => 'Boost-Platzierung',
'description' => 'Prominente Platzierung Ihrer Meldung auf der Startseite und der passenden Branchenseite.',
'days' => ':count Tage',
],
'proof_pdf' => [
'title' => 'Veröffentlichungsnachweis (PDF)',
'description' => 'Offizieller Nachweis Ihrer Veröffentlichung als PDF-Dokument – ideal für Reporting und Archiv.',
'unit' => 'pro Nachweis',
],
'packs' => [
'title' => 'Credit-Pakete',
'description' => 'Guthaben aufladen und flexibel für Add-ons einsetzen. Größere Pakete enthalten Bonus-Credits.',
'credits' => ':count Credits',
'bonus' => '+:count Bonus',
'net' => 'netto',
],
// TODO: Diese Leistungen hängen am Magic-Link-/Bookings-Rework — Lineup
// und Preise final abstimmen, sobald die In-App-Seite steht.
'more' => [
'title' => 'Weitere Leistungen',
'correction' => 'Inhaltliche Korrektur',
'update' => 'Update / Ergänzung',
'depublish' => 'Depublizieren',
],
],
'vat_note' => 'Alle Preise sind Nettopreise und verstehen sich zzgl. der gesetzlichen Umsatzsteuer. Die Abrechnung erfolgt sicher über unseren Zahlungsdienstleister.',
];

97
lang/en/pricing.php Normal file
View file

@ -0,0 +1,97 @@
<?php
/*
|--------------------------------------------------------------------------
| Pricing page (public portal) — externalised content
|--------------------------------------------------------------------------
|
| English counterpart of lang/de/pricing.php. Prices/numbers do NOT live here;
| they are read from the system (Plan model, config/billing.php, config/credits.php).
|
| NOTE: The in-app booking page (livewire/customer/bookings.blade.php) is still
| being reworked. Some of these strings (mainly the add-on line-up) may change.
|
*/
return [
'meta_title' => 'Pricing & Plans – Publish press releases',
'meta_description' => 'Transparent pricing for press releases: subscription with a monthly quota, single publication and flexible add-ons. All prices net, plus VAT.',
'eyebrow' => 'Plans & Pricing',
'headline' => 'Transparent pricing for every reach',
'intro' => 'Publish regularly on a subscription with a monthly quota, or one-off without commitment. Add-ons are booked flexibly on top. All prices are net, plus statutory VAT.',
// 1. Subscription plans (data: Plan::active())
'plans' => [
'eyebrow' => 'Subscriptions',
'title' => 'Subscriptions with a monthly quota',
'subtitle' => 'Cancel monthly. The annual plan includes two months free.',
'per_month' => '/ month',
'per_year' => '/ year',
'net' => 'net, plus VAT.',
'yearly_hint' => ':price € / year · 2 months free',
'quota' => ':count press releases / month',
'daily_limit' => 'max. :count publications / day',
'no_daily_limit' => 'No daily limit',
'included' => 'Editorial review & publication included',
'cta' => 'Choose plan',
'popular' => 'Popular',
'empty' => 'Plans will be published shortly.',
'enterprise' => 'More publications, multiple brands or special terms? Enterprise conditions are available on request via support.',
],
// 2. Single press release (data: config('billing.single_pm_price_cents'))
'single' => [
'eyebrow' => 'No subscription',
'title' => 'Single press release',
'description' => 'Exactly one publication including editorial review. You only pay on publication – rejected releases are free.',
'price_suffix' => 'per publication',
'net' => 'net, plus VAT.',
'cta' => 'Publish a single release',
],
// 3. Add-ons & individual costs (data: config('credits'))
'addons' => [
'eyebrow' => 'Add-ons',
'title' => 'Add-ons & individual costs',
'subtitle' => '1 credit = 1 €. Add-ons are booked flexibly from your balance – larger credit packs include bonus credits.',
'credits_unit' => 'credits',
'from' => 'from',
'extra_pm' => [
'title' => 'Extra press release',
'description' => 'One more publication when your monthly quota is used up – without changing plans. The price drops with a higher plan.',
'tier_label' => 'Plan',
'price_label' => 'Price per release',
],
'boost' => [
'title' => 'Boost placement',
'description' => 'Prominent placement of your release on the homepage and the matching industry page.',
'days' => ':count days',
],
'proof_pdf' => [
'title' => 'Proof of publication (PDF)',
'description' => 'Official proof of your publication as a PDF document – ideal for reporting and archiving.',
'unit' => 'per proof',
],
'packs' => [
'title' => 'Credit packs',
'description' => 'Top up your balance and use it flexibly for add-ons. Larger packs include bonus credits.',
'credits' => ':count credits',
'bonus' => '+:count bonus',
'net' => 'net',
],
'more' => [
'title' => 'Further services',
'correction' => 'Content correction',
'update' => 'Update / addition',
'depublish' => 'Unpublish',
],
],
'vat_note' => 'All prices are net and exclude statutory VAT. Billing is handled securely via our payment provider.',
];