Update marketing packages and checkout copy
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run
tests / ui (push) Waiting to run

This commit is contained in:
Codex Agent
2026-02-01 13:04:11 +01:00
parent 386d0004ed
commit 2e78f3ab8d
35 changed files with 136 additions and 157 deletions

View File

@@ -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;

View File

@@ -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",

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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": {

View File

@@ -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;

View File

@@ -694,7 +694,7 @@ export default function MobileBrandingPage() {
{!brandingAllowed ? (
<UpgradeCard
title={t('events.branding.lockedTitle', 'Unlock branding')}
body={t('events.branding.lockedBody', 'Upgrade to Standard or Premium to unlock event branding.')}
body={t('events.branding.lockedBody', 'Upgrade to Classic or Premium to unlock event branding.')}
actionLabel={t('events.branding.upgradeAction', 'Upgrade package')}
onPress={() => navigate(adminPath('/mobile/billing/shop?feature=custom_branding'))}
/>

View File

@@ -245,7 +245,7 @@ export default function MobileEventFormPage() {
}
if (slugValue === 'standard') {
return 'Standard';
return 'Classic';
}
if (slugValue === 'pro') {

View File

@@ -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') {

View File

@@ -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,

View File

@@ -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,

View File

@@ -252,7 +252,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
<div className="space-y-6">
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="md:col-span-1">
<label htmlFor="first_name" className="block text-sm font-medium text-gray-700 mb-1">
<label htmlFor="first_name" className="block text-sm font-medium text-gray-700 dark:text-gray-100 mb-1">
{t('register.first_name')} {t('common:required')}
</label>
<div className="relative">
@@ -269,7 +269,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
clearErrors('first_name');
}
}}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm ${errors.first_name ? 'border-red-500' : 'border-gray-300'}`}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm dark:bg-gray-900 dark:text-gray-100 ${errors.first_name ? 'border-red-500' : 'border-gray-300 dark:border-gray-700'}`}
placeholder={t('register.first_name_placeholder')}
/>
</div>
@@ -277,7 +277,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
</div>
<div className="md:col-span-1">
<label htmlFor="last_name" className="block text-sm font-medium text-gray-700 mb-1">
<label htmlFor="last_name" className="block text-sm font-medium text-gray-700 dark:text-gray-100 mb-1">
{t('register.last_name')} {t('common:required')}
</label>
<div className="relative">
@@ -294,7 +294,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
clearErrors('last_name');
}
}}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm ${errors.last_name ? 'border-red-500' : 'border-gray-300'}`}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm dark:bg-gray-900 dark:text-gray-100 ${errors.last_name ? 'border-red-500' : 'border-gray-300 dark:border-gray-700'}`}
placeholder={t('register.last_name_placeholder')}
/>
</div>
@@ -302,7 +302,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
</div>
<div className="md:col-span-2">
<label htmlFor="email" className="block text-sm font-medium text-gray-700 mb-1">
<label htmlFor="email" className="block text-sm font-medium text-gray-700 dark:text-gray-100 mb-1">
{t('register.email')} {t('common:required')}
</label>
<div className="relative">
@@ -319,7 +319,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
clearErrors('email');
}
}}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm ${errors.email ? 'border-red-500' : 'border-gray-300'}`}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm dark:bg-gray-900 dark:text-gray-100 ${errors.email ? 'border-red-500' : 'border-gray-300 dark:border-gray-700'}`}
placeholder={t('register.email_placeholder')}
/>
</div>
@@ -327,7 +327,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
</div>
<div className="md:col-span-1">
<label htmlFor="password" className="block text-sm font-medium text-gray-700 mb-1">
<label htmlFor="password" className="block text-sm font-medium text-gray-700 dark:text-gray-100 mb-1">
{t('register.password')} {t('common:required')}
</label>
<div className="relative">
@@ -347,7 +347,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
clearErrors('password_confirmation');
}
}}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm ${errors.password ? 'border-red-500' : 'border-gray-300'}`}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm dark:bg-gray-900 dark:text-gray-100 ${errors.password ? 'border-red-500' : 'border-gray-300 dark:border-gray-700'}`}
placeholder={t('register.password_placeholder')}
/>
</div>
@@ -355,7 +355,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
</div>
<div className="md:col-span-1">
<label htmlFor="password_confirmation" className="block text-sm font-medium text-gray-700 mb-1">
<label htmlFor="password_confirmation" className="block text-sm font-medium text-gray-700 dark:text-gray-100 mb-1">
{t('register.password_confirmation')} {t('common:required')}
</label>
<div className="relative">
@@ -375,7 +375,7 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
clearErrors('password_confirmation');
}
}}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm ${errors.password_confirmation ? 'border-red-500' : 'border-gray-300'}`}
className={`block w-full pl-10 pr-3 py-3 border rounded-md shadow-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#FFB6C1] focus:border-[#FFB6C1] sm:text-sm dark:bg-gray-900 dark:text-gray-100 ${errors.password_confirmation ? 'border-red-500' : 'border-gray-300 dark:border-gray-700'}`}
placeholder={t('register.password_confirmation_placeholder')}
/>
</div>
@@ -399,14 +399,14 @@ export default function RegisterForm({ packageId, onSuccess, privacyHtml, locale
clearErrors('terms');
}
}}
className="h-4 w-4 text-[#FFB6C1] focus:ring-[#FFB6C1] border-gray-300 rounded"
className="h-4 w-4 text-[#FFB6C1] focus:ring-[#FFB6C1] border-gray-300 dark:border-gray-600 rounded"
/>
<label htmlFor="privacy_consent" className="ml-2 block text-sm text-gray-900">
<label htmlFor="privacy_consent" className="ml-2 block text-sm text-gray-900 dark:text-gray-100">
{t('register.privacy_consent')}{' '}
<button
type="button"
onClick={() => setPrivacyOpen(true)}
className="text-[#FFB6C1] hover:underline inline bg-transparent border-none cursor-pointer p-0 font-medium"
className="text-[#FFB6C1] hover:underline inline bg-transparent border-none cursor-pointer p-0 font-medium dark:text-pink-300"
>
{t('register.privacy_policy_link')}
</button>.

View File

@@ -664,7 +664,7 @@ const resolveServiceTierLabel = (slug: string | null | undefined): string => {
}
if (slug === 'standard') {
return 'Standard';
return 'Classic';
}
if (slug === 'pro') {
@@ -784,7 +784,7 @@ function PackageCard({
: null;
const displayFeatures = buildDisplayFeatures(pkg, variant);
const visibleFeatures = compact ? displayFeatures.slice(0, 3) : displayFeatures.slice(0, 5);
const visibleFeatures = displayFeatures.slice(0, 5);
const metrics = resolvePackageMetrics(pkg, variant, t, tCommon);
const metricList = (
@@ -1200,18 +1200,6 @@ const PackageDetailGrid: React.FC<PackageDetailGridProps> = ({
{t('packages.hero_description')}
</p>
</motion.div>
<motion.div className="flex justify-center md:justify-end" variants={revealUp}>
<Link
href={localizedPath(locale === 'en' ? '/gift-card' : '/gutschein')}
className="group inline-flex items-center gap-3 rounded-full border border-white/50 bg-white/70 px-4 py-2 text-xs font-semibold uppercase tracking-[0.2em] text-gray-700 shadow-sm backdrop-blur transition hover:bg-white/90 dark:border-gray-800 dark:bg-gray-900/70 dark:text-gray-100"
>
<span className="flex h-8 w-8 items-center justify-center rounded-full bg-pink-500/15 text-pink-600 dark:text-pink-300">
<Gift className="h-4 w-4" aria-hidden />
</span>
<span>{t('packages.gift_cta')}</span>
<ArrowRight className="h-3.5 w-3.5 text-gray-400 transition group-hover:translate-x-1" aria-hidden />
</Link>
</motion.div>
</motion.div>
</section>
@@ -1238,26 +1226,24 @@ const PackageDetailGrid: React.FC<PackageDetailGridProps> = ({
<TabsContent value="endcustomer" className="space-y-8 pt-8">
<div className="md:hidden">
<div className="relative">
<div className="pointer-events-none absolute inset-y-0 left-0 w-6 bg-gradient-to-r from-white to-transparent dark:from-gray-950" />
<div className="pointer-events-none absolute inset-y-0 right-0 w-6 bg-gradient-to-l from-white to-transparent dark:from-gray-950" />
<div className="pointer-events-none absolute inset-y-0 left-0 w-4 bg-gradient-to-r from-white/70 to-transparent dark:from-gray-950/70" />
<div className="pointer-events-none absolute inset-y-0 right-0 w-4 bg-gradient-to-l from-white/70 to-transparent dark:from-gray-950/70" />
<div
ref={mobileEndcustomerRef}
className="flex snap-x snap-mandatory gap-4 overflow-x-auto pb-6"
style={{ scrollPaddingLeft: '16px', scrollBehavior: 'smooth' }}
style={{ scrollPaddingLeft: '16px', scrollPaddingRight: '16px', scrollBehavior: 'smooth' }}
>
{orderedEndcustomerPackages.map((pkg) => (
<div key={pkg.id} className="snap-start basis-[72vw] shrink-0 sm:basis-[60vw]">
<motion.div variants={revealUp} initial="hidden" whileInView="visible" viewport={viewportOnce}>
<PackageCard
pkg={pkg}
variant="endcustomer"
highlight={pkg.id === highlightEndcustomerId}
onSelect={(selected) => handleCardClick(selected, 'endcustomer')}
onCtaClick={handleCtaClick}
className="h-full"
compact
/>
</motion.div>
<div key={pkg.id} className="snap-center basis-[64vw] shrink-0 sm:basis-[56vw]">
<PackageCard
pkg={pkg}
variant="endcustomer"
highlight={pkg.id === highlightEndcustomerId}
onSelect={(selected) => handleCardClick(selected, 'endcustomer')}
onCtaClick={handleCtaClick}
className="h-full"
compact
/>
</div>
))}
</div>
@@ -1319,26 +1305,24 @@ const PackageDetailGrid: React.FC<PackageDetailGridProps> = ({
</motion.div>
<div className="md:hidden">
<div className="relative">
<div className="pointer-events-none absolute inset-y-0 left-0 w-6 bg-gradient-to-r from-white to-transparent dark:from-gray-950" />
<div className="pointer-events-none absolute inset-y-0 right-0 w-6 bg-gradient-to-l from-white to-transparent dark:from-gray-950" />
<div className="pointer-events-none absolute inset-y-0 left-0 w-4 bg-gradient-to-r from-white/70 to-transparent dark:from-gray-950/70" />
<div className="pointer-events-none absolute inset-y-0 right-0 w-4 bg-gradient-to-l from-white/70 to-transparent dark:from-gray-950/70" />
<div
ref={mobileResellerRef}
className="flex snap-x snap-mandatory gap-4 overflow-x-auto pb-6"
style={{ scrollPaddingLeft: '16px', scrollBehavior: 'smooth' }}
style={{ scrollPaddingLeft: '16px', scrollPaddingRight: '16px', scrollBehavior: 'smooth' }}
>
{orderedResellerPackages.map((pkg) => (
<div key={pkg.id} className="snap-start basis-[72vw] shrink-0 sm:basis-[60vw]">
<motion.div variants={revealUp} initial="hidden" whileInView="visible" viewport={viewportOnce}>
<PackageCard
pkg={pkg}
variant="reseller"
highlight={pkg.id === highlightResellerId}
onSelect={(selected) => handleCardClick(selected, 'reseller')}
onCtaClick={handleCtaClick}
className="h-full"
compact
/>
</motion.div>
<div key={pkg.id} className="snap-center basis-[64vw] shrink-0 sm:basis-[56vw]">
<PackageCard
pkg={pkg}
variant="reseller"
highlight={pkg.id === highlightResellerId}
onSelect={(selected) => handleCardClick(selected, 'reseller')}
onCtaClick={handleCtaClick}
className="h-full"
compact
/>
</div>
))}
</div>
@@ -1386,6 +1370,19 @@ const PackageDetailGrid: React.FC<PackageDetailGridProps> = ({
<PackageComparison packages={orderedResellerPackages} variant="reseller" serviceTierNames={serviceTierNames} />
</motion.div>
</TabsContent>
<div className="flex justify-center pt-2 md:pt-6">
<Link
href={localizedPath(locale === 'en' ? '/gift-card' : '/gutschein')}
className="group inline-flex items-center gap-3 rounded-full border border-gray-200 bg-white px-4 py-2 text-xs font-semibold uppercase tracking-[0.2em] text-gray-700 shadow-sm transition hover:bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-100 dark:hover:bg-gray-900/80"
>
<span className="flex h-8 w-8 items-center justify-center rounded-full bg-pink-500/15 text-pink-600 dark:text-pink-300">
<Gift className="h-4 w-4" aria-hidden />
</span>
<span>{t('packages.gift_cta')}</span>
<ArrowRight className="h-3.5 w-3.5 text-gray-400 transition group-hover:translate-x-1" aria-hidden />
</Link>
</div>
</Tabs>
</div>
</section>

View File

@@ -72,7 +72,7 @@ describe('Home', () => {
<Home
packages={[
{ id: 1, name: 'Starter', description: 'Desc', price: 29 },
{ id: 2, name: 'Standard', description: 'Desc', price: 59 },
{ id: 2, name: 'Classic', description: 'Desc', price: 59 },
]}
/>
);

View File

@@ -104,7 +104,7 @@ describe('Packages', () => {
},
{
id: 2,
name: 'Standard',
name: 'Classic',
slug: 'standard',
description: 'Desc',
description_breakdown: [],

View File

@@ -44,12 +44,12 @@
"packages": {
"title": "Unsere Packages",
"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.",
"cta_explore": "Pakete entdecken",
"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",
@@ -100,7 +100,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": "Fotospiel-Wasserzeichen entfernen",
"feature_custom_tasks": "Benutzerdefinierte Tasks",
@@ -164,7 +164,7 @@
"standard": [
{
"name": "Lena & Jonas",
"text": "Standard fühlt sich wie das Allround-Paket an: genug Gäste und Fotos plus ein Jahr Galerie."
"text": "Classic fühlt sich wie das Allround-Paket an: genug Gäste und Fotos plus ein Jahr Galerie."
},
{
"name": "Marco P.",
@@ -206,7 +206,7 @@
"m-medium-reseller": [
{
"name": "Eventbüro Lenz",
"text": "15 Events decken unsere Saison meistens ab. Standard-Level ist für viele Kunden passend."
"text": "15 Events decken unsere Saison meistens ab. Classic-Level ist für viele Kunden passend."
},
{
"name": "Jasmin & Co.",
@@ -256,7 +256,7 @@
},
{
"name": "Agentur Süd",
"text": "Standard-Level ist ein guter Mittelweg für verschiedene Event-Typen."
"text": "Classic-Level ist ein guter Mittelweg für verschiedene Event-Typen."
}
]
}

View File

@@ -3,11 +3,11 @@
return [
'packages' => [
'title' => 'Unsere Packages Wählen Sie Ihr Event-Paket',
'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.',
'cta_explore' => 'Packages entdecken',
'tab_endcustomer' => 'Einzel-Events',
'tab_reseller' => 'Partner / Agenturen',
'tab_reseller' => 'mehrere Events',
'section_endcustomer' => 'Packages für Endkunden (Einmalkauf pro Event)',
'section_reseller' => 'Packages für Partner / Agenturen (Event-Kontingent)',
'free' => 'Kostenlos',
@@ -40,7 +40,7 @@ return [
'feature_watermark_custom' => 'Eigenes Wasserzeichen',
'feature_branding' => 'Branding',
'feature_support' => 'Support',
'feature_basic_uploads' => 'Grundlegende Uploads',
'feature_basic_uploads' => 'Download aller Fotos',
'feature_unlimited_sharing' => 'Unbegrenztes Teilen',
'feature_no_watermark' => 'Fotospiel-Wasserzeichen entfernen',
'feature_custom_tasks' => 'Benutzerdefinierte Tasks',
@@ -85,9 +85,9 @@ return [
'family' => 'Familienfeiern',
],
'blog' => 'Blog',
'packages' => 'Packages',
'packages' => 'Pakete',
'contact' => 'Kontakt',
'discover_packages' => 'Packages entdecken',
'discover_packages' => 'Pakete entdecken',
'language' => 'Sprache',
'open_menu' => 'Menü öffnen',
'close_menu' => 'Menü schließen',

View File

@@ -49,7 +49,7 @@
"cta_explore": "Discover 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",
@@ -165,7 +165,7 @@
"standard": [
{
"name": "Lena & Jonas",
"text": "Standard feels like the all-round package: plenty of guests and photos plus a full year of gallery."
"text": "Classic feels like the all-round package: plenty of guests and photos plus a full year of gallery."
},
{
"name": "Marco P.",
@@ -207,7 +207,7 @@
"m-medium-reseller": [
{
"name": "Event Bureau Lenz",
"text": "Fifteen events usually cover our season. Standard level fits most clients."
"text": "Fifteen events usually cover our season. Classic level fits most clients."
},
{
"name": "Jasmin & Co.",
@@ -257,7 +257,7 @@
},
{
"name": "Agency South",
"text": "Standard level is a solid middle ground for varied event types."
"text": "Classic level is a solid middle ground for varied event types."
}
]
}

View File

@@ -7,7 +7,7 @@ return [
'hero_description' => 'From free entry to premium features: Tailor your event package to your needs. Simple, secure and scalable.',
'cta_explore' => 'Discover Packages',
'tab_endcustomer' => 'End Customers',
'tab_reseller' => 'Partner / Agencies',
'tab_reseller' => 'Bundles',
'section_endcustomer' => 'Packages for End Customers (One-time purchase per Event)',
'section_reseller' => 'Packages for Partner / Agencies (Event bundle)',
'free' => 'Free',