feat: enhance accessibility and testing with data-test attributes and improve error handling
Some checks failed
Workflow / ⚫️ Test (push) Has been cancelled
Workflow / ʦ TypeScript (push) Has been cancelled

This commit is contained in:
T. Zehetbauer
2026-04-01 10:46:44 +02:00
parent 3bcc5c70a3
commit abac22feb1
55 changed files with 1622 additions and 128 deletions

View File

@@ -0,0 +1,71 @@
{
"nav": {
"bookings": "Buchungen",
"calendar": "Kalender",
"rooms": "Zimmer",
"guests": "Gäste",
"newBooking": "Neue Buchung"
},
"list": {
"title": "Buchungen",
"searchPlaceholder": "Gast oder Zimmer suchen...",
"newBooking": "Neue Buchung",
"noBookings": "Keine Buchungen vorhanden",
"createFirst": "Erstellen Sie Ihre erste Buchung.",
"activeBookings": "Aktive Buchungen",
"guest": "Gast",
"room": "Zimmer",
"checkIn": "Check-in",
"checkOut": "Check-out",
"nights": "Nächte",
"price": "Preis"
},
"detail": {
"notFound": "Buchung nicht gefunden",
"guestInfo": "Gastinformationen",
"roomInfo": "Zimmerinformationen",
"bookingDetails": "Buchungsdetails",
"extras": "Extras"
},
"form": {
"room": "Zimmer *",
"selectRoom": "— Zimmer wählen —",
"guest": "Gast",
"checkIn": "Check-in *",
"checkOut": "Check-out *",
"adults": "Erwachsene",
"children": "Kinder",
"notes": "Notizen",
"created": "Buchung erfolgreich erstellt",
"errorCreating": "Fehler beim Erstellen"
},
"status": {
"pending": "Ausstehend",
"confirmed": "Bestätigt",
"checked_in": "Eingecheckt",
"checked_out": "Ausgecheckt",
"cancelled": "Storniert",
"no_show": "Nicht erschienen"
},
"rooms": {
"title": "Zimmer",
"newRoom": "Neues Zimmer",
"noRooms": "Keine Zimmer vorhanden",
"name": "Name",
"type": "Typ",
"capacity": "Kapazität",
"price": "Preis/Nacht"
},
"guests": {
"title": "Gäste",
"newGuest": "Neuer Gast",
"noGuests": "Keine Gäste vorhanden",
"name": "Name",
"email": "E-Mail",
"phone": "Telefon",
"bookings": "Buchungen"
},
"calendar": {
"title": "Belegungskalender"
}
}

View File

@@ -0,0 +1,120 @@
{
"nav": {
"courses": "Kurse",
"newCourse": "Neuer Kurs",
"calendar": "Kalender",
"categories": "Kategorien",
"instructors": "Kursleiter",
"locations": "Standorte",
"statistics": "Statistiken"
},
"pages": {
"coursesTitle": "Kurse",
"newCourseTitle": "Neuer Kurs",
"calendarTitle": "Kurskalender",
"categoriesTitle": "Kurskategorien",
"instructorsTitle": "Kursleiter",
"locationsTitle": "Standorte",
"statisticsTitle": "Kurs-Statistiken"
},
"list": {
"searchPlaceholder": "Kurs suchen...",
"title": "Kurse ({count})",
"noCourses": "Keine Kurse vorhanden",
"createFirst": "Erstellen Sie Ihren ersten Kurs, um loszulegen.",
"courseNumber": "Kursnr.",
"courseName": "Kursname",
"startDate": "Beginn",
"endDate": "Ende",
"participants": "Teilnehmer",
"fee": "Gebühr"
},
"detail": {
"notFound": "Kurs nicht gefunden",
"participants": "Teilnehmer",
"sessions": "Termine",
"viewAllParticipants": "Alle Teilnehmer anzeigen",
"viewAttendance": "Anwesenheit anzeigen",
"noParticipants": "Noch keine Teilnehmer.",
"noSessions": "Noch keine Termine.",
"addParticipant": "Teilnehmer hinzufügen"
},
"form": {
"basicData": "Grunddaten",
"courseNumber": "Kursnummer",
"courseName": "Kursname *",
"description": "Beschreibung",
"schedule": "Zeitplan",
"startDate": "Startdatum",
"endDate": "Enddatum",
"registrationDeadline": "Anmeldeschluss",
"capacity": "Kapazität",
"maxParticipants": "Max. Teilnehmer",
"minParticipants": "Min. Teilnehmer",
"fee": "Gebühr (€)",
"reducedFee": "Ermäßigte Gebühr (€)",
"statusSection": "Status",
"courseStatus": "Kursstatus",
"created": "Kurs erfolgreich erstellt",
"updated": "Kurs aktualisiert",
"errorCreating": "Fehler beim Erstellen des Kurses",
"errorUpdating": "Fehler beim Aktualisieren"
},
"status": {
"planned": "Geplant",
"open": "Offen",
"running": "Laufend",
"completed": "Abgeschlossen",
"cancelled": "Abgesagt"
},
"enrollment": {
"enrolled": "Eingeschrieben",
"waitlisted": "Warteliste",
"cancelled": "Storniert",
"completed": "Abgeschlossen",
"enrolledAt": "Eingeschrieben am"
},
"attendance": {
"title": "Anwesenheit",
"present": "Anwesend",
"absent": "Abwesend",
"excused": "Entschuldigt",
"session": "Termin"
},
"calendar": {
"title": "Kurskalender",
"courseDay": "Kurstag",
"free": "Frei",
"today": "Heute",
"weekdays": ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"],
"months": [
"Januar",
"Februar",
"März",
"April",
"Mai",
"Juni",
"Juli",
"August",
"September",
"Oktober",
"November",
"Dezember"
]
},
"categories": {
"title": "Kategorien",
"newCategory": "Neue Kategorie",
"noCategories": "Keine Kategorien vorhanden."
},
"instructors": {
"title": "Kursleiter",
"newInstructor": "Neuer Kursleiter",
"noInstructors": "Keine Kursleiter vorhanden."
},
"locations": {
"title": "Standorte",
"newLocation": "Neuer Standort",
"noLocations": "Keine Standorte vorhanden."
}
}

View File

@@ -0,0 +1,81 @@
{
"nav": {
"documents": "Dokumente",
"generate": "Generieren",
"templates": "Vorlagen"
},
"overview": {
"title": "Dokumente",
"subtitle": "Dokumente generieren und Vorlagen verwalten",
"generate": "Erstellen",
"manageTemplates": "Vorlagen verwalten"
},
"types": {
"member_card": "Mitgliedsausweis",
"invoice": "Rechnung",
"label": "Etiketten",
"report": "Bericht",
"letter": "Brief",
"certificate": "Zertifikat"
},
"typeDescriptions": {
"member_card": "Mitgliedsausweise mit Foto und QR-Code generieren",
"invoice": "Professionelle Rechnungen für Mitglieder und Dienstleistungen",
"label": "Adressetiketten für Serienbriefe und Versand",
"report": "Statistische Auswertungen und Übersichten",
"letter": "Serienbriefe und individuelle Schreiben",
"certificate": "Teilnahmebescheinigungen und Urkunden"
},
"generate": {
"title": "Dokument generieren",
"documentType": "Dokumenttyp",
"titleLabel": "Titel / Bezeichnung",
"format": "Format",
"orientation": "Ausrichtung",
"portrait": "Hochformat",
"landscape": "Querformat",
"comingSoon": "Demnächst verfügbar",
"generating": "Wird generiert...",
"generateButton": "Generieren",
"success": "Dokument erfolgreich erstellt!",
"downloaded": "Datei heruntergeladen",
"downloadAgain": "Erneut herunterladen",
"error": "Fehler bei der Generierung",
"backToDocuments": "Zurück zu Dokumente",
"cancel": "Abbrechen",
"hint": "Hinweis",
"memberCardHint": "Es werden Mitgliedsausweise für alle aktiven Mitglieder generiert.",
"labelHint": "Es werden Adressetiketten für alle aktiven Mitglieder generiert.",
"reportHint": "Es wird ein Mitgliederbericht mit aktuellen Daten generiert."
},
"templates": {
"title": "Dokumentvorlagen",
"subtitle": "Vorlagen für Mitgliedsausweise, Rechnungen, Etiketten und mehr",
"newTemplate": "Neue Vorlage",
"noTemplates": "Keine Vorlagen vorhanden",
"createFirst": "Erstellen Sie Ihre erste Dokumentvorlage.",
"allTemplates": "Alle Vorlagen ({count})",
"name": "Name",
"type": "Typ",
"description": "Beschreibung"
},
"card": {
"title": "MITGLIEDSAUSWEIS",
"memberSince": "Mitglied seit",
"dateOfBirth": "Geb.-Datum",
"address": "Adresse",
"validUntil": "Gültig",
"issuedOn": "Ausgestellt"
},
"report": {
"title": "Mitgliederbericht",
"total": "Gesamt:"
},
"errors": {
"accountNotFound": "Konto nicht gefunden",
"unknownType": "Unbekannter Dokumenttyp",
"underDevelopment": "ist noch in Entwicklung",
"dbError": "DB-Fehler",
"noActiveMembers": "Keine aktiven Mitglieder"
}
}

View File

@@ -0,0 +1,67 @@
{
"nav": {
"events": "Veranstaltungen",
"newEvent": "Neue Veranstaltung",
"registrations": "Anmeldungen",
"holidayPasses": "Ferienpässe"
},
"list": {
"title": "Veranstaltungen",
"newEvent": "Neue Veranstaltung",
"noEvents": "Keine Veranstaltungen vorhanden",
"createFirst": "Erstellen Sie Ihre erste Veranstaltung.",
"upcoming": "Bevorstehend",
"totalRegistrations": "Anmeldungen gesamt"
},
"detail": {
"notFound": "Veranstaltung nicht gefunden",
"date": "Datum",
"time": "Uhrzeit",
"location": "Ort",
"registrations": "Anmeldungen",
"description": "Beschreibung",
"noRegistrations": "Noch keine Anmeldungen",
"parentName": "Elternteil"
},
"form": {
"basicData": "Grunddaten",
"name": "Name der Veranstaltung *",
"description": "Beschreibung",
"dateTime": "Datum & Zeit",
"eventDate": "Datum *",
"startTime": "Startzeit",
"endDate": "Enddatum",
"location": "Ort",
"contact": "Kontakt",
"contactName": "Ansprechpartner",
"contactEmail": "E-Mail",
"contactPhone": "Telefon",
"participantsAndFees": "Teilnehmer & Kosten",
"capacity": "Max. Teilnehmer",
"minAge": "Mindestalter",
"maxAge": "Höchstalter",
"fee": "Gebühr (€)",
"registrationDeadline": "Anmeldeschluss",
"status": "Status",
"created": "Veranstaltung erfolgreich erstellt",
"errorCreating": "Fehler beim Erstellen der Veranstaltung"
},
"status": {
"planned": "Geplant",
"open": "Offen",
"full": "Ausgebucht",
"running": "Laufend",
"completed": "Abgeschlossen",
"cancelled": "Abgesagt"
},
"registrationStatus": {
"pending": "Ausstehend",
"confirmed": "Bestätigt",
"waitlisted": "Warteliste",
"cancelled": "Storniert"
},
"holidayPasses": {
"title": "Ferienpässe",
"noPasses": "Keine Ferienpässe vorhanden"
}
}

View File

@@ -0,0 +1,113 @@
{
"nav": {
"overview": "Finanzen",
"invoices": "Rechnungen",
"sepa": "SEPA-Einzüge",
"payments": "Zahlungen",
"newInvoice": "Neue Rechnung",
"newBatch": "Neuer Einzug"
},
"dashboard": {
"title": "Finanzen Übersicht",
"subtitle": "Rechnungen, SEPA-Einzüge und Zahlungen verwalten",
"openInvoices": "Offene Rechnungen",
"overdueInvoices": "Überfällige Rechnungen",
"totalRevenue": "Gesamteinnahmen",
"sepaBatches": "SEPA-Einzüge"
},
"invoices": {
"title": "Rechnungen",
"newInvoice": "Neue Rechnung",
"noInvoices": "Keine Rechnungen vorhanden",
"createFirst": "Erstellen Sie Ihre erste Rechnung.",
"invoiceNumber": "Rechnungsnr.",
"recipient": "Empfänger",
"issueDate": "Rechnungsdatum",
"dueDate": "Fälligkeitsdatum",
"amount": "Betrag",
"notFound": "Rechnung nicht gefunden"
},
"invoiceForm": {
"title": "Rechnungsdaten",
"invoiceNumber": "Rechnungsnummer *",
"issueDate": "Rechnungsdatum",
"dueDate": "Fälligkeitsdatum *",
"recipient": "Empfänger",
"recipientName": "Name *",
"recipientAddress": "Adresse",
"lineItems": "Positionen",
"addLineItem": "+ Position hinzufügen",
"itemDescription": "Beschreibung *",
"quantity": "Menge",
"unitPrice": "Einzelpreis (€)",
"removeItem": "Position entfernen",
"amounts": "Beträge",
"taxRate": "MwSt.-Satz (%)",
"subtotal": "Zwischensumme (netto)",
"tax": "MwSt. ({rate}%)",
"total": "Gesamtbetrag",
"notes": "Anmerkungen",
"created": "Rechnung erfolgreich erstellt",
"errorCreating": "Fehler beim Erstellen der Rechnung"
},
"invoiceStatus": {
"draft": "Entwurf",
"sent": "Versendet",
"paid": "Bezahlt",
"overdue": "Überfällig",
"cancelled": "Storniert",
"credited": "Gutgeschrieben"
},
"sepa": {
"title": "SEPA-Einzüge",
"newBatch": "Neuer Einzug",
"noBatches": "Keine SEPA-Einzüge vorhanden",
"createFirst": "Erstellen Sie Ihren ersten SEPA-Einzug.",
"directDebit": "Lastschrift",
"creditTransfer": "Überweisung",
"executionDate": "Ausführungsdatum",
"totalAmount": "Gesamtbetrag",
"itemCount": "Positionen",
"downloadXml": "XML herunterladen",
"notFound": "Einzug nicht gefunden"
},
"sepaBatchForm": {
"title": "SEPA-Einzug erstellen",
"batchType": "Typ",
"directDebit": "Lastschrift (SEPA Core)",
"creditTransfer": "Überweisung",
"description": "Beschreibung",
"descriptionPlaceholder": "z.B. Mitgliedsbeiträge Q1 2026",
"executionDate": "Ausführungsdatum *",
"executionDateRequired": "Ausführungsdatum ist erforderlich",
"created": "SEPA-Einzug erstellt",
"errorCreating": "Fehler beim Erstellen"
},
"sepaBatchStatus": {
"draft": "Entwurf",
"ready": "Bereit",
"submitted": "Eingereicht",
"executed": "Abgeschlossen",
"failed": "Fehlgeschlagen",
"cancelled": "Abgebrochen"
},
"sepaItemStatus": {
"pending": "Ausstehend",
"success": "Verarbeitet",
"failed": "Fehlgeschlagen",
"rejected": "Abgelehnt"
},
"payments": {
"title": "Zahlungsübersicht",
"paidInvoices": "Bezahlte Rechnungen",
"openInvoices": "Offene Rechnungen",
"overdueInvoices": "Überfällige Rechnungen",
"sepaBatches": "SEPA-Einzüge"
},
"common": {
"cancel": "Abbrechen",
"creating": "Wird erstellt...",
"membershipFee": "Mitgliedsbeitrag",
"sepaDirectDebit": "SEPA Einzug"
}
}

View File

@@ -0,0 +1,80 @@
{
"nav": {
"overview": "Übersicht",
"protocols": "Protokolle",
"tasks": "Aufgaben",
"newProtocol": "Neues Protokoll"
},
"pages": {
"overviewTitle": "Sitzungsprotokolle",
"protocolsTitle": "Sitzungsprotokolle - Protokolle",
"tasksTitle": "Sitzungsprotokolle - Aufgaben"
},
"dashboard": {
"title": "Sitzungsprotokolle Übersicht",
"subtitle": "Protokolle, Tagesordnungspunkte und Aufgaben verwalten",
"totalProtocols": "Protokolle gesamt",
"publishedProtocols": "Veröffentlicht",
"draftProtocols": "Entwürfe",
"overdueTasks": "Überfällige Aufgaben",
"recentProtocols": "Neueste Protokolle",
"noRecentProtocols": "Noch keine Protokolle vorhanden."
},
"protocol": {
"title": "Titel *",
"meetingDate": "Sitzungsdatum *",
"meetingType": "Sitzungsart",
"location": "Ort",
"created": "Protokoll erfolgreich erstellt",
"updated": "Protokoll aktualisiert",
"published": "Protokoll veröffentlicht",
"errorSaving": "Fehler beim Speichern des Protokolls",
"notFound": "Protokoll nicht gefunden",
"noProtocols": "Keine Protokolle vorhanden",
"createFirst": "Erstellen Sie Ihr erstes Sitzungsprotokoll, um loszulegen."
},
"protocolList": {
"searchPlaceholder": "Protokoll suchen...",
"title": "Protokolle ({count})",
"date": "Datum",
"titleColumn": "Titel",
"type": "Sitzungsart",
"locationColumn": "Ort",
"statusColumn": "Status",
"published": "Veröffentlicht",
"draft": "Entwurf"
},
"items": {
"agendaItems": "Tagesordnungspunkte",
"noItems": "Keine Tagesordnungspunkte vorhanden.",
"addItem": "Punkt hinzufügen",
"statusUpdated": "Status aktualisiert",
"deleted": "Tagesordnungspunkt gelöscht",
"deleteConfirm": "Tagesordnungspunkt wirklich löschen?",
"errorUpdating": "Fehler beim Aktualisieren",
"errorDeleting": "Fehler beim Löschen",
"dueDate": "Fällig: {date}",
"responsible": "Verantwortlich: {name}",
"status": {
"open": "Offen",
"in_progress": "In Bearbeitung",
"done": "Erledigt",
"cancelled": "Abgebrochen"
}
},
"tasks": {
"title": "Offene Aufgaben ({count})",
"noTasks": "Keine offenen Aufgaben",
"allTasksDone": "Alle Aufgaben sind erledigt.",
"overdue": "Überfällig",
"fromProtocol": "aus Protokoll"
},
"meetingTypes": {
"regular": "Ordentliche Sitzung",
"extraordinary": "Außerordentliche Sitzung",
"board": "Vorstandssitzung",
"general_assembly": "Mitgliederversammlung",
"committee": "Ausschusssitzung",
"other": "Sonstige"
}
}

View File

@@ -0,0 +1,76 @@
{
"nav": {
"newsletters": "Newsletter",
"templates": "Vorlagen",
"newNewsletter": "Neuer Newsletter"
},
"list": {
"title": "Newsletter",
"subtitle": "Newsletter erstellen und versenden",
"newNewsletter": "Neuer Newsletter",
"noNewsletters": "Keine Newsletter vorhanden",
"createFirst": "Erstellen Sie Ihren ersten Newsletter, um loszulegen.",
"subject": "Betreff",
"noSubject": "(Kein Betreff)",
"recipients": "Empfänger",
"created": "Erstellt",
"sent": "Gesendet",
"totalSent": "Gesendet",
"totalRecipients": "Empfänger gesamt"
},
"detail": {
"title": "Newsletter Details",
"backToList": "Zurück zu Newsletter",
"sendNewsletter": "Newsletter versenden",
"recipientsSection": "Empfänger",
"sentCount": "Gesendet",
"failedCount": "Fehlgeschlagen",
"noRecipients": "Keine Empfänger hinzugefügt. Fügen Sie Empfänger aus Ihrer Mitgliederliste hinzu.",
"recipientName": "Name",
"recipientEmail": "E-Mail",
"recipientStatus": "Status",
"notFound": "Newsletter nicht gefunden"
},
"form": {
"content": "Newsletter-Inhalt",
"subject": "Betreff *",
"bodyHtml": "Inhalt (HTML) *",
"bodyHtmlPlaceholder": "<h1>Hallo!</h1><p>Ihr Newsletter-Inhalt...</p>",
"bodyText": "Nur-Text-Version",
"bodyTextHelp": "Nur-Text-Fallback für E-Mail-Clients ohne HTML-Unterstützung",
"schedule": "Zeitplan",
"scheduledDate": "Geplanter Versand (optional)",
"scheduleHelp": "Leer lassen, um den Newsletter als Entwurf zu speichern.",
"created": "Newsletter erfolgreich erstellt",
"errorCreating": "Fehler beim Erstellen des Newsletters"
},
"templates": {
"title": "Newsletter-Vorlagen",
"subtitle": "Wiederverwendbare Vorlagen für Newsletter",
"newTemplate": "Neue Vorlage",
"noTemplates": "Keine Vorlagen vorhanden",
"createFirst": "Erstellen Sie Ihre erste Newsletter-Vorlage, um sie in Kampagnen wiederzuverwenden.",
"allTemplates": "Alle Vorlagen ({count})",
"name": "Name",
"subject": "Betreff",
"variables": "Variablen"
},
"status": {
"draft": "Entwurf",
"scheduled": "Geplant",
"sending": "Wird versendet",
"sent": "Gesendet",
"failed": "Fehlgeschlagen"
},
"recipientStatus": {
"pending": "Ausstehend",
"sent": "Gesendet",
"failed": "Fehlgeschlagen",
"bounced": "Unzustellbar"
},
"common": {
"cancel": "Abbrechen",
"creating": "Wird erstellt...",
"create": "Newsletter erstellen"
}
}

View File

@@ -0,0 +1,53 @@
{
"nav": {
"pages": "Seiten",
"posts": "Beiträge",
"settings": "Einstellungen"
},
"pages": {
"title": "Seiten",
"newPage": "Neue Seite",
"noPages": "Keine Seiten vorhanden",
"createFirst": "Erstellen Sie Ihre erste Seite.",
"pageTitle": "Seitentitel *",
"slug": "URL-Pfad",
"slugPlaceholder": "Leer lassen für automatische Generierung...",
"membersOnly": "Nur für Mitglieder",
"createAndEdit": "Seite erstellen & Editor öffnen",
"pageCreated": "Seite erstellt — Editor wird geöffnet",
"errorCreating": "Fehler beim Erstellen",
"notFound": "Seite nicht gefunden",
"published": "Seite veröffentlicht",
"error": "Fehler"
},
"posts": {
"title": "Beiträge",
"newPost": "Neuer Beitrag",
"noPosts": "Keine Beiträge vorhanden",
"createFirst": "Erstellen Sie Ihren ersten Beitrag.",
"postTitle": "Titel *",
"content": "Beitragsinhalt (HTML erlaubt)...",
"excerpt": "Kurzfassung",
"postCreated": "Beitrag erstellt",
"errorCreating": "Fehler"
},
"settings": {
"title": "Einstellungen",
"saved": "Einstellungen gespeichert",
"error": "Fehler"
},
"editor": {
"publish": "Veröffentlichen",
"unpublish": "Zurückziehen"
},
"portal": {
"loginSuccess": "Erfolgreich angemeldet",
"membersArea": "Mitgliederbereich"
},
"blocks": {
"news": "Neuigkeiten",
"events": "Veranstaltungen",
"loginError": "Fehler bei der Anmeldung",
"connectionError": "Verbindungsfehler"
}
}