trim((string) $value), explode(',', (string) env('APP_SUPPORTED_LOCALES', '')) )); if (empty($configuredLocales)) { $configuredLocales = array_filter([ config('app.locale'), config('app.fallback_locale'), ]); } $supportedLocales = array_values(array_unique($configuredLocales ?: ['de', 'en'])); $localePattern = implode('|', $supportedLocales); $rewritePath = static function (string $path, string $locale): string { $normalized = '/'.ltrim($path, '/'); if ($normalized === '//') { $normalized = '/'; } $map = [ '/kontakt' => ['en' => '/contact'], '/contact' => ['de' => '/kontakt'], '/so-funktionierts' => ['en' => '/how-it-works'], '/how-it-works' => ['de' => '/so-funktionierts'], '/anlaesse' => ['en' => '/occasions'], '/anlaesse/hochzeit' => ['en' => '/occasions/wedding'], '/anlaesse/geburtstag' => ['en' => '/occasions/birthday'], '/anlaesse/firmenevent' => ['en' => '/occasions/corporate-event'], '/anlaesse/konfirmation' => ['en' => '/occasions/confirmation'], '/occasions/wedding' => ['de' => '/anlaesse/hochzeit'], '/occasions/birthday' => ['de' => '/anlaesse/geburtstag'], '/occasions/corporate-event' => ['de' => '/anlaesse/firmenevent'], '/occasions/confirmation' => ['de' => '/anlaesse/konfirmation'], ]; $rewrites = $map[$normalized] ?? []; return $rewrites[$locale] ?? $normalized; }; $determinePreferredLocale = static function (Request $request) use ($supportedLocales): string { $sessionLocale = $request->session()->get('preferred_locale'); if ($sessionLocale && in_array($sessionLocale, $supportedLocales, true)) { return $sessionLocale; } $headerLocale = $request->getPreferredLanguage($supportedLocales); if ($headerLocale && in_array($headerLocale, $supportedLocales, true)) { return $headerLocale; } return $supportedLocales[0] ?? 'de'; }; Route::prefix('{locale}') ->where(['locale' => $localePattern]) ->middleware([ \App\Http\Middleware\SetLocaleFromRequest::class, ]) ->group(function () { Route::get('/', [MarketingController::class, 'index'])->name('marketing.home'); Route::middleware('guest')->group(function () { Route::get('/login', [AuthenticatedSessionController::class, 'create']); Route::post('/login', [AuthenticatedSessionController::class, 'store']); Route::get('/register', [RegisteredUserController::class, 'create']); Route::post('/register', [RegisteredUserController::class, 'store']); }); Route::get('/contact', [MarketingController::class, 'contactView']) ->name('marketing.contact'); Route::post('/contact', [MarketingController::class, 'contact']) ->name('marketing.contact.submit'); Route::get('/kontakt', [MarketingController::class, 'contactView']) ->name('kontakt'); Route::post('/kontakt', [MarketingController::class, 'contact']) ->name('kontakt.submit'); Route::get('/blog', [MarketingController::class, 'blogIndex'])->name('blog'); Route::get('/blog/{slug}', [MarketingController::class, 'blogShow'])->name('blog.show'); Route::get('/packages', [MarketingController::class, 'packagesIndex'])->name('packages'); Route::get('/anlaesse/{type}', [MarketingController::class, 'occasionsType'])->name('anlaesse.type'); Route::get('/occasions/{type}', [MarketingController::class, 'occasionsType']) ->name('occasions.type'); Route::get('/so-funktionierts', [MarketingController::class, 'howItWorks']) ->where('locale', 'de'); Route::get('/how-it-works', [MarketingController::class, 'howItWorks']) ->where('locale', 'en') ->name('marketing.how-it-works'); Route::get('/demo', [MarketingController::class, 'demo'])->name('demo'); Route::get('/success/{packageId?}', [MarketingController::class, 'success'])->name('marketing.success'); Route::get('/impressum', [LegalPageController::class, 'show']) ->defaults('slug', 'impressum') ->name('impressum'); Route::get('/datenschutz', [LegalPageController::class, 'show']) ->defaults('slug', 'datenschutz') ->name('datenschutz'); Route::get('/agb', [LegalPageController::class, 'show']) ->defaults('slug', 'agb') ->name('agb'); Route::get('/buy/{packageId}', [MarketingController::class, 'buyPackages']) ->name('buy.packages') ->defaults('locale', config('app.locale', 'de')); Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'index']) ->name('marketing.profile.index'); }); Route::fallback(function () { return Inertia::render('marketing/NotFound', [ 'requestedPath' => request()->path(), ])->toResponse(request())->setStatusCode(404); }); }); Route::get('/', function (Request $request) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); return redirect("/{$locale}", 302); })->name('home'); Route::get('/contact', function (Request $request) use ($determinePreferredLocale, $rewritePath) { $locale = $determinePreferredLocale($request); $path = $rewritePath('/contact', $locale); return redirect("/{$locale}".($path === '/' ? '' : $path), 301); }); Route::get('/kontakt', function (Request $request) use ($determinePreferredLocale, $rewritePath) { $locale = $determinePreferredLocale($request); $path = $rewritePath('/kontakt', $locale); return redirect("/{$locale}".($path === '/' ? '' : $path), 301); }); Route::get('/so-funktionierts', function (Request $request) use ($determinePreferredLocale, $rewritePath) { $locale = $determinePreferredLocale($request); $path = $rewritePath('/so-funktionierts', $locale); return redirect("/{$locale}{$path}", 301); }); Route::get('/how-it-works', function (Request $request) use ($determinePreferredLocale, $rewritePath) { $locale = $determinePreferredLocale($request); $path = $rewritePath('/how-it-works', $locale); return redirect("/{$locale}{$path}", 301); }); Route::get('/blog', function (Request $request) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); return redirect("/{$locale}/blog", 301); }); Route::get('/blog/{slug}', function (Request $request, string $slug) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); return redirect("/{$locale}/blog/{$slug}", 301); }); Route::get('/packages', function (Request $request) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); return redirect("/{$locale}/packages", 301); }); Route::get('/anlaesse/{type}', function (Request $request, string $type) use ($determinePreferredLocale, $rewritePath) { $locale = $determinePreferredLocale($request); $path = $rewritePath("/anlaesse/{$type}", $locale); return redirect("/{$locale}{$path}", 301); }); Route::get('/occasions/{type}', function (Request $request, string $type) use ($determinePreferredLocale, $rewritePath) { $locale = $determinePreferredLocale($request); $path = $rewritePath("/occasions/{$type}", $locale); return redirect("/{$locale}{$path}", 301); }); Route::get('/demo', function (Request $request) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); return redirect("/{$locale}/demo", 301); }); Route::get('/success/{packageId?}', function (Request $request, ?int $packageId = null) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); $path = "/{$locale}/success"; if ($packageId !== null) { $path .= "/{$packageId}"; } return redirect($path, 301); }); Route::get('/buy/{packageId}', function (Request $request, int $packageId) use ($determinePreferredLocale) { $locale = $determinePreferredLocale($request); return redirect("/{$locale}/buy/{$packageId}", 301); }); Route::get('/dashboard', DashboardController::class) ->middleware(['auth']) ->name('dashboard'); Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'index']) ->name('profile.index'); }); Route::prefix('event-admin')->group(function () { $renderAdmin = fn () => view('admin'); Route::get('/auth/callback', $renderAdmin)->name('tenant.admin.auth.callback'); Route::get('/login', $renderAdmin)->name('tenant.admin.login'); Route::get('/logout', $renderAdmin)->name('tenant.admin.logout'); Route::get('/auth/google', [TenantAdminGoogleController::class, 'redirect']) ->name('tenant.admin.google.redirect'); Route::get('/auth/google/callback', [TenantAdminGoogleController::class, 'callback']) ->name('tenant.admin.google.callback'); Route::get('/{view?}', $renderAdmin) ->where('view', '.*') ->name('tenant.admin.app'); }); Route::view('/event', 'guest')->name('guest.pwa.landing'); Route::view('/g/{token}', 'guest')->where('token', '.*')->name('guest.gallery'); Route::view('/e/{token}/{path?}', 'guest') ->where('token', '.*') ->where('path', '.*') ->name('guest.event'); Route::middleware('auth')->group(function () { Route::get('/tenant/events/{event}/photos/archive', EventPhotoArchiveController::class) ->name('tenant.events.photos.archive'); }); if (config('checkout.enabled')) { Route::get('/purchase-wizard/{package}', [CheckoutController::class, 'show'])->name('purchase.wizard'); Route::get('/checkout/{package}', [CheckoutController::class, 'show'])->name('checkout.show'); } else { Route::get('/purchase-wizard/{package}', function (Package $package) { return redirect()->route('packages', [ 'locale' => app()->getLocale(), 'highlight' => $package->slug, ]); })->name('purchase.wizard'); Route::get('/checkout/{package}', function (Package $package) { return redirect()->route('packages', [ 'locale' => app()->getLocale(), 'highlight' => $package->slug, ]); })->name('checkout.show'); } Route::post('/checkout/login', [CheckoutController::class, 'login'])->name('checkout.login'); Route::post('/checkout/register', [CheckoutController::class, 'register'])->name('checkout.register'); Route::get('/checkout/auth/google', [CheckoutGoogleController::class, 'redirect'])->name('checkout.google.redirect'); Route::get('/checkout/auth/google/callback', [CheckoutGoogleController::class, 'callback'])->name('checkout.google.callback'); Route::post('/checkout/track-abandoned', [CheckoutController::class, 'trackAbandonedCheckout'])->name('checkout.track-abandoned'); Route::post('/set-locale', [LocaleController::class, 'set'])->name('set-locale'); Route::middleware('auth')->group(function () { Route::post('/paddle/create-checkout', [PaddleCheckoutController::class, 'create'])->name('paddle.checkout.create'); }); Route::post('/paddle/webhook', [PaddleWebhookController::class, 'handle'])->name('paddle.webhook');