Files
myeasycms-v2/apps/web/i18n/messages/de/common.json
Zaid Marzguioui a1719671df
Some checks failed
Workflow / ⚫️ Test (push) Has been cancelled
Workflow / ʦ TypeScript (push) Has been cancelled
fix: QA remediation — all 19 audit fixes (C+ → A-)
## Summary
Fixes all 31  FAILs and most ⚠️ WARNs from the QA audit (113/33⚠️/31).

## Changes

### FIX 1 — Loading Skeleton
- Replace full-screen GlobalLoader with PageBody-scoped animate-pulse skeleton
- Sidebar stays visible during page transitions

### FIX 2 — Status Badges i18n (15 files, 12 label maps)
- Add *_LABEL_KEYS maps to lib/status-badges.ts (i18n keys instead of German)
- Update all 15 consumer files to use t(*_LABEL_KEYS[status])
- Add status namespace to finance.json (de+en)
- Add registration_open to events.json status (de+en)
- Add status block to cms.json events section (de+en)
- Add missing pending/bounced keys to newsletter.json (de+en)
- Add active key to courses.json status (de+en)

### FIX 3 — Error Page i18n
- Replace 4 hardcoded German strings with useTranslations('common')
- Add error.* keys to common.json (de+en)

### FIX 4 — Account Not Found i18n
- Convert AccountNotFound to async Server Component
- Resolve default props from getTranslations('common')
- Add accountNotFoundCard.* keys to common.json (de+en)

### FIX 5 — Publish Toggle Button (6 strings + 2 bugs)
- Add useTranslations('siteBuilder'), replace 6 German strings
- Fix: add response.ok check before router.refresh()
- Fix: add disabled={isPending} to AlertDialogAction
- Fix: use Base UI render= prop pattern (not asChild)
- Add pages.hide/publish/hideTitle/publishTitle/hideDesc/publishDesc/
  toggleError/cancelAction to siteBuilder.json (de+en)

### FIX 6 — Cancel Booking Button (7 strings + bugs)
- Add useTranslations('bookings'), replace all strings
- Fix: use render= prop pattern, add disabled={isPending}
- Add cancel.* and calendar.* keys to bookings.json (de+en)

### FIX 7 — Portal Pages i18n (5 files, ~40 strings)
- Create i18n/messages/de/portal.json and en/portal.json
- Add 'portal' to i18n/request.ts namespace list
- Rewrite portal/page.tsx, invite/page.tsx, profile/page.tsx,
  documents/page.tsx with getTranslations('portal')
- Fix portal-linked-accounts.tsx: add useTranslations, replace
  hardcoded strings, fix AlertDialogTrigger render= pattern

### FIX 8 — Invitations View (1 string)
- Replace hardcoded string with t('invitations.emptyDescription')
- Add key to members.json (de+en)

### FIX 9 — Dead Navigation Link
- Comment out memberPortal nav entry (page does not exist)

### FIX 10 — Calendar Button Accessibility
- Add aria-label + aria-hidden to all icon buttons in bookings/calendar
- Add aria-label + aria-hidden to all icon buttons in courses/calendar
- Add previousMonth/nextMonth/backToBookings/backToCourses to
  bookings.json and courses.json (de+en)

### FIX 11 — Pagination Aria Labels
- Add aria-label to icon-only pagination buttons in finance/page.tsx
- Fix Link/Button nesting in newsletter/page.tsx, add aria-labels
- Add pagination.* to common.json (de+en)
- Add common.previous/next to newsletter.json (de+en)

### FIX 12 — Site Builder Type Safety
- Add SitePage interface, replace Record<string,unknown> in page.tsx
- Add SitePost interface, replace Record<string,unknown> in posts/page.tsx
- Remove String() casts on typed properties

### FIX 14 — EmptyState Heading Level
- Change <h3> to <h2> in empty-state.tsx (WCAG heading sequence)

### FIX 16 — CmsPageShell Nullish Coalescing
- Change description ?? <AppBreadcrumbs /> to !== undefined check

### FIX 17 — Meetings Protocol Hardcoded Strings
- Replace 5 hardcoded German strings with t() in protocol detail page
- Add notFound/back/backToList/statusPublished/statusDraft to meetings.json

### FIX 18 — Finance Toolbar Hardcoded Strings
- Replace toolbar filter labels with t() calls in finance/page.tsx

### FIX 19 — Admin Audit Hardcoded Strings
- Add getTranslations('cms.audit') to audit page
- Replace title, description, column headers, pagination labels
- Add description/timestamp/paginationPrevious/paginationNext to cms.json

## Verification
- tsc --noEmit: 0 errors
- Turbopack: Compiled successfully in 9.3s
- Lint: 0 new errors introduced
- All 8 audit verification checks pass
2026-04-02 01:18:15 +02:00

223 lines
9.4 KiB
JSON

{
"homeTabLabel": "Startseite",
"homeTabDescription": "Willkommen auf Ihrer Startseite",
"accountMembers": "Teammitglieder",
"membersTabDescription": "Hier können Sie die Mitglieder Ihres Teams verwalten.",
"billingTabLabel": "Abrechnung",
"billingTabDescription": "Abonnement und Abrechnung verwalten",
"dashboardTabLabel": "Dashboard",
"settingsTabLabel": "Einstellungen",
"profileSettingsTabLabel": "Profil",
"subscriptionSettingsTabLabel": "Abonnement",
"dashboardTabDescription": "Ein Überblick über die Aktivitäten und Leistung Ihres Kontos.",
"settingsTabDescription": "Verwalten Sie Ihre Einstellungen und Präferenzen.",
"emailAddress": "E-Mail-Adresse",
"password": "Passwort",
"modalConfirmationQuestion": "Sind Sie sicher, dass Sie fortfahren möchten?",
"imageInputLabel": "Klicken Sie hier, um ein Bild hochzuladen",
"cancel": "Abbrechen",
"clear": "Löschen",
"notFound": "Nicht gefunden",
"accountNotFound": "Konto nicht gefunden",
"accountNotFoundDescription": "Das angeforderte Konto existiert nicht oder Sie haben keine Berechtigung darauf zuzugreifen.",
"backToDashboard": "Zum Dashboard",
"backToHomePage": "Zurück zur Startseite",
"goBack": "Erneut versuchen",
"genericServerError": "Entschuldigung, ein Fehler ist aufgetreten.",
"genericServerErrorHeading": "Entschuldigung, bei der Verarbeitung Ihrer Anfrage ist ein Fehler aufgetreten. Bitte kontaktieren Sie uns, wenn das Problem weiterhin besteht.",
"pageNotFound": "Seite nicht gefunden",
"pageNotFoundSubHeading": "Die gesuchte Seite existiert nicht oder wurde verschoben. Überprüfen Sie die URL oder kehren Sie zur Startseite zurück.",
"genericError": "Etwas ist schiefgelaufen",
"genericErrorSubHeading": "Es ist ein unerwarteter Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, kontaktieren Sie unser Support-Team.",
"anonymousUser": "Anonymer Benutzer",
"tryAgain": "Erneut versuchen",
"theme": "Design",
"lightTheme": "Hell",
"darkTheme": "Dunkel",
"systemTheme": "System",
"expandSidebar": "Seitenleiste einblenden",
"collapseSidebar": "Seitenleiste ausblenden",
"documentation": "Dokumentation",
"pricing": "Preise",
"getStarted": "Jetzt starten",
"getStartedWithPlan": "Mit {plan} starten",
"retry": "Wiederholen",
"contactUs": "Kontakt",
"loading": "Wird geladen. Bitte warten...",
"yourAccounts": "Ihre Konten",
"continueKey": "Weiter",
"skip": "Überspringen",
"info": "Info",
"signedInAs": "Angemeldet als",
"pageOfPages": "Seite {page} von {total}",
"showingRecordCount": "{pageSize} von {totalCount} Einträgen",
"noData": "Keine Daten vorhanden",
"pageNotFoundHeading": "404",
"errorPageHeading": "500",
"notifications": "Benachrichtigungen",
"noNotifications": "Keine Benachrichtigungen",
"justNow": "Gerade eben",
"newVersionAvailable": "Neue Version verfügbar",
"newVersionAvailableDescription": "Eine neue Version der Anwendung ist verfügbar. Bitte laden Sie die Seite neu, um die neuesten Aktualisierungen zu erhalten.",
"newVersionSubmitButton": "Neu laden und aktualisieren",
"back": "Zurück",
"search": "Suchen",
"searchPlaceholder": "Suchen...",
"previous": "Zurück",
"next": "Weiter",
"recordCount": "{total} Datensätze",
"filesTitle": "Dateiverwaltung",
"filesSubtitle": "Dateien hochladen und verwalten",
"filesSearch": "Datei suchen...",
"deleteFile": "Datei löschen",
"deleteFileConfirm": "Möchten Sie diese Datei wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"routes": {
"account": "Konto",
"billing": "Abrechnung",
"dashboard": "Dashboard",
"settings": "Einstellungen",
"profile": "Profil",
"people": "Personen",
"clubMembers": "Vereinsmitglieder",
"memberApplications": "Aufnahmeanträge",
"memberPortal": "Mitgliederportal",
"memberCards": "Mitgliedsausweise",
"memberDues": "Beitragskategorien",
"accessAndRoles": "Zugänge & Rollen",
"courseManagement": "Kursverwaltung",
"courseList": "Alle Kurse",
"courseCalendar": "Kurskalender",
"courseInstructors": "Kursleiter",
"courseLocations": "Standorte",
"eventManagement": "Veranstaltungen",
"eventList": "Alle Veranstaltungen",
"eventRegistrations": "Anmeldungen",
"holidayPasses": "Ferienpässe",
"bookingManagement": "Buchungsverwaltung",
"bookingList": "Alle Buchungen",
"bookingCalendar": "Belegungskalender",
"bookingRooms": "Zimmer",
"bookingGuests": "Gäste",
"financeManagement": "Finanzen",
"financeOverview": "Übersicht",
"financeInvoices": "Rechnungen",
"financeSepa": "SEPA-Einzüge",
"financePayments": "Zahlungen",
"documentManagement": "Dokumente",
"documentOverview": "Übersicht",
"documentGenerate": "Generieren",
"documentTemplates": "Vorlagen",
"files": "Dateiverwaltung",
"newsletterManagement": "Newsletter",
"newsletterCampaigns": "Kampagnen",
"newsletterNew": "Neuer Newsletter",
"newsletterTemplates": "Vorlagen",
"siteBuilder": "Website",
"sitePages": "Seiten",
"sitePosts": "Beiträge",
"siteSettings": "Einstellungen",
"customModules": "Benutzerdefinierte Module",
"moduleList": "Alle Module",
"fisheriesManagement": "Fischerei",
"fisheriesOverview": "Übersicht",
"fisheriesWaters": "Gewässer",
"fisheriesLeases": "Pachten",
"fisheriesCatchBooks": "Fangbücher",
"fisheriesPermits": "Erlaubnisscheine",
"fisheriesCompetitions": "Wettbewerbe",
"meetingProtocols": "Sitzungsprotokolle",
"meetingsOverview": "Übersicht",
"meetingsProtocols": "Protokolle",
"meetingsTasks": "Offene Aufgaben",
"associationManagement": "Verbandsverwaltung",
"associationOverview": "Übersicht",
"associationHierarchy": "Organisationsstruktur",
"associationMemberSearch": "Verbandsweite Suche",
"associationEvents": "Geteilte Veranstaltungen",
"associationReporting": "Berichte",
"associationTemplates": "Geteilte Vorlagen",
"administration": "Administration",
"accountSettings": "Kontoeinstellungen"
},
"roles": {
"owner": {
"label": "Inhaber"
},
"member": {
"label": "Mitglied"
}
},
"otp": {
"requestVerificationCode": "Bestätigungscode anfordern",
"requestVerificationCodeDescription": "Wir müssen Ihre Identität bestätigen. Wir senden einen Bestätigungscode an {email}.",
"sendingCode": "Code wird gesendet...",
"sendVerificationCode": "Bestätigungscode senden",
"enterVerificationCode": "Bestätigungscode eingeben",
"codeSentToEmail": "Wir haben einen Bestätigungscode an {email} gesendet.",
"verificationCode": "Bestätigungscode",
"enterCodeFromEmail": "Geben Sie den 6-stelligen Code ein, den wir Ihnen per E-Mail gesendet haben.",
"verifying": "Wird überprüft...",
"verifyCode": "Code überprüfen",
"requestNewCode": "Neuen Code anfordern",
"errorSendingCode": "Fehler beim Senden des Codes. Bitte versuchen Sie es erneut."
},
"cookieBanner": {
"title": "Wir verwenden Cookies 🍪",
"description": "Diese Website verwendet Cookies, um Ihnen die bestmögliche Erfahrung zu bieten.",
"reject": "Ablehnen",
"accept": "Akzeptieren"
},
"dashboard": {
"recentActivity": "Letzte Aktivität",
"recentActivityDescription": "Aktuelle Buchungen und Veranstaltungen",
"recentActivityEmpty": "Noch keine Aktivitäten",
"recentActivityEmptyDescription": "Aktuelle Buchungen und Veranstaltungen werden hier angezeigt.",
"quickActions": "Schnellaktionen",
"quickActionsDescription": "Häufig verwendete Aktionen",
"newMember": "Neues Mitglied",
"newCourse": "Neuer Kurs",
"createNewsletter": "Newsletter erstellen",
"newBooking": "Neue Buchung",
"newEvent": "Neue Veranstaltung",
"bookingFrom": "Buchung vom",
"members": "Mitglieder",
"courses": "Kurse",
"openInvoices": "Offene Rechnungen",
"newsletters": "Newsletter",
"membersDescription": "{total} gesamt, {pending} ausstehend",
"coursesDescription": "{total} gesamt, {participants} Teilnehmer",
"openInvoicesDescription": "Entwürfe zum Versenden",
"newslettersDescription": "Erstellt"
},
"dropzone": {
"success": "{count} Datei(en) erfolgreich hochgeladen",
"error": "Fehler beim Hochladen von {count} Datei(en)",
"errorMessageUnknown": "Ein unbekannter Fehler ist aufgetreten.",
"errorMessageFileUnknown": "Unbekannte Datei",
"errorMessageFileSizeUnknown": "Unbekannte Dateigröße",
"errorMessageFileSizeTooSmall": "Datei ist zu klein",
"errorMessageFileSizeTooLarge": "Datei ist zu groß",
"uploading": "Wird hochgeladen...",
"uploadFiles": "{count} Datei(en) hochladen",
"maxFileSize": "Maximale Dateigröße: {size}",
"maxFiles": "Sie können maximal {count} Dateien hochladen. Bitte entfernen Sie {files} Dateien.",
"dragAndDrop": "Ziehen und ablegen oder",
"select": "Dateien auswählen",
"toUpload": "zum Hochladen"
},
"error": {
"title": "Etwas ist schiefgelaufen",
"description": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
"retry": "Erneut versuchen",
"toDashboard": "Zum Dashboard"
},
"pagination": {
"previous": "Vorherige Seite",
"next": "Nächste Seite"
},
"accountNotFoundCard": {
"title": "Konto nicht gefunden",
"description": "Das angeforderte Konto existiert nicht oder Sie haben keine Berechtigung darauf zuzugreifen.",
"action": "Zum Dashboard"
}
}