diff --git a/AGENTS.md b/AGENTS.md index b194fa3..108a814 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -38,6 +38,9 @@ This repository hosts a multi-tenant event photo platform (Laravel 12, PHP 8.3, - resources/js/admin/ — Tenant Admin PWA source (React 19, Capacitor/TWA ready). - resources/js/pages/ — Inertia pages (React). - docs/archive/README.md — historical PRP context. +- Marketing frontend language files: + - Source translations: `resources/lang/{de,en}/marketing.php` and `resources/lang/{de,en}/marketing.json`. + - Runtime i18next JSON served to the frontend: `public/lang/{de,en}/marketing.json` (must stay in sync with the source files). ## Standard Workflows - Coding tasks (Codegen Agent): diff --git a/config/gift-vouchers.php b/config/gift-vouchers.php index ff0d274..8109fd8 100644 --- a/config/gift-vouchers.php +++ b/config/gift-vouchers.php @@ -30,21 +30,21 @@ return [ ], [ 'key' => 'gift-standard', - 'label' => 'Geschenk Standard', + 'label' => 'Geschenk Classic', 'amount' => 59.00, 'currency' => 'EUR', 'paddle_price_id' => env('PADDLE_GIFT_PRICE_STANDARD', 'pri_01kbwccfvzrf4z2f1r62vns7gh'), ], [ 'key' => 'gift-standard-usd', - 'label' => 'Gift Standard (USD)', + 'label' => 'Gift Classic (USD)', 'amount' => 65.00, 'currency' => 'USD', 'paddle_price_id' => env('PADDLE_GIFT_PRICE_STANDARD_USD'), ], [ 'key' => 'gift-standard-gbp', - 'label' => 'Gift Standard (GBP)', + 'label' => 'Gift Classic (GBP)', 'amount' => 55.00, 'currency' => 'GBP', 'paddle_price_id' => env('PADDLE_GIFT_PRICE_STANDARD_GBP'), @@ -70,27 +70,6 @@ return [ 'currency' => 'GBP', 'paddle_price_id' => env('PADDLE_GIFT_PRICE_PREMIUM_GBP'), ], - [ - 'key' => 'gift-premium-plus', - 'label' => 'Geschenk Premium Plus', - 'amount' => 149.00, - 'currency' => 'EUR', - 'paddle_price_id' => env('PADDLE_GIFT_PRICE_PREMIUM_PLUS', 'pri_01kbwccgnjzwrjy5xg1yp981p6'), - ], - [ - 'key' => 'gift-premium-plus-usd', - 'label' => 'Gift Premium Plus (USD)', - 'amount' => 159.00, - 'currency' => 'USD', - 'paddle_price_id' => env('PADDLE_GIFT_PRICE_PREMIUM_PLUS_USD'), - ], - [ - 'key' => 'gift-premium-plus-gbp', - 'label' => 'Gift Premium Plus (GBP)', - 'amount' => 139.00, - 'currency' => 'GBP', - 'paddle_price_id' => env('PADDLE_GIFT_PRICE_PREMIUM_PLUS_GBP'), - ], ], // Package types a voucher coupon should apply to. diff --git a/database/seeders/CouponSeeder.php b/database/seeders/CouponSeeder.php index 745ec22..4a96ee2 100644 --- a/database/seeders/CouponSeeder.php +++ b/database/seeders/CouponSeeder.php @@ -60,7 +60,7 @@ class CouponSeeder extends Seeder [ 'code' => 'UPGRADE30', 'name' => 'Upgrade 30 €', - 'description' => '30 € Nachlass als Upgrade-Anreiz von Starter auf Standard/Premium.', + 'description' => '30 € Nachlass als Upgrade-Anreiz von Starter auf Classic/Premium.', 'type' => CouponType::FLAT, 'amount' => 30.00, 'currency' => 'EUR', @@ -77,7 +77,7 @@ class CouponSeeder extends Seeder [ 'code' => 'SEASON50', 'name' => 'Hochzeits-Saison 50 €', - 'description' => 'Saisonaler 50 € Rabatt für die Hochzeitssaison auf Standard/Premium.', + 'description' => 'Saisonaler 50 € Rabatt für die Hochzeitssaison auf Classic/Premium.', 'type' => CouponType::FLAT, 'amount' => 50.00, 'currency' => 'EUR', diff --git a/database/seeders/PackageSeeder.php b/database/seeders/PackageSeeder.php index 1882c85..5f03e70 100644 --- a/database/seeders/PackageSeeder.php +++ b/database/seeders/PackageSeeder.php @@ -31,7 +31,7 @@ class PackageSeeder extends Seeder 'max_events_per_year' => 1, 'watermark_allowed' => false, 'branding_allowed' => false, - 'features' => ['basic_uploads', 'limited_sharing', 'custom_tasks'], + 'features' => ['basic_uploads', 'limited_sharing', 'custom_tasks', 'live_slideshow'], 'paddle_product_id' => 'pro_01k8jcxx2g1vj9snqbga4283ej', 'paddle_price_id' => 'pri_01k8jcxx8qktxvqzzv0nkjjj27', 'description' => <<<'TEXT' @@ -51,10 +51,10 @@ TEXT, ], [ 'slug' => 'standard', - 'name' => 'Standard', + 'name' => 'Classic', 'name_translations' => [ - 'de' => 'Standard', - 'en' => 'Standard', + 'de' => 'Classic', + 'en' => 'Classic', ], 'type' => PackageType::ENDCUSTOMER, 'price' => 59.00, @@ -151,10 +151,10 @@ TEXT, ], [ 'slug' => 'm-medium-reseller', - 'name' => 'Partner Standard', + 'name' => 'Partner Classic', 'name_translations' => [ - 'de' => 'Partner Standard', - 'en' => 'Partner Standard', + 'de' => 'Partner Classic', + 'en' => 'Partner Classic', ], 'type' => PackageType::RESELLER, 'included_package_slug' => 'standard', @@ -171,15 +171,15 @@ TEXT, 'paddle_product_id' => 'pro_01k8jcxtrxw7jsew52jnax901q', 'paddle_price_id' => 'pri_01k8jcxv06nsgy8ym8mnfrfm5v', 'description' => <<<'TEXT' -Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Standard‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen. +Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Classic‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen. TEXT, 'description_translations' => [ - 'de' => 'Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Standard‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen.', - 'en' => 'Event-Kontingent for Partner / Agencies: {{max_events_per_year}} events at Standard level. Recommended to use within 24 months.', + 'de' => 'Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Classic‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen.', + 'en' => 'Event-Kontingent for Partner / Agencies: {{max_events_per_year}} events at Classic level. Recommended to use within 24 months.', ], 'description_table' => [ ['title' => 'Events', 'value' => '{{max_events_per_year}} Events'], - ['title' => 'Inklusive Event-Level', 'value' => 'Standard'], + ['title' => 'Inklusive Event-Level', 'value' => 'Classic'], ['title' => 'Empfehlung', 'value' => 'Empfohlen innerhalb von 24 Monaten zu nutzen.'], ], ], @@ -273,15 +273,15 @@ TEXT, 'paddle_product_id' => 'pro_01k8jct3gz9ks5mg6z61q6nrxb', 'paddle_price_id' => 'pri_01k8jcxsa8axwpjnybhjbcrb06', 'description' => <<<'TEXT' -Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Standard‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen. +Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Classic‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen. TEXT, 'description_translations' => [ - 'de' => 'Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Standard‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen.', - 'en' => 'Event-Kontingent for Partner / Agencies: {{max_events_per_year}} events at Standard level. Recommended to use within 24 months.', + 'de' => 'Event-Kontingent für Partner / Agenturen: {{max_events_per_year}} Events auf Classic‑Niveau. Empfohlen innerhalb von 24 Monaten zu nutzen.', + 'en' => 'Event-Kontingent for Partner / Agencies: {{max_events_per_year}} events at Classic level. Recommended to use within 24 months.', ], 'description_table' => [ ['title' => 'Events', 'value' => '{{max_events_per_year}} Events'], - ['title' => 'Inklusive Event-Level', 'value' => 'Standard'], + ['title' => 'Inklusive Event-Level', 'value' => 'Classic'], ['title' => 'Empfehlung', 'value' => 'Empfohlen innerhalb von 24 Monaten zu nutzen.'], ], ], diff --git a/public/lang/de/marketing.json b/public/lang/de/marketing.json index 8026e5c..d67c3d3 100644 --- a/public/lang/de/marketing.json +++ b/public/lang/de/marketing.json @@ -109,7 +109,7 @@ "priority_support": "Priorisierter Support", "cancel_link": "Paket verwalten: :link", "hero_kicker": "Pakete, die mit eurem Event mitwachsen", - "hero_title": "Entdecken Sie unsere flexiblen Packages", + "hero_title": "Entdecken Sie unsere flexiblen Event-Pakete", "hero_description": "Von kostenlosem Einstieg bis Premium-Features: Passen Sie Ihr Event-Paket an Ihre Bedürfnisse an. Einfach, sicher und skalierbar.", "hero_secondary": "Teste den kompletten Gäste-Flow in unserer Live-Demo – kein Login, kein App-Store.", "cta_demo": "Demo ansehen", @@ -117,7 +117,7 @@ "cta_explore_highlight": "Lieblingspaket sichern", "gift_cta": "Paket verschenken", "tab_endcustomer": "Einzel-Events", - "tab_reseller": "Partner / Agentur", + "tab_reseller": "mehrere Events", "section_endcustomer": "Packages für Endkunden (Einmalkauf pro Event)", "section_reseller": "Packages für Partner / Agenturen (Event-Kontingent)", "bundles_title": "Partner & Agentur Bundles", @@ -156,7 +156,7 @@ "feature_watermark_custom": "Eigenes Wasserzeichen", "feature_branding": "Branding", "feature_support": "Support", - "feature_basic_uploads": "Basis-Uploads", + "feature_basic_uploads": "Download aller Fotos", "feature_unlimited_sharing": "Unbegrenztes Teilen", "feature_no_watermark": "Kein Wasserzeichen", "feature_custom_tasks": "Benutzerdefinierte Tasks", @@ -523,9 +523,9 @@ "family": "Familienfeiern" }, "blog": "Blog", - "packages": "Packages", + "packages": "Pakete", "contact": "Kontakt", - "discover_packages": "Packages entdecken", + "discover_packages": "Pakete entdecken", "language": "Sprache", "language_de": "Deutsch", "language_en": "English", @@ -837,7 +837,7 @@ "label": "Setup vom Account zur Galerie" }, { - "value": "0 Apps", + "value": "keine App-Installation erforderlich", "label": "Gäste nutzen nur ihren Browser" }, { diff --git a/public/lang/en/marketing.json b/public/lang/en/marketing.json index d9f8d2d..b0d7fb2 100644 --- a/public/lang/en/marketing.json +++ b/public/lang/en/marketing.json @@ -104,7 +104,7 @@ "cta_explore_highlight": "Explore top packages", "gift_cta": "Gift a package", "tab_endcustomer": "End Customers", - "tab_reseller": "Partner / Agency", + "tab_reseller": "Bundles", "section_endcustomer": "Packages for End Customers (One-time purchase per event)", "section_reseller": "Packages for Partner / Agencies (Event bundle)", "bundles_title": "Partner & Agency Bundles", diff --git a/resources/js/admin/DevTenantSwitcher.tsx b/resources/js/admin/DevTenantSwitcher.tsx index 11dc953..8e75ad9 100644 --- a/resources/js/admin/DevTenantSwitcher.tsx +++ b/resources/js/admin/DevTenantSwitcher.tsx @@ -7,7 +7,7 @@ import { useTheme } from '@tamagui/core'; const DEV_TENANT_KEYS = [ { key: 'cust-standard-empty', label: 'Endkunde – Starter (kein Event)' }, - { key: 'cust-starter-wedding', label: 'Endkunde – Standard (Hochzeit)' }, + { key: 'cust-starter-wedding', label: 'Endkunde – Classic (Hochzeit)' }, { key: 'reseller-s-active', label: 'Reseller S – 3 aktive Events' }, { key: 'reseller-s-full', label: 'Reseller S – voll belegt (5/5)' }, ] as const; diff --git a/resources/js/admin/i18n/locales/de/common.json b/resources/js/admin/i18n/locales/de/common.json index 9e12988..6a8278e 100644 --- a/resources/js/admin/i18n/locales/de/common.json +++ b/resources/js/admin/i18n/locales/de/common.json @@ -200,7 +200,7 @@ "plans": { "title": "Pakete im Überblick", "subtitle": "Wähle das passende Kontingent", - "hint": "Starter, Standard oder Partner – alles mit Moderation & QR-Codes.", + "hint": "Starter, Classic oder Partner – alles mit Moderation & QR-Codes.", "starter": { "title": "Starter", "badge": "Für ein Event", @@ -209,7 +209,7 @@ "p3": "Moderation & Galerie-Link" }, "standard": { - "title": "Standard", + "title": "Classic", "badge": "Beliebt", "highlight": "Mehr Kontingent & Branding", "p1": "Mehr Events pro Jahr", diff --git a/resources/js/admin/i18n/locales/de/management.json b/resources/js/admin/i18n/locales/de/management.json index d57853d..a485581 100644 --- a/resources/js/admin/i18n/locales/de/management.json +++ b/resources/js/admin/i18n/locales/de/management.json @@ -763,7 +763,7 @@ "surface": "Fläche", "lockedBranding": "Branding ist in diesem Paket gesperrt.", "lockedTitle": "Branding freischalten", - "lockedBody": "Upgrade auf Standard oder Premium, um Event-Branding zu nutzen.", + "lockedBody": "Upgrade auf Classic oder Premium, um Event-Branding zu nutzen.", "upgradeAction": "Paket upgraden", "source": "Branding-Quelle", "sourceHint": "Nutze das Standard-Branding oder passe nur dieses Event an.", @@ -2934,7 +2934,7 @@ "recommendedUsage": "Empfohlen innerhalb von 24 Monaten zu nutzen.", "tiers": { "starter": "Starter", - "standard": "Standard", + "standard": "Classic", "premium": "Premium" }, "compare": { diff --git a/resources/js/admin/i18n/locales/en/common.json b/resources/js/admin/i18n/locales/en/common.json index b6729c2..431c181 100644 --- a/resources/js/admin/i18n/locales/en/common.json +++ b/resources/js/admin/i18n/locales/en/common.json @@ -200,7 +200,7 @@ "plans": { "title": "Packages at a glance", "subtitle": "Choose the right quota", - "hint": "Starter, Standard or Partner – all include moderation & invites.", + "hint": "Starter, Classic or Partner – all include moderation & invites.", "starter": { "title": "Starter", "badge": "For one event", @@ -209,7 +209,7 @@ "p3": "Moderation & gallery link" }, "standard": { - "title": "Standard", + "title": "Classic", "badge": "Popular", "highlight": "More quota & branding", "p1": "More events per year", diff --git a/resources/js/admin/i18n/locales/en/management.json b/resources/js/admin/i18n/locales/en/management.json index 5ba070c..87d876f 100644 --- a/resources/js/admin/i18n/locales/en/management.json +++ b/resources/js/admin/i18n/locales/en/management.json @@ -759,7 +759,7 @@ "surface": "Surface", "lockedBranding": "Branding is locked for this package.", "lockedTitle": "Unlock branding", - "lockedBody": "Upgrade to Standard or Premium to unlock event branding.", + "lockedBody": "Upgrade to Classic or Premium to unlock event branding.", "upgradeAction": "Upgrade package", "source": "Branding source", "sourceHint": "Use the default branding or customize this event only.", @@ -2936,7 +2936,7 @@ "recommendedUsage": "Recommended to use within 24 months.", "tiers": { "starter": "Starter", - "standard": "Standard", + "standard": "Classic", "premium": "Premium" }, "compare": { diff --git a/resources/js/admin/mobile/BillingPage.tsx b/resources/js/admin/mobile/BillingPage.tsx index 8c7a48b..f13df72 100644 --- a/resources/js/admin/mobile/BillingPage.tsx +++ b/resources/js/admin/mobile/BillingPage.tsx @@ -524,7 +524,7 @@ function PackageCard({ pkg.included_package_slug === 'starter' ? t('shop.partner.tiers.starter', 'Starter') : pkg.included_package_slug === 'standard' - ? t('shop.partner.tiers.standard', 'Standard') + ? t('shop.partner.tiers.standard', 'Classic') : pkg.included_package_slug === 'pro' ? t('shop.partner.tiers.premium', 'Premium') : pkg.included_package_slug; diff --git a/resources/js/admin/mobile/BrandingPage.tsx b/resources/js/admin/mobile/BrandingPage.tsx index 6c10253..7ff8b7c 100644 --- a/resources/js/admin/mobile/BrandingPage.tsx +++ b/resources/js/admin/mobile/BrandingPage.tsx @@ -694,7 +694,7 @@ export default function MobileBrandingPage() { {!brandingAllowed ? ( navigate(adminPath('/mobile/billing/shop?feature=custom_branding'))} /> diff --git a/resources/js/admin/mobile/EventFormPage.tsx b/resources/js/admin/mobile/EventFormPage.tsx index 6cc830b..10a4ebb 100644 --- a/resources/js/admin/mobile/EventFormPage.tsx +++ b/resources/js/admin/mobile/EventFormPage.tsx @@ -245,7 +245,7 @@ export default function MobileEventFormPage() { } if (slugValue === 'standard') { - return 'Standard'; + return 'Classic'; } if (slugValue === 'pro') { diff --git a/resources/js/admin/mobile/PackageShopPage.tsx b/resources/js/admin/mobile/PackageShopPage.tsx index 697d326..3fa8742 100644 --- a/resources/js/admin/mobile/PackageShopPage.tsx +++ b/resources/js/admin/mobile/PackageShopPage.tsx @@ -704,7 +704,7 @@ function resolveIncludedTierLabel( } if (slug === 'standard') { - return t('shop.partner.tiers.standard', 'Standard'); + return t('shop.partner.tiers.standard', 'Classic'); } if (slug === 'pro') { diff --git a/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx b/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx index 6cec7ee..e80d1c0 100644 --- a/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx +++ b/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx @@ -24,7 +24,7 @@ const fixtures = vi.hoisted(() => ({ activePackage: { id: 1, package_id: 1, - package_name: 'Standard', + package_name: 'Classic', package_type: 'reseller', included_package_slug: null, active: true, diff --git a/resources/js/admin/mobile/__tests__/EventsPage.test.tsx b/resources/js/admin/mobile/__tests__/EventsPage.test.tsx index 6aa45e2..ece46fc 100644 --- a/resources/js/admin/mobile/__tests__/EventsPage.test.tsx +++ b/resources/js/admin/mobile/__tests__/EventsPage.test.tsx @@ -68,7 +68,7 @@ vi.mock('../../api', () => ({ { id: 1, package_id: 1, - package_name: 'Standard', + package_name: 'Classic', package_type: 'endcustomer', included_package_slug: null, active: true, @@ -84,7 +84,7 @@ vi.mock('../../api', () => ({ activePackage: { id: 1, package_id: 1, - package_name: 'Standard', + package_name: 'Classic', package_type: 'endcustomer', included_package_slug: null, active: true, diff --git a/resources/js/pages/auth/RegisterForm.tsx b/resources/js/pages/auth/RegisterForm.tsx index 416c688..af3f03d 100644 --- a/resources/js/pages/auth/RegisterForm.tsx +++ b/resources/js/pages/auth/RegisterForm.tsx @@ -252,7 +252,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
-
-
-
-
-