feat: add cross-organization member search and template cloning functionality

This commit is contained in:
T. Zehetbauer
2026-04-01 10:15:35 +02:00
parent d3db316a68
commit fd8c2cc32a
36 changed files with 9025 additions and 94 deletions

View File

@@ -0,0 +1,306 @@
{
"nav": {
"overview": "Übersicht",
"clubs": "Vereine",
"hierarchy": "Hierarchie",
"memberSearch": "Mitgliedersuche",
"events": "Veranstaltungen",
"reporting": "Berichte",
"templates": "Vorlagen",
"statistics": "Statistik",
"settings": "Einstellungen"
},
"pages": {
"overviewTitle": "Verbandsverwaltung",
"clubsTitle": "Verbandsverwaltung - Vereine",
"hierarchyTitle": "Verbandsverwaltung - Hierarchie",
"hierarchyDescription": "Verwalten Sie die Organisationsstruktur Ihres Verbands",
"memberSearchTitle": "Verbandsverwaltung - Mitgliedersuche",
"memberSearchDescription": "Suchen Sie Mitglieder in allen verknüpften Organisationen",
"eventsTitle": "Verbandsverwaltung - Veranstaltungen",
"eventsDescription": "Veranstaltungen aller verknüpften Organisationen anzeigen und filtern",
"reportingTitle": "Verbandsverwaltung - Berichte",
"reportingDescription": "Aggregierte Berichte und Kennzahlen aller Organisationen im Verband",
"templatesTitle": "Verbandsverwaltung - Vorlagen",
"templatesDescription": "Geteilte Vorlagen aus der Verbandshierarchie klonen und verwenden",
"statisticsTitle": "Verbandsverwaltung - Statistik",
"settingsTitle": "Verbandsverwaltung - Einstellungen"
},
"common": {
"search": "Suchen",
"filter": "Filtern",
"cancel": "Abbrechen",
"save": "Speichern",
"delete": "Löschen",
"edit": "Bearbeiten",
"add": "Hinzufügen",
"create": "Erstellen",
"back": "Zurück",
"next": "Weiter",
"saving": "Wird gespeichert...",
"name": "Name",
"email": "E-Mail",
"phone": "Telefon",
"location": "Ort",
"status": "Status",
"actions": "Aktionen",
"action": "Aktion",
"type": "Typ",
"date": "Datum",
"description": "Beschreibung",
"noEntries": "Keine Einträge vorhanden.",
"allTypes": "Alle Typen",
"allStatuses": "Alle Status",
"allOrganizations": "Alle Organisationen",
"organization": "Organisation",
"archived": "Archiviert",
"showArchived": "Archivierte anzeigen",
"hideArchived": "Archivierte ausblenden"
},
"pagination": {
"page": "Seite {page} von {totalPages} ({total} Einträge)",
"back": "Zurück",
"next": "Weiter"
},
"dashboard": {
"title": "Verbandsverwaltung Übersicht",
"subtitle": "Vereine, Beiträge, Kontakte und Aufgaben verwalten",
"activeClubs": "Aktive Vereine",
"totalMembers": "Gesamtmitglieder",
"openFees": "Offene Beiträge",
"invoiceCount": "{count} Rechnungen",
"openTasks": "Offene Aufgaben",
"clubTypes": "Vereinstypen",
"archivedClubs": "Archivierte Vereine",
"clubsWithoutContact": "Vereine ohne Ansprechpartner",
"allClubsWithContact": "Alle Vereine haben mindestens einen Ansprechpartner.",
"addContact": "Kontakt hinzufügen"
},
"clubs": {
"searchPlaceholder": "Verein suchen...",
"newClub": "Neuer Verein",
"title": "Vereine ({count})",
"noClubs": "Keine Vereine vorhanden",
"createFirst": "Erstellen Sie Ihren ersten Verein, um loszulegen.",
"members": "Mitglieder",
"contact": "Kontakt",
"founded": "Gegr. {year}"
},
"clubForm": {
"basicData": "Grunddaten",
"name": "Name *",
"shortName": "Kurzname",
"associationType": "Vereinstyp",
"noType": "— Kein Typ —",
"foundingYear": "Gründungsjahr",
"memberCount": "Mitgliederanzahl",
"address": "Adresse",
"street": "Straße",
"zip": "PLZ",
"city": "Ort",
"website": "Website",
"bankData": "Bankdaten",
"accountHolder": "Kontoinhaber",
"iban": "IBAN",
"bic": "BIC",
"updateClub": "Verein aktualisieren",
"createClub": "Verein erstellen",
"clubUpdated": "Verein aktualisiert",
"clubCreated": "Verein erstellt",
"errorSaving": "Fehler beim Speichern"
},
"contacts": {
"title": "Ansprechpartner",
"addContact": "Kontakt hinzufügen",
"noContacts": "Keine Ansprechpartner vorhanden.",
"firstName": "Vorname *",
"lastName": "Nachname *",
"role": "Funktion",
"update": "Aktualisieren",
"created": "Kontakt erstellt",
"updated": "Kontakt aktualisiert",
"deleted": "Kontakt gelöscht",
"errorCreating": "Fehler beim Erstellen",
"errorUpdating": "Fehler beim Aktualisieren",
"errorDeleting": "Fehler beim Löschen"
},
"billing": {
"title": "Beitragsabrechnungen",
"feeType": "Beitragsart",
"year": "Jahr",
"amount": "Betrag",
"dueDate": "Fällig",
"paymentMethod": "Zahlung",
"noBillings": "Keine Beitragsabrechnungen vorhanden.",
"showAll": "Alle anzeigen",
"showOpen": "Nur offene",
"markAsPaid": "Als bezahlt markieren",
"paid": "Beitrag als bezahlt markiert",
"deleted": "Beitragsabrechnung gelöscht",
"errorUpdating": "Fehler beim Aktualisieren",
"errorDeleting": "Fehler beim Löschen"
},
"notes": {
"title": "Notizen & Aufgaben ({count} offen)",
"noNotes": "Keine Notizen vorhanden.",
"dueDate": "Fällig: {date}",
"completed": "Erledigt ({count})",
"markDone": "Als erledigt markieren",
"taskCompleted": "Aufgabe erledigt",
"noteDeleted": "Notiz gelöscht",
"errorUpdating": "Fehler beim Aktualisieren",
"errorDeleting": "Fehler beim Löschen"
},
"hierarchy": {
"structure": "Organisationsstruktur",
"directChildren": "Direkte Unterverbände",
"totalOrganizations": "Organisationen gesamt",
"availableToLink": "Verfügbar zum Verknüpfen",
"addOrganization": "Organisation hinzufügen",
"availableOrganizations": "Verfügbare Organisationen",
"selectOrganization": "Organisation auswählen...",
"link": "Verknüpfen",
"linking": "Wird verknüpft...",
"linked": "Organisation erfolgreich verknüpft",
"unlinkTitle": "Verknüpfung lösen",
"unlinked": "Verknüpfung gelöst",
"directCount": "{count} direkt",
"rootLevel": "Dachverband",
"subLevel": "Unterverband",
"clubLevel": "Verein",
"errorLinking": "Fehler beim Verknüpfen der Organisation",
"errorUnlinking": "Fehler beim Entfernen der Verknüpfung"
},
"memberSearch": {
"searchPlaceholder": "Name, E-Mail oder Mitgliedsnr. suchen...",
"title": "Mitglieder ({count})",
"noMembers": "Keine Mitglieder gefunden",
"tryOtherSearch": "Versuchen Sie einen anderen Suchbegriff.",
"noMembersInHierarchy": "In den verknüpften Organisationen sind noch keine Mitglieder vorhanden.",
"joinDate": "Eintritt",
"memberStatus": {
"active": "Aktiv",
"inactive": "Inaktiv",
"pending": "Ausstehend",
"resigned": "Ausgetreten",
"excluded": "Ausgeschlossen",
"deceased": "Verstorben"
}
},
"transfer": {
"title": "Mitglied transferieren",
"description": "{name} wird von {source} in eine andere Organisation verschoben.",
"loadingPreview": "Lade Transfervorschau...",
"targetOrganization": "Zielorganisation",
"selectTarget": "Organisation auswählen...",
"keepSepaData": "SEPA-Bankdaten (IBAN/BIC) übernehmen",
"keepSepaHelp": "Bankverbindung wird übernommen, Mandat muss im Zielverein neu bestätigt werden.",
"reason": "Grund (optional)",
"reasonPlaceholder": "z.B. Umzug, Vereinswechsel...",
"transferring": "Wird transferiert...",
"confirm": "Transferieren",
"transferred": "Mitglied erfolgreich transferiert",
"errorTransfer": "Fehler beim Transfer",
"activeEnrollments": "{count} aktive Kurseinschreibung(en)",
"retained": "bleibt erhalten",
"openInvoices": "{count} offene Rechnung(en)",
"remainsAtSource": "verbleibt beim Quellverein",
"activeMandates": "{count} aktive(s) SEPA-Mandat(e)",
"willReset": "wird zurückgesetzt",
"newsletters": "{count} Newsletter-Abonnement(s)",
"resetSection": "Wird zurückgesetzt:",
"memberNumberReset": "Mitgliedsnr. #{number} — Neuvergabe im Zielverein nötig",
"duesCategoryReset": "Beitragskategorie — muss im Zielverein neu zugewiesen werden",
"sepaStatusReset": "SEPA-Mandatstatus → \"ausstehend\" (Neubestätigung nötig)",
"noSideEffects": "Keine aktiven Verknüpfungen gefunden",
"noSideEffectsHelp": "Transfer kann ohne Seiteneffekte durchgeführt werden."
},
"events": {
"title": "Veranstaltungen ({count})",
"noEvents": "Keine Veranstaltungen gefunden",
"tryOtherFilters": "Versuchen Sie andere Filterkriterien.",
"noEventsInHierarchy": "In den verknüpften Organisationen sind noch keine Veranstaltungen vorhanden.",
"event": "Veranstaltung",
"capacity": "Kapazität",
"fee": "Gebühr",
"shared": "Geteilt",
"sharedOnly": "Nur geteilte",
"eventStatus": {
"planned": "Geplant",
"open": "Offen",
"full": "Ausgebucht",
"running": "Laufend",
"completed": "Abgeschlossen",
"cancelled": "Abgesagt"
}
},
"reporting": {
"perOrganization": "Bericht pro Organisation",
"noOrganizations": "Keine Organisationen vorhanden",
"hierarchyEmpty": "Die Hierarchie enthält noch keine Organisationen.",
"organizations": "Organisationen",
"activeMembers": "Aktive Mitglieder",
"ofTotal": "von {total} gesamt",
"newThisYear": "Neue Mitglieder (Jahr)",
"upcomingEvents": "Anstehende Termine",
"activeCourses": "Aktive Kurse",
"openInvoices": "Offene Rechnungen",
"invoiceCount": "{count} Rechnungen",
"level": "Ebene",
"activeMembersShort": "Aktive Mitgl.",
"totalShort": "Gesamt",
"newYearShort": "Neu (Jahr)",
"courses": "Kurse",
"eventsShort": "Termine",
"openInvoicesShort": "Offene Rechn.",
"openAmount": "Offener Betrag"
},
"templates": {
"sharedTemplates": "Geteilte Vorlagen",
"noTemplates": "Keine geteilten Vorlagen vorhanden",
"templatesHelp": "Vorlagen, die von anderen Organisationen in Ihrer Hierarchie geteilt werden, erscheinen hier.",
"filterAll": "Alle",
"filterNewsletter": "Newsletter",
"filterDocument": "Dokumente",
"templateType": "Template-Typ",
"created": "Erstellt",
"clone": "Klonen",
"cloneTitle": "Vorlage klonen",
"cloneDescription": "Erstellen Sie eine Kopie der Vorlage \"{name}\" in Ihrer Organisation.",
"cloneName": "Name der Kopie",
"cloneNamePlaceholder": "Name der neuen Vorlage",
"cloning": "Wird geklont...",
"cloneConfirm": "Vorlage klonen",
"cloned": "Vorlage wurde erfolgreich geklont",
"errorCloning": "Fehler beim Klonen der Vorlage",
"newsletter": "Newsletter",
"document": "Dokument",
"templateTypes": {
"generic": "Allgemein",
"member_card": "Mitgliedsausweis",
"invoice": "Rechnung",
"receipt": "Quittung",
"certificate": "Urkunde",
"letter": "Brief",
"label": "Etikett",
"report": "Bericht"
}
},
"settings": {
"title": "Einstellungen",
"subtitle": "Funktionen, Vereinstypen und Beitragsarten verwalten",
"roles": "Funktionen (Rollen)",
"types": "Vereinstypen",
"feeTypes": "Beitragsarten",
"descriptionOptional": "Beschreibung (optional)"
},
"statistics": {
"title": "Statistik",
"subtitle": "Entwicklung der Mitgliedsvereine und Gesamtmitglieder im Zeitverlauf",
"clubDevelopment": "Vereinsentwicklung",
"memberDevelopment": "Mitgliederentwicklung",
"clubsLabel": "Vereine",
"membersLabel": "Mitglieder",
"helpText": "Die Statistiken werden automatisch aus den Vereinsdaten und der Verbandshistorie berechnet."
}
}