Files
Wabenhain/src/i18n/dictionaries/de.ts
T
Nick SzaunigandClaude Opus 5.5 a09057d960 feat(admin): Listen mit Status-Badges, Leerzustaenden und klaren Aktionen
Neue gemeinsame Bausteine in components/admin-list.tsx: Seitenkopf mit
Hauptaktion, Suchleiste, Status-Badge (gleiche Form wie der Bestellstatus,
wartende Eintraege mit pulsierendem Punkt), Leerzustand mit Wabe und
naechstem Schritt sowie Zeilenaktionen mit einheitlichem Unterstrich-
Hover (Loeschen rot, Sperren/Zurueckziehen gedaempft).

Umgestellt: Bewertungen (SVG-Sterne statt Unicode), Benutzer, Gutscheine
(neu: Status "Abgelaufen"), Versand, Ernten, Chargen (Anlegeformulare auf
admin-form), Firmenanfragen (Status als Badge, beschriftete Auswahl) und
Audit-Log. Zahlen und Daten in Tabellen mit tabular-nums.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-25 20:51:50 +02:00

1762 lines
91 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { Dictionary } from "../dictionary-type";
export const de: Dictionary = {
common: {
siteDescription:
"Entdecke hochwertigen Honig aus eigener Imkerei in Altenmünster. Kleine Ernten, klare Herkunft und echtes Imkerhandwerk.",
categories: {
HONIG: "Honig",
KERZEN: "Bienenwachskerzen",
PROPOLIS: "Propolis",
},
turnstile: {
loadError: "Die Sicherheitsprüfung konnte nicht geladen werden.",
retry: "Erneut versuchen",
},
},
nav: {
shop: "Shop",
harvests: "Unsere Ernten",
origin: "Herkunft",
apiary: "Imkerei",
business: "Für Unternehmen",
knowledge: "Wissen",
contact: "Kontakt",
account: "Mein Konto",
discoverHoney: "Honig entdecken",
searchPlaceholder: "Honig suchen…",
openSearch: "Suche öffnen",
openMenu: "Menü öffnen",
closeMenu: "Menü schließen",
openCart: (count) => (count > 0 ? `Warenkorb öffnen, ${count} Artikel` : "Warenkorb öffnen"),
skipToContent: "Zum Inhalt springen",
},
footer: {
columnWabenhain: "Wabenhain",
columnShopping: "Einkaufen",
columnLegal: "Rechtliches",
aboutUs: "Über uns",
businessCustomers: "Geschäftskunden",
trackOrder: "Bestellung verfolgen",
tagline: "Honig aus den Westlichen Wäldern.",
bottomLine: "Geerntet · abgefüllt · versendet aus eigener Imkerei in Altenmünster",
socialAriaLabel: (platform) => `Wabenhain bei ${platform}`,
},
legalTitles: {
impressum: "Impressum",
datenschutz: "Datenschutz",
agb: "AGB",
widerruf: "Widerrufsbelehrung",
versandZahlung: "Versand und Zahlung",
cookieRichtlinie: "Cookie-Richtlinie",
},
cart: {
title: "Warenkorb",
close: "Schließen",
empty: "Dein Warenkorb ist noch leer.",
remove: "entfernen",
subtotal: "Zwischensumme",
checkout: "Zur Kasse",
viewCart: "Warenkorb ansehen",
},
orderStatusBadge: {
// Nicht "Neu": dieser Status bedeutet, dass die Zahlung noch nicht
// bestaetigt ist — bei einem abgebrochenen Checkout bleibt sie es auch.
NEU: "Zahlung ausstehend",
BEZAHLT: "Bezahlt",
IN_VORBEREITUNG: "In Vorbereitung",
VERSANDBEREIT: "Versandbereit",
VERSENDET: "Versendet",
ABHOLBEREIT: "Abholbereit",
ABGEHOLT: "Abgeholt",
STORNIERT: "Storniert",
},
orderStatusTimeline: {
ordered: "Bestellt",
paid: "Bezahlt",
preparing: "In Vorbereitung",
readyToShip: "Versandbereit",
shipped: "Versendet",
readyForPickup: "Abholbereit",
pickedUp: "Abgeholt",
cancelled: "Diese Bestellung wurde storniert.",
ariaLabel: "Bestellstatus",
},
ordersPage: {
backToAccount: "Zurück zur Konto-Übersicht",
title: "Meine Bestellungen",
emptyTitle: "Du hast noch keine Bestellungen aufgegeben.",
emptyDescription: "Sobald du bestellst, findest du hier Status, Rechnungen und die Möglichkeit, schnell erneut zu bestellen.",
shippedOn: (date) => `Versendet am ${date}`,
shippingPending: "Versand ausstehend",
pickedUpOn: (date) => `Abgeholt am ${date}`,
pickupPending: "Abholung ausstehend",
readySince: (date) => `Abholbereit seit ${date}`,
giftMessagePrefix: "Deine Geschenknachricht:",
viewInvoice: "Rechnung ansehen",
requestReturn: "Rücksendung anfragen",
reorder: "Erneut bestellen",
returnStatusLabels: {
ANGEFRAGT: "Rücksendung angefragt",
ANGENOMMEN: "Rücksendung angenommen",
ABGELEHNT: "Rücksendung abgelehnt",
ERSTATTET: "Erstattet",
},
},
herkunftPage: {
eyebrow: "Herkunft",
title: "Eine Landschaft prägt ihren Honig.",
subtitle: "Die Region Altenmünster und die Westlichen Wälder im Landkreis Augsburg sind der Ursprung jeder Wabenhain-Ernte.",
aspects: [
{ title: "Landschaft", text: "Wälder, Wiesen und Streuobst prägen das Landschaftsbild rund um Altenmünster." },
{ title: "Vegetation", text: "Von Frühblühern über Robinie bis zur Sommerlinde: Die Trachtpflanzen wechseln über das Jahr." },
{ title: "Jahreszeiten", text: "Jede Saison bringt ein eigenes Nektarangebot und damit einen eigenen Honigcharakter." },
{ title: "Bienenstände", text: "Unsere Völker stehen an ausgewählten, ruhigen Standorten in der Region." },
],
privacyNote:
"Aus Rücksicht auf unsere Bienenvölker zeigen wir keine exakten Standorte, sondern nur den ungefähren Bereich unserer Bienenstände.",
},
imkereiPage: {
eyebrow: "Über Wabenhain",
title: "Wabenhain entstand aus der Begeisterung für Bienen, Natur und echtes Handwerk.",
paragraphs: [
"Was als kleine Leidenschaft für die Bienenhaltung begann, ist heute eine eigenständige Imkerei mit klarer Haltung: Qualität vor Masse, Herkunft vor Anonymität.",
"Wir arbeiten mit unseren eigenen Völkern in und um Altenmünster, begleiten jede Saison aufmerksam und greifen nur so weit ein, wie es für gesunde Bienenvölker und eine gute Ernte notwendig ist.",
"Kleine Chargen sind für uns kein Kompromiss, sondern bewusste Entscheidung: Nur so lässt sich jede Ernte lückenlos dokumentieren, vom Bienenstand bis ins Glas.",
"Dahinter steht die Überzeugung, dass Honig mehr ist als ein Süßungsmittel: Er ist ein Abbild der Landschaft, in der er entsteht.",
],
imageLabel: "Der Imker bei der Arbeit",
},
unternehmenPage: {
eyebrow: "Für Unternehmen",
title: "Regional schenken. Nachhaltig Eindruck hinterlassen.",
subtitle: "Für Unternehmen, Kanzleien, Praxen, Hotels, Agenturen und Handwerksbetriebe.",
packages: [
{ key: "KLASSIK", title: "Klassik", text: "Honigglas + Firmenbanderole" },
{ key: "GESCHENK", title: "Geschenk", text: "Honigglas + Karton + Grußkarte" },
{ key: "INDIVIDUELL", title: "Individuell", text: "Komplett individuelles Design" },
],
inquiryHeading: "Anfrage senden",
},
businessInquiryForm: {
companyLabel: "Unternehmen",
contactPersonLabel: "Ansprechpartner",
emailLabel: "E-Mail",
phoneOptionalLabel: "Telefonnummer (optional)",
quantityLabel: "Gewünschte Menge (Stück)",
deliveryDateLabel: "Gewünschter Liefertermin",
packageLabel: "Paket",
messageLabel: "Nachricht",
submitting: "Wird gesendet…",
submit: "Firmengeschenke anfragen",
successMessage: "Danke für deine Anfrage! Wir melden uns in Kürze bei dir.",
errorMessage: "Da ist etwas schiefgelaufen. Bitte versuche es erneut.",
},
legalPage: {
reviewNotice: "",
},
notFoundPage: {
eyebrow: "404",
title: "Diese Seite gibt es nicht, zumindest nicht mehr.",
text: "Der Link ist vielleicht veraltet, oder die Seite wurde verschoben. Schau dich im Shop um oder geh zurück zur Startseite.",
backToShop: "Zum Shop",
backToHome: "Zur Startseite",
},
siteErrorPage: {
eyebrow: "Fehler",
title: "Da ist etwas schiefgelaufen.",
text: "Das war ein technischer Fehler auf unserer Seite, nicht deine Schuld. Versuch es noch einmal, oder komm später wieder vorbei.",
retry: "Erneut versuchen",
backToHome: "Zur Startseite",
},
cookieConsent: {
dialogLabel: "Cookie-Einstellungen",
bannerTextBeforeLink:
"Wir verwenden nur technisch notwendige Cookies (z.B. für den Login im Kundenkonto). Mit deiner Zustimmung nutzen wir zusätzlich Cookies zur Reichweitenmessung. Details findest du in unserer ",
policyLinkLabel: "Cookie-Richtlinie",
bannerTextAfterLink: ".",
essentialOnly: "Nur notwendige",
acceptAll: "Alle akzeptieren",
changeSettings: "Cookie-Einstellungen ändern",
},
impressumPage: {
title: "Impressum",
contactHeading: "Kontakt",
phoneLabel: "Telefon",
emailLabel: "E-Mail",
sections: [
{
heading: "Angaben gemäß § 5 TMG",
paragraphs: [
"Inhaber: Nick Rosenlöcher",
"Rechtsform: Einzelunternehmen",
],
},
{
heading: "Umsatzsteuer-ID",
paragraphs: [
"Umsatzsteuer-Identifikationsnummer gemäß § 27a Umsatzsteuergesetz: DE366479158",
],
},
{
heading: "Redaktionell verantwortlich",
paragraphs: [
"Verantwortlich für den redaktionellen Inhalt gemäß § 18 Abs. 2 MStV (u.a. die Beiträge im Bereich \"Honigwissen\"): Nick Rosenlöcher.",
],
},
{
heading: "Haftung für Inhalte",
paragraphs: [
"Als Diensteanbieter sind wir gemäß § 7 Abs. 1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden entsprechender Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.",
],
},
{
heading: "Haftung für Links",
paragraphs: [
"Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zu diesem Zeitpunkt nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.",
],
},
{
heading: "Urheberrecht",
paragraphs: [
"Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechts bedürfen der schriftlichen Zustimmung des jeweiligen Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.",
],
},
{
heading: "Streitschlichtung",
paragraphs: [
// Der frühere Verweis auf die EU-Plattform zur Online-Streitbeilegung
// (ec.europa.eu/consumers/odr) ist entfallen: die zugrunde liegende
// ODR-Verordnung wurde aufgehoben und die Plattform eingestellt. Ein
// Link auf einen abgeschalteten Dienst ist schlechter als keiner. Die
// Erklärung nach § 36 VSBG bleibt dagegen Pflicht und steht hier.
"Wir sind nicht verpflichtet und nicht bereit, an einem Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen (§ 36 Abs. 1 Nr. 1 VSBG).",
],
},
],
},
datenschutzPage: {
title: "Datenschutzerklärung",
sections: [
{
heading: "1. Verantwortlicher",
paragraphs: [
"Nach unserer Einschätzung sind wir aufgrund der Größe und Art unseres Betriebs nicht gemäß § 38 BDSG zur Benennung einer/eines Datenschutzbeauftragten verpflichtet. Bei Fragen zum Datenschutz wenden Sie sich bitte direkt an die im Impressum genannte Kontaktadresse.",
],
},
{
heading: "2. Hosting",
paragraphs: [
"Diese Website wird auf eigener, selbst betriebener Server-Infrastruktur gehostet, nicht bei einem externen Hosting-Anbieter. Es besteht daher kein Auftragsverarbeitungsvertrag mit einem externen Hosting-Dienstleister gemäß Art. 28 DSGVO; die Verarbeitung der Server-Logfiles (siehe Punkt 3) erfolgt ausschließlich durch uns selbst als Verantwortlichen.",
],
},
{
heading: "3. Server-Logfiles beim Besuch der Website",
paragraphs: [
"Beim Aufruf unserer Website erhebt unser Hosting-Anbieter automatisch technische Zugriffsdaten (z.B. IP-Adresse, Datum und Uhrzeit des Zugriffs, aufgerufene Seite, Browsertyp, Referrer-URL) in sogenannten Server-Logfiles. Diese Verarbeitung ist zur Bereitstellung der Website technisch erforderlich (Art. 6 Abs. 1 lit. f DSGVO) und wird nach kurzer Zeit automatisch gelöscht.",
],
},
{
heading: "4. Bestellung und Vertragsabwicklung",
paragraphs: [
"Für den Versand übermitteln wir deinen Namen und die Lieferanschrift an unseren Versanddienstleister DHL (DHL Paket GmbH, Bonn). Wählst du die Lieferung an eine Packstation oder Filiale, kommt die von dir gewählte Standortnummer hinzu. Suchst du im Bestellvorgang nach einer Packstation, wird dein eingegebener Ort beziehungsweise deine Postleitzahl zur Abfrage an DHL weitergegeben. Rufst du den Stand deiner Sendung unter „Bestellung verfolgen“ ab, fragen wir ihn mit Sendungsnummer und Postleitzahl der Lieferanschrift bei DHL ab und zeigen ihn dir direkt bei uns an. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO.",
"Bei einer Bestellung erheben wir die für die Vertrags-, Zahlungs- und Versandabwicklung notwendigen Daten (Name, Adresse, E-Mail, ggf. Telefonnummer sowie die bestellten Artikel). Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung).",
"Zahlungen werden über unseren Zahlungsdienstleister Stripe Payments Europe, Ltd. abgewickelt. Dabei werden die für die Zahlungsabwicklung notwendigen Daten an Stripe übermittelt. Es gelten zusätzlich die Datenschutzhinweise von Stripe (stripe.com/de/privacy). Soweit dabei Daten an mit Stripe verbundene Unternehmen außerhalb der EU/des EWR (insbesondere Stripe, Inc. in den USA) übermittelt werden, erfolgt dies auf Grundlage von EU-Standardvertragsklauseln gemäß Art. 46 DSGVO.",
"Bestell- und Rechnungsdaten werden aufgrund handels- und steuerrechtlicher Aufbewahrungspflichten (§ 257 HGB, § 147 AO) für die gesetzlich vorgeschriebene Dauer gespeichert.",
],
},
{
heading: "5. Kundenkonto",
paragraphs: [
"Alternativ kannst du dich mit einem Microsoft-Konto anmelden (Microsoft Entra ID). Dabei wirst du zu Microsoft weitergeleitet und meldest dich dort an; wir selbst erhalten kein Passwort, sondern nur deine E-Mail-Adresse und deinen Namen, um dein Kundenkonto zuzuordnen. Welche Daten Microsoft bei der Anmeldung selbst verarbeitet, richtet sich nach den Datenschutzhinweisen von Microsoft. Anbieter ist die Microsoft Ireland Operations Limited; eine Übermittlung an die Microsoft Corporation in die USA kann stattfinden. Microsoft ist unter dem EU-US Data Privacy Framework zertifiziert. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO.",
"Legst du ein Kundenkonto an, speichern wir die von dir angegebenen Daten (Name, E-Mail, Passwort verschlüsselt als Hash) sowie optional hinterlegte Lieferadressen, um dir Bestellhistorie, Rechnungseinsicht und eine schnellere Kasse zu ermöglichen. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. Du kannst dein Konto und die zugehörigen Daten jederzeit über eine formlose Anfrage an uns löschen lassen.",
"Zur Anmeldung wird ein technisch notwendiges Cookie gesetzt, siehe unsere Cookie-Richtlinie.",
],
},
{
heading: "6. Newsletter (Erntepost)",
paragraphs: [
"Meldest du dich zu unserer Erntepost an, verwenden wir deine E-Mail-Adresse ausschließlich zum Versand von Informationen über neue Ernten. Rechtsgrundlage ist deine Einwilligung (Art. 6 Abs. 1 lit. a DSGVO). Eine Abmeldung ist jederzeit über den Link in jeder E-Mail oder im Kundenkonto möglich.",
],
},
{
heading: "7. Kontakt- und Firmenkundenformular",
paragraphs: [
"Nimmst du über ein Formular Kontakt zu uns auf (z.B. Firmenkunden-Anfrage), verarbeiten wir die von dir mitgeteilten Daten zur Bearbeitung deiner Anfrage. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b bzw. f DSGVO.",
],
},
{
heading: "8. Schutz der Formulare vor Missbrauch (Cloudflare Turnstile)",
paragraphs: [
"Um unsere Formulare vor automatisierten Massenzugriffen zu schützen, setzen wir Cloudflare Turnstile ein, einen Dienst der Cloudflare, Inc., 101 Townsend Street, San Francisco, CA 94107, USA. Betroffen sind Anmeldung, Registrierung, Passwort-Reset, Zwei-Faktor-Bestätigung, Bestellabschluss, Newsletter-Anmeldung, Firmenanfrage und die Benachrichtigung bei Verfügbarkeit.",
"Rufst du eine Seite mit einem dieser Formulare auf, lädt dein Browser ein Skript von challenges.cloudflare.com. Dabei werden deine IP-Adresse sowie technische Merkmale deines Browsers und Endgeräts an Cloudflare übermittelt und dort ausgewertet, um zu unterscheiden, ob die Eingabe von einem Menschen oder einem Programm stammt. Nach Angaben des Anbieters setzt Turnstile dafür keine Cookies zu Werbezwecken und erstellt kein seitenübergreifendes Nutzerprofil.",
"Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Unser berechtigtes Interesse besteht darin, Anmeldeversuche mit gestohlenen Zugangsdaten, Spam über unsere Formulare und missbräuchliche Bestellungen abzuwehren.",
"Eine Übermittlung in die USA findet statt. Cloudflare ist unter dem EU-US Data Privacy Framework zertifiziert; ergänzend bestehen Standardvertragsklauseln.",
],
},
{
heading: "9. Google-Rezensionen",
paragraphs: [
"Auf unserer Startseite zeigen wir Bewertungen von unserem Google-Unternehmensprofil an. Die Rezensionstexte werden dafür serverseitig über die Google Places API abgerufen; dein Browser baut dabei keine eigene Verbindung zu Google auf. Anbieter: Google Ireland Limited, wobei eine Übermittlung an die Google LLC (USA) nicht ausgeschlossen werden kann. Es gelten die Datenschutzhinweise von Google (policies.google.com/privacy).",
],
},
{
heading: "10. Cookies",
paragraphs: ["Details zu den auf dieser Website eingesetzten Cookies findest du in unserer Cookie-Richtlinie."],
},
{
heading: "11. Deine Rechte",
paragraphs: [
"Du hast das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16 DSGVO), Löschung (Art. 17 DSGVO), Einschränkung der Verarbeitung (Art. 18 DSGVO), Datenübertragbarkeit (Art. 20 DSGVO) sowie Widerspruch gegen die Verarbeitung (Art. 21 DSGVO) deiner personenbezogenen Daten.",
"Zudem steht dir ein Beschwerderecht bei einer Datenschutz-Aufsichtsbehörde zu, z.B. dem Bayerischen Landesamt für Datenschutzaufsicht.",
],
},
],
},
agbPage: {
title: "Allgemeine Geschäftsbedingungen",
sections: [
{
heading: "1. Geltungsbereich",
paragraphs: [
"Diese Allgemeinen Geschäftsbedingungen (AGB) gelten für alle Bestellungen über wabenhain.com zwischen Wabenhain und ihren Kund:innen, sowohl Verbraucher:innen im Sinne des § 13 BGB als auch Unternehmer:innen im Sinne des § 14 BGB.",
],
},
{
heading: "2. Vertragsschluss",
paragraphs: [
"Die Darstellung der Produkte im Shop stellt kein bindendes Angebot dar, sondern eine unverbindliche Aufforderung, eine Bestellung aufzugeben. Mit Abschluss der Bestellung gibst du ein verbindliches Angebot zum Kauf ab, das wir durch eine Bestätigung per E-Mail oder durch Lieferung der Ware annehmen.",
],
},
{
heading: "3. Preise und Versandkosten",
paragraphs: ["Alle Preise verstehen sich inklusive der gesetzlichen Umsatzsteuer. Versandkosten werden im Checkout transparent ausgewiesen, siehe auch unsere Seite \"Versand und Zahlung\"."],
},
{
heading: "4. Zahlungsarten",
paragraphs: [
"Wir bieten PayPal, Kreditkarte, Apple Pay und Google Pay über unseren Zahlungsdienstleister Stripe an. Eine Zahlung per Überweisung ist auf Anfrage möglich. Details siehe unsere Seite \"Versand und Zahlung\" sowie unsere Datenschutzerklärung zu Stripe.",
"Die Kaufpreiszahlung ist grundsätzlich sofort mit Bestellung fällig (Vorkasse über den gewählten Zahlungsdienst), sofern nichts anderes vereinbart wurde.",
],
},
{
heading: "5. Lieferung und Abholung",
paragraphs: ["Wir liefern innerhalb Deutschlands. Alternativ kann die Ware nach Absprache direkt bei uns in Altenmünster abgeholt werden."],
},
{
heading: "6. Widerrufsrecht",
paragraphs: [
"Verbraucher:innen steht grundsätzlich ein gesetzliches Widerrufsrecht zu. Einzelheiten, insbesondere zu Ausnahmen bei schnell verderblichen Waren wie Honig, entnimmst du unserer separaten Widerrufsbelehrung.",
],
},
{
heading: "7. Gewährleistung",
paragraphs: [
"Es gelten die gesetzlichen Gewährleistungsrechte (§§ 434 ff. BGB). Bei Verbraucher:innen beträgt die Verjährungsfrist für Mängelansprüche zwei Jahre ab Ablieferung der Ware.",
"Bei Lebensmitteln wie Honig weist das aufgedruckte Mindesthaltbarkeitsdatum (MHD) darauf hin, bis wann das Produkt bei sachgerechter Lagerung mindestens seine spezifischen Eigenschaften behält. Es handelt sich nicht um ein Verfallsdatum und begründet für sich genommen keinen Mangel.",
],
},
{
heading: "8. Eigentumsvorbehalt",
paragraphs: ["Die gelieferte Ware bleibt bis zur vollständigen Bezahlung unser Eigentum."],
},
{
heading: "9. Streitschlichtung",
paragraphs: [
// Siehe gleichlautende Stelle im Impressum: der Verweis auf die
// eingestellte EU-Plattform ist entfallen, die Erklärung nach
// § 36 VSBG bleibt.
"Wir sind nicht verpflichtet und nicht bereit, an einem Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen (§ 36 Abs. 1 Nr. 1 VSBG).",
],
},
{
heading: "10. Schlussbestimmungen",
paragraphs: [
"Es gilt das Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts. Bei Verbraucher:innen gilt dies nur, soweit hierdurch der durch zwingende Bestimmungen des Rechts des gewöhnlichen Aufenthaltslandes gewährte Schutz nicht entzogen wird.",
"Sollte eine Bestimmung dieser AGB unwirksam sein oder werden, bleibt die Wirksamkeit der übrigen Bestimmungen hiervon unberührt.",
],
},
],
},
widerrufPage: {
title: "Widerrufsbelehrung",
sections: [
{
heading: "Widerrufsrecht",
paragraphs: [
"Du hast das Recht, binnen vierzehn Tagen ohne Angabe von Gründen diesen Vertrag zu widerrufen. Die Widerrufsfrist beträgt vierzehn Tage ab dem Tag, an dem du oder ein von dir benannter Dritter die Waren in Besitz genommen hat.",
"Um dein Widerrufsrecht auszuüben, musst du uns mittels einer eindeutigen Erklärung (z.B. per E-Mail) über deinen Entschluss, diesen Vertrag zu widerrufen, informieren.",
],
},
{
heading: "Folgen des Widerrufs",
paragraphs: [
"Wenn du diesen Vertrag widerrufst, erstatten wir dir alle Zahlungen, die wir von dir erhalten haben, unverzüglich und spätestens binnen vierzehn Tagen ab dem Tag zurück, an dem die Mitteilung über deinen Widerruf bei uns eingegangen ist.",
// Wortlaut aus der amtlichen Muster-Widerrufsbelehrung (Anlage 1 zu
// Art. 246a § 1 Abs. 2 EGBGB), bewusst unveraendert uebernommen.
// Ohne diese Information traegt nach § 357 Abs. 6 BGB der Verkaeufer
// die Ruecksendekosten — die Belehrung selbst ist die Voraussetzung
// dafuer, sie dem Kaeufer auferlegen zu duerfen. Die Ausnahme fuer
// mangelhafte Ware steht bewusst NICHT hier: das ist Gewaehrleistung
// (§ 439 BGB) und damit ein anderes Recht als der Widerruf; eine
// Abweichung vom Muster kostet dessen Gesetzlichkeitsfiktion. Sie
// steht stattdessen unter "Versand und Zahlung" → "Rücksendung".
"Du trägst die unmittelbaren Kosten der Rücksendung der Waren.",
],
},
{
heading: "Ausschluss des Widerrufsrechts",
paragraphs: [
"Das Widerrufsrecht besteht nicht bei Lieferung von Waren, die schnell verderben können oder deren Verfallsdatum schnell überschritten würde, sowie bei versiegelten Waren, die aus Gründen des Gesundheitsschutzes oder der Hygiene nicht zur Rückgabe geeignet sind, wenn ihre Versiegelung nach der Lieferung entfernt wurde.",
],
},
],
},
versandZahlungPage: {
title: "Versand und Zahlung",
shippingHeading: "Versand",
shippingIntro:
"Wir versenden innerhalb Deutschlands. Die Versandkosten richten sich nach der Gesamtmenge aller Artikel deiner Bestellung (mehrere Produkte werden zusammengezählt) und werden dir vor Abschluss der Bestellung transparent angezeigt:",
tierRange: (min, max, price) => `${min}–${max} Gläser/Artikel: ${price}`,
tierMinimum: (min, price) => `Ab ${min} Gläsern/Artikeln: ${price}`,
pickupNote: "Alternativ kannst du deine Bestellung nach Absprache direkt bei uns in Altenmünster abholen. Dabei fallen keine Versandkosten an.",
regionHeading: "Liefergebiet",
regionTextDe: "Versand ist nur innerhalb Deutschlands möglich. Bestellungen mit einer Lieferadresse außerhalb Deutschlands können wir derzeit leider nicht annehmen. Ausgenommen sind außerdem Helgoland und Büsingen am Hochrhein: beide liegen außerhalb des EU-Zollgebiets, dorthin wäre jede Sendung zollpflichtig.",
regionTextEu: "Versand ist in die gesamte Europäische Union möglich — dorthin fällt kein Zoll an. Bestellungen mit einer Lieferadresse außerhalb der EU können wir derzeit leider nicht annehmen. Das gilt auch für Gebiete, die zwar zu einem EU-Land gehören, aber außerhalb des Zollgebiets liegen: Helgoland, Büsingen am Hochrhein, die Kanarischen Inseln, Ceuta und Melilla, die französischen Überseegebiete, Livigno, Campione d’Italia, Åland und den Berg Athos.",
paymentHeading: "Zahlungsmethoden",
paymentText: "Wir bieten Kreditkarte, SEPA-Lastschrift, Klarna, PayPal, Apple Pay und Google Pay über unseren Zahlungsdienstleister Stripe an. Eine Zahlung per Überweisung ist auf Anfrage möglich.",
deliveryTimeHeading: "Lieferzeit",
deliveryTimeText: "Die übliche Lieferzeit innerhalb Deutschlands beträgt 2–4 Werktage nach Zahlungseingang.",
returnsHeading: "Rücksendung",
returnsText:
"Die unmittelbaren Kosten der Rücksendung trägt der Käufer. Das gilt für die Ausübung des Widerrufsrechts, also wenn du eine einwandfreie Ware zurückgibst.",
returnsDefectText:
"Davon ausgenommen ist mangelhafte Ware: liegt ein Mangel vor, der auf die Produktion oder auf uns als Verkäufer zurückzuführen ist, übernehmen wir die Kosten der Rücksendung vollständig. Melde dich in diesem Fall einfach bei uns, bevor du die Ware zurückschickst.",
},
cookieRichtliniePage: {
title: "Cookie-Richtlinie",
sections: [
{
heading: "Was sind Cookies?",
paragraphs: [
"Cookies sind kleine Textdateien, die beim Besuch einer Website auf deinem Endgerät gespeichert werden. Sie ermöglichen es unter anderem, dich während eines Besuchs wiederzuerkennen oder Einstellungen zu speichern.",
],
},
{
heading: "Technisch notwendige Cookies",
paragraphs: [
"Diese Cookies sind für den Betrieb der Website erforderlich und können nicht deaktiviert werden. Sie werden nur gesetzt, wenn du sie durch dein Verhalten aktiv auslöst (z.B. Anmeldung im Kundenkonto).",
"wabenhain_session: Hält dich nach der Anmeldung im Kundenkonto eingeloggt. Läuft nach 30 Tagen automatisch ab. Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO / § 25 Abs. 2 Nr. 2 TDDDG.",
],
},
{
heading: "Lokale Speicherung ohne Cookies",
paragraphs: [
"Dein Warenkorb wird nicht über ein Cookie, sondern über den lokalen Speicher deines Browsers (localStorage) auf deinem Gerät gespeichert und verlässt dein Gerät nicht. Ebenso wird deine Cookie-Auswahl selbst im localStorage hinterlegt.",
],
},
{
heading: "Cookies mit Einwilligung",
paragraphs: [
"Aktuell setzen wir keine Analyse- oder Marketing-Cookies ein. Sollten wir künftig z.B. eine Reichweitenmessung einsetzen, wird dies nur nach deiner ausdrücklichen Einwilligung über den Cookie-Banner aktiviert und an dieser Stelle vorab benannt.",
],
},
{
heading: "Externe Inhalte",
paragraphs: [
"Google-Rezensionen auf unserer Startseite werden serverseitig über die Google Places API abgerufen und angezeigt. Dabei wird kein Cookie in deinem Browser gesetzt, und es findet keine direkte Verbindung deines Browsers zu Google statt.",
"Zahlungen werden über Stripe abgewickelt. Während des Bezahlvorgangs kann Stripe eigene, für die Betrugsprävention notwendige Cookies setzen. Es gelten die Datenschutzhinweise von Stripe.",
"Auf Seiten mit Formularen (Anmeldung, Registrierung, Passwort-Reset, Bestellabschluss, Newsletter, Firmenanfrage) lädt dein Browser ein Skript von Cloudflare Turnstile. Der Dienst unterscheidet Eingaben von Menschen und automatisierten Programmen. Dabei wird deine IP-Adresse an Cloudflare übermittelt. Nach Angaben des Anbieters setzt Turnstile keine Cookies zu Werbezwecken und erstellt kein seitenübergreifendes Nutzerprofil. Einzelheiten in unserer Datenschutzerklärung.",
],
},
{
heading: "Deine Auswahl ändern",
paragraphs: ["Du kannst deine Cookie-Auswahl jederzeit widerrufen oder anpassen."],
},
],
},
wissenListPage: {
eyebrow: "Honigwissen",
title: "Wissenswertes rund um Honig",
readMore: "Weiterlesen",
},
wissenArticlePage: {
backLabel: "Zurück zum Honigwissen",
eyebrow: "Honigwissen",
otherArticlesHeading: "Weitere Artikel",
},
wissenArticles: {
"warum-kristallisiert-honig": {
title: "Warum kristallisiert Honig?",
excerpt: "Kristallisation ist ein natürlicher Prozess und kein Qualitätsmangel. Wir erklären, woran das liegt.",
body: [
"Honig besteht hauptsächlich aus den Zuckerarten Glukose und Fruktose sowie Wasser. Glukose neigt dazu, mit der Zeit auszukristallisieren – das ist ein völlig natürlicher, physikalischer Vorgang und kein Zeichen von schlechter Qualität.",
"Je höher der Glukose-Anteil einer Honigsorte, desto schneller kristallisiert sie. Sortenreine Honige unterscheiden sich daher deutlich in ihrer Kristallisationsgeschwindigkeit.",
"Wer flüssigen Honig bevorzugt, kann das Glas vorsichtig im Wasserbad bei niedriger Temperatur erwärmen. Wichtig ist, den Honig dabei nicht zu überhitzen, damit wertvolle Inhaltsstoffe erhalten bleiben.",
],
},
"fluessiger-oder-cremiger-honig": {
title: "Flüssiger oder cremiger Honig?",
excerpt: "Beide Konsistenzen sind reiner Honig – der Unterschied liegt in der Verarbeitung nach der Ernte.",
body: [
"Ob ein Honig flüssig oder cremig-fest ist, hängt vom Kristallisationsverhalten der jeweiligen Sorte sowie der Verarbeitung nach dem Schleudern ab.",
"Für eine feincremige Konsistenz wird der Honig nach der Ernte kontrolliert gerührt. Dabei entstehen viele feine Kristalle statt weniger großer, was den Honig streichzart macht.",
"Beide Varianten sind gleichwertig in Qualität und Nährstoffen – es ist reine Geschmacks- und Verwendungssache.",
],
},
"was-bedeutet-fruehtracht": {
title: "Was bedeutet Frühtracht?",
excerpt: "Die Frühtracht ist die erste Ernte des Jahres und trägt den Charakter des Frühlings.",
body: [
"Als Frühtracht bezeichnet man den Honig aus dem ersten Erntedurchgang des Jahres. Die Bienen sammeln in dieser Zeit vor allem Nektar von Frühblühern wie Obstbäumen, Raps und Löwenzahn.",
"Frühtrachthonig ist meist mild im Geschmack, hell in der Farbe und kristallisiert aufgrund des Rapsanteils häufig zügig zu einer feincremigen Konsistenz.",
"Jede Frühtracht schmeckt anders, weil Wetter, Blühzeitpunkte und Standort von Jahr zu Jahr variieren.",
],
},
"was-bedeutet-sommertracht": {
title: "Was bedeutet Sommertracht?",
excerpt: "Die Sommertracht entsteht im Hochsommer und bringt kräftigere, aromatischere Honige hervor.",
body: [
"Als Sommertracht bezeichnet man die Ernten ab etwa Juli, wenn die Frühjahrsblüte vorüber ist und die Bienen stattdessen Nektar von Linde, Kastanie, Wald und spätblühenden Wiesenblumen sammeln.",
"Sommertrachthonige sind meist dunkler, kräftiger im Geschmack und kristallisieren langsamer als Frühtrachthonige, da sie einen höheren Fruktoseanteil haben.",
"Bei Waldanteil in der Umgebung kann die Sommertracht zudem würzige, leicht malzige Noten entwickeln, die typisch für Honigtau- statt Blütennektar sind.",
],
},
"wie-entsteht-honig": {
title: "Wie entsteht Honig?",
excerpt: "Vom Nektar in der Blüte bis zum fertigen Honig im Glas ist es ein bemerkenswerter Prozess der Bienen.",
body: [
"Sammelbienen fliegen Blüten an und nehmen den zuckerhaltigen Nektar mit ihrem Rüssel auf, den sie in einer speziellen Honigblase transportieren. Dabei versetzen körpereigene Enzyme den Nektar bereits mit ersten Stoffen, die die Haltbarkeit verbessern.",
"Im Bienenstock wird der Nektar von Stockbienen mehrfach untereinander weitergereicht und dabei weiter angereichert. Anschließend verteilen die Bienen ihn dünn in den Wabenzellen, wo überschüssiges Wasser verdunstet.",
"Erst wenn der Wassergehalt auf unter etwa 18 Prozent gesunken ist, verschließen die Bienen die Zelle mit einem Wachsdeckel. Der Honig ist reif und kann geerntet werden.",
],
},
"warum-schmeckt-jede-honigernte-anders": {
title: "Warum schmeckt jede Honigernte anders?",
excerpt: "Wetter, Blühzeitpunkte und Standort machen jede Charge zu einem eigenen Geschmackserlebnis.",
body: [
"Honig ist ein Naturprodukt: Sein Geschmack hängt unmittelbar davon ab, welche Pflanzen zum Zeitpunkt der Ernte in der Umgebung der Bienenstöcke geblüht haben.",
"Wetterbedingungen wie Regen, Sonnenstunden und Temperatur beeinflussen, wie viel Nektar welche Pflanzenart in einem bestimmten Jahr liefert, und damit, welche Trachtquelle im Honig dominiert.",
"Deshalb schmeckt auch dieselbe Sorte, etwa Frühtracht, von Jahr zu Jahr und von Standort zu Standort leicht unterschiedlich. Wir dokumentieren jede Charge einzeln, damit dieser Unterschied nachvollziehbar bleibt statt in einer Mischcharge zu verschwinden.",
],
},
"wie-lange-ist-honig-haltbar": {
title: "Wie lange ist Honig haltbar?",
excerpt: "Bei richtiger Lagerung bleibt Honig außergewöhnlich lange genießbar.",
body: [
"Reiner Honig hat durch seinen niedrigen Wassergehalt und den hohen Zuckeranteil eine sehr lange natürliche Haltbarkeit. Auf dem Etikett geben wir dennoch ein Mindesthaltbarkeitsdatum an, wie gesetzlich vorgeschrieben.",
"Voraussetzung für eine lange Haltbarkeit ist die richtige Lagerung: kühl, dunkel und trocken, am besten bei gleichbleibender Temperatur zwischen 10 und 20 Grad.",
"Wird das Glas nach dem Öffnen wieder fest verschlossen und ein sauberer, trockener Löffel verwendet, bleibt der Honig auch über das Mindesthaltbarkeitsdatum hinaus in der Regel genießbar.",
],
},
"was-macht-regionalen-honig-aus": {
title: "Was macht regionalen Honig aus?",
excerpt: "Kurze Wege, bekannte Standorte und nachvollziehbare Ernten unterscheiden regionalen von anonymem Honig.",
body: [
"Regionaler Honig stammt von Bienenvölkern, deren Standort und Umgebung bekannt sind, anders als bei vielen Honigmischungen aus dem Supermarkt, die Honig aus mehreren Ländern zusammenführen.",
"Das bedeutet kurze Transportwege, eine Ernte, die zur heimischen Landschaft passt, und eine Imkerei, die für Qualität und Herkunft direkt ansprechbar ist.",
"Bei Wabenhain lässt sich jede Charge bis zum Bienenstand zurückverfolgen: Das ist der Kern dessen, was für uns regionalen Honig ausmacht.",
],
},
"wie-honig-richtig-lagern": {
title: "Wie sollte Honig gelagert werden?",
excerpt: "Kühl, dunkel und gut verschlossen: So bleibt Honig am längsten in bester Qualität.",
body: [
"Honig sollte bei möglichst gleichbleibender Temperatur zwischen 10 und 20 Grad gelagert werden, idealerweise in einem Vorratsschrank statt im Kühlschrank. Zu kalte Lagerung beschleunigt die Kristallisation, ohne die Qualität zu verbessern.",
"Direktes Sonnenlicht und Wärmequellen wie Herd oder Heizung sollten vermieden werden, da Wärme wertvolle Aromen und Inhaltsstoffe abbauen kann.",
"Das Glas nach jeder Nutzung gut verschließen, damit kein Wasser aus der Luft in den Honig gelangt. Das kann sonst Gärung begünstigen.",
],
},
"warum-nie-ueber-28-grad-erwaermt": {
title: "Warum wird unser Honig nie über 28 °C erwärmt?",
excerpt: "Honig enthält von Natur aus hitzeempfindliche Enzyme: Bei uns bleiben sie durch schonende Verarbeitung erhalten.",
body: [
"Honig enthält von den Bienen selbst eingebrachte Enzyme, unter anderem Invertase und Diastase. Sie sind deutlich hitzeempfindlich: Je stärker und länger Honig erwärmt wird, desto mehr geht davon verloren, messbar unter anderem an der sogenannten Diastasezahl und am HMF-Gehalt (Hydroxymethylfurfural), einem anerkannten Indikator für Wärmebelastung.",
"In der Imkerei gilt allgemein eine Grenze von 40 °C, um diese Inhaltsstoffe nicht zu schädigen. Das Schleudern selbst findet ohnehin nur bei Raumtemperatur (ca. 25–30 °C) statt, da Bienenwachs schon ab etwa 50 °C zu schmelzen beginnt.",
"Bei Wabenhain gehen wir bewusst noch einen Schritt weiter: Unser Honig wird zu keinem Zeitpunkt der Ernte, Schleuderung und Abfüllung über 28 °C erwärmt, spürbar unterhalb sowohl der üblichen 40-Grad-Grenze als auch der natürlichen Bienenstocktemperatur von rund 35 °C. So bleiben die Enzyme so weit wie möglich erhalten, wie sie auch im Bienenstock vorliegen.",
],
},
},
kontaktPage: {
eyebrow: "Kontakt",
title: "Wir freuen uns von dir zu hören.",
pickupHeading: "Honig vor Ort abholen",
pickupText:
"Nach Absprache kannst du deine Bestellung direkt bei uns in Altenmünster abholen. Wähle dazu im Checkout einfach „Abholung“ aus. Wir melden uns anschließend mit einem Abholtermin.",
},
twoFactorPage: {
eyebrow: "Sicherheit",
title: "Zwei-Faktor-Authentifizierung",
subtitle: "Schützt dein Konto zusätzlich zum Passwort mit einem Code aus einer Authenticator-App.",
backLabel: "Zurück zur Übersicht",
activeStatus: (count) => `Zwei-Faktor-Authentifizierung ist aktiv. Noch ${count} Backup-Code${count === 1 ? "" : "s"} verfügbar.`,
disableHeading: "Deaktivieren",
passwordConfirmLabel: "Passwort zur Bestätigung",
disableButton: "Zwei-Faktor-Authentifizierung deaktivieren",
setupButton: "Einrichten",
},
wishlistPage: {
title: "Meine Wunschliste",
emptyTitle: "Noch keine Produkte gemerkt.",
emptyDescription: "Auf jeder Produktseite kannst du sie über „Zur Wunschliste hinzufügen“ speichern.",
},
twoFactorCodePage: {
eyebrow: "Kundenkonto",
title: "Anmeldung bestätigen",
subtitle: "Gib den 6-stelligen Code aus deiner Authenticator-App ein, oder verwende einen deiner Backup-Codes.",
cancelLabel: "Anmeldung abbrechen",
codeLabel: "Code",
confirm: "Bestätigen",
},
twoFactorBackupCodesPage: {
eyebrow: "Sicherheit",
title: "Deine Backup-Codes",
subtitle:
"Jeder Code funktioniert einmalig, falls du keinen Zugriff auf deine Authenticator-App hast. Speichere sie an einem sicheren Ort. Sie werden dir nur jetzt angezeigt.",
warning: "Diese Codes werden nicht erneut angezeigt. Lade die Seite nicht neu, ohne sie gespeichert zu haben.",
done: "Fertig",
},
twoFactorSetupPage: {
eyebrow: "Sicherheit",
title: "Zwei-Faktor-Authentifizierung einrichten",
subtitle:
"Scanne den QR-Code mit einer Authenticator-App (z. B. Google Authenticator, Authy) und bestätige mit dem angezeigten Code.",
backLabel: "Zurück",
qrAlt: "QR-Code für die Authenticator-App",
manualEntryLabel: "Manuell eingeben:",
appCodeLabel: "Code aus der App",
activate: "Aktivieren",
},
retourePage: {
backLabel: "Zurück zu meinen Bestellungen",
orderEyebrow: (orderNumber) => `Bestellung ${orderNumber}`,
title: "Rücksendung anfragen",
reasonLabel: "Grund für die Rücksendung",
reasonPlaceholder: "Was hat dich zur Rücksendung bewogen?",
submit: "Anfrage senden",
},
erntenPage: {
eyebrow: "Ernten",
title: "Kein Jahr schmeckt gleich.",
batchCount: (count) => `${count} Charge${count === 1 ? "" : "n"}`,
emptyText: "Noch keine Ernten hinterlegt.",
},
erntenDetailPage: {
backLabel: "Zurück zu allen Ernten",
batchesHeading: "Chargen dieser Ernte",
productsHeading: "Produkte aus dieser Ernte",
glassesAvailable: (remaining, total) => `${remaining} von ${total} Gläsern verfügbar`,
},
chargePage: {
verifiedBatch: "Verifizierte Charge",
provenanceNote: (code) => `Charge ${code} · Diese Angaben stammen direkt aus unserer Produktionsdokumentation.`,
stepHarvest: "Ernte",
stepFilling: "Abfüllung",
stepBestBefore: "Mindesthaltbar bis",
regionLabel: "Region",
fromThisBatch: "Aus dieser Charge",
},
newsletterBestaetigtPage: {
eyebrow: "Erntepost",
confirmedTitle: "Anmeldung bestätigt.",
invalidTitle: "Link nicht mehr gültig.",
unsubscribedTitle: "Abmeldung erfolgreich.",
confirmedText: "Danke! Du erfährst ab sofort als Erstes von der nächsten Ernte.",
invalidText: "Dieser Bestätigungslink wurde bereits verwendet oder ist abgelaufen. Melde dich gerne erneut an.",
unsubscribedText: "Du wurdest von der Erntepost abgemeldet und erhältst keine weiteren E-Mails mehr.",
backHome: "Zur Startseite",
discountHeading: "Dein Willkommensrabatt",
discountText: (percent) => `${percent}% auf deine nächste Bestellung mit Code`,
discountCopyHint: "Code beim Checkout eingeben.",
copyCode: "Code kopieren",
codeCopied: "Kopiert",
},
adminReviewsPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Bewertungen",
searchLabel: "Suche",
searchPlaceholder: "Produkt oder Kund:in",
filterButton: "Filtern",
resetFilter: "Filter zurücksetzen",
noResultsFiltered: "Keine Treffer für diese Suche.",
colProduct: "Produkt",
colCustomer: "Kund:in",
colRating: "Bewertung",
colComment: "Kommentar",
colDate: "Datum",
colStatus: "Status",
statusPublished: "Veröffentlicht",
statusPending: "Ausstehend",
approve: "Freischalten",
deleteConfirm: "Diese Bewertung wirklich löschen?",
delete: "Löschen",
noReviewsYet: "Noch keine Bewertungen vorhanden.",
},
adminAuditLogPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Audit-Log",
intro: (limit) => `Protokoll aller Admin-Änderungen (Produkte, Bestellungen, Gutscheine, Benutzer, …), die letzten ${limit} Einträge.`,
colTimestamp: "Zeitpunkt",
colAdmin: "Admin",
colAction: "Aktion",
colObject: "Objekt",
colDetails: "Details",
noEntriesYet: "Noch keine protokollierten Änderungen.",
},
adminVouchersPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Gutscheine",
newVoucher: "Neuer Gutschein",
colCode: "Code",
colDiscount: "Rabatt",
colMinOrder: "Mindestbestellwert",
colMinQuantity: "Mengenrabatt ab",
colUsage: "Nutzungen",
colValidity: "Gültigkeit",
colStatus: "Status",
immediately: "sofort",
unlimited: "unbegrenzt",
statusActive: "Aktiv",
statusInactive: "Inaktiv",
statusExpired: "Abgelaufen",
edit: "Bearbeiten",
deleteConfirm: (code) => `Gutschein "${code}" wirklich löschen?`,
delete: "Löschen",
noVouchersYet: "Noch keine Gutscheine angelegt.",
},
adminVoucherEditPage: {
backToVouchers: "Zurück zu Gutscheinen",
title: "Gutschein bearbeiten",
codeLabel: "Code",
typeLabel: "Typ",
typePercent: "Prozent",
typeFixed: "Fester Betrag (Cent)",
valueLabel: "Wert",
minOrderLabel: "Mindestbestellwert (Cent, optional)",
minQuantityLabel: "Mindestmenge für Mengenrabatt (Stück, optional, automatisch angewendet ohne Codeeingabe)",
maxUsesLabel: "Max. Nutzungen insgesamt (leer = unbegrenzt)",
validFromLabel: "Gültig ab (optional)",
validUntilLabel: "Gültig bis (optional)",
activeLabel: "Aktiv",
redeemedSoFar: (count, max) => `Bisher ${count}${max !== null ? ` von ${max}` : ""} mal eingelöst.`,
save: "Speichern",
},
adminVoucherNewPage: {
backToVouchers: "Zurück zu Gutscheinen",
title: "Neuer Gutschein",
codeLabel: "Code",
codePlaceholder: "WABEN10",
typeLabel: "Typ",
typePercent: "Prozent",
typeFixed: "Fester Betrag (Cent)",
valueLabel: "Wert",
minOrderLabel: "Mindestbestellwert (Cent, optional)",
minQuantityLabel: "Mindestmenge für Mengenrabatt (Stück, optional, automatisch angewendet ohne Codeeingabe)",
maxUsesLabel: "Max. Nutzungen insgesamt (leer = unbegrenzt)",
validFromLabel: "Gültig ab (optional)",
validUntilLabel: "Gültig bis (optional)",
activeLabel: "Aktiv",
create: "Anlegen",
},
adminShippingPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Versandkosten",
newTier: "Neue Staffel",
intro:
"Die Versandkosten richten sich nach der Gesamtmenge aller Artikel im Warenkorb. Mehrere Positionen werden zu einer Menge zusammengezählt, nicht mehr nach Bestellwert berechnet. Ohne passende Staffel greift ein fester Sicherheits-Fallback von 4,90 €. Abholung in Altenmünster ist immer versandkostenfrei.",
colQuantity: "Menge",
colPrice: "Preis",
quantityFrom: (min) => `ab ${min} Stück`,
quantityRange: (min, max) => `${min}–${max} Stück`,
edit: "Bearbeiten",
deleteConfirm: "Diese Versandstaffel wirklich löschen?",
delete: "Löschen",
noTiersYet: "Noch keine Staffeln angelegt. Es gilt der Sicherheits-Fallback von 4,90 €.",
},
adminShippingEditPage: {
backToShipping: "Zurück zu Versandkosten",
title: "Versandstaffel bearbeiten",
minQuantityLabel: "Von (Stück)",
maxQuantityLabel: "Bis (Stück, leer = unbegrenzt)",
priceLabel: "Preis (Cent)",
save: "Speichern",
},
adminShippingNewPage: {
backToShipping: "Zurück zu Versandkosten",
title: "Neue Versandstaffel",
minQuantityLabel: "Von (Stück)",
maxQuantityLabel: "Bis (Stück, leer = unbegrenzt)",
priceLabel: "Preis (Cent)",
create: "Anlegen",
},
adminUsersPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Benutzer",
newUser: "Neuer Benutzer",
searchLabel: "Suche",
searchPlaceholder: "Name oder E-Mail",
filterButton: "Filtern",
resetFilter: "Filter zurücksetzen",
noResultsFiltered: "Keine Treffer für diese Suche.",
colName: "Name",
colEmail: "E-Mail",
colRole: "Rolle",
colStatus: "Status",
col2fa: "2FA",
colCreated: "Erstellt",
roleCustomer: "Kunde",
roleAdmin: "Admin",
youSuffix: " (Du)",
statusBlocked: "Gesperrt",
statusTemporarilyLocked: "Temporär gesperrt",
statusActive: "Aktiv",
edit: "Bearbeiten",
unblock: "Entsperren",
block: "Sperren",
delete: "Löschen",
deleteConfirm: (name) => `"${name}" wirklich löschen? Dies kann nicht rückgängig gemacht werden.`,
noUsersYet: "Noch keine Benutzer angelegt.",
},
adminUserEditPage: {
backToUsers: "Zurück zu Benutzern",
createdOn: (date) => `Konto erstellt am ${date}`,
firstNameLabel: "Vorname",
lastNameLabel: "Nachname",
emailLabel: "E-Mail",
phoneLabel: "Telefon",
roleLabel: "Rolle",
roleCustomer: "Kunde",
roleAdmin: "Admin",
cannotChangeOwnRole: "Du kannst deine eigene Rolle hier nicht ändern.",
save: "Speichern",
securityHeading: "Sicherheit",
twoFactorLabel: "Zwei-Faktor-Authentifizierung",
twoFactorActive: "Aktiv",
twoFactorInactive: "Nicht aktiv",
statusLabel: "Status",
blockedSince: (date) => `Vom Admin gesperrt seit ${date}`,
temporarilyLockedFailedAttempts: "Temporär gesperrt (Fehlversuche)",
statusActive: "Aktiv",
sendPasswordReset: "Passwort-Reset-E-Mail senden",
unblock: "Entsperren",
block: "Sperren",
deleteAccount: "Konto löschen",
deleteConfirm: (name) => `"${name}" wirklich löschen? Dies kann nicht rückgängig gemacht werden.`,
},
adminUserNewPage: {
backToUsers: "Zurück zu Benutzern",
title: "Neuer Benutzer",
intro:
"Es wird kein Passwort vergeben: Der Benutzer erhält sofort eine E-Mail mit einem Link, um sein eigenes Passwort festzulegen.",
firstNameLabel: "Vorname",
lastNameLabel: "Nachname",
emailLabel: "E-Mail",
roleLabel: "Rolle",
roleCustomer: "Kunde",
roleAdmin: "Admin",
createAndSend: "Anlegen & Reset-E-Mail senden",
},
adminBatchesPage: {
backToDashboard: "Zurück zum Dashboard",
notDeletable: "in Verwendung",
title: "Chargen",
colBatch: "Charge",
colHarvest: "Ernte",
colFillDate: "Abfülldatum",
colBestBefore: "MHD",
colTotalGlasses: "Gläser gesamt",
colRemaining: "Verbleibend",
edit: "Bearbeiten",
delete: "Löschen",
deleteConfirm: (code) => `Charge "${code}" wirklich löschen? Dies kann nicht rückgängig gemacht werden.`,
noBatchesYet: "Noch keine Chargen angelegt.",
newBatchHeading: "Neue Charge anlegen",
codeLabel: "Chargen-Code",
codePlaceholder: "z.B. FH-27-01",
harvestLabel: "Ernte",
fillDateLabel: "Abfülldatum",
bestBeforeDateLabel: "Mindesthaltbarkeitsdatum",
glassCountLabel: "Anzahl Gläser",
remainingGlassesLabel: "Verbleibender Bestand",
create: "Anlegen",
},
adminBatchEditPage: {
backToBatches: "Zurück zu Chargen",
title: "Charge bearbeiten",
fillDateLabel: "Abfülldatum",
bestBeforeDateLabel: "Mindesthaltbarkeitsdatum",
glassCountLabel: "Anzahl Gläser",
remainingGlassesLabel: "Verbleibender Bestand",
imagesLabel: "Chargen-Bilder",
image1Label: "Bild 1 — linke Kachel auf der Chargenseite",
image2Label: "Bild 2 — rechte Kachel auf der Chargenseite (Standort)",
save: "Speichern",
},
trackOrderPage: {
eyebrow: "Bestellung verfolgen",
title: "Wo ist meine Bestellung?",
intro: "Gib deine Bestellnummer und die bei der Bestellung verwendete E-Mail-Adresse ein, um den aktuellen Status zu sehen, auch ohne Kundenkonto.",
orderNumberLabel: "Bestellnummer",
orderNumberPlaceholder: "z.B. WH-2026-A1B2C3D4",
submit: "Status anzeigen",
notFoundError: "Keine Bestellung mit dieser Kombination aus Bestellnummer und E-Mail-Adresse gefunden.",
rateLimitError: "Zu viele Anfragen. Bitte versuche es später erneut.",
itemsHeading: "Artikel",
totalLabel: "Gesamt",
viewInvoice: "Rechnung ansehen",
},
passwordStrength: {
weak: "Schwach",
fair: "Mittel",
strong: "Stark",
},
shipmentInfo: {
heading: "Sendungsverfolgung",
carrierLabel: "Versanddienstleister",
trackingNumberLabel: "Sendungsnummer",
trackPackage: "Sendung verfolgen",
historyHeading: "Sendungsverlauf",
historyAriaLabel: "Sendungsverlauf von DHL",
estimatedDelivery: (date) => `Voraussichtliche Zustellung: ${date}`,
notYetScanned:
"DHL hat das Paket noch nicht erfasst. Das kann nach dem Versand einige Stunden dauern – schau gern später noch einmal vorbei.",
historyUnavailable: "Der Sendungsverlauf lässt sich gerade nicht laden. Bitte versuche es später noch einmal.",
dataSource: "Daten von DHL",
statuses: {
"pre-transit": "Angekündigt",
transit: "Unterwegs",
delivered: "Zugestellt",
failure: "Zustellproblem",
unknown: "Status unbekannt",
},
},
flash: {
close: "Meldung schließen",
success: "Erledigt",
error: "Fehler",
info: "Hinweis",
},
adminArchive: {
tabsAriaLabel: "Ansicht",
tabActive: "Aktiv",
tabArchive: "Archiv",
archive: "Archivieren",
restore: "Wiederherstellen",
archivedOn: (date) => `Archiviert am ${date}`,
manualHint: "von Hand",
autoRuleOrders:
"Versendete, abgeholte und stornierte Bestellungen ohne offene Retoure landen nach einem Monat ohne Bearbeitung automatisch hier.",
autoRuleReturns:
"Angenommene, abgelehnte und erstattete Retouren landen nach einem Monat ohne Bearbeitung automatisch hier.",
autoRuleProducts:
"Produkte, die seit über einem Monat Bestand 0 haben, landen automatisch hier und kehren zurück, sobald wieder Bestand da ist. Im Shop bleiben sie unverändert sichtbar.",
emptyArchive: "Das Archiv ist leer.",
},
errorPage: {
eyebrow: "Fehler",
title: "Etwas ist schiefgelaufen.",
description: "Das war nicht dein Fehler. Bitte versuche es erneut, oder kehre zur Startseite zurück.",
retry: "Erneut versuchen",
backHome: "Zur Startseite",
},
adminHarvestsPage: {
backToDashboard: "Zurück zum Dashboard",
notDeletable: "in Verwendung",
title: "Ernten",
colType: "Typ",
colYear: "Jahr",
colHarvestDate: "Erntedatum",
colLocation: "Standort",
colBatches: "Chargen",
colProducts: "Produkte",
colStatus: "Status",
statusPublished: "Veröffentlicht",
statusDraft: "Entwurf",
publish: "Veröffentlichen",
unpublish: "Verbergen",
edit: "Bearbeiten",
delete: "Löschen",
deleteConfirm: (label) => `"${label}" wirklich löschen? Dies kann nicht rückgängig gemacht werden.`,
noHarvestsYet: "Noch keine Ernten angelegt.",
newHarvestHeading: "Neue Ernte anlegen",
typeLabel: "Typ (z.B. Frühtracht)",
yearLabel: "Jahr",
harvestDateLabel: "Erntedatum",
locationLabel: "Standort",
descriptionLabel: "Beschreibung",
isPublishedLabel: "Sofort veröffentlichen",
create: "Anlegen",
},
adminHarvestEditPage: {
backToHarvests: "Zurück zu Ernten",
title: "Ernte bearbeiten",
typeLabel: "Typ",
yearLabel: "Jahr",
harvestDateLabel: "Erntedatum",
locationLabel: "Standort",
descriptionLabel: "Beschreibung",
imagesLabel: "Erntebilder",
image1Label: "Bild 1 — Ernten-Übersicht und linke Kachel auf der Chargenseite",
image2Label: "Bild 2 — rechte Kachel auf der Chargenseite (Standort)",
isPublishedLabel: "Öffentlich sichtbar",
isPublishedHint: "Steuert, ob diese Ernte auf der Website (Shop, /ernten) sichtbar ist.",
draftNotice: "Diese Ernte ist aktuell nur im Admin-Bereich sichtbar (z.B. aus ApiCore importiert). Bitte Angaben prüfen und danach veröffentlichen.",
publishNow: "Jetzt veröffentlichen",
save: "Speichern",
},
adminApiCoreSync: {
heading: "ApiCore-Synchronisierung",
intro:
"Holt in einem Durchgang Ernten, Chargen und Produkte aus ApiCore — in dieser Reihenfolge, weil jede Stufe auf der vorherigen aufbaut. Ernten und Produkte entstehen als Entwürfe: Ernten unveröffentlicht, Produkte deaktiviert und ohne Preis, denn ApiCore führt keine Verkaufspreise. Je Abfüllung entsteht ein eigener Jahrgang. Bereits freigegebene Einträge werden nie überschrieben.",
button: "Alles synchronisieren",
resultHarvests: (created, updated, skipped, failed) =>
`Ernten: ${created} neu, ${updated} aktualisiert, ${skipped} übersprungen${failed > 0 ? `, ${failed} fehlgeschlagen` : ""}.`,
resultBatches: (created, skipped, failed) =>
`Chargen: ${created} neu, ${skipped} übersprungen${failed > 0 ? `, ${failed} fehlgeschlagen (siehe Server-Log)` : ""}.`,
resultProducts: (created, skipped, failed) =>
`Produkte: ${created} neue${created === 1 ? "r Jahrgang" : " Jahrgänge"}, ${skipped} übersprungen${failed > 0 ? `, ${failed} fehlgeschlagen (siehe Server-Log)` : ""}.`,
pending: (count) =>
`${count} Abfüllung${count === 1 ? "" : "en"} ohne passende Charge — meist ein Hinweis darauf, dass die zugehörige Ernte in ApiCore noch fehlt.`,
discontinued: (count) =>
`${count} Abfüllung${count === 1 ? "" : "en"} gehör${count === 1 ? "t" : "en"} zu einem Artikel, den ApiCore nicht mehr führt — dafür wurde kein neuer Jahrgang angelegt. Bereits vorhandene bleiben im Verkauf.`,
error: "Synchronisierung mit ApiCore fehlgeschlagen.",
batchLoadError: "Chargen konnten nicht geladen werden — ohne sie entstehen auch keine Produkte",
},
adminProductsPage: {
backToDashboard: "Zurück zum Dashboard",
delete: "Löschen",
deleteConfirm: (label) =>
`"${label}" wirklich löschen? Dies kann nicht rückgängig gemacht werden.`,
notDeletable: "bereits verkauft",
title: "Produkte",
newProduct: "Neues Produkt",
colProduct: "Produkt",
colCategory: "Kategorie",
colHarvest: "Ernte",
colBatch: "Charge",
colWeight: "Gewicht",
colPrice: "Preis",
colStock: "Bestand",
colStatus: "Status",
statusActive: "Aktiv",
statusInactive: "Inaktiv",
edit: "Bearbeiten",
noProductsYet: "Noch keine Produkte angelegt.",
draftHint: "Entwurf: kein Preis gepflegt",
},
adminProductEditPage: {
backToProducts: "Zurück zu Produkten",
title: "Produkt bearbeiten",
harvestBatchSuffix: (type, year, code) => ` · ${type} ${year} · Charge ${code}`,
nameLabel: "Name",
descriptionLabel: "Beschreibung",
tasteTagsLabel: "Merkmale/Tags (kommagetrennt)",
consistencyLabel: "Konsistenz",
intensityMildLabel: "mild (1-5)",
intensityFloralLabel: "floral (1-5)",
intensityKraeftigLabel: "kräftig (1-5)",
weightLabel: "Gewicht (g)",
stockLabel: "Lagerbestand (Gläser)",
priceLabel: "Preis (Cent)",
pricePerKgLabel: "Grundpreis pro kg (Cent)",
vatRateLabel: "Umsatzsteuersatz (%, optional)",
vatRateHint:
"Leer lassen: es gilt der Satz der Kategorie (Honig 7 %, Kerzen 19 %). Nur ausfüllen, wenn dieses Produkt davon abweicht. 0 bedeutet steuerfrei nach § 19 UStG.",
imagesLabel: "Produktbilder",
visibleInShop: "Im Shop sichtbar",
sectionText: "Text und Bilder",
sectionTaste: "Geschmack",
sectionPriceStock: "Preis und Bestand",
sectionVisibility: "Sichtbarkeit",
save: "Speichern",
},
adminProductNewPage: {
backToProducts: "Zurück zu Produkten",
title: "Neues Produkt",
nameLabel: "Name",
slugLabel: "URL-Slug (optional, wird sonst aus Name generiert)",
categoryLabel: "Kategorie",
categoryHint:
"Nur Honig-Produkte sind einer Ernte/Charge zugeordnet. Bei anderen Kategorien wird diese Auswahl beim Speichern automatisch ignoriert, da z.B. Kerzen unabhängig von einer Ernte sind.",
harvestLabel: "Ernte",
noneOption: "Keine Auswahl",
batchLabel: "Charge",
batchOption: (code, type, year) => `${code} (${type} ${year})`,
descriptionLabel: "Beschreibung",
tasteTagsLabel: "Merkmale/Tags (kommagetrennt)",
tasteTagsPlaceholder: "mild, floral, feincremig",
consistencyLabel: "Konsistenz (nur Honig)",
consistencyPlaceholder: "feincremig",
intensityMildLabel: "Intensität mild (1-5)",
intensityFloralLabel: "Intensität floral (1-5)",
intensityKraeftigLabel: "Intensität kräftig (1-5)",
weightLabel: "Gewicht (g)",
stockLabel: "Lagerbestand (Gläser)",
priceLabel: "Preis (Cent)",
pricePerKgLabel: "Grundpreis pro kg (Cent)",
vatRateLabel: "Umsatzsteuersatz (%, optional)",
vatRateHint:
"Leer lassen: es gilt der Satz der Kategorie (Honig 7 %, Kerzen 19 %). Nur ausfüllen, wenn dieses Produkt davon abweicht. 0 bedeutet steuerfrei nach § 19 UStG.",
pricePlaceholder: "990",
pricePerKgPlaceholder: "1980",
imagesLabel: "Produktbilder",
visibleInShop: "Im Shop sichtbar",
sectionText: "Text und Bilder",
sectionCategory: "Kategorie und Herkunft",
sectionTaste: "Geschmack",
sectionPriceStock: "Preis und Bestand",
sectionVisibility: "Sichtbarkeit",
create: "Anlegen",
},
adminReturnsPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Retouren",
searchLabel: "Suche",
searchPlaceholder: "Bestellnummer, Name oder E-Mail",
filterButton: "Filtern",
resetFilter: "Filter zurücksetzen",
noResultsFiltered: "Keine Treffer für diese Suche.",
statusRequested: "Angefragt",
statusAccepted: "Angenommen",
statusRejected: "Abgelehnt",
statusRefunded: "Erstattet",
accept: "Annehmen",
reject: "Ablehnen",
refundNow: "Jetzt per Stripe erstatten",
noRequestsYet: "Noch keine Rücksendeanfragen eingegangen.",
},
adminInquiriesPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Firmenanfragen",
searchLabel: "Suche",
searchPlaceholder: "Firma, Ansprechperson oder E-Mail",
filterButton: "Filtern",
resetFilter: "Filter zurücksetzen",
noResultsFiltered: "Keine Treffer für diese Suche.",
statusNew: "Neu",
statusInProgress: "In Bearbeitung",
statusCompleted: "Abgeschlossen",
statusRejected: "Abgelehnt",
statusSelectLabel: "Status der Anfrage",
save: "Speichern",
packageLabel: "Paket",
quantityLabel: "Menge",
unitsSuffix: (quantity) => `${quantity} Stück`,
deliveryDateLabel: "Liefertermin",
noInquiriesYet: "Noch keine Firmenanfragen eingegangen.",
},
adminOrderDetailPage: {
postNumberLabel: "DHL-Postnummer",
backToOrders: "Zurück zu Bestellungen",
saveStatus: "Status speichern",
giftHeading: "🎁 Geschenk: Nachricht beilegen",
customerHeading: "Kunde",
registeredAccount: "Registriertes Kundenkonto",
guestOrder: "Gastbestellung",
shippingAddressHeading: "Lieferadresse",
pickupHeading: "Abholung",
shippedOn: (date) => `Versendet am ${date}`,
notShippedYet: "Noch nicht versendet",
pickedUpOn: (date) => `Abgeholt am ${date}`,
notPickedUpYet: "Noch nicht abgeholt",
readySince: (date) => `Abholbereit seit ${date}`,
itemsHeading: "Artikel",
colProduct: "Produkt",
colBatch: "Charge",
colQuantity: "Menge",
colTotal: "Summe",
subtotalLabel: "Zwischensumme",
shippingLabel: "Versand",
freeShipping: "kostenlos",
discountLabel: "Rabatt",
totalLabel: "Gesamt",
paymentHeading: "Zahlung",
paidOn: (date) => `Bezahlt am ${date}`,
noPaymentYet: "Noch keine Zahlung erfasst.",
invoiceHeading: "Rechnung",
downloadPdf: "PDF herunterladen",
noInvoiceYet: "Noch keine Rechnung erstellt (folgt nach Zahlungseingang).",
trackingHeading: "Sendungsverfolgung",
carrierLabel: "Versanddienstleister",
carrierPlaceholder: "z.B. DHL, DPD, Hermes",
trackingNumberLabel: "Sendungsnummer",
saveTracking: "Speichern",
dhlHeading: "DHL-Versandmarke",
dhlCreateButton: "Versandmarke erstellen",
dhlAlreadyCreated: (trackingNumber) => `DHL-Versandmarke bereits erstellt: Sendungsnummer ${trackingNumber}`,
dhlNotConfigured: "DHL ist noch nicht konfiguriert, siehe .env (DHL_API_KEY, DHL_API_SECRET, DHL_GKP_USERNAME, DHL_GKP_PASSWORD, DHL_ACCOUNT_NUMBER).",
deleteHeading: "Bestellung löschen",
deleteHint:
"Diese Bestellung ist nie zu einem Geschäftsvorfall geworden: keine Zahlung, keine Rechnung. Sie kann deshalb rückstandslos entfernt werden. Reservierte Ware wird dabei wieder dem Bestand gutgeschrieben.",
deleteButton: "Endgültig löschen",
deleteConfirm: (orderNumber) =>
`Bestellung ${orderNumber} endgültig löschen? Das lässt sich nicht rückgängig machen.`,
deleteBlocked:
"Diese Bestellung kann nicht gelöscht werden — es hängt eine Zahlung oder eine Rechnung daran, oder sie ist bereits in Bearbeitung. Rechnungen und Zahlungsbelege sind aufbewahrungspflichtig. Storniere die Bestellung stattdessen: das erstattet das Geld, bucht die Ware zurück und lässt den Beleg stehen.",
},
adminOrdersPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Bestellungen",
searchLabel: "Suche (Nummer, E-Mail, Nachname)",
searchPlaceholder: "z.B. WH-2026 oder [email protected]",
statusLabel: "Status",
statusAll: "Alle",
filterButton: "Filtern",
resetFilter: "Filter zurücksetzen",
colNumber: "Nummer",
colCustomer: "Kunde",
colDate: "Datum",
colItems: "Artikel",
colTotal: "Summe",
colStatus: "Status",
colFulfillment: "Lieferart",
giftOrderTitle: "Geschenkbestellung mit Nachricht",
save: "Speichern",
shipping: "Versand",
pickup: "Abholung",
noResultsFiltered: "Keine Bestellungen gefunden, die zu diesem Filter passen.",
noOrdersYet: "Noch keine Bestellungen vorhanden.",
},
adminDashboardPage: {
missingUploadsTitle: (missing: number, checked: number) =>
`${missing} von ${checked} hinterlegten Bild-/Videodateien fehlen auf dem Server.`,
uploadsNotPersistentTitle:
"Das Upload-Verzeichnis liegt im Container und ist nicht dauerhaft.",
uploadsNotPersistentHint: (uploadDir: string) =>
`Alle Bilder und Videos unter ${uploadDir} gehen beim nächsten Redeploy verloren. In Kubernetes muss das Volume "uploads" ein PersistentVolumeClaim sein (kubectl apply -f k8s/04-uploads-pvc.yaml und k8s/05-app-deployment.yaml), im Docker-Betrieb ein benanntes Volume. Details in k8s/README.md, Abschnitt "Bilder/Videos verschwinden nach jedem Redeploy".`,
missingUploadsHint:
"Die Datenbank kennt die Pfade noch, die Dateien selbst sind weg — im Shop erscheinen dort leere Flächen. Fast immer liegt das an einem nicht dauerhaften Upload-Verzeichnis: In Kubernetes muss das Volume \"uploads\" ein PersistentVolumeClaim sein (k8s/04-uploads-pvc.yaml), kein emptyDir, sonst geht es bei jedem Redeploy verloren. Nach dem Umstellen müssen die betroffenen Dateien einmalig neu hochgeladen werden.",
title: "Dashboard",
statRevenueToday: "Umsatz heute",
statRevenueMonth: "Umsatz Monat",
statOpenOrders: "Offene Bestellungen",
statInventory: "Lagerbestand (Gläser)",
statSoldGlasses: "Verkaufte Gläser",
statAvgCart: "Ø Warenkorb",
statRepeatCustomers: "Stammkund:innen",
topProductsHeading: "Top-Produkte",
noSalesYet: "Noch keine Verkäufe.",
unitsSuffix: (quantity) => `(${quantity} Stück)`,
revenueByCategoryHeading: "Umsatz nach Kategorie",
revenueTrendHeading: (days) => `Umsatzverlauf (${days} Tage)`,
daysAgoLabel: (days) => `vor ${days} Tagen`,
todayLabel: "heute",
topVouchersHeading: "Meistgenutzte Gutscheine",
noVouchersYet: "Noch keine Gutscheine eingelöst.",
usedCountLabel: (count, maxUses) => `${count}× genutzt${maxUses ? ` / ${maxUses}` : ""}`,
viewAllOrders: "Alle Bestellungen ansehen →",
greeting: (part, name) =>
`${part === "morning" ? "Guten Morgen" : part === "day" ? "Hallo" : "Guten Abend"}, ${name}.`,
todayRevenueLabel: "Umsatz heute",
monthRevenueLabel: "Umsatz diesen Monat",
vsYesterday: (delta, up) => `${up ? "↑" : "↓"} ${delta} gegenüber gestern`,
toDoHeading: "Zu erledigen",
toDoOrders: (count) => (count === 1 ? "1 Bestellung wartet auf Versand" : `${count} Bestellungen warten auf Versand`),
toDoReturns: (count) => (count === 1 ? "1 neue Retoure" : `${count} neue Retouren`),
toDoReviews: (count) => (count === 1 ? "1 Bewertung wartet auf Freigabe" : `${count} Bewertungen warten auf Freigabe`),
toDoInquiries: (count) => (count === 1 ? "1 neue Firmenanfrage" : `${count} neue Firmenanfragen`),
allDoneTitle: "Alles erledigt.",
allDoneText: "Gerade wartet nichts auf dich. Zeit für die Bienen.",
chartTooltip: (day, value) => `${day}: ${value}`,
},
adminContentPage: {
backToDashboard: "Zurück zum Dashboard",
title: "Inhalte",
intro:
"Diese Texte erscheinen auf der Website. Ein leeres Feld bedeutet nicht \"leer auf der Seite\": Dann wird der ursprüngliche Text weiter angezeigt. Trage nur ein, was du ändern möchtest.",
sectionImages: "Bilder",
sectionImagesIntro: "Alle Bilder und das Hero-Video, die du hochladen kannst, sortiert nach Seite.",
sectionText: "Texte",
sectionTextIntro: "Alle Textinhalte, sortiert nach Bereich.",
groupCompany: "Firmendaten",
groupShipping: "Versand",
groupHome: "Homepage",
groupPages: "Weitere Seiten",
groupLegal: "Rechtstexte",
groupSocial: "Social Media",
deLabel: "Deutsch",
enLabel: "Englisch",
save: "Speichern",
saved: "Gespeichert.",
},
adminImageField: {
none: "Kein Bild",
chooseFile: "Datei auswählen",
uploading: "Wird hochgeladen…",
remove: "Bild entfernen",
removeImageAt: (position) => `Bild ${position} entfernen`,
uploadError: "Der Upload ist fehlgeschlagen.",
uploadErrorStatus: (status) =>
status === 413
? `Die Datei wurde abgewiesen, weil sie zu groß ist (HTTP 413). Sie hat den Shop gar nicht erreicht — diese Grenze setzt der vorgeschaltete Proxy bzw. das CDN.`
: status === 502
? `Der Server hat die Verarbeitung abgebrochen (HTTP 502). Das Backend hat die Verbindung fallen gelassen, ohne zu antworten — häufig, weil ihm der Arbeitsspeicher ausging. Bitte informiere die Technik und nenne diese Nummer.`
: status === 503 || status === 504 || status === 522 || status === 524
? `Der Server hat die Verarbeitung abgebrochen (HTTP ${status}). Das ist eine Zeitüberschreitung: die Verarbeitung dauerte länger, als der vorgeschaltete Proxy zulässt.`
: `Der Server hat unerwartet geantwortet (HTTP ${status}) — keine verwertbare Rückmeldung. Bitte informiere die Technik und nenne diese Nummer.`,
uploadErrorNetwork: "Die Verbindung zum Server wurde während des Uploads unterbrochen.",
},
adminVideoField: {
none: "Kein Video",
chooseFile: "Datei auswählen",
uploading: "Wird hochgeladen…",
remove: "Video entfernen",
uploadError: "Der Upload ist fehlgeschlagen.",
uploadErrorStatus: (status) =>
status === 413
? `Das Video wurde abgewiesen, weil es zu groß ist (HTTP 413). Es hat den Shop gar nicht erreicht — diese Grenze setzt der vorgeschaltete Proxy bzw. das CDN, nicht der Shop selbst.`
: status === 502
? `Der Server hat die Verarbeitung abgebrochen (HTTP 502). Das Backend hat die Verbindung fallen gelassen, ohne zu antworten — bei Videos meist, weil ihm beim Verarbeiten der Arbeitsspeicher ausging. Bitte informiere die Technik und nenne diese Nummer.`
: status === 503 || status === 504 || status === 522 || status === 524
? `Der Server hat die Verarbeitung abgebrochen (HTTP ${status}). Das ist eine Zeitüberschreitung: der Upload dauerte länger, als der vorgeschaltete Proxy zulässt. Ein kürzeres oder kleineres Video kommt in der Regel durch.`
: `Der Server hat unerwartet geantwortet (HTTP ${status}) — keine verwertbare Rückmeldung. Bitte informiere die Technik und nenne diese Nummer.`,
uploadErrorNetwork: "Die Verbindung zum Server wurde während des Uploads unterbrochen.",
},
adminShell: {
navDashboard: "Dashboard",
navOrders: "Bestellungen",
navReturns: "Retouren",
navProducts: "Produkte",
navHarvests: "Ernten",
navBatches: "Chargen",
navBusinessInquiries: "Firmenanfragen",
navUsers: "Benutzer",
navShipping: "Versand",
navVouchers: "Gutscheine",
navReviews: "Bewertungen",
navAuditLog: "Audit-Log",
navContent: "Inhalte",
navAriaLabel: "Admin-Navigation",
mobileNavAriaLabel: "Mobile Admin-Navigation",
openMenu: "Menü öffnen",
closeMenu: "Menü schließen",
loggedInAs: (name) => `Angemeldet als ${name}`,
logout: "Abmelden",
groupSales: "Verkauf",
groupRange: "Sortiment",
groupCustomers: "Kundschaft",
groupSite: "Seite",
paletteOpen: "Schnellsuche",
paletteShortcut: "Strg K",
palettePlaceholder: "Wohin? Seite oder Aktion suchen …",
paletteNoResults: "Nichts gefunden.",
paletteSectionPages: "Seiten",
paletteSectionActions: "Aktionen",
actionNewProduct: "Neues Produkt anlegen",
actionNewVoucher: "Neuen Gutschein anlegen",
actionNewUser: "Neues Konto anlegen",
actionNewShippingTier: "Neue Versandstufe anlegen",
actionViewShop: "Shop ansehen",
badgeWaiting: (count) => `${count} warten`,
twoFactorWarning:
"Dieses Admin-Konto hat noch keine Zwei-Faktor-Authentifizierung aktiviert, empfohlen für Konten mit Zugriff auf Bestellungen, Rückerstattungen und Kundendaten.",
twoFactorSetupLink: "Jetzt einrichten →",
},
invoicePage: {
loginRequiredError: "Bitte melde dich an, um die Rechnung zu sehen.",
backToOrders: "Zurück zu meinen Bestellungen",
downloadPdf: "PDF herunterladen",
invoiceLabel: (invoiceNumber) => `Rechnung ${invoiceNumber}`,
orderLabel: (orderNumber) => `Bestellung ${orderNumber}`,
dateLabel: "Datum:",
itemHeader: "Artikel",
quantityHeader: "Menge",
priceHeader: "Preis",
totalHeader: "Summe",
subtotalLabel: "Zwischensumme",
shippingLabel: "Versand",
freeShipping: "kostenlos",
discountLabel: "Rabatt",
netLabel: "Nettobetrag",
vatLabel: (ratePercent) => `zzgl. ${ratePercent} % Umsatzsteuer`,
smallBusinessNote: "Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.",
totalLabel: "Gesamt",
legalNote: "Diese Rechnung wurde automatisch erzeugt und ist ohne Unterschrift gültig.",
},
addressesPage: {
title: "Meine Adressen",
standard: "Standard",
setDefault: "Als Standard",
delete: "Löschen",
emptyTitle: "Noch keine Adresse hinterlegt.",
emptyDescription: "Speichere eine Lieferadresse, um beim nächsten Checkout schneller fertig zu sein.",
addNewHeading: "Neue Adresse hinzufügen",
labelField: "Bezeichnung (z.B. Zuhause)",
labelDefaultValue: "Zuhause",
useAsDefault: "Als Standardadresse verwenden",
save: "Adresse speichern",
},
account: {
eyebrow: "Kundenkonto",
loginRegisterTitle: "Anmelden oder Konto erstellen",
login: "Anmelden",
register: "Konto erstellen",
emailLabel: "E-Mail",
passwordLabel: "Passwort",
passwordMinLabel: "Passwort (mind. 8 Zeichen)",
passwordConfirmLabel: "Passwort bestätigen",
firstNameLabel: "Vorname",
lastNameLabel: "Nachname",
forgotPassword: "Passwort vergessen?",
ssoDivider: "oder",
ssoButton: "Mit Microsoft anmelden",
greeting: (name) => `Hallo, ${name}`,
verifyEmailPrompt: "Bitte bestätige deine E-Mail-Adresse. Ohne Bestätigung kannst du mit diesem Konto nicht bestellen.",
resendVerification: "Link erneut senden",
navOrders: { title: "Bestellungen", description: "Bestellhistorie, Versandstatus und Rechnungen" },
navAddresses: { title: "Adressen", description: "Lieferadressen verwalten" },
navWishlist: { title: "Wunschliste", description: "Gemerkte Produkte ansehen" },
navSecurity: {
title: "Sicherheit",
twoFactorLabel: "Zwei-Faktor-Authentifizierung",
twoFactorActive: "aktiv",
twoFactorInactive: "nicht aktiv",
},
navAdmin: { title: "Admin-Bereich", description: "Bestellungen, Produkte, Ernten, Chargen und Firmenanfragen verwalten" },
newsletterHeading: "Erntepost",
newsletterSubscribed: "Du erhältst aktuell die Erntepost.",
newsletterNotSubscribed: "Du bist aktuell nicht angemeldet.",
subscribe: "Anmelden",
unsubscribe: "Abmelden",
logoutAllDevicesHeading: "Alle Geräte abmelden",
logoutAllDevicesDescription: "Beendet alle aktiven Sitzungen, auch dieses Gerät. Du musst dich danach neu anmelden.",
logout: "Abmelden",
privacy: {
heading: "Datenschutz",
downloadDataHeading: "Meine Daten herunterladen",
downloadDataDescription: "Lade eine Kopie aller bei uns gespeicherten Daten zu deinem Konto herunter (Art. 15 DSGVO).",
downloadDataButton: "Daten herunterladen",
deleteAccountHeading: "Konto löschen",
deleteAccountDescription:
"Dein Konto und alle persönlichen Daten werden dauerhaft gelöscht. Bereits abgeschlossene Bestellungen bleiben aus gesetzlichen Aufbewahrungspflichten erhalten, aber ohne Verknüpfung zu deinem Konto.",
deleteAccountPasswordLabel: "Passwort zur Bestätigung",
deleteAccountButton: "Konto endgültig löschen",
deleteAccountConfirm: "Bist du sicher, dass du dein Konto endgültig löschen möchtest? Dies kann nicht rückgängig gemacht werden.",
deleteAccountAdminBlocked: "Admin-Konten können nicht selbst gelöscht werden. Bitte kontaktiere einen anderen Admin.",
},
},
trustBadges: {
sslEncrypted: "SSL-verschlüsselt",
securePayment: "Sichere Zahlung via Stripe",
returnPolicy: "14 Tage Widerrufsrecht",
},
passwortVergessenPage: {
backLabel: "Zurück zur Anmeldung",
title: "Passwort vergessen",
sentMessage: "Falls ein Konto mit dieser E-Mail-Adresse besteht, haben wir dir gerade einen Link zum Zurücksetzen des Passworts geschickt. Der Link ist eine Stunde gültig.",
intro: "Gib deine E-Mail-Adresse ein. Wir schicken dir einen Link zum Zurücksetzen des Passworts.",
requestLink: "Link anfordern",
},
passwortZuruecksetzenPage: {
backLabel: "Zurück zur Anmeldung",
title: "Neues Passwort vergeben",
incompleteLinkTextBefore: "Dieser Link ist unvollständig. Bitte fordere einen neuen Link über ",
incompleteLinkLabel: "Passwort vergessen",
incompleteLinkTextAfter: " an.",
newPasswordLabel: "Neues Passwort (mind. 8 Zeichen)",
save: "Passwort speichern",
},
checkoutSuccessPage: {
pendingEyebrow: "Zahlung in Bearbeitung",
successEyebrow: "Vielen Dank",
pendingTitle: "Deine Bestellung ist eingegangen.",
successTitle: "Deine Bestellung wurde bestätigt.",
orderNumberLabel: "Bestellnummer",
pendingText: "Deine Zahlung wird noch bestätigt (bei SEPA-Lastschrift kann das einige Werktage dauern). Sobald sie eingegangen ist, bekommst du eine Bestätigung per E-Mail.",
successText: "Wir bereiten dein Glas Wabenhain-Honig mit Sorgfalt vor. Sobald deine Zahlung eingegangen ist, senden wir dir eine Bestätigung per E-Mail (bei SEPA-Lastschrift kann das einige Werktage dauern).",
continueShopping: "Weiter stöbern",
trackOrder: "Bestellung verfolgen",
openEyebrow: "Zahlung nicht abgeschlossen",
openTitle: "Das hat leider nicht geklappt.",
openText: "Die Zahlung wurde abgebrochen oder abgelehnt, es wurde nichts abgebucht. Deine Bestellung ist noch für dich reserviert — versuche es einfach erneut, gern auch mit einer anderen Zahlungsart.",
cancelPayment: "Bestellung abbrechen",
notCompletedEyebrow: "Nicht abgeschlossen",
notCompletedTitle: "Diese Bestellung wurde nicht bezahlt.",
notCompletedText: "Die Zahlung ist abgelaufen oder wurde abgebrochen, es wurde nichts abgebucht. Dein Warenkorb ist noch gefüllt, du kannst jederzeit neu bestellen.",
backToCart: "Zurück zum Warenkorb",
},
checkoutCancelPage: {
eyebrow: "Abgebrochen",
title: "Deine Bestellung wurde nicht abgeschlossen.",
text: "Kein Problem, dein Warenkorb ist noch gefüllt. Du kannst den Bestellvorgang jederzeit erneut starten.",
released: "Die für dich zurückgelegte Ware steht wieder im Shop zur Verfügung.",
backToCart: "Zurück zum Warenkorb",
},
checkoutPage: {
paymentHeading: "Zahlung",
paymentBack: "Zurück zu deinen Angaben",
paymentCancelling: "Einen Moment…",
paymentCancelError: "Das hat gerade nicht geklappt. Bitte versuche es noch einmal.",
paymentLoading: "Sichere Zahlung wird geladen…",
paymentLoadError: "Das Zahlungsformular konnte nicht geladen werden. Ein Werbeblocker kann das verhindern.",
paymentUnavailable: "Die Zahlung ist gerade nicht verfügbar. Bitte versuche es später erneut oder melde dich bei uns.",
eyebrow: "Checkout",
emptyCart: "Dein Warenkorb ist leer",
yourDetails: "Deine Daten",
stepPayment: "Bezahlen",
stepsAriaLabel: "Schritte der Bestellung",
firstName: "Vorname",
lastName: "Nachname",
email: "E-Mail",
phoneOptional: "Telefonnummer (optional)",
fulfillmentLabel: "Lieferart",
shippingOption: "Versand",
pickupOption: "Abholung in Altenmünster",
deliveryTimeNote: "Übliche Lieferzeit: 2–4 Werktage nach Zahlungseingang.",
deliveryTargetAddress: "An meine Adresse",
deliveryTargetPackstation: "An eine Packstation",
packstationIntro:
"Gib die Postleitzahl ein, in deren Nähe die Packstation liegen soll. Die Standorte kommen direkt von DHL.",
packstationZipLabel: "Postleitzahl",
packstationSearchButton: "Packstationen suchen",
packstationSearching: "Suche läuft …",
packstationNoResults: "Zu dieser Postleitzahl wurde keine Packstation gefunden.",
packstationChooseHint: "Bitte wähle eine Packstation aus der Liste.",
packstationSelectedLabel: "Gewählte Packstation",
packstationChange: "Andere Packstation wählen",
packstationDistance: (meters: number) =>
meters < 1000 ? `ca. ${meters} m entfernt` : `ca. ${(meters / 1000).toFixed(1)} km entfernt`,
postNumberLabel: "DHL-Postnummer",
postNumberHint:
"Deine 6- bis 10-stellige Postnummer aus dem DHL-Kundenkonto. DHL kann ohne sie nicht an eine Packstation liefern.",
streetLabel: "Straße und Hausnummer",
zipLabel: "PLZ",
cityLabel: "Ort",
countryLabel: "Land",
shippingRegionDeNote: "Wir versenden derzeit ausschließlich innerhalb Deutschlands.",
discountCodeLabel: "Gutscheincode (optional)",
discountCodePlaceholder: "z.B. WABEN10",
isGiftLabel: "Das ist ein Geschenk",
giftMessageLabel: "Persönliche Nachricht (optional)",
giftMessagePlaceholder: "Wird von Hand auf eine Karte geschrieben und der Bestellung beigelegt.",
genericError: "Etwas ist schiefgelaufen. Bitte versuche es erneut.",
submitting: "Wird verarbeitet…",
placeOrder: "Kostenpflichtig bestellen",
paymentMethodsNote:
"Im nächsten Schritt bezahlst du sicher direkt hier auf der Seite: PayPal, Kreditkarte, SEPA-Lastschrift oder Klarna, abgewickelt über Stripe.",
yourOrderHeading: "Deine Bestellung",
shippingWithCount: (count) => `Versand (${count} Stück)`,
shippingPickup: "Versand (Abholung)",
},
cartPage: {
title: "Dein Warenkorb",
goToShop: "Zum Shop",
shippingLabel: (count) => `Versand (${count} Stück)`,
free: "kostenlos",
total: "Gesamt",
nextTierHint: (unitsUntilNext, nextPrice) =>
unitsUntilNext === 1
? `Noch 1 Stück bis zur nächsten Versandstufe (${nextPrice}).`
: `Noch ${unitsUntilNext} Stück bis zur nächsten Versandstufe (${nextPrice}).`,
pickupHint: "Abholung in Altenmünster ist immer kostenlos.",
bulkDiscountProgress: (unitsUntilNext, percent) =>
unitsUntilNext === 1
? `Noch 1 Stück bis ${percent}% Mengenrabatt.`
: `Noch ${unitsUntilNext} Stück bis ${percent}% Mengenrabatt.`,
discountLabel: "Mengenrabatt",
},
product: {
tasteMild: "mild",
tasteFloral: "floral",
tasteIntense: "kräftig",
addToCart: "In den Warenkorb",
added: "Hinzugefügt ✓",
outOfStock: "Ausverkauft",
onlyLeft: (count) => `Nur noch ${count}`,
toHoney: "Zum Honig",
toProduct: "Zum Produkt",
viewProduct: "Zum Produkt →",
},
productPage: {
reviewsLink: (count) => `${count} Bewertung${count === 1 ? "" : "en"}`,
noReviews: "Noch keine Bewertungen",
shippingHint: (price) => `Versand ab ${price} · Lieferzeit 2–4 Werktage`,
onlyLeftInStock: (count) => `Nur noch ${count} auf Lager`,
soldOut: "Ausverkauft",
currentlyUnavailable: "Aktuell nicht verfügbar, schau bald wieder vorbei.",
notifyMeLabel: "Benachrichtige mich, wenn es wieder verfügbar ist",
emailPlaceholder: "E-Mail-Adresse",
notifySubmit: "Anmelden",
removeFromWishlist: "★ Von der Wunschliste entfernen",
addToWishlist: "☆ Zur Wunschliste hinzufügen",
loginToSave: "um dieses Produkt zu merken.",
loginLinkLabel: "Melde dich an",
checklist: {
HONIG: [
"aus eigener Imkerei",
"Honig aus Deutschland",
"abgefüllt in Altenmünster",
"nachvollziehbare Charge",
"nie über 28 °C erwärmt, Enzyme bleiben erhalten",
],
KERZEN: [
"handgegossen aus reinem Bienenwachs",
"aus eigener Imkerei in Altenmünster",
"rußarmes, langes Abbrennen",
],
PROPOLIS: [
"aus eigener Imkerei in Altenmünster",
"schonend verarbeitet",
"ohne synthetische Zusätze",
],
},
detailLabels: {
description: "Beschreibung",
origin: "Herkunft",
harvest: "Ernte",
batch: "Charge",
storage: "Aufbewahrung",
note: "Hinweis",
},
storageText: "Trocken und vor Wärme geschützt lagern. Kristallisation ist ein natürlicher Qualitätsprozess.",
infantWarningText: "Aufgrund des natürlichen Sporengehalts ist Honig nicht für Säuglinge unter 12 Monaten geeignet.",
nonHoneyOriginText: "Aus eigener Imkerei und Produktion in Altenmünster.",
viewBatchOrigin: "Chargen-Herkunft dieses Glases ansehen →",
giftHint: "Verschenkst du dieses Glas? Beim Checkout kannst du eine persönliche Nachricht beilegen lassen.",
learnMoreLabel: "Mehr erfahren:",
reviewsHeading: "Bewertungen",
noReviewsForProduct: "Für dieses Produkt gibt es noch keine Bewertungen.",
loginToReview: "um dieses Produkt zu bewerten.",
alreadyReviewed: "Du hast dieses Produkt bereits bewertet.",
alreadyReviewedPending: "Du hast dieses Produkt bereits bewertet, deine Bewertung wird noch geprüft.",
onlyBuyersCanReview: "Nur Käufer:innen können dieses Produkt bewerten.",
yourRating: "Deine Bewertung",
commentPlaceholder: "Was hat dir gefallen? (optional)",
submitReview: "Bewertung abgeben",
relatedProductsHeading: "Das könnte dir auch gefallen",
recentlyViewedHeading: "Zuletzt angesehen",
starsOutOf5: (rating) => `${rating} von 5 Sternen`,
starLabel: (value) => `${value} ${value === 1 ? "Stern" : "Sterne"}`,
},
shop: {
eyebrow: "Shop",
title: "Unser Sortiment",
subtitle: "Honig, Bienenwachskerzen und Propolis aus eigener Imkerei, solange der jeweilige Bestand reicht.",
allCategories: "Alle",
sortLabel: "Sortieren:",
sortNewest: "Neu eingetroffen",
sortPriceAsc: "Preis aufsteigend",
sortPriceDesc: "Preis absteigend",
sortAvailability: "Verfügbarkeit",
apply: "Anwenden",
onlyAvailable: "Nur verfügbare",
searchInputLabel: "Im Sortiment suchen",
clearSearch: "Suche zurücksetzen",
searchResults: (query, count) => `Suchergebnisse für „${query}“ (${count})`,
noSearchResults: "Keine Treffer für deine Suche.",
noProducts: "Aktuell sind hier keine Produkte verfügbar. Schau bald wieder vorbei.",
productsHeading: "Produkte",
},
home: {
hero: {
intro: "Kleine Ernten, klare Herkunft und ehrliches Imkerhandwerk aus Altenmünster.",
ctaPrimary: "Aktuelle Ernte entdecken",
ctaSecondary: "Unsere Imkerei",
footnote: "Geerntet · abgefüllt · versendet aus eigener Imkerei",
},
currentHarvest: {
eyebrow: "Aktuell verfügbar",
title: "Die aktuelle Ernte",
subtitle: "Kleine, dokumentierte Chargen, solange der Vorrat reicht.",
},
originStory: {
eyebrow: "Herkunft",
title: "Man schmeckt, wo Honig entsteht.",
paragraph1:
"Unsere Bienenvölker stehen in und rund um Altenmünster in den Westlichen Wäldern. Wälder, Wiesen, Gärten und landwirtschaftliche Flächen prägen jede Ernte auf ihre eigene Weise.",
paragraph2:
"Deshalb betrachten wir Honig nicht als standardisiertes Produkt. Jede Ernte besitzt ihren eigenen Charakter.",
facts: ["Standort: Altenmünster", "Herkunft: Deutschland", "kleine Erntemengen", "eigene Bienenvölker", "eigene Abfüllung"],
cta: "Mehr über die Herkunft",
},
philosophy: {
eyebrow: "Philosophie",
title: "Die Wabenhain-Philosophie",
items: [
{ title: "Eigene Ernte", text: "Unser Honig stammt aus unseren eigenen Bienenvölkern." },
{ title: "Kleine Chargen", text: "Jede Ernte wird separat dokumentiert und abgefüllt." },
{ title: "Klare Herkunft", text: "Vom Bienenstand bis ins Glas nachvollziehbar." },
{ title: "Ehrliches Handwerk", text: "Keine anonyme Massenware, sondern Honig aus eigener Imkerei." },
],
},
productSpotlight: {
description: "Die erste Ernte des Jahres.",
consistency: "Konsistenz",
harvest: "Ernte",
batch: "Charge",
weight: "Gewicht",
price: "Preis",
cta: "Ernte entdecken",
},
processTimeline: {
eyebrow: "Vom Bienenvolk zum Glas",
title: "Sechs Schritte bis zu deinem Honig",
steps: [
{ number: "01", title: "Blüte", text: "Die Bienen sammeln Nektar aus der Umgebung." },
{ number: "02", title: "Honig", text: "Im Bienenvolk entsteht daraus Honig." },
{ number: "03", title: "Ernte", text: "Die reifen Honigwaben werden geerntet." },
{ number: "04", title: "Verarbeitung", text: "Der Honig wird geschleudert und sorgfältig verarbeitet." },
{ number: "05", title: "Abfüllung", text: "Jede Charge wird dokumentiert und in Altenmünster abgefüllt." },
{ number: "06", title: "Dein Glas", text: "Direkt von der Imkerei zu dir." },
],
},
regionalSection: {
eyebrow: "Regionale Imkerei",
title: "Aus Altenmünster. Für die Region. Und darüber hinaus.",
paragraph1: "Wabenhain ist eine kleine Imkerei aus Altenmünster im Landkreis Augsburg.",
paragraph2:
"Unsere Produktion ist bewusst überschaubar. Dadurch kennen wir unsere Bienenvölker, Standorte und Ernten und können jede Charge nachvollziehbar dokumentieren.",
ctaAbout: "Über Wabenhain",
ctaPickup: "Honig vor Ort abholen",
},
sustainability: {
eyebrow: "Verantwortung",
title: "Verantwortung beginnt im Kleinen.",
items: [
{ title: "Wiederverwendbare Gläser", text: "Saubere Wabenhain-Gläser können bei uns zurückgegeben werden." },
{ title: "Kurze Wege", text: "Abholung direkt bei der Imkerei möglich." },
{ title: "Eigene Produktion", text: "Ernte und Abfüllung erfolgen direkt durch uns." },
{ title: "Bienenhaltung", text: "Unsere Bienenvölker sind Teil der regionalen Landschaft und Landwirtschaft." },
],
},
businessTeaser: {
eyebrow: "Für Unternehmen",
title: "Ein regionales Geschenk, das in Erinnerung bleibt.",
paragraph: "Wabenhain-Honig eignet sich als hochwertiges Geschenk für Kunden, Mitarbeiter und Geschäftspartner.",
cta: "Firmengeschenke anfragen",
},
reviews: {
eyebrow: "Stimmen",
title: "Was unsere Kund:innen sagen",
googleReviewsCount: (rating, count) => `${rating} ★ · ${count} Google-Rezensionen`,
seeAllOnGoogle: "Alle Bewertungen auf Google ansehen →",
starsOutOf5: (rating) => `${rating} von 5 Sternen`,
testimonials: [
{
quote: "Extrem cremiger Honig und geschmacklich deutlich intensiver als das, was man aus dem Supermarkt kennt.",
author: "Julia, Augsburg",
},
{ quote: "Man schmeckt wirklich, dass hier jede Charge mit Sorgfalt entsteht.", author: "Markus, Altenmünster" },
{
quote: "Schönes Geschenk für Kunden. Die Rückmeldungen waren durchweg begeistert.",
author: "Firmenkunde, Region Augsburg",
},
],
},
newsletter: {
eyebrow: "Erntepost",
title: "Erfahre als Erstes von der nächsten Ernte.",
description:
"Neue Ernten gibt es nur einige Male im Jahr. Mit unserer Erntepost erfährst du, sobald neuer Honig verfügbar ist.",
successMessage: "Danke! Bitte bestätige die Anmeldung über den Link in deiner E-Mail.",
emailPlaceholder: "[email protected]",
subscribe: "Abonnieren",
subscribing: "Wird gesendet…",
errorMessage: "Da ist etwas schiefgelaufen. Bitte versuche es erneut.",
consentBeforeLink: "Mit der Anmeldung stimmst du unserer ",
consentAfterLink: " zu. Abmeldung jederzeit möglich.",
privacyLinkLabel: "Datenschutzerklärung",
},
},
};