diff --git a/frontend/src/i18n/locales/de-CH.json b/frontend/src/i18n/locales/de-CH.json index 044b747f..94ca87e3 100644 --- a/frontend/src/i18n/locales/de-CH.json +++ b/frontend/src/i18n/locales/de-CH.json @@ -112,7 +112,8 @@ "errorLoadingRequests": "Fehler bim Lade vo de offene Afroge", "accessRequested": "Zugriff isch aagfragt worde.", "accessRequestPending": "Der Zugriff auf diesen Verein ist beantragt. Bitte haben Sie etwas Geduld.", - "accessRequestFailed": "Zugriffsafrag het nöd chönne gstellt werde." + "accessRequestFailed": "Zugriffsafrag het nöd chönne gstellt werde.", + "mobileSelectHint": "Bitte wähl zerscht en Verein us, zum d App uf em Smartphone z nutze." }, "auth": { "login": "Aamelde", diff --git a/frontend/src/i18n/locales/de-extended.json b/frontend/src/i18n/locales/de-extended.json index 03e0b13c..bb9a9d07 100644 --- a/frontend/src/i18n/locales/de-extended.json +++ b/frontend/src/i18n/locales/de-extended.json @@ -6,6 +6,7 @@ "common": { "loading": "Lade...", "save": "Speichern", + "saved": "Gespeichert", "cancel": "Abbrechen", "delete": "Löschen", "edit": "Bearbeiten", @@ -24,12 +25,15 @@ "reset": "Zurücksetzen", "all": "Alle", "today": "Heute", + "time": "Zeit", "new": "Neu", "update": "Aktualisieren", + "move": "Verschieben", "refresh": "Neu laden", "create": "Erstellen", "remove": "Entfernen", "select": "Auswählen", + "download": "herunterladen", "choose": "Wählen", "apply": "Anwenden", "clear": "Löschen", @@ -37,7 +41,6 @@ "view": "Anzeigen", "name": "Name", "date": "Datum", - "time": "Zeit", "status": "Status", "type": "Typ", "description": "Beschreibung", @@ -47,6 +50,7 @@ "disabled": "Deaktiviert", "required": "Erforderlich", "optional": "Optional", + "in": "in", "min": "Min", "minutes": "Minuten", "hours": "Stunden", @@ -54,8 +58,11 @@ "weeks": "Wochen", "months": "Monate", "years": "Jahre", - "period": "Zeitraum" + "ok": "OK", + "period": "Zeitraum", + "saving": "Speichere..." }, + "unknown": "Unbekannt", "navigation": { "home": "Startseite", "members": "Mitglieder", @@ -64,6 +71,8 @@ "approvals": "Freigaben", "statistics": "Trainings-Statistik", "tournaments": "Turniere", + "clubTournaments": "Vereinsturniere", + "tournamentParticipations": "Turnierteilnahmen", "schedule": "Spielpläne", "clubSettings": "Vereinseinstellungen", "predefinedActivities": "Vordefinierte Aktivitäten", @@ -72,6 +81,8 @@ "logs": "System-Logs", "memberTransfer": "Mitgliederübertragung", "myTischtennisAccount": "myTischtennis-Account", + "clickTtAccount": "HTTV / click-TT Account", + "clickTtBrowser": "HTTV / click-TT", "personalSettings": "Persönliche Einstellungen", "logout": "Ausloggen", "login": "Einloggen", @@ -94,7 +105,15 @@ "noAccess": "Für diesen Verein wurde Dir noch kein Zugriff gestattet.", "requestAccess": "Zugriff beantragen", "openRequests": "Offene Anfragen auf Zugriff", - "accessRequestPending": "Der Zugriff auf diesen Verein ist beantragt. Bitte haben Sie etwas Geduld." + "title": "Verein", + "openAccessRequests": "Offene Anfragen auf Zugriff", + "diary": "Trainingstagebuch", + "accessDenied": "Zugriff auf den Verein nicht gestattet.", + "errorLoadingRequests": "Fehler beim Laden der offenen Anfragen", + "accessRequested": "Zugriff wurde angefragt.", + "accessRequestPending": "Der Zugriff auf diesen Verein ist beantragt. Bitte haben Sie etwas Geduld.", + "accessRequestFailed": "Zugriffsanfrage konnte nicht gestellt werden.", + "mobileSelectHint": "Bitte wähle zuerst einen Verein aus, um die App auf dem Smartphone zu nutzen." }, "auth": { "login": "Einloggen", @@ -165,7 +184,12 @@ "cancel": "Abbrechen", "successfullyLoaded": "Erfolgreich geladen", "recordsFound": "Datensätze gefunden", - "recordsDisplayed": "angezeigt" + "recordsDisplayed": "angezeigt", + "invalidFile": "Ungültige Datei", + "pleaseSelectImageFile": "Bitte wähle eine Bilddatei aus.", + "fileTooLarge": "Datei zu groß", + "imageMaxSize": "Das Bild darf maximal 5 MB groß sein.", + "note": "Hinweis" }, "members": { "title": "Mitglieder", @@ -208,7 +232,92 @@ "memberFormHandedOver": "Mitgliedsformular ausgehändigt", "adultReleaseApproved": "Freigabe Erwachsene", "adultReserveApproved": "Ersatz bei Erwachsenen", + "wantsToPlay": "Will spielen", "trainingGroups": "Trainingsgruppen", + "noGroupsAssigned": "Keine Gruppen zugeordnet", + "noGroupsAvailable": "Keine Gruppen verfügbar", + "addGroup": "Gruppe hinzufügen...", + "remove": "Entfernen", + "image": "Bild", + "selectFile": "Datei auswählen", + "camera": "Kamera", + "imagePreview": "Vorschau des Mitgliedsbildes", + "change": "Ändern", + "create": "Anlegen", + "clearFields": "Felder leeren", + "showInactiveMembers": "Inaktive Mitglieder anzeigen", + "showTrainingParticipationsColumn": "Spalte „Trainingsteilnahmen“ anzeigen", + "ageGroup": "Altersklasse", + "ttSeasonFilter": "Saison (Stichtag)", + "ttSeasonCurrentTag": "aktuell", + "ttSeasonNextTag": "kommend", + "ttStichtagHint": "Stichtag 1.1. (DTTB). Jungen: nur J-Klassen. Mädchen: J und M möglich.", + "lastTrainingFilter": "Letztes Training", + "lastTrainingFilterHasDate": "Mit erfasstem Datum", + "lastTrainingFilterNoDate": "Ohne letztes Training", + "lastTrainingFilterNotInTraining": "„Nicht mehr im Training“", + "lastTrainingFilterHint": "AK-Spalte: laufende und nächste Saison. Weitere Details (letztes Training, Teilnahmen) auch beim Überfahren der Zeile.", + "rowTooltipSeparator": "·", + "ttAgeClassCol": "AK (TT)", + "ttAdult": "Erwachsene (kein Jugend nach Stichtag)", + "ttFilterGroupJ": "Mädchen & Jungen (gemischt)", + "ttFilterGroupM": "Mädchen (nur weiblich)", + "adults": "Erwachsene (18+)", + "j19": "J19", + "j17": "J17 (17 und jünger)", + "j15": "J15", + "j13": "J13", + "j11": "J11", + "j9": "J9", + "m19": "M19", + "m15": "M15", + "m13": "M13", + "m11": "M11", + "m9": "M9", + "clearFilters": "Filter zurücksetzen", + "imageInternet": "Bild (Inet?)", + "testMember": "Testm.", + "name": "Name, Vorname", + "ttrQttr": "TTR / QTTR", + "address": "Adresse", + "active": "Aktiv", + "actions": "Aktionen", + "phoneNumberShort": "Telefon-Nr.", + "emailAddressShort": "Email-Adresse", + "trainingParticipations": "Trainingsteilnahmen", + "memberImage": "Mitgliedsbild", + "inactive": "inaktiv", + "sixOrMoreParticipations": "6 oder mehr Trainingsteilnahmen", + "threeOrMoreParticipations": "3 oder mehr Trainingsteilnahmen", + "noTestMembership": "Keine Testmitgliedschaft mehr", + "formHandedOver": "Mitgliedsformular ausgehändigt", + "deactivateMember": "Mitglied deaktivieren", + "notes": "Notizen", + "exercises": "Übungen", + "memberImages": "Mitgliedsbilder", + "testMembershipRemoved": "Testmitgliedschaft entfernt.", + "errorRemovingTestMembership": "Fehler beim Entfernen der Testmitgliedschaft.", + "formMarkedAsHandedOver": "Mitgliedsformular als ausgehändigt markiert.", + "errorMarkingForm": "Fehler beim Markieren des Formulars.", + "deactivateMemberTitle": "Mitglied deaktivieren", + "deactivateMemberConfirm": "Möchten Sie \"{name}\" wirklich deaktivieren?", + "memberDeactivated": "Mitglied deaktiviert", + "errorDeactivatingMember": "Fehler beim Deaktivieren des Mitglieds", + "errorSavingMember": "Fehler beim Speichern des Mitglieds", + "errorAddingToGroup": "Fehler beim Hinzufügen zur Gruppe", + "errorRemovingFromGroup": "Fehler beim Entfernen aus der Gruppe", + "imageUpdated": "Bild wurde aktualisiert", + "errorRotatingImage": "Fehler beim Drehen des Bildes", + "imageDeleted": "Bild wurde gelöscht.", + "errorDeletingImage": "Bild konnte nicht gelöscht werden", + "primaryImageUpdated": "Hauptbild wurde aktualisiert.", + "errorSettingPrimaryImage": "Hauptbild konnte nicht gesetzt werden", + "errorUploadingImage": "Bild konnte nicht hochgeladen werden", + "errorLoadingImage": "Fehler beim Laden des Bildes", + "phoneList": "Telefonliste.pdf", + "errorLoadingTrainingParticipations": "Fehler beim Laden der Trainingsteilnahmen", + "errorUpdatingRatings": "Fehler beim Aktualisieren der TTR/QTTR-Werte", + "errorTransfer": "Fehler bei der Übertragung", "subtitle": "Mitglieder suchen, filtern und direkt bearbeiten.", "closeEditor": "Editor schließen", "visibleMembers": "Sichtbare Mitglieder", @@ -220,11 +329,17 @@ "scopeTest": "Probe", "scopeActiveTest": "Aktiv + Probe", "scopeNeedsForm": "Formular ungeprüft", + "scopeActiveDataIncomplete": "Aktiv + Daten unvollständig", + "scopeDataIncomplete": "Daten unvollständig", "scopeInactive": "Inaktiv", + "searchAndFilter": "Suche und Filter", + "bulkActions": "Sammelaktionen", "resultsVisible": "Mitglieder sichtbar", "editHint": "Ein Klick auf eine Zeile öffnet den Editor.", "editorCreateHint": "Neues Mitglied anlegen und Kontaktdaten direkt erfassen.", "editorEditHint": "Daten von {name} bearbeiten.", + "editorAssignTrainingGroupHint": "Bitte mindestens eine Trainingsgruppe zuordnen.", + "editorRecommendedEntry": "Empfohlener Eintrag", "transferSuccessTitle": "Übertragung erfolgreich", "transferErrorTitle": "Fehler bei der Übertragung", "clickTtRequestPending": "Click-TT-Antrag läuft", @@ -269,17 +384,36 @@ "sortFirstName": "Vorname", "sortBirthday": "Geburtstag", "sortAge": "Alter", + "ageRange": "Alter von - bis", + "ageFromPlaceholder": "von", + "ageToPlaceholder": "bis", "age": "Alter", + "dataQuality": "Datenqualität", + "dataQualityComplete": "Daten vollständig", + "dataIssueBirthdate": "Geburtsdatum fehlt", + "dataIssuePhone": "Telefon fehlt", + "dataIssueEmail": "E-Mail fehlt", + "dataIssueAddress": "Adresse fehlt", + "dataIssueStreet": "Straße fehlt", + "dataIssuePostalCode": "PLZ fehlt", + "dataIssueCity": "Ort fehlt", + "dataIssueGender": "Geschlecht ungeklärt", + "dataIssueTrainingGroup": "Trainingsgruppe fehlt", "openTasks": "Offene Aufgaben", "noOpenTasks": "Keine offenen Aufgaben", "taskVerifyForm": "Formular prüfen", "taskReviewTrialStatus": "Probe-Status prüfen", "taskCheckTrainingStatus": "Trainingsstatus prüfen", + "taskCheckDataQuality": "Datenqualität prüfen", + "taskAssignTrainingGroup": "Trainingsgruppe zuordnen", "taskCheckClickTt": "Click-TT-Spielberechtigung prüfen", "taskActionVerify": "Prüfen", "taskActionMarkRegular": "Regulär setzen", + "taskActionReview": "Öffnen", "taskActionRequest": "Anfragen", "toggleSortDirection": "Sortierrichtung wechseln", + "showTtrHistory": "TTR-Historie anzeigen", + "missingTtrHistoryId": "Keine myTischtennis-ID hinterlegt", "sortLastTraining": "Letztes Training", "sortOpenTasks": "Offene Aufgaben", "exportPreview": "Exportvorschau", @@ -348,33 +482,125 @@ "applySuggestion": "Vorschlag übernehmen", "skipSuggestion": "Ohne Vorschlag fortfahren", "createNewDate": "Neues Datum anlegen", + "activeTrainingDay": "Aktiver Trainingstag", + "trainingDaySection": "Trainingstag", + "trainingDayChecklist": "Abschlusscheck", "trainingStart": "Trainingsbeginn", "trainingEnd": "Trainingsende", + "trainingWindow": "Trainingsfenster", + "trainingWindowUnset": "Noch nicht gesetzt", + "groupsLabel": "Gruppen", + "groupsSection": "Gruppen", "createDate": "Datum anlegen", "editTrainingTimes": "Trainingszeiten bearbeiten", "updateTimes": "Zeiten aktualisieren", "groupManagement": "Gruppenverwaltung", "createGroups": "Gruppen erstellen", "trainingPlan": "Trainingsplan", + "planActivitiesCount": "Plan-Aktivitäten", + "timeblocksCount": "Zeitblöcke", + "planEmptyState": "Im Trainingsplan ist noch nichts eingetragen.", + "planAddHint": "Neue Plan-Elemente fügst du über die Aktionen oben hinzu.", "startTime": "Startzeit", "group": "Gruppe", "timeblock": "Zeitblock", "assignParticipants": "Teilnehmer zuordnen", "addTimeblock": "Zeitblock", "activities": "Aktivitäten", + "freeActivities": "Freie Aktivitäten", + "noFreeActivitiesYet": "Noch keine freien Aktivitäten erfasst.", "addActivity": "Aktivität hinzufügen", "bookAccident": "Unfall buchen", "activity": "Aktivität", "duration": "Dauer", "activityImage": "Aktivitätsbild", - "activityDrawing": "Aktivitätszeichnung" + "activityDrawing": "Aktivitätszeichnung", + "today": "Heute", + "existingGroups": "Vorhandene Gruppen", + "leader": "Leiter", + "deleteGroup": "Gruppe löschen", + "numberOfGroups": "Anzahl Gruppen", + "addGroup": "Gruppe hinzufügen", + "activityOrTimeblock": "Aktivität / Zeitblock", + "durationMinutes": "Dauer (Min)", + "standardActivities": "Standard-Aktivitäten", + "standardDurationShort": "Min", + "standardActivityAddError": "Standard-Aktivität konnte nicht hinzugefügt werden.", + "addGroupActivity": "Gruppen-Aktivität hinzufügen", + "addGroupButton": "+ Gruppe", + "all": "Alle", + "selectGroup": "Gruppe auswählen...", + "activityPlaceholder": "Aktivität", + "assignShort": "Zuordnen", + "statusReadyShort": "Bereit", + "statusOpenShort": "Offen", + "openPlanItemsLabel": "Plan-Status", + "openPlanItems": "{count} offen", + "unassignedPlanItems": "{count} offen", + "durationExampleLong": "z.B. 2x7 oder 3*5", + "durationExampleShort": "z.B. 2x7", + "showImage": "Bild/Zeichnung anzeigen", + "participants": "Teilnehmer", + "searchParticipants": "Teilnehmer suchen", + "filterAll": "Alle", + "filterPresent": "Anwesend", + "filterAbsent": "Abwesend", + "filterExcused": "Entschuldigt", + "filterTest": "Probe", + "participantStatusNone": "Kein Status", + "participantStatusExcused": "Entschuldigt", + "participantStatusCancelled": "Abgesagt", + "quickAdd": "+ Schnell hinzufügen", + "selectTags": "Tags auswählen", + "createDrawing": "Übungszeichnung erstellen", + "overallActivity": "Gesamt-Aktivität", + "editActivity": "Aktivität bearbeiten", + "editGroupActivity": "Gruppen-Aktivität bearbeiten", + "assignParticipantsForGroupActivity": "Teilnehmer für Gruppen-Aktivität zuordnen", + "delete": "Löschen", + "min": "Min", + "errorLoadingPredefinedActivities": "Fehler beim Laden der vordefinierten Aktivitäten", + "selectParticipantAndNote": "Bitte wählen Sie einen Teilnehmer aus und geben Sie einen Notiztext ein.", + "selectGroupAndActivity": "Bitte wählen Sie eine Gruppe und geben Sie eine Aktivität ein.", + "dateCannotBeDeleted": "Datum kann nicht gelöscht werden", + "dateCannotBeDeletedDetails": "Es sind noch Inhalte vorhanden (Trainingplan, Teilnehmer, Aktivitäten, Unfälle oder Notizen).", + "confirmDelete": "Löschen bestätigen", + "confirmDeleteDate": "Möchten Sie dieses Datum wirklich löschen?", + "confirmDeleteDateDetails": "Alle zugehörigen Daten werden ebenfalls gelöscht.", + "noParticipants": "Keine Teilnehmer für diesen Trainingstag vorhanden.", + "mustCreateAtLeastTwoGroups": "Beim ersten Erstellen müssen mindestens 2 Gruppen erstellt werden!", + "oneGroupAdded": "1 Gruppe wurde erfolgreich hinzugefügt!", + "groupsCreated": "{count} Gruppen wurden erfolgreich erstellt!", + "errorCreatingGroups": "Fehler beim Erstellen der Gruppen", + "confirmDeleteGroup": "Möchten Sie die Gruppe \"{name}\" wirklich löschen?", + "groupDeletedSuccessfully": "Gruppe wurde erfolgreich gelöscht!", + "errorDeletingGroup": "Fehler beim Löschen der Gruppe", + "errorCreatingActivity": "Fehler beim Erstellen der Aktivität", + "trainingPlanAsPDF": "Trainingsplan als PDF", + "trainingPlanPdfShort": "Ablaufplan als PDF", + "trainingDayAsPDF": "Trainingstag als PDF herunterladen", + "trainingDayAsPDFShort": "Trainingstag als PDF", + "trainingDaySummaryPdfShort": "Teilnehmerübersicht als PDF", + "minutes": "Minuten", + "formHandedOver": "Mitgliedsformular ausgehändigt", + "errorOccurred": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.", + "trainingTimesUpdated": "Trainingszeiten erfolgreich aktualisiert.", + "noActiveTrainingDay": "Kein Trainingstag ausgewählt.", + "statusReady": "Zeiten und Trainingsplan sind gepflegt.", + "statusEmpty": "Dieser Trainingstag ist noch leer.", + "statusInProgress": "Dieser Trainingstag ist teilweise vorbereitet.", + "formMarkedAsHandedOver": "Mitgliedsformular als ausgehändigt markiert", + "errorMarkingForm": "Fehler beim Markieren des Mitgliedsformulars", + "dateNoLongerCurrent": "Ausgewähltes Datum war nicht mehr aktuell. Bitte erneut versuchen.", + "activityRequired": "Bitte geben Sie eine Aktivität ein.", + "activityNotFound": "Aktivität nicht gefunden. Bitte wählen Sie eine aus der Liste aus." }, "home": { "welcome": "Willkommen im TrainingsTagebuch", "heroTitle": "Vereinsverwaltung, Trainingsplanung und Turniere – alles an einem Ort", "heroSubtitle": "Das TrainingsTagebuch ist die umfassende Lösung für Vereine: Mitgliederverwaltung, Trainingsgruppen, Trainingszeiten, Trainingstagebuch, Turnierorganisation, Team-Management, MyTischtennis-Integration, Statistiken und mehr – DSGVO‑konform und einfach zu bedienen.", "startFree": "Kostenlos starten", - "features": { + "heroFeatures": { "memberManagement": "Mitglieder- und Gruppenverwaltung", "trainingGroups": "Trainingsgruppen & Trainingszeiten", "trainingDiary": "Trainingstagebuch & Dokumentation", @@ -406,9 +632,85 @@ "faqPrivacy": { "question": "Wie steht es um den Datenschutz?", "answer": "Wir setzen auf Datensparsamkeit, transparente Freigaben, rollenbasierte Zugriffe und vollständiges Aktivitätsprotokoll. Die Anwendung ist DSGVO‑konform." + }, + "whatCanYouDo": "Was kannst du mit dem TrainingsTagebuch machen?", + "rolesAndPrivacy": "Rollen, Berechtigungen & DSGVO", + "features": { + "manageMembers": "Mitglieder verwalten", + "manageMembersDesc": "Erstelle Mitgliedsprofile, bilde Gruppen und halte Kontakt‑ und Freigabestände aktuell.", + "keepDiary": "Trainingstagebuch führen", + "keepDiaryDesc": "Dokumentiere Inhalte, Umfang und Anwesenheiten jeder Einheit – nachvollziehbar und strukturiert.", + "organizeSchedules": "Spielpläne organisieren", + "organizeSchedulesDesc": "Plane Spiele, Turniere und Veranstaltungen inklusive Gruppen, Runden und Ergebnissen.", + "statistics": "Statistiken & Auswertungen", + "statisticsDesc": "Erhalte Trainings‑ und Teilnahmeübersichten, erkenne Entwicklung und plane gezielt.", + "security": "Sicherheit & DSGVO", + "securityDesc": "Datenschutzfreundliche Architektur, Freigaben durch Mitglieder und transparente Zugriffe.", + "predefinedActivities": "Vordefinierte Aktivitäten", + "predefinedActivitiesDesc": "Nutze Vorlagen für wiederkehrende Übungen und beschleunige deine Dokumentation.", + "trainingGroups": "Trainingsgruppen & Trainingszeiten", + "trainingGroupsDesc": "Organisiere Trainingsgruppen, definiere Trainingszeiten und verwalte Gruppenzuordnungen.", + "officialTournaments": "Offizielle Turniere", + "officialTournamentsDesc": "Importiere und verwalte offizielle Turniere, verwalte Teilnahmen und Ergebnisse.", + "teamManagement": "Team-Management & Ligen", + "teamManagementDesc": "Verwalte Mannschaften, Ligen, Spielpläne und Ergebnisse für deinen Verein.", + "myTischtennisIntegration": "MyTischtennis-Integration", + "myTischtennisIntegrationDesc": "Automatische Synchronisation mit MyTischtennis.de für Spielergebnisse und Statistiken.", + "pdfExport": "PDF-Export", + "pdfExportDesc": "Exportiere Trainingstage als PDF mit Teilnehmern, Aktivitäten und Statistiken.", + "permissionSystem": "Berechtigungssystem", + "permissionSystemDesc": "Rollenbasierte Zugriffe (Admin, Trainer, Mannschaftsführer, Mitglied) mit individuellen Berechtigungen.", + "activityLog": "Aktivitätsprotokoll", + "activityLogDesc": "Vollständiges Logging aller Aktionen für Transparenz und Nachvollziehbarkeit.", + "memberManagement": "Mitglieder- und Gruppenverwaltung", + "trainingDiary": "Trainingstagebuch & Dokumentation", + "tournaments": "Turniere (intern, offen, offiziell)", + "myTischtennis": "MyTischtennis-Integration" + }, + "faqInstallation": { + "question": "Benötige ich eine Installation?", + "answer": "Nein, es handelt sich um eine Web‑Anwendung. Du nutzt sie direkt im Browser – auf Desktop, Tablet und Smartphone." + }, + "faqTournaments": { + "question": "Welche Turnierarten werden unterstützt?", + "answer": "Du kannst interne Turniere, offene Turniere und offizielle Turniere (z.B. von Verbänden) verwalten. Offizielle Turniere können importiert werden." + }, + "faqMyTischtennis": { + "question": "Funktioniert die MyTischtennis-Integration automatisch?", + "answer": "Ja, nach der Einrichtung synchronisiert sich die Anwendung automatisch mit MyTischtennis.de und importiert Spielergebnisse und Statistiken." + }, + "faqTrainingGroups": { + "question": "Kann ich Trainingsgruppen und -zeiten verwalten?", + "answer": "Ja, du kannst Trainingsgruppen anlegen, Trainingszeiten definieren und Mitglieder den Gruppen zuordnen. Das Trainingstagebuch schlägt automatisch passende Gruppen und Zeiten vor." + }, + "faqPermissions": { + "question": "Wie funktioniert das Berechtigungssystem?", + "answer": "Es gibt vier Rollen: Admin, Trainer, Mannschaftsführer und Mitglied. Jede Rolle hat spezifische Berechtigungen, die individuell angepasst werden können." + }, + "registerNow": "Jetzt kostenlos registrieren", + "haveAccount": "Ich habe schon einen Account", + "welcomeBack": "Herzlich Willkommen zurück! Du bist erfolgreich eingeloggt.", + "authenticatedFeatures": { + "manageMembers": "Mitglieder verwalten", + "manageMembersDesc": "Verwalte deine Vereinsmitglieder, erstelle Trainingsgruppen und behalte den Überblick über alle Teilnehmer.", + "keepDiary": "Trainingstagebuch führen", + "keepDiaryDesc": "Dokumentiere Trainingsaktivitäten, Teilnehmer, Aktivitäten und Notizen für jeden Trainingstag.", + "trainingGroups": "Trainingsgruppen & Zeiten", + "trainingGroupsDesc": "Organisiere Trainingsgruppen, definiere Trainingszeiten und verwalte Gruppenzuordnungen.", + "manageTournaments": "Turniere verwalten", + "manageTournamentsDesc": "Erstelle interne und offene Turniere, importiere offizielle Turniere und verwalte Teilnahmen.", + "teamManagement": "Team-Management", + "teamManagementDesc": "Verwalte Mannschaften, Ligen, Spielpläne und Ergebnisse für deinen Verein.", + "myTischtennisIntegration": "MyTischtennis-Integration", + "myTischtennisIntegrationDesc": "Synchronisiere automatisch Spielergebnisse und Statistiken mit MyTischtennis.de.", + "statistics": "Statistiken & Auswertungen", + "statisticsDesc": "Erhalte detaillierte Trainings- und Teilnahmeübersichten sowie Aktivitätsstatistiken.", + "pdfExport": "PDF-Export", + "pdfExportDesc": "Exportiere Trainingstage als PDF mit Teilnehmern, Aktivitäten und Statistiken." } }, "tournaments": { + "internalTournaments": "Interne Turniere", "internalStatsTitle": "Statistik interne Turniere (Einzel)", "internalStatsOpenButton": "Turnierstatistik (Einzel)", "internalStatsExportPdf": "Als PDF exportieren", @@ -436,19 +738,31 @@ "internalStatsPoints": "Summe", "internalStatsAvgPoints": "Ø", "internalStatsEmpty": "Keine auswertbaren Daten im gewählten Zeitraum.", - "title": "Turniere", + "openTournaments": "Offene Turniere", + "miniChampionships": "Minimeisterschaften", + "newMiniChampionship": "Neue Minimeisterschaft", + "miniChampionshipYear": "Jahr", + "miniChampionshipYearHint": "12 = in diesem Jahr 12 oder 13 Jahre, 10 = 10 oder 11, 8 = 9 und jünger", + "miniChampionshipLocation": "Ort", + "tournamentParticipations": "Turnierteilnahmen", + "date": "Datum", + "newTournament": "Neues Turnier", + "unknownDate": "Unbekanntes Datum", + "name": "Name", "tournamentName": "Turniername", - "events": "Veranstaltungen", - "participations": "Turnierbeteiligungen", - "showEvents": "Gespeicherte Veranstaltungen anzeigen", - "showParticipations": "Turnierbeteiligungen anzeigen", + "winningSets": "Gewinnsätze", "numberOfTables": "Anzahl Tische", "table": "Tisch", + "playerOne": "Spieler 1", + "playerTwo": "Spieler 2", + "groupsLabel": "Gruppen", + "knockoutLabel": "KO", "distributeTables": "Freie Tische verteilen", "distributeTablesResult": "Tischverteilung", "noFreeTables": "Keine freien Tische verfügbar.", "noAssignableMatches": "Keine Spiele verfügbar, bei denen beide Spieler frei sind.", "tablesDistributed": "Tische wurden verteilt.", + "errorDistributingTables": "Fehler beim Verteilen der Tische.", "missingDataPDF": "Fehlende Daten als PDF", "missingDataPDFTitle": "Fehlende Teilnehmerdaten – Minimeisterschaft", "missingDataPDFSubtitle": "Bitte die fehlenden Daten (markiert mit ____) bei den Teilnehmern erfragen und hier notieren.", @@ -457,13 +771,164 @@ "noTop3Yet": "Es stehen noch keine Top-3-Platzierungen fest.", "missingDataPDFTitleTop3": "Fehlende Daten – Top 3 Minimeisterschaft", "missingDataPDFSubtitleTop3": "Fehlende Daten der ersten 3 Plätze (markiert mit ____) bitte erfragen und hier notieren.", - "doublesTournament": "Doppel-Turnier", - "doublesTournamentHint": "Schaltet alle vorhandenen Klassen auf Doppel und legt neue Klassen standardmäßig als Doppel an.", "address": "Adresse", "phone": "Telefon", "generatingPDF": "PDF wird erstellt...", "page": "Seite", + "create": "Erstellen", + "exportPDF": "PDF exportieren", + "playInGroups": "Spielen in Gruppen", + "classes": "Klassen", + "save": "Speichern", + "cancel": "Abbrechen", + "edit": "Bearbeiten", + "delete": "Löschen", + "className": "Klassenname", + "addClass": "Klasse hinzufügen", + "noClassesYet": "Noch keine Klassen vorhanden. Fügen Sie eine neue Klasse hinzu.", + "singles": "Einzel", + "doubles": "Doppel", + "doublesTournament": "Doppel-Turnier", + "doublesTournamentHint": "Schaltet alle vorhandenen Klassen auf Doppel und legt neue Klassen standardmäßig als Doppel an.", + "genderAll": "Alle", + "genderMixed": "Mixed", + "minBirthYear": "Geboren im Jahr oder später", + "selectClass": "Klasse auswählen", + "tabConfig": "Konfiguration", + "tabGroups": "Gruppen", + "tabParticipants": "Teilnehmer", + "tabResults": "Ergebnisse", + "tabPlacements": "Platzierungen", + "finalPlacements": "Endplatzierungen", + "groupPlacements": "Gruppenplatzierungen", + "noPlacementsYet": "Noch keine Platzierungen vorhanden.", + "participants": "Teilnehmer", + "seeded": "Gesetzt", + "gaveUp": "Aufgegeben", + "statusOpen": "Offen", + "statusLive": "Live", + "statusFinished": "Fertig", + "gaveUpHint": "Spieler hat aufgegeben – alle Spiele zählen für den Gegner (11:0) bzw. 0:0 bei beiden aufgegeben.", + "club": "Verein", + "class": "Klasse", + "group": "Gruppe", + "action": "Aktion", + "unknown": "Unbekannt", + "clubMember": "(Vereinsmitglied)", + "selectParticipant": "-- Teilnehmer auswählen --", + "add": "Hinzufügen", + "loadFromTraining": "Aus Trainingstag laden", + "addExternalParticipant": "Externen Teilnehmer hinzufügen", + "firstName": "Vorname", + "lastName": "Nachname", + "optional": "optional", + "birthdate": "Geburtsdatum", + "addClubMember": "Vereinsmitglied hinzufügen", + "advancersPerGroup": "Aufsteiger pro Gruppe", + "maxGroupSize": "Maximale Gruppengröße", + "groupsPerClass": "Gruppen", + "groupsPerClassHint": "Geben Sie für jede Klasse die Anzahl der Gruppen ein (0 = keine Gruppen für diese Klasse):", + "showClass": "Klasse anzeigen", + "allClasses": "Alle Klassen", + "withoutClass": "Ohne Klasse", + "currentClass": "Aktive Klasse", + "selectClassPrompt": "Bitte wählen Sie oben eine Klasse aus.", + "numberOfGroups": "Anzahl Gruppen", + "createGroups": "Gruppen erstellen", + "randomizeGroups": "Zufällig verteilen", + "resetGroups": "Gruppen zurücksetzen", + "groupsOverview": "Gruppenübersicht", + "groupNumber": "Gruppe", + "index": "Index", + "position": "Platz", + "player": "Spieler", + "points": "Punkte", + "sets": "Sätze", + "diff": "Diff", + "pointsRatio": "Spielpunkte", + "livePosition": "Live-Platz", + "pairings": "Doppel-Paarungen", + "addPairing": "Paarung hinzufügen", + "selectPlayer": "Spieler auswählen", + "external": "Extern", + "randomPairings": "Zufällige Doppel-Paarungen", + "errorMoreSeededThanUnseeded": "Es gibt mehr gesetzte als nicht gesetzte Spieler. Zufällige Paarungen können nicht erstellt werden.", + "randomPairingsCreated": "Zufällige Paarungen wurden erstellt.", + "resetGroupMatches": "Gruppenspiele", + "cleanupOrphanedMatches": "Verwaiste Spiele aufräumen", + "groupMatches": "Gruppenspiele", + "round": "Runde", + "encounter": "Begegnung", + "result": "Ergebnis", + "setDiff": "Satzdifferenz", + "createMatches": "Spiele erstellen", + "startKORound": "K.o.-Runde starten", + "deleteKORound": "K.o.-Runde", + "email": "E-Mail", + "forForwarding": "für Weitermeldung", + "showPlayerDetails": "Spielerdetails anzeigen", + "noPlayerDataAvailable": "Keine Spielerdaten verfügbar", "dataNotRecorded": "Noch nicht erfasst", + "resultsRanking": "Rangliste", + "newSetPlaceholder": "Neuen Satz, z. B. 11:7", + "finishMatch": "Abschließen", + "correctMatch": "Korrigieren", + "markMatchLive": "Als laufend markieren", + "unmarkMatchLive": "Laufend-Markierung entfernen", + "stageConfigTitle": "Zwischenrunde & Endrunde", + "stageConfigLoading": "Lade Zwischenrunden …", + "stageConfigIntro": "Zwischenrunde ist optional. Wenn du sie aktivierst, gibt es danach immer eine Endrunde. KO-Endrunde wird als ein einziges Feld erzeugt.", + "stageConfigCurrentSetup": "Aktuelle Struktur", + "stageFlowWithIntermediate": "Vorrunde -> Zwischenrunde ({stage2}) -> Endrunde ({final})", + "stageFlowDirectFinal": "Vorrunde -> Endrunde ({final})", + "stageStep1": "Schritt 1", + "stageStep2": "Schritt 2", + "stageStep3": "Schritt 3", + "stageStep1Title": "Zwischenrunde festlegen", + "stageStep1Description": "Entscheide zuerst, ob nach der Vorrunde noch eine zusätzliche Runde gespielt werden soll.", + "stageStep2Description": "Lege fest, wie die Zwischenrunde aussieht und wie viele Gruppen dort gebraucht werden.", + "stageFinalDescription": "Bestimme, ob die Endrunde als Gruppenphase oder direkt als K.-o.-Feld gespielt wird.", + "useIntermediateStage": "Zwischenrunde verwenden", + "intermediateRound": "Zwischenrunde (Runde 2)", + "finalRound": "Endrunde", + "playThirdPlace": "Platz 3 ausspielen", + "roundMode": "Modus", + "roundGroupCount": "Anzahl Gruppen", + "promotionRule12": "Weiterkommen: Vorrunde → Zwischenrunde (1→2)", + "promotionRuleFinal": "Weiterkommen: Runde {from} → Runde {to}", + "promotionRuleDescription12": "Hier legst du fest, welche Plätze aus jeder Vorrundengruppe in die Zwischenrunde kommen.", + "promotionRuleDescriptionFinalKnockout": "Hier legst du fest, welche Plätze aus der vorherigen Runde in das K.-o.-Feld kommen.", + "promotionRuleDescriptionFinalGroups": "Hier legst du fest, welche Plätze aus der vorherigen Runde in die Gruppen der Endrunde kommen.", + "poolRuleLabel": "Regel {number}", + "poolRuleSummary": "Plätze {places} gehen in {target}", + "poolRulePreview": "Aus jeder Gruppe gehen Platz {places} weiter in {target}.", + "poolRulePlacesLabel": "Welche Plätze kommen weiter?", + "poolRulePlacesHelp": "Beispiel: 1 oder 1,2", + "poolRuleTargetLabel": "Wohin gehen diese Plätze?", + "poolRuleQuickExamples": "Schnellbeispiele:", + "targetGroupsLabel": "{count} Gruppen", + "poolRuleTargetKnockout": "das K.-o.-Feld", + "poolRuleTargetGroupsDetailed": "{count} Zielgruppen", + "addPoolRule": "Pool-Regel hinzufügen", + "noPoolRulesYet12": "Noch keine Regeln. Beispiel: Plätze 1 und 2 -> obere Runde-2-Gruppen.", + "noPoolRulesYetFinal": "Noch keine Regeln. Beispiel: Plätze 1 und 2 -> Endrunde.", + "placesFromEachGroup": "Plätze aus jeder Gruppe (z. B. 1,2)", + "target": "Ziel", + "targetGroupCount": "Ziel-Gruppenanzahl", + "saveRounds": "Runden speichern", + "createFinalFromPreliminary": "Endrunde aus Vorrunde erstellen", + "createIntermediateFromPreliminary": "Zwischenrunde aus Vorrunde erstellen", + "createFinalFromIntermediate": "Endrunde aus Zwischenrunde erstellen", + "transferQualifiedToFinalFromPreliminary": "Qualifizierte Spieler direkt in die Endrunde übernehmen", + "transferQualifiedToIntermediate": "Qualifizierte Spieler in die Zwischenrunde übernehmen", + "transferQualifiedToFinalFromIntermediate": "Qualifizierte Spieler in die Endrunde übernehmen", + "transferQualifiedToFinalFromPreliminaryDesc": "Nutzt die Regeln Vorrunde -> Endrunde und erzeugt daraus direkt die qualifizierten Teilnehmer.", + "transferQualifiedToIntermediateDesc": "Nutzt die Regeln Vorrunde -> Zwischenrunde und übernimmt die qualifizierten Teilnehmer.", + "transferQualifiedToFinalFromIntermediateDesc": "Nutzt die Regeln Zwischenrunde -> Endrunde und übernimmt die qualifizierten Teilnehmer.", + "stageActionsTitle": "Nächste Aktionen", + "stageActionsDescription": "Diese Schritte übernehmen qualifizierte Spieler in die nächste Runde.", + "stageActionRun": "Jetzt ausführen", + "stageActionMissingRulesHint": "Lege zuerst mindestens eine Weiterkommens-Regel an, bevor du Spieler in die nächste Runde übernimmst.", "stageValidationTitle": "Review configuration", "stageValidationDescription": "Fix these points before saving or moving players into the next round.", "stageValidationGroupCountRequired": "Please set at least one valid group count.", @@ -471,17 +936,22 @@ "stageValidationRulePlacesRequired": "Enter at least one place that should advance.", "stageValidationRulePlacesInvalid": "The place definition is invalid. Only positive whole numbers such as 1 or 1,2 are allowed.", "stageValidationRulePlacesDuplicate": "A single rule must not contain the same place more than once.", + "stageValidationRulePlacesGap": "Die Platzangabe hat Lücken. Meist ist eine zusammenhängende Reihenfolge wie 1,2 oder 1,2,3 gemeint.", "stageValidationRulesOverlap": "Place {place} is assigned twice, in rule {first} and rule {second}.", "stageValidationTargetGroupsRequired": "Please enter a valid number of target groups.", - "stageValidationKnockoutTargetOnly": "For a knockout final round, only the knockout bracket is allowed as the target here.", - "stageValidationSaveBlocked": "Please fix the highlighted configuration errors first.", - "stageValidationSuggestion": "Vorschlag: {value}", - "stageValidationRulePlacesGap": "Die Platzangabe hat Lücken. Meist ist eine zusammenhängende Reihenfolge wie 1,2 oder 1,2,3 gemeint.", "stageValidationTargetGroupCountMismatch": "Die Anzahl der Zielgruppen muss zur Zielrunde passen. Erwartet: {expected}.", "stageValidationTargetTypeMismatch": "Das Ziel dieser Regel muss zur Zielrunde passen. Erwartet: {target}.", + "stageValidationKnockoutTargetOnly": "For a knockout final round, only the knockout bracket is allowed as the target here.", + "stageValidationKnockoutNeedsTwoPlayers": "Für ein K.-o.-Feld werden mindestens 2 Qualifizierte benötigt.", + "stageValidationKnockoutByesLikely": "Mit voraussichtlich {count} Qualifizierten wird das K.-o.-Feld sehr wahrscheinlich Freilose enthalten.", + "stageValidationNotEnoughQualifiersForGroups": "Mit nur {count} Qualifizierten für {groups} Zielgruppen würden leere Gruppen entstehen.", + "stageValidationThinGroupsLikely": "Mit {count} Qualifizierten auf {groups} Zielgruppen werden die Gruppen vermutlich sehr klein.", + "stageValidationSuggestion": "Vorschlag: {value}", "stageValidationApplyFix": "Übernehmen", + "stageValidationApplyAllFixes": "{count} Schnellkorrektur(en) anwenden", "stageValidationApplyTargetTypeFix": "Auf {target} umstellen", "stageValidationApplyTargetGroupFix": "Auf {count} Zielgruppen setzen", + "stageValidationSaveBlocked": "Please fix the highlighted configuration errors first.", "ruleStatusOk": "Passt", "ruleStatusReview": "Prüfen", "ruleStatusBlocked": "Blockiert", @@ -500,7 +970,9 @@ "stageFlowBreakdownActionAddRule": "Regel anlegen", "stageFlowBreakdownActionReview": "Fehler prüfen", "stageFlowBreakdownActionOpen": "Regel öffnen", - "stageValidationApplyAllFixes": "{count} Schnellkorrektur(en) anwenden", + "stageFlowReadinessNoGroups": "Noch keine passenden Gruppen vorhanden", + "stageFlowReadinessIncompleteGroups": "{count} Gruppe(n) sind noch nicht vollständig entschieden", + "stageFlowReadinessReady": "Übergang ist fachlich startklar", "stageFlowRecommendationTitle": "Empfohlener nächster Schritt", "stageFlowRecommendationFixes": "Die typischen Konfigurationsprobleme können direkt automatisch bereinigt werden.", "stageFlowRecommendationMissingRule": "Für {label} fehlt noch eine vollständige Regel. Lege am besten damit los.", @@ -509,40 +981,123 @@ "stageFlowRecommendationSave": "Die Rundenlogik ist stimmig. Du kannst die Konfiguration jetzt speichern.", "stageFlowPreviewMissing": "Noch keine Regel konfiguriert.", "stageFlowPreviewRule": "Plätze {places} gehen in {target}", - "stageValidationKnockoutNeedsTwoPlayers": "Für ein K.-o.-Feld werden mindestens 2 Qualifizierte benötigt.", - "stageValidationKnockoutByesLikely": "Mit voraussichtlich {count} Qualifizierten wird das K.-o.-Feld sehr wahrscheinlich Freilose enthalten.", - "stageValidationNotEnoughQualifiersForGroups": "Mit nur {count} Qualifizierten für {groups} Zielgruppen würden leere Gruppen entstehen.", - "stageValidationThinGroupsLikely": "Mit {count} Qualifizierten auf {groups} Zielgruppen werden die Gruppen vermutlich sehr klein.", "stageFlowPreviewRuleWithCount": "{base} (voraussichtlich {count} Qualifizierte)", - "stageFlowReadinessNoGroups": "Noch keine passenden Gruppen vorhanden", - "stageFlowReadinessIncompleteGroups": "{count} Gruppe(n) sind noch nicht vollständig entschieden", - "stageFlowReadinessReady": "Übergang ist fachlich startklar", "stageFlowQualifiedPreviewTitle": "Aktuell qualifiziert", - "stageFlowQualifiedPreviewEntry": "G{group} · Platz {position} · {name}" - }, - "permissions": { - "title": "Berechtigungsverwaltung", - "clubMembers": "Clubmitglieder", - "email": "Email", - "role": "Rolle", - "status": "Status", - "resetResource": "Zurücksetzen", - "resetAll": "Alle zurücksetzen", - "close": "Abbrechen", - "save": "Speichern" - }, - "logs": { - "title": "System-Logs", - "applyFilters": "Filter anwenden", - "clearFilters": "Zurücksetzen", - "time": "Zeit", - "type": "Typ", - "method": "Methode", - "path": "Pfad", - "status": "Status", - "executionTime": "Ausführungszeit", - "error": "Fehler", - "viewDetails": "Details" + "stageFlowQualifiedPreviewEntry": "G{group} · Platz {position} · {name}", + "stageConfigMissingIds": "Kann nicht speichern: Vereins- oder Turnier-ID fehlt.", + "stageConfigLoadError": "Fehler beim Laden der Rundenkonfiguration.", + "stageConfigBadServerResponse": "Fehlerhafte Antwort vom Server.", + "stageCreated": "Runde {round} wurde erstellt.", + "stageParticipantsTransferred": "Qualifizierte Spieler wurden in {round} übernommen.", + "atLeastOnePoolRule": "Bitte mindestens eine Pool-Regel für {label} anlegen (z. B. Plätze 1,2).", + "enterMiniLocation": "Bitte geben Sie einen Ort ein.", + "selectTournamentFirst": "Bitte wählen Sie zuerst ein Turnier aus.", + "errorGeneratingPdf": "Fehler beim Generieren des PDFs.", + "orphanedMatchesRemoved": "{count} verwaiste Spiele entfernt.", + "noOrphanedMatchesFound": "Keine verwaisten Spiele gefunden.", + "enterClassName": "Bitte geben Sie einen Klassennamen ein.", + "deleteClassTitle": "Klasse löschen", + "deleteClassConfirm": "Möchten Sie die Klasse \"{name}\" wirklich löschen?", + "deleteClassParticipantsDetached": "Alle Teilnehmer werden von dieser Klasse entfernt.", + "enterExternalParticipantName": "Bitte geben Sie mindestens Vorname und Nachname ein.", + "noTournamentDate": "Kein Turnierdatum vorhanden.", + "noValidTrainingParticipants": "Keine gültigen Teilnehmer im Trainingstag für dieses Datum gefunden.", + "noTrainingParticipants": "Keine Teilnehmer im Trainingstag für dieses Datum gefunden.", + "noTrainingOnDate": "Kein Trainingstag für {date} gefunden.", + "selectTwoDifferentPlayers": "Bitte wählen Sie zwei verschiedene Spieler aus.", + "pairingAlreadyExists": "Diese Paarung existiert bereits.", + "participantNotFound": "Teilnehmer nicht gefunden.", + "minimumParticipantsForPairings": "Mindestens 2 Teilnehmer für Paarungen erforderlich.", + "deleteExistingPairingsConfirm": "Bestehende Paarungen werden gelöscht. Fortfahren?", + "pairingsCreatedWithErrors": "{successCount} Paarungen erstellt, {errorCount} Fehler.", + "koRound": "K.-o.-Runde", + "errorUpdatingTournament": "Fehler beim Aktualisieren des Turniers.", + "pleaseEnterDate": "Bitte geben Sie ein Datum ein!", + "errorCreatingTournament": "Fehler beim Erstellen des Turniers.", + "pleaseSelectParticipant": "Bitte wählen Sie einen Teilnehmer aus!", + "errorCreatingGroups": "Fehler beim Erstellen der Gruppen.", + "errorResettingKORound": "Fehler beim Zurücksetzen der K.o.-Runde.", + "mergeClasses": "Klassen zusammenlegen (gemeinsame Gruppenphase)", + "sourceClass": "Quelle", + "targetClass": "Ziel", + "strategy": "Strategie", + "mergeSingleGroup": "Alle Spieler aus A in eine Gruppe (bei B)", + "mergeDistribute": "Spieler aus A auf alle Gruppen (von B) verteilen", + "outOfCompetition": "Spieler aus A außer Konkurrenz", + "errorMergingClasses": "Fehler beim Zusammenlegen der Klassen.", + "apply": "Übernehmen", + "participantsNeedClassAssignment": "{count} Teilnehmer sind noch keiner Klasse zugeordnet. Diese sollten zuerst zugeordnet werden.", + "autoAssignableParticipantsHint": "{count} davon koennen automatisch zugeordnet werden.", + "assignmentReviewTitle": "{count} Teilnehmer brauchen eine Auswahl:", + "conflictSuggestionLabel": "Vorschläge:", + "workspaceProblemsTitle": "{count} offene Punkte", + "problemConfigTitle": "Konfiguration unvollständig", + "problemConfigDescription": "Prüfe Datum, Name und Gewinnsätze.", + "problemUnassignedTitle": "{count} Teilnehmer ohne Klasse", + "problemUnassignedDescription": "Diese Teilnehmer brauchen noch eine manuelle Klassenzuordnung.", + "problemUnassignedAutoDescription": "{count} davon können direkt automatisch zugeordnet werden.", + "problemConflictsTitle": "{count} Teilnehmer mit Konflikten", + "problemConflictsDescription": "Prüfe unpassende Klassen, fehlende Daten oder unklare Zuordnungen.", + "problemDoublesTitle": "{count} offene Doppelpartner", + "problemDoublesDescription": "Ein oder mehrere Doppelklassen brauchen noch Partnerzuordnungen.", + "problemDoublesAutoDescription": "Die offene Doppelklasse kann direkt automatisch gepaart werden.", + "problemGroupsMissingTitle": "Gruppen noch nicht erstellt", + "problemGroupsMissingDescription": "Für das Gruppenturnier müssen zuerst Gruppen angelegt werden.", + "problemGroupMatchesTitle": "Gruppenspiele noch nicht erzeugt", + "problemGroupMatchesDescription": "Die Gruppen sind bereit, aber die Spiele wurden noch nicht erstellt.", + "problemKnockoutReadyTitle": "K.-o.-Runde kann gestartet werden", + "problemKnockoutReadyDescription": "Die Gruppenphase ist abgeschlossen und die Endrunde kann jetzt erzeugt werden.", + "autoAssignEligible": "Automatisch zuweisen", + "autoAssignEligibleNone": "Aktuell gibt es keine Teilnehmer mit eindeutiger automatischer Klassenzuweisung.", + "autoAssignEligibleDone": "{count} Teilnehmer wurden automatisch zugeordnet.", + "autoAssignEligiblePartial": "{successCount} Teilnehmer wurden automatisch zugeordnet, {errorCount} nicht.", + "doublesPairingHint": "{count} Teilnehmer in dieser Doppelklasse haben noch keinen Partner.", + "createSuggestedPairings": "Partner bilden", + "placementsPendingTitle": "Platzierungen noch nicht verfügbar", + "placementsPendingSelectedClass": "Für die aktuell gewählte Klasse gibt es noch keine Platzierungen.", + "placementsPendingNoGroups": "Sobald Gruppenspiele oder eine Endrunde vorhanden sind, erscheinen hier die Platzierungen.", + "placementsPendingGroups": "Gruppenplatzierungen erscheinen, sobald Gruppenspiele vorhanden sind.", + "placementsPendingFinals": "Endplatzierungen erscheinen, sobald mehrere Gruppen oder eine Endrunde vorhanden sind.", + "showingTournamentCount": "{visible} von {total}", + "noMatchingTournamentsTitle": "Keine passenden Turniere", + "noTournamentsCreatedYet": "Es wurden noch keine Turniere angelegt.", + "adjustTournamentSearch": "Passe den Suchbegriff an oder lege ein neues Turnier an.", + "selectedTournament": "Aktives Turnier", + "createGroupMatches": "Gruppenspiele berechnen", + "participantConflicts": "Konflikte", + "unpairedDoubles": "Doppel ohne Partner", + "noEligibleClass": "Keine passende Klasse gefunden.", + "eligibleClassesHint": "Passt zu: {classes}", + "warningClassMissing": "Klasse nicht gefunden", + "warningGenderMismatch": "Geschlecht passt nicht zur Klasse", + "warningGenderMissing": "Geschlecht fehlt für diese Klasse", + "warningBirthDateMissing": "Geburtsdatum fehlt für diese Klasse", + "warningTooOldForClass": "Zu alt für diese Klasse", + "warningTooYoungForClass": "Zu jung für diese Klasse", + "warningMissingPairing": "Doppelpartner fehlt", + "statusConfigReady": "Konfiguration bereit", + "statusConfigIncomplete": "Konfiguration unvollständig", + "statusParticipantsUnassigned": "{count} ohne Klasse", + "statusParticipantsConflicts": "{count} Teilnehmer mit Konflikten", + "statusParticipantsReady": "{count} Teilnehmer konfliktfrei", + "statusUnpairedDoubles": "{count} Doppel ohne Partner", + "statusGroupsMissing": "Gruppen noch nicht erstellt", + "statusGroupsReady": "Gruppen bereit", + "statusGroupsRunning": "Gruppenphase läuft", + "statusKnockoutReady": "K.-o.-Runde startklar", + "statusKnockoutRunning": "K.-o.-Runde läuft", + "statusTournamentCompleted": "Turnier abgeschlossen", + "statusActionAssign": "Zuweisen", + "statusActionReview": "Prüfen", + "statusActionPair": "Paaren", + "statusActionCreate": "Erstellen", + "statusActionGenerate": "Erzeugen", + "statusActionStart": "Starten", + "title": "Turniere", + "events": "Veranstaltungen", + "participations": "Turnierbeteiligungen", + "showEvents": "Gespeicherte Veranstaltungen anzeigen", + "showParticipations": "Turnierbeteiligungen anzeigen" }, "myTischtennis": { "title": "myTischtennis-Account", @@ -580,10 +1135,6 @@ "passwordNote": "Hinweis: Das Speichern des Passworts ist optional. Wenn Sie es nicht speichern, werden Sie bei jeder Synchronisation nach dem Passwort gefragt.", "passwordsEncrypted": "Passwörter werden verschlüsselt gespeichert" }, - "memberTransfer": { - "title": "Mitgliederübertragung", - "transferConfig": "Übertragungskonfiguration" - }, "imprint": { "title": "Impressum", "serviceProvider": "Diensteanbieter", @@ -608,8 +1159,254 @@ "logData": "Logdaten", "recipients": "Empfänger" }, + "trainingStats": { + "title": "Trainings-Statistik", + "activeMembers": "Aktive Mitglieder", + "averageParticipationCurrentMonth": "Durchschnittliche Teilnahme (aktueller Monat)", + "averageParticipationLastMonth": "Durchschnittliche Teilnahme (letzter Monat)", + "averageParticipationQuarter": "Durchschnittliche Teilnahme (Quartal)", + "averageParticipationHalfYear": "Durchschnittliche Teilnahme (Halbjahr)", + "averageParticipationYear": "Durchschnittliche Teilnahme (Jahr)", + "trainingDays": "Trainingstage (letzte 12 Monate)", + "trainingDayFilter": "Trainingstag", + "allTrainingDays": "Alle Trainingstage", + "memberParticipations": "Mitglieder-Teilnahmen", + "date": "Datum", + "weekday": "Wochentag", + "participants": "Teilnehmer", + "attendingMembers": "Anwesende Mitglieder", + "noParticipants": "Keine Teilnehmer", + "name": "Name", + "ttr": "TTR", + "qttr": "QTTR", + "birthdate": "Geburtsdatum", + "participations12Months": "Teilnahmen (12 Monate)", + "participations3Months": "Teilnahmen (3 Monate)", + "participationsTotal": "Teilnahmen (Gesamt)", + "lastTraining": "Letztes Training", + "actions": "Aktionen", + "showDetails": "Details anzeigen" + }, + "tournament": { + "apply": "Übernehmen" + }, + "clubSettings": { + "title": "Vereins-Einstellungen", + "settings": "Einstellungen", + "trainingGroups": "Trainingsgruppen", + "trainingTimes": "Trainingszeiten", + "greetingText": "Begrüßungstext", + "greetingPlaceholder": "Begrüßungstext für Heimspiele...", + "placeholders": "Platzhalter", + "homeTeam": "Name Heimmannschaft", + "guestTeam": "Name Gastmannschaft", + "homePlayers": "Spieler und Doppel Heimmannschaft", + "guestPlayers": "Spieler und Doppel Gastmannschaft", + "greetingHint": "Dieser Text erscheint im Reiter \"Begrüßung\" des Spielberichtsbogens.", + "associationMemberNumber": "Verbands-Mitgliedsnummer", + "associationMemberNumberPlaceholder": "z. B. 12-3456", + "save": "Speichern", + "saved": "Gespeichert", + "saveFailed": "Speichern fehlgeschlagen", + "loadFailed": "Einstellungen konnten nicht geladen werden", + "noClubSelected": "Bitte wählen Sie zuerst einen Verein aus.", + "myTischtennisRankings": "myTischtennis TTR/QTTR-Ranglisten", + "myTischtennisRankingsHint": "Automatischer Abruf der Vereins-Rangliste für TTR- und QTTR-Updates der Mitglieder.", + "autoFetchRankings": "Ranglisten automatisch abrufen", + "myTischtennisFedNickname": "Verbandskürzel", + "myTischtennisFedNicknamePlaceholder": "z. B. HeTTV", + "rankingsUsesAssociationNumber": "Die Vereinsnummer für den Ranglisten-Abruf entspricht der Verbands-Mitgliedsnummer oben.", + "memberDataQuality": "Datenqualität Mitglieder", + "memberDataQualityHint": "Diese Felder zählen auf der Mitgliederseite als nötig. Alle Felder bleiben weiterhin eingebbar.", + "requireStreet": "Straße nötig", + "requirePostalCode": "PLZ nötig", + "requireCity": "Ort nötig", + "requirePhone": "Telefonnummer nötig", + "requireEmail": "E-Mail-Adresse nötig" + }, + "predefinedActivities": { + "title": "Vordefinierte Aktivitäten", + "new": "Neu", + "reload": "Neu laden", + "filterAll": "Alle", + "filterStandard": "Standard-Aktivitäten", + "filterCustom": "Selbstdefiniert", + "searchPlaceholder": "Kürzel suchen (z.B. 'as vh us' oder 'vh as us')...", + "deduplicate": "Doppelungen zusammenführen", + "selectSource": "Quelle wählen…", + "selectTarget": "Ziel wählen…", + "merge": "Zusammenführen", + "editActivity": "Aktivität bearbeiten", + "newActivity": "Neue Aktivität", + "editDrawing": "Übungszeichnung bearbeiten", + "createDrawing": "Übungszeichnung erstellen", + "name": "Name", + "code": "Kürzel", + "duration": "Dauer (Minuten)", + "durationText": "Dauer (Text)", + "durationTextPlaceholder": "z.B. 2x7", + "excludeFromStats": "Nicht in Statistik berücksichtigen", + "description": "Beschreibung", + "addImage": "Bild hinzufügen", + "imageHelp": "Du kannst entweder einen Link zu einem Bild eingeben oder ein Bild hochladen:", + "imageLink": "Bild-Link (optional)", + "imageLinkPlaceholder": "z.B. https://example.com/bild.jpg oder /api/predefined-activities/:id/image/:imageId", + "orUploadImage": "Oder Bild hochladen:", + "upload": "Hochladen", + "uploadAfterSave": "Nach Speichern hochladen", + "uploadNote": "Hinweis: Das Bild wird erst nach dem Speichern der Aktivität hochgeladen.", + "uploadedImages": "Hochgeladene Bilder:", + "delete": "Löschen", + "cancel": "Abbrechen", + "min": "min" + }, + "accident": { + "reportAccident": "Unfall melden", + "member": "Mitglied", + "pleaseSelect": "Bitte wählen", + "accident": "Unfall", + "accidentDescription": "Beschreibung des Unfalls...", + "reportedAccidents": "Gemeldete Unfälle", + "close": "Schließen", + "submit": "Eintragen" + }, + "schedule": { + "title": "Spielpläne", + "subtitle": "Teams auswählen, Spieltage prüfen und Ligatabellen im Blick behalten.", + "importSchedule": "Spielplanimport", + "galleryLoading": "Galerie wird geladen…", + "gallery": "Mitglieder-Galerie", + "overallSchedule": "Gesamtspielplan", + "adultSchedule": "Spielplan Erwachsene", + "noTeamsFound": "Keine Teams für diese Saison gefunden", + "noMatchingTeams": "Keine Teams passen zur aktuellen Suche.", + "searchTeams": "Team oder Liga suchen", + "selection": "Auswahl", + "activeSelection": "Aktive Auswahl", + "noSelectionTitle": "Noch keine Auswahl aktiv", + "noSelectionMessage": "Wählen Sie links einen Gesamtspielplan, den Erwachsenenspielplan oder ein Team aus.", + "scheduleTab": "Spielplan", + "tableTab": "Tabelle", + "downloadPDF": "Download PDF", + "refreshTable": "Tabelle aktualisieren", + "tableLoading": "Tabelle wird geladen…", + "fetchTeamData": "Spielplan & Ergebnisse abrufen", + "fetchingTeamData": "Abruf läuft…", + "fetchStartFailed": "Abruf konnte nicht gestartet werden.", + "fetchDataFailed": "Teamdaten konnten nicht abgerufen werden.", + "fetchTimedOut": "Zeitüberschreitung beim Abruf.", + "teamDataFetched": "Teamdaten erfolgreich aktualisiert.", + "teamDataFetchedDetails": "Mannschaft: {team}\nVerarbeitete Datensätze: {count}", + "gamesFor": "Spiele für", + "date": "Datum", + "time": "Uhrzeit", + "homeTeam": "Heimmannschaft", + "guestTeam": "Gastmannschaft", + "result": "Ergebnis", + "ageClass": "Altersklasse", + "code": "Code", + "homePin": "Heim-PIN", + "guestPin": "Gast-PIN", + "noGames": "Keine Spiele vorhanden", + "leagueTable": "Ligatabelle", + "position": "Platz", + "team": "Team", + "teams": "Teams", + "matches": "Matches", + "completedShort": "Abgeschlossen", + "pendingShort": "Offen", + "nextMatch": "Nächstes Spiel", + "workspaceScheduleDescription": "{matches} Spiele, davon {completed} abgeschlossen und {pending} offen.", + "workspaceTableDescription": "{count} Tabellenzeilen aktuell geladen.", + "matchOverviewTitle": "Spielübersicht", + "matchOverviewDescription": "Steuert, welche Spiele aus der aktuell gewählten Liga im Spielplan angezeigt werden.", + "ownTeamMatches": "Eigene Mannschaft", + "allLeagueMatches": "Alle Spiele", + "otherTeamMatches": "Andere Mannschaft", + "selectOtherTeam": "Andere Mannschaft wählen", + "sets": "Sätze", + "points": "Pkt.", + "balls": "Bälle", + "noTableData": "Keine Tabellendaten verfügbar", + "galleryTitle": "Mitglieder-Galerie - Klicken Sie auf ein Bild, um als 'Bereit' zu markieren", + "imageSize": "Bildgröße", + "noMembersWithImages": "Keine Mitglieder mit Bildern gefunden.", + "playerSelection": "Spielerauswahl", + "vs": "vs", + "loadingMembers": "Lade Mitglieder...", + "player": "Spieler", + "ready": "Bereit", + "planned": "Vorgesehen", + "played": "Gespielt", + "noActiveMembers": "Keine aktiven Mitglieder gefunden", + "save": "Speichern", + "cancel": "Abbrechen", + "openMatchReport": "Spielberichtsbogen öffnen", + "copyCode": "Code kopieren", + "copyHomePin": "Heim-PIN kopieren", + "copyGuestPin": "Gast-PIN kopieren", + "errorLoadingMembers": "Laden der Mitgliederliste fehlgeschlagen.", + "playerSelectionSaved": "Spielerauswahl gespeichert", + "errorSavingPlayerSelection": "Fehler beim Speichern der Spielerauswahl", + "pleaseSelectGame": "Bitte wählen Sie zuerst ein Spiel aus", + "errorLoadingGallery": "Galerie konnte nicht geladen werden.", + "errorLoadingTeams": "Fehler beim Laden der Teams", + "noLeagueForTeam": "Für dieses Team ist keine Liga hinterlegt. Bitte zuerst eine Liga zuordnen.", + "errorLoadingMatches": "Fehler beim Laden der Matches", + "errorLoadingOverallSchedule": "Fehler beim Laden des Gesamtspielplans", + "errorLoadingAdultSchedule": "Fehler beim Laden des Erwachsenenspielplans", + "noMatchesForPDF": "Keine Matches gefunden, um PDF zu generieren.", + "errorCopying": "Fehler beim Kopieren", + "schedulePDF": "Spielpläne.pdf", + "selectSpecificLeague": "Bitte wählen Sie eine spezifische Liga aus, um die Tabelle zu laden.", + "tableDataLoaded": "Tabellendaten erfolgreich von MyTischtennis geladen!", + "errorLoadingTable": "Fehler beim Laden der Tabellendaten von MyTischtennis", + "scheduleImportSuccess": "Spielplan erfolgreich importiert!", + "errorImportingCSV": "Fehler beim Importieren der CSV-Datei", + "locationInfo": "Ort", + "showLocation": "Spiellokal anzeigen", + "locationDialogTitle": "Spiellokal", + "locationName": "Spiellokal", + "addressLabel": "Adresse", + "cityLabel": "PLZ / Ort", + "matchLabel": "Spiel" + }, "teamManagement": { + "title": "Team-Verwaltung", + "subtitle": "Teams auswählen, Konfiguration prüfen und Liga-Daten an einem Ort pflegen.", + "ratingUpdates": "Rating-Updates", + "lastRun": "Zuletzt", + "updated": "aktualisiert", + "error": "Fehler", + "matchResults": "Spielergebnisse", + "fetched": "abgerufen", + "newTeam": "Neues Team", + "basicSettings": "Grundeinstellungen", + "basicSettingsIntro": "Teamname und Liga in einem ruhigen Formular prüfen und anpassen.", + "editTeam": "Team bearbeiten", + "createNewTeam": "Neues Team anlegen", + "teamName": "Team-Name", + "teamNamePlaceholder": "z.B. Herren 1, Damen 2", + "league": "Spielklasse", + "plannedLeague": "Geplante Spielklasse", + "plannedLeaguePlaceholder": "z. B. Bezirksliga, nach nächster Meldung …", + "plannedLeagueHint": "Optional. Unabhängig von der gemeldeten Liga (MyTischtennis).", + "team": "Team", + "teamId": "Team-ID", + "groupId": "Gruppen-ID", + "association": "Verband", + "groupName": "Gruppenname", + "noLeague": "Keine Spielklasse", + "change": "Ändern", + "createAndEdit": "Anlegen & Bearbeiten", + "clearFields": "Felder leeren", + "playerStats": "Spieleinsätze", + "playerStatsIntro": "Schneller Überblick über Einsätze der Mannschaft in dieser Saison.", "lineupProposal": "Mannschaftsmeldung nach QTTR", + "teamGender": "Geschlecht", + "teamAgeGroup": "Altersklasse", + "teamGenderOpen": "Offen", + "teamGenderFemale": "Weiblich", "eligibility": "Einsatz", "eligibilityRegular": "Regulär", "eligibilityAdultRelease": "Freigabe Erwachsene", @@ -621,20 +1418,1022 @@ "exportLineupPdf": "Aufstellung als PDF", "lineupPdfEmpty": "Es sind keine Spieler in der Aufstellung – PDF kann nicht erstellt werden.", "lineupPdfFilePrefix": "Aufstellung", - "plannedLeague": "Geplante Spielklasse", - "plannedLeaguePlaceholder": "z. B. Bezirksliga, nach nächster Meldung …", - "plannedLeagueHint": "Optional. Unabhängig von der gemeldeten Liga (MyTischtennis).", + "lineupUnsavedChanges": "Ungespeicherte Änderungen in der Mannschaftsmeldung.", + "lineupSaved": "Mannschaftsmeldung gespeichert.", "lineupSaveError": "Mannschaftsmeldung konnte nicht gespeichert werden.", "lineupValidationTooLargeGap": "{higher} hat mehr als 30 QTTR Punkte Vorsprung vor {lower}. Diese Reihenfolge bitte korrigieren.", + "refreshStats": "Aktualisieren", + "loadingStats": "Lade Statistiken...", + "noPlayerStats": "Keine Spieleinsätze erfasst.", + "player": "Spieler", + "qttr": "(Q)TTR-Wert", + "season": "Saison", + "seasonFull": "Gesamte Saison (ab 1. Juli)", "firstHalf": "Vorrunde", "firstHalfFull": "Vorrunde (Juli - Dezember)", "secondHalf": "Rückrunde", "secondHalfFull": "Rückrunde (ab 1. Januar)", + "documents": "Dokumente", + "documentsIntro": "Code- und PIN-Listen hochladen, prüfen und bei Bedarf erneut parsen.", + "documentAvailable": "Vorhanden", + "documentMissing": "Fehlt", + "latestUpload": "Zuletzt hochgeladen: {date}", + "noDocumentUploadYet": "Noch kein Dokument hochgeladen.", + "uploadNewVersion": "Neue Version hochladen", + "openDocument": "Anzeigen", + "parseDocument": "Neu parsen", + "codeList": "Code-Liste", + "pinList": "Pin-Liste", + "automaticJobs": "Automatische Jobs", + "lastUpdated": "Zuletzt aktualisiert", + "status": "Status", + "successful": "Erfolgreich", + "noAutomaticUpdate": "Noch keine automatische Aktualisierung", + "myTischtennis": "MyTischtennis", + "myTischtennisIntro": "URL einfügen, Konfiguration prüfen und bei Bedarf Daten manuell abrufen.", + "configurationStatus": "Konfigurationsstatus", + "manualFetch": "Abrufen", + "noIssues": "Keine offenen Konfigurationsprobleme.", + "parseUrlAction": "URL prüfen", + "myTischtennisUrlPlaceholder": "MyTischtennis URL...", + "teams": "Teams", + "planningTitle": "Mannschaftsplanung", + "planningSubtitle": "Mitglieder auf geplante Teams verteilen, Reihenfolge festlegen und offene Zuordnungen sehen.", + "searchMembers": "Mitglied suchen", + "playersWantToPlay": "Wollen spielen", + "playersPoolSubtitle": "Alle aktiven Mitglieder mit Spielinteresse", + "unassignedMembers": "Noch nicht zugeordnet", + "unassignedMembersSubtitle": "Mitglieder ohne Team-Zuordnung", + "allMembersAssigned": "Alle Mitglieder sind aktuell zugeordnet.", + "addPlanningTeam": "Planungs-Team hinzufügen", + "selectMember": "Mitglied auswählen", + "selectTeam": "Team auswählen", + "assignMemberToTeam": "Zu Team hinzufügen", + "markAsInterested": "Als interessiert markieren", + "autoSaved": "Automatisch gespeichert", + "autoSaveError": "Automatisches Speichern fehlgeschlagen", + "sortFirstLast": "Sortierung: Vorname Nachname", + "sortLastFirst": "Sortierung: Nachname Vorname", + "noMembersInPool": "Keine passenden Mitglieder gefunden.", + "noPlannedLeague": "Keine geplante Spielklasse", + "activeTeam": "Aktives Team", + "searchTeams": "Team suchen", + "openInWorkspace": "Zum Bearbeiten öffnen", + "filterAll": "Alle", + "filterConfigured": "Konfiguriert", + "filterNeedsAttention": "Prüfen", + "filterNoLeague": "Ohne Liga", + "seasonUnknown": "unbekannt", + "noTeamsYet": "Noch keine Teams vorhanden. Erstellen Sie Ihr erstes Team!", + "noMatchingTeams": "Keine Teams passen zur aktuellen Suche oder Filterung.", + "edit": "Bearbeiten", + "delete": "Löschen", + "noAssignment": "Keine Zuordnung", + "created": "Erstellt", + "unknown": "Unbekannt", + "fullyConfigured": "Vollständig konfiguriert", + "partiallyConfigured": "Teilweise konfiguriert", + "notConfigured": "Nicht konfiguriert", + "never": "Nie", + "showCodeList": "Code-Liste anzeigen", + "showPinList": "Pin-Liste anzeigen", + "deleteTeamTitle": "Club-Team löschen", + "deleteTeamConfirm": "Möchten Sie das Club-Team \"{name}\" wirklich löschen?", + "errorDeletingTeam": "Fehler beim Löschen des Club-Teams.", + "teamHasNoLeague": "Dieses Team ist keiner Liga zugeordnet.", + "assignLeagueBeforeDocuments": "Bitte ordnen Sie dem Team zuerst eine Liga zu, damit Dokumente verarbeitet werden können.", + "assignLeagueBeforeParsing": "Bitte ordnen Sie dem Team zuerst eine Liga zu, um PDF-Dateien zu parsen.", + "documentParsedSummary": "{label} erfolgreich hochgeladen und geparst!\n\nGefundene Spiele: {matchesFound}\nNeue Spiele erstellt: {created}\nSpiele aktualisiert: {updated}", + "errorsCount": "Fehler: {count}", + "moreErrors": "... und {count} weitere", + "noMatchesFoundTitle": "Keine Spiele gefunden", + "noMatchesFoundDetails": "Hinweis: Keine Spiele erkannt.\nZeilen im Dokument: {lines}", + "documentUploaded": "{label} \"{fileName}\" wurde erfolgreich hochgeladen!", + "errorUploadingDocument": "Fehler beim Hochladen und Parsen der Datei.", + "matchesSummary": "Gefundene Spiele: {matchesFound}\nNeue Spiele erstellt: {created}\nSpiele aktualisiert: {updated}", + "errorParsingPdf": "Fehler beim Parsen der PDF-Datei", + "documentNotFound": "Das ausgewählte Dokument wurde nicht gefunden.", + "missingLeagueForTeam": "Für das ausgewählte Team wurde keine Liga übermittelt.", + "pdfFileNotFound": "Die PDF-Datei konnte nicht gefunden werden.", + "reuploadFile": "Bitte laden Sie die Datei erneut hoch und versuchen Sie es noch einmal.", + "errorLoadingPdf": "Fehler beim Laden des PDFs.", + "errorParsingUrl": "URL konnte nicht geparst werden. Bitte überprüfen Sie das Format.", + "configureLeagueTitle": "Liga konfigurieren?", + "tableUrlDetected": "Tabellen-URL erkannt", + "configureLeagueDetails": "Verband: {association}\nSaison: {season}\nLiga: {league}\nGruppen-ID: {groupId}\n\nMöchten Sie diese Liga in der Datenbank konfigurieren? Dies ermöglicht es, Tabellendaten automatisch abzurufen.", + "selectTeamTitle": "Team auswählen", + "selectTeamFirst": "Bitte wählen Sie zuerst ein Team aus", + "selectTeamForConfiguration": "Um die MyTischtennis-Konfiguration zu aktivieren, müssen Sie zuerst ein Team aus der Liste auswählen.", + "teamConfiguredSuccess": "Team erfolgreich konfiguriert! Automatischer Datenabruf ist jetzt aktiv.", + "teamConfiguredDetails": "Liga: {league}\nSaison: {season}\nAutomatischer Datenabruf ist jetzt aktiv.", + "errorConfiguringTeam": "Team konnte nicht konfiguriert werden.", + "leagueConfiguredSuccess": "Liga erfolgreich konfiguriert! Tabellendaten können jetzt automatisch abgerufen werden.", + "leagueConfiguredDetails": "Liga: {league}\nSaison: {season}\nVerband: {association}\nGruppen-ID: {groupId}\n\nTabellendaten können jetzt automatisch abgerufen werden.", + "errorConfiguringLeague": "Liga konnte nicht konfiguriert werden.", + "notCreated": "Nicht erstellt", + "autoFetchEnabled": "Automatischer Datenabruf ist aktiviert", + "missingItems": "Fehlend: {items}", "missingConfigSummary": "Fehlende Angaben:", "leagueFieldRequired": "Bitte eine Spielklasse auswählen und speichern.", - "myTischtennisUrlRequired": "MyTischtennis-URL einfügen und parsen, um Team-ID und Ligendaten zu übernehmen." + "myTischtennisUrlRequired": "MyTischtennis-URL einfügen und parsen, um Team-ID und Ligendaten zu übernehmen.", + "enterUrlForAutoConfig": "MyTischtennis-URL eingeben für automatische Konfiguration", + "errorLoadingStats": "Statistiken konnten nicht geladen werden.", + "asyncJobStartFailed": "Async-Job konnte nicht gestartet werden.", + "dataFetchFailed": "Daten konnten nicht abgerufen werden.", + "fetchTimedOut": "Zeitüberschreitung beim Abruf (Async-Job läuft zu lange).", + "teamDataFetched": "Teamdaten erfolgreich abgerufen.", + "unknownTeam": "Unbekanntes Team", + "teamDataFetchedDetails": "Team: {team}\nAbgerufene Datensätze: {count}", + "tableUpdateLabel": "Tabellenaktualisierung:", + "mytischtennisLoginRequired": "Login bei myTischtennis erforderlich", + "fetchTimeoutShort": "Zeitüberschreitung beim Abruf (Timeout).", + "invalidFileTypeTitle": "Ungültiger Dateityp", + "invalidFileExtension": "{label} muss eine der folgenden Endungen haben: {extensions}.", + "invalidMimeType": "{label} weist einen unerwarteten MIME-Typ auf: {type}.", + "fileTooLargeTitle": "Datei zu groß", + "fileTooLarge": "{label} darf maximal 10 MB groß sein." + }, + "pendingApprovals": { + "title": "Ausstehende Benutzeranfragen", + "firstName": "Vorname", + "lastName": "Nachname", + "email": "Email", + "actions": "Aktionen", + "approve": "Genehmigen", + "reject": "Ablehnen", + "noPendingRequests": "Keine ausstehenden Benutzeranfragen.", + "noPermission": "Keine Berechtigung", + "noPermissionMessage": "Sie haben keine Berechtigung, Freigaben zu verwalten.", + "noPermissionDetails": "Nur Administratoren können Mitgliedsanfragen bearbeiten.", + "errorLoadingRequests": "Fehler beim Laden der ausstehenden Anfragen", + "errorApproving": "Fehler beim Genehmigen des Benutzers", + "errorRejecting": "Fehler beim Ablehnen des Benutzers" + }, + "permissions": { + "title": "Berechtigungsverwaltung", + "subtitle": "Verwalten Sie die Zugriffsrechte für Clubmitglieder", + "loadingMembers": "Lade Mitglieder...", + "availableRoles": "Verfügbare Rollen", + "clubMembers": "Clubmitglieder", + "email": "Email", + "role": "Rolle", + "status": "Status", + "actions": "Aktionen", + "active": "Aktiv", + "inactive": "Deaktiviert", + "clickToDeactivate": "Klicken zum Deaktivieren", + "clickToActivate": "Klicken zum Aktivieren", + "customize": "Anpassen", + "creator": "Ersteller", + "permissionsFor": "Berechtigungen für", + "baseRole": "Basis-Rolle", + "customizeInfo": "Hier können Sie individuelle Anpassungen vornehmen.", + "reset": "Zurücksetzen", + "resetAll": "Alle zurücksetzen", + "cancel": "Abbrechen", + "save": "Speichern", + "errorLoadingData": "Fehler beim Laden der Daten", + "errorUpdatingRole": "Fehler beim Aktualisieren der Rolle", + "errorSavingPermissions": "Fehler beim Speichern der Berechtigungen", + "resetResource": "Zurücksetzen", + "close": "Abbrechen" + }, + "memberTransfer": { + "title": "Mitgliederübertragung", + "loadingConfig": "Konfiguration wird geladen...", + "transferConfiguration": "Übertragungskonfiguration", + "configInfo": "Konfigurieren Sie hier die Einstellungen für die Übertragung von Mitgliedern an externe Systeme. Diese Einstellungen werden vereinsspezifisch gespeichert.", + "serverConfiguration": "Server-Konfiguration", + "serverBaseUrl": "Server-Basis-URL", + "serverBaseUrlPlaceholder": "https://example.com", + "serverBaseUrlHint": "Basis-URL des Servers (z.B. https://example.com)", + "loginConfiguration": "Login-Konfiguration", + "loginEndpointPath": "Login-Endpoint Pfad", + "loginEndpointPlaceholder": "/api/auth/login", + "loginEndpointHint": "Optional: Relativer Pfad zum Login-Endpoint (z.B. /api/auth/login)", + "loginFormat": "Login-Format", + "loginData": "Login-Daten", + "usernameEmail": "Benutzername / Email", + "password": "Passwort", + "additionalField": "Zusätzliches Feld", + "additionalFieldExample1": "Zusätzliches Feld (z.B. client_id)", + "additionalFieldExample2": "Zusätzliches Feld (z.B. client_secret)", + "passwordEncrypted": "Passwörter werden verschlüsselt gespeichert", + "transferConfigurationTitle": "Übertragungs-Konfiguration", + "transferEndpointPath": "Übertragungs-Endpoint Pfad", + "transferEndpointPlaceholder": "/api/members/bulk", + "transferEndpointHint": "Relativer Pfad zum Übertragungs-Endpoint (z.B. /api/members/bulk)", + "httpMethod": "HTTP-Methode", + "transferFormat": "Übertragungs-Format", + "bulkMode": "Bulk-Import-Modus (alle Mitglieder auf einmal übertragen)", + "bulkModeHint": "Wenn aktiviert, werden alle Mitglieder in einem Request als Array übertragen.", + "importTemplate": "Template aus vollständigem Beispiel importieren", + "importTemplatePlaceholder": "Fügen Sie hier ein vollständiges Beispiel-Template ein, z.B.:\nLBRACE\n DQUOTEmembersDQUOTE: [\n LBRACE\n DQUOTEfirstNameDQUOTE: DQUOTEMaxDQUOTE,\n DQUOTElastNameDQUOTE: DQUOTEMustermannDQUOTE,\n DQUOTEemailDQUOTE: DQUOTEmaxATexample.comDQUOTE\n RBRACE\n ]\nRBRACE", + "analyzeAndImport": "Template analysieren und importieren", + "importTemplateHint": "Fügen Sie ein vollständiges Beispiel-Template (mit Beispiel-Mitgliedern) ein. Das System erkennt automatisch das Mitglied-Template und das Bulk-Wrapper-Template.", + "bulkWrapperTemplate": "Bulk-Wrapper-Template (optional)", + "bulkWrapperWhat": "Was ist ein Bulk-Wrapper-Template?", + "bulkWrapperDescription": "Optional können Sie die äußere Struktur definieren, in die die Mitglieder-Array eingefügt wird. Verwenden Sie PLACEHOLDER_MEMBERS als Platzhalter für das Array der Mitglieder.", + "example": "Beispiel", + "bulkWrapperNote": "Hinweis: Wenn kein Wrapper-Template angegeben wird, wird automatisch ein members-Array verwendet.", + "availablePlaceholders": "Verfügbare Platzhalter", + "membersArray": "Mitglieder-Array", + "transferTemplate": "Übertragungs-Template", + "templateWhat": "Was ist ein Template?", + "templateDescription": "Das Template definiert das Format, in dem die Mitgliederdaten an das externe System übertragen werden. Verwenden Sie Platzhalter wie PLACEHOLDER_FIRSTNAME, um die Daten automatisch zu ersetzen.", + "exampleJson": "Beispiel für JSON-Format (empfohlen)", + "exampleXml": "Beispiel für XML-Format", + "exampleFormData": "Beispiel für Form-Data Format", + "formDataHint": "Für Form-Data verwenden Sie ein einfaches Text-Template mit Zeilen im Format feldname=platzhalter:", + "bulkModeActive": "Bulk-Modus aktiv", + "bulkModeActiveDescription": "Das Template definiert das Format für ein einzelnes Mitglied. Die Mitglieder werden automatisch in ein Array gewrappt. Die äußere Struktur können Sie optional im \"Bulk-Wrapper-Template\" definieren (siehe unten).", + "placeholderHint": "Klicken Sie auf einen Platzhalter, um ihn an der aktuellen Cursor-Position einzufügen:", + "templateTip": "Tipp: Setzen Sie den Cursor an die gewünschte Stelle im Template und klicken Sie auf einen Platzhalter, um ihn einzufügen. Platzhalter werden beim Übertragen automatisch durch die tatsächlichen Mitgliederdaten ersetzt.", + "saving": "Speichere...", + "save": "Speichern", + "deleting": "Lösche...", + "deleteConfig": "Konfiguration löschen", + "errorLoading": "Fehler beim Laden der Konfiguration", + "configSaved": "Konfiguration erfolgreich gespeichert!", + "errorSaving": "Fehler beim Speichern", + "confirmDelete": "Konfiguration löschen", + "confirmDeleteMessage": "Möchten Sie die Konfiguration wirklich löschen?", + "configDeleted": "Konfiguration erfolgreich gelöscht!", + "errorDeleting": "Fehler beim Löschen", + "templateImported": "Template erfolgreich importiert!", + "templateImportedDetails": "Mitglied- und Bulk-Wrapper-Template wurden erkannt und ausgefüllt.", + "templateImportedSingle": "Einzelnes Mitglied-Template erkannt.", + "templateImportedBulk": "Mitglied-Template erkannt, Bulk-Modus aktiviert.", + "errorParsingTemplate": "Fehler beim Parsen des Templates", + "invalidTemplateFormat": "Ungültiges Template-Format", + "invalidJson": "Bitte stellen Sie sicher, dass gültiges JSON verwendet wird.", + "placeholders": { + "firstName": "Vorname", + "firstNameDesc": "Vorname des Mitglieds", + "lastName": "Nachname", + "lastNameDesc": "Nachname des Mitglieds", + "fullName": "Vollständiger Name", + "fullNameDesc": "Vorname und Nachname kombiniert", + "email": "E-Mail-Adresse", + "emailDesc": "E-Mail-Adresse des Mitglieds", + "phone": "Telefonnummer", + "phoneDesc": "Telefonnummer des Mitglieds", + "street": "Straße", + "streetDesc": "Straße und Hausnummer", + "city": "Ort", + "cityDesc": "Wohnort", + "birthDate": "Geburtsdatum", + "birthDateDesc": "Geburtsdatum im Format YYYY-MM-DD", + "birthDateAlt": "Geburtsdatum (alt)", + "birthDateAltDesc": "Geburtsdatum im Format YYYY-MM-DD (alternative Bezeichnung)", + "address": "Kombinierte Adresse", + "addressDesc": "Straße und Ort kombiniert", + "ttr": "TTR-Wert", + "ttrDesc": "TTR-Wert des Mitglieds", + "qttr": "QTTR-Wert", + "qttrDesc": "QTTR-Wert des Mitglieds", + "gender": "Geschlecht", + "genderDesc": "Geschlecht des Mitglieds" + }, + "transferConfig": "Übertragungskonfiguration" + }, + "logs": { + "title": "System-Logs", + "subtitle": "Übersicht über alle API-Requests, Responses und Ausführungen", + "backend": "Backend", + "all": "Alle", + "mytischtennis": "myTischtennis", + "ownBackend": "Eigenes Backend", + "logType": "Log-Typ", + "apiRequests": "API-Requests", + "scheduler": "Scheduler", + "cronJobs": "Cron-Jobs", + "manual": "Manuelle Ausführungen", + "httpMethod": "HTTP-Methode", + "status": "Status", + "path": "Pfad", + "pathPlaceholder": "z.B. /api/diary", + "from": "Von", + "to": "Bis", + "applyFilters": "Filter anwenden", + "clearFilters": "Zurücksetzen", + "loadingLogs": "Lade Logs...", + "successfullyLoaded": "Erfolgreich geladen", + "recordsFound": "Datensätze gefunden", + "displayed": "angezeigt", + "error": "Fehler", + "total": "Gesamt", + "displayedLabel": "Angezeigt", + "time": "Zeit", + "type": "Typ", + "method": "Methode", + "executionTime": "Ausführungszeit", + "errorLabel": "Fehler", + "actions": "Aktionen", + "details": "Details", + "previous": "Vorherige", + "next": "Nächste", + "page": "Seite", + "of": "von", + "logDetails": "Log-Details", + "errorLoading": "Fehler beim Laden der Logs", + "justNow": "gerade eben", + "secondsAgo": "vor {n} Sekunden", + "minutesAgo": "vor {n} Minuten", + "logTypeLabels": { + "api_request": "API-Request", + "scheduler": "Scheduler", + "cron_job": "Cron-Job", + "manual": "Manuell" + }, + "logDetailsLabels": { + "time": "Zeit", + "type": "Typ", + "method": "Methode", + "path": "Pfad", + "status": "Status", + "executionTime": "Ausführungszeit", + "ip": "IP", + "schedulerJob": "Scheduler-Job", + "error": "Fehler", + "requestBody": "Request Body", + "responseBody": "Response Body" + }, + "viewDetails": "Details" + }, + "csvImport": { + "title": "Spielplan importieren", + "uploadCsvFile": "CSV-Datei hochladen", + "cancel": "Abbrechen", + "import": "Importieren" + }, + "quickAddMember": { + "title": "Neues Mitglied hinzufügen", + "firstName": "Vorname", + "lastName": "Nachname (optional)", + "birthDate": "Geburtsdatum (optional)", + "gender": "Geschlecht", + "pleaseSelect": "Bitte wählen", + "cancel": "Abbrechen", + "createAndAdd": "Erstellen & Hinzufügen" + }, + "dialogs": { + "info": { + "title": "Information", + "ok": "OK" + }, + "confirm": { + "title": "Bestätigung", + "ok": "OK", + "cancel": "Abbrechen" + } + }, + "memberSelection": { + "title": "Mitglieder auswählen", + "selectAll": "Alle auswählen", + "deselectAll": "Alle abwählen", + "members": "Mitglieder", + "recommendations": "Empfehlungen", + "noRecommendations": "Keine passenden Empfehlungen gefunden.", + "close": "Schließen", + "generatePdf": "PDF erzeugen" + }, + "memberTransferDialog": { + "title": "Mitglieder übertragen", + "loadingConfig": "Gespeicherte Konfiguration wird geladen...", + "noConfigFound": "Keine Konfiguration gefunden", + "noConfigMessage": "Bitte konfigurieren Sie zuerst die Mitgliederübertragung in den Einstellungen.", + "goToSettings": "Zu den Einstellungen", + "transferConfiguration": "Übertragungskonfiguration", + "server": "Server", + "endpoint": "Endpoint", + "method": "Methode", + "format": "Format", + "mode": "Modus", + "bulkImport": "Bulk-Import", + "single": "Einzeln", + "editConfig": "Konfiguration bearbeiten", + "loginDataOverride": "Login-Daten (optional überschreiben)", + "loginDataHint": "Die Login-Daten werden aus den Einstellungen verwendet. Sie können sie hier überschreiben, falls nötig.", + "loginData": "Login-Daten", + "usernameEmail": "Benutzername / Email", + "passwordPlaceholder": "Passwort (leer lassen für gespeichertes)", + "additionalFieldPlaceholder": "Zusätzliches Feld (z.B. client_id)", + "additionalFieldPlaceholderForm": "Feldname: Wert (z.B. client_id: abc123)", + "loginDataOverrideHint": "Nur ausfüllen, wenn Sie die gespeicherten Login-Daten überschreiben möchten. Leere Felder verwenden die gespeicherten Werte.", + "cancel": "Abbrechen", + "transferring": "Übertrage...", + "transfer": "Übertragen", + "transferSuccess": "{transferred} von {total} Mitgliedern erfolgreich übertragen.", + "excludedMembers": "Ausgeschlossene Mitglieder (fehlende Pflichtfelder)", + "additionalErrors": "Weitere Fehler", + "transferFailed": "Übertragung fehlgeschlagen", + "transferError": "Fehler bei der Übertragung" + }, + "myTischtennisAccount": { + "title": "myTischtennis-Account", + "loading": "Lade...", + "linkedAccount": "Verknüpfter Account", + "email": "E-Mail:", + "passwordSaved": "Passwort gespeichert:", + "club": "Verein (myTischtennis):", + "lastSuccessfulLogin": "Letzter erfolgreicher Login:", + "lastLoginAttempt": "Letzter Login-Versuch:", + "lastFetch": "Letzter Abruf:", + "autoUpdates": "Automatische Updates:", + "enabled": "Aktiviert", + "disabled": "Deaktiviert", + "yes": "Ja", + "no": "Nein", + "editAccount": "Account bearbeiten", + "loginAgain": "Erneut einloggen", + "updateHistory": "Update-History", + "unlinkAccount": "Account trennen", + "noAccountLinked": "Kein myTischtennis-Account verknüpft.", + "linkAccount": "Account verknüpfen", + "aboutMyTischtennis": "Über myTischtennis", + "aboutDescription": "Durch die Verknüpfung Ihres myTischtennis-Accounts können Sie:", + "aboutFeature1": "Automatisch Turnierdaten importieren", + "aboutFeature2": "Spielerergebnisse synchronisieren", + "aboutFeature3": "Wettkampfdaten direkt abrufen", + "aboutHint": "Das Speichern des Passworts ist optional. Wenn Sie es nicht speichern, werden Sie bei jeder Synchronisation nach dem Passwort gefragt.", + "fetchStatistics": "Datenabruf-Statistiken", + "loadingStatistics": "Lade Statistiken...", + "playerRatings": "Spielerwertungen", + "matchResults": "Spielergebnisse", + "leagueTables": "Ligatabellen", + "playersUpdated": "Spieler aktualisiert", + "results": "Ergebnisse", + "teams": "Teams", + "neverFetched": "Noch nie abgerufen", + "refreshStatistics": "Statistiken aktualisieren", + "errorLoadingAccount": "Fehler beim Laden des myTischtennis-Accounts", + "accountSaved": "myTischtennis-Account erfolgreich gespeichert", + "loginSuccessful": "Login erfolgreich! Verbindungsdaten aktualisiert.", + "loginFailed": "Login fehlgeschlagen", + "passwordRequired": "Passwort benötigt", + "unlinkAccountTitle": "Account trennen", + "unlinkAccountConfirm": "Möchten Sie die Verknüpfung zum myTischtennis-Account wirklich trennen?", + "accountUnlinked": "myTischtennis-Account erfolgreich getrennt", + "errorUnlinking": "Fehler beim Trennen des Accounts", + "errorLoadingStatistics": "Fehler beim Laden der Fetch-Statistiken", + "justNow": "Gerade eben", + "minutesAgo": "vor {count} Min.", + "hoursAgo": "vor {count} Std.", + "yesterday": "Gestern", + "daysAgo": "vor {count} Tagen", + "never": "Nie" + }, + "myTischtennisDialog": { + "editAccount": "myTischtennis-Account bearbeiten", + "linkAccount": "myTischtennis-Account verknüpfen", + "email": "myTischtennis-E-Mail", + "emailPlaceholder": "Ihre myTischtennis-E-Mail-Adresse", + "password": "myTischtennis-Passwort", + "passwordPlaceholder": "Ihr myTischtennis-Passwort", + "passwordPlaceholderKeep": "Leer lassen um beizubehalten", + "savePassword": "myTischtennis-Passwort speichern", + "savePasswordHint": "Wenn aktiviert, wird Ihr myTischtennis-Passwort verschlüsselt gespeichert, sodass automatische Synchronisationen möglich sind.", + "autoUpdateRatings": "Automatische Update-Ratings aktivieren", + "autoUpdateRatingsHint": "Täglich um 6:00 Uhr werden automatisch die neuesten Ratings von myTischtennis abgerufen. Erfordert gespeichertes Passwort.", + "autoUpdateWarning": "Für automatische Updates muss das myTischtennis-Passwort gespeichert werden.", + "appPassword": "Ihr App-Passwort zur Bestätigung", + "appPasswordPlaceholder": "Ihr Passwort für diese App", + "appPasswordHint": "Aus Sicherheitsgründen benötigen wir Ihr App-Passwort, um das myTischtennis-Passwort zu speichern.", + "cancel": "Abbrechen", + "saving": "Speichere...", + "save": "Speichern", + "errorSaving": "Fehler beim Speichern des Accounts", + "login": "Einloggen", + "loggingIn": "Logge ein...", + "errorLogin": "Fehler beim Einloggen", + "loadingLoginForm": "Lade Login-Formular..." + }, + "trainingDetails": { + "title": "Trainings-Details", + "birthdate": "Geburtsdatum", + "birthYear": "Geburtsjahr", + "maxBirthYear": "Geboren ≤ Jahr", + "last12Months": "Letzte 12 Monate", + "last3Months": "Letzte 3 Monate", + "total": "Gesamt", + "trainingParticipations": "Trainingsteilnahmen (absteigend sortiert)", + "noTrainings": "Keine Trainingsteilnahmen vorhanden" + }, + "memberNotes": { + "title": "Notizen für", + "phone": "Telefon-Nr.", + "memberImage": "Mitgliedsbild", + "tags": "Tags", + "selectTags": "Tags auswählen", + "newNote": "Neue Notiz", + "add": "Hinzufügen", + "notes": "Notizen" + }, + "matchReport": { + "hideAnalyzer": "Analyzer verstecken", + "analyzeNuscore": "nuscore analysieren", + "createLocalCopy": "Lokale Kopie erstellen" + }, + "matchReportApi": { + "loading": "Lade Spielberichtsdaten...", + "errorLoading": "Fehler beim Laden der Daten", + "retry": "Erneut versuchen", + "general": "Allgemein", + "homeLineup": "Aufstellung Heim", + "guestLineup": "Aufstellung Gast", + "greeting": "Begrüßung", + "result": "Ergebniserfassung", + "completion": "Abschluss", + "vs": "vs", + "startTime": "Startzeit", + "endTime": "Endzeit", + "setCurrentTime": "Aktuelle Zeit setzen", + "status": "Status", + "completed": "Abgeschlossen", + "pending": "Ausstehend", + "notAppeared": "Nicht angetreten", + "bothTeamsAppeared": "Beide Mannschaften angetreten", + "homeTeamNotAppeared": "Heimmannschaft {team} nicht angetreten", + "guestTeamNotAppeared": "Gastmannschaft {team} nicht angetreten", + "playSystem": "Spielsystem", + "pinInput": "PIN-Eingabe", + "homePin": "PIN Heimverein", + "guestPin": "PIN Gastverein", + "signLineup": "Aufstellung signieren", + "selectedPlayers": "Ausgewählte Spieler", + "availablePlayers": "Verfügbare Spieler", + "noLineupData": "Keine Aufstellungsdaten verfügbar", + "clickToRemove": "Klicken zum Entfernen", + "rank": "Rang" + }, + "activityStats": { + "title": "Übungs-Statistiken", + "last3Participations": "Letzte 3 Teilnahmen", + "activityStatistics": "Statistik der Übungen", + "noParticipations": "Keine Teilnahmen vorhanden", + "noStatistics": "Keine Statistiken vorhanden" + }, + "tagHistory": { + "title": "Tag-Historie", + "selectTags": "Tags auswählen", + "noHistory": "Keine Tag-Historie vorhanden" + }, + "imageViewer": { + "previousImage": "Vorheriges Bild", + "nextImage": "Nächstes Bild", + "noImageAvailable": "Kein Bild verfügbar", + "rotateLeft": "90° links drehen", + "rotateRight": "90° rechts drehen", + "setAsPrimary": "Als Hauptbild festlegen", + "setAsPrimaryButton": "Als Hauptbild setzen", + "deleteImage": "Bild löschen", + "delete": "Löschen", + "selectFiles": "Dateien auswählen", + "camera": "Kamera" + }, + "memberActivities": { + "title": "Übungen von", + "period": "Zeitraum", + "last4Weeks": "Letzte 4 Wochen", + "last3Months": "Letzte 3 Monate", + "last6Months": "Letztes halbes Jahr", + "lastYear": "Letztes Jahr", + "all": "Alle", + "loading": "Lade Übungen...", + "noActivities": "Keine Übungen im gewählten Zeitraum gefunden.", + "activity": "Übung", + "frequency": "Häufigkeit", + "dates": "Daten", + "more": "weitere", + "showLess": "weniger anzeigen", + "close": "Schließen" + }, + "memberGallery": { + "title": "Mitglieder-Galerie", + "titleWithDate": "Mitglieder-Galerie - Klicken Sie auf ein Bild, um als Teilnehmer hinzuzufügen", + "imageSize": "Bildgröße", + "loading": "Galerie wird geladen…", + "noImage": "Kein Bild", + "noMembersWithImages": "Keine Mitglieder mit Bildern gefunden." + }, + "myTischtennisHistory": { + "title": "Update-Ratings History", + "loading": "Lade History...", + "noHistory": "Noch keine automatischen Updates durchgeführt.", + "successful": "Erfolgreich", + "failed": "Fehlgeschlagen", + "ratingsUpdated": "Ratings aktualisiert", + "close": "Schließen" + }, + "courtDrawing": { + "title": "Tischtennis-Übung konfigurieren", + "cancel": "Abbrechen", + "ok": "OK", + "durationMinutes": "Dauer (Minuten)", + "durationText": "Dauer (Text)", + "durationTextPlaceholder": "z.B. 2x5", + "group": "Gruppe", + "selectGroup": "Gruppe auswählen..." + }, + "imageDialog": { + "title": "Bild", + "noImageAvailable": "Kein Bild verfügbar", + "close": "Schließen" + }, + "seasonSelector": { + "label": "Saison:", + "loading": "Lade...", + "selectSeason": "Saison wählen...", + "addSeason": "Neue Saison hinzufügen", + "newSeason": "Neue Saison:", + "placeholder": "z.B. 2023/2024", + "create": "Erstellen", + "cancel": "Abbrechen", + "errorLoading": "Fehler beim Laden der Saisons", + "errorCreating": "Fehler beim Erstellen der Saison", + "alreadyExists": "Diese Saison existiert bereits!", + "hint": "Hinweis" + }, + "officialTournaments": { + "uploadPdf": "PDF hochladen", + "events": "Veranstaltungen", + "showEvents": "Gespeicherte Veranstaltungen anzeigen", + "participations": "Turnierbeteiligungen", + "showParticipations": "Turnierbeteiligungen anzeigen", + "savedEvents": "Gespeicherte Veranstaltungen", + "tournament": "Turnier", + "editTitle": "Titel bearbeiten", + "updateTitleError": "Titel konnte nicht gespeichert werden.", + "delete": "Löschen", + "timeRange": "Zeitraum:", + "last3Months": "Letzte 3 Monate", + "last6Months": "Letzte 6 Monate", + "last12Months": "Letzte 12 Monate", + "last2Years": "Letzte 2 Jahre", + "previousSeason": "Vorherige Saison", + "all": "Alle", + "member": "Mitglied", + "competition": "Konkurrenz", + "date": "Datum", + "placement": "Platzierung", + "noEvents": "Noch keine Veranstaltungen vorhanden. Laden Sie ein PDF hoch, um zu beginnen.", + "title": "Titel:", + "dateTime": "Termin:", + "venues": "Austragungsorte:", + "competitionTypes": "Konkurrenztypen:", + "deadlines": "Meldeschlüsse:", + "ageClasses": "Altersklassen:", + "startTimes": "Startzeiten:", + "deadlinesByAgeClass": "Meldeschlüsse je AK:", + "entryFees": "Teilnahmegebühren:", + "selectMembers": "Mitglieder auswählen", + "pdfForSelectedMembers": "PDF für markierte Mitglieder", + "showCompetitions": "Konkurrenzen anzeigen", + "showParticipants": "Teilnehmer anzeigen", + "showResults": "Ergebnisse anzeigen", + "competitions": "Konkurrenzen", + "ageClassCompetition": "Altersklasse/Wettbewerb", + "startTime": "Startzeit", + "entryFee": "Startgeld", + "deadlineDate": "Meldeschluss (Datum):", + "deadlineOnline": "Meldeschluss (Online):", + "cutoffDate": "Stichtag:", + "openTo": "Offen für:", + "preliminaryRound": "Vorrunde:", + "finalRound": "Endrunde:", + "eligible": "Teilnahmeberechtigt", + "name": "Name", + "birthDate": "Geburtsdatum", + "age": "Alter", + "status": "Status", + "action": "Aktion", + "hasPlayed": "Hat gespielt", + "registered": "Angemeldet", + "wantsToParticipate": "Möchte teilnehmen", + "notInterested": "Nicht interessiert", + "markAsRegistered": "Als angemeldet markieren", + "markAsParticipated": "Als teilgenommen markieren", + "resetStatus": "Status zurücksetzen", + "checkBoxToActivate": "Checkbox aktivieren", + "participants": "Teilnehmer", + "participantsPdf": "Teilnehmer-PDF", + "results": "Ergebnisse", + "participated": "Teilgenommen", + "uploadError": "Fehler beim Hochladen der PDF.", + "updatePlacementError": "Fehler beim Aktualisieren der Platzierung", + "updateStatusError": "Fehler beim Aktualisieren des Status" + }, + "baseDialog": { + "minimize": "Minimieren", + "close": "Schließen", + "resize": "Größe ändern" + }, + "dialogManager": { + "noMinimizedDialogs": "Keine minimierten Dialoge", + "minimize": "Minimieren", + "close": "Schließen" + }, + "matchReportHeaderActions": { + "insertPin": "PIN einfügen", + "insertPinTitle": "PIN automatisch einfügen", + "copyPin": "PIN kopieren", + "copyPinTitle": "PIN in Zwischenablage kopieren", + "noPinAvailable": "Keine PIN verfügbar", + "copied": "Kopiert!", + "copyError": "Fehler beim Kopieren der PIN" + }, + "dialogExamples": { + "title": "Dialog-Beispiele", + "modalDialogs": "Modale Dialoge", + "simpleModal": "Einfacher Modal", + "largeModal": "Großer Modal", + "fullscreenModal": "Fullscreen Modal", + "nonModalDialogs": "Nicht-modale Dialoge", + "nonModalDialog": "Nicht-modaler Dialog", + "multipleDialogs": "Mehrere Dialoge", + "infoDialogs": "Informations-Dialoge", + "info": "Info", + "success": "Erfolg", + "warning": "Warnung", + "error": "Fehler", + "confirmDialogs": "Bestätigungs-Dialoge", + "composableUsage": "Composable-Verwendung", + "useDialogExample": "useDialog Beispiel", + "useConfirmExample": "useConfirm Beispiel", + "simpleModalTitle": "Einfacher Modal Dialog", + "simpleModalText": "Dies ist ein einfacher modaler Dialog mit mittlerer Größe.", + "simpleModalText2": "Klicken Sie außerhalb oder auf das X, um zu schließen.", + "largeModalTitle": "Großer Modal Dialog", + "largeModalText": "Dies ist ein großer modaler Dialog.", + "largeModalText2": "Er bietet mehr Platz für Inhalte.", + "scrollArea": "Scroll-Bereich für viel Inhalt...", + "fullscreenModalTitle": "Fullscreen Modal Dialog", + "fullscreenModalText": "Dies ist ein Fullscreen-Dialog.", + "fullscreenModalText2": "Er nimmt fast den gesamten Bildschirm ein (90vw x 90vh).", + "nonModalTitle": "Nicht-modaler Dialog", + "nonModalText": "Dies ist ein nicht-modaler Dialog.", + "nonModalText2": "Sie können ihn verschieben und mehrere gleichzeitig öffnen!", + "secondNonModalTitle": "Zweiter nicht-modaler Dialog", + "secondNonModalText": "Noch ein nicht-modaler Dialog!", + "information": "Information", + "infoMessage": "Dies ist eine Informationsmeldung.", + "successMessage": "Der Vorgang wurde erfolgreich abgeschlossen!", + "successDetails": "Alle Änderungen wurden gespeichert.", + "warningMessage": "Bitte beachten Sie folgende Hinweise.", + "warningDetails": "Einige Felder sind möglicherweise nicht vollständig ausgefüllt.", + "errorMessage": "Ein Fehler ist aufgetreten.", + "errorDetails": "Bitte versuchen Sie es später erneut.", + "confirmDeleteTitle": "Löschen bestätigen", + "confirmDeleteMessage": "Möchten Sie diesen Eintrag wirklich löschen?", + "confirmWarningMessage": "Sind Sie sicher, dass Sie fortfahren möchten?", + "confirmWarningDetails": "Diese Aktion kann nicht rückgängig gemacht werden.", + "composableDialogTitle": "Dialog mit useDialog Composable", + "composableDialogText": "Dieser Dialog verwendet das useDialog Composable.", + "composableDialogText2": "Das macht die Verwaltung einfacher!", + "composableConfirmTitle": "useConfirm Beispiel", + "composableConfirmMessage": "Möchten Sie fortfahren?", + "composableConfirmDetails": "Dies ist ein Beispiel für das useConfirm Composable.", + "minimizedDialogs": "Minimierte Dialoge:" + }, + "courtDrawingTool": { + "title": "Tischtennis-Übungszeichnung", + "configureExercise": "Übung konfigurieren", + "stepStartPosition": "1. Startposition", + "stepStartPositionHint": "Aus welcher Aufschlagposition startet die Übung?", + "stepFirstStroke": "2. 1. Schlag", + "stepFirstStrokeHint": "Schlagseite und Rotation für den ersten Ball festlegen.", + "stepTarget": "3. Ziel", + "stepTargetHint": "Zielzone für den ersten Schlag auswählen.", + "stepAdditionalStrokes": "4. Folgeschläge", + "stepAdditionalStrokesHint": "Optional weitere Bälle als Liste aufbauen.", + "noAdditionalStrokes": "Noch keine Folgeschläge angelegt.", + "service": "Aufschlag:", + "serviceTitle": "Aufschlag", + "forehand": "Vorhand", + "backhand": "Rückhand", + "spin": "Schnitt:", + "underspin": "Unterschnitt", + "topspin": "Überschnitt", + "sidespin": "Seitschnitt", + "sideUnderspin": "Seitunterschnitt", + "counterSpin": "Gegenläufer", + "targetPosition": "Zielposition:", + "targetPositionLabel": "Zielposition", + "strokeSide": "Seite", + "strokeTypeLabel": "Schlagart", + "addStroke": "Schlag hinzufügen", + "preview": "Vorschau", + "previewHint": "Die Grafik erscheint, sobald der erste Schlag vollständig gesetzt ist.", + "completeFirstStroke": "1. Schlag vervollständigen", + "completeFirstStrokeHint": "Wähle Startposition, Schlagseite, Rotation und Ziel. Danach erscheint die grafische Darstellung.", + "codeLabel": "Kürzel", + "titleLabel": "Titel", + "startLeft": "links", + "startMiddle": "mitte", + "startRight": "rechts", + "strokeTypePush": "Schupf", + "strokeTypeCounter": "Konter", + "strokeTypeTopspin": "Topspin", + "strokeTypeFlip": "Flip", + "strokeTypeBlock": "Block", + "strokeTypeSmash": "Schuss", + "strokeTypeChopDefense": "Schnittabwehr", + "strokeTypeLobDefense": "Ballonabwehr", + "targetForehandLong": "Vorhand lang", + "targetMiddleLong": "Mitte lang", + "targetBackhandLong": "Rückhand lang", + "targetForehandHalfLong": "Vorhand halblang", + "targetMiddleHalfLong": "Mitte halblang", + "targetBackhandHalfLong": "Rückhand halblang", + "targetForehandShort": "Vorhand kurz", + "targetMiddleShort": "Mitte kurz", + "targetBackhandShort": "Rückhand kurz", + "toTarget": "nach" + }, + "courtDrawingRender": { + "startAnimation": "Animation starten", + "animationRunning": "Animation läuft..." + }, + "nuscoreAnalyzer": { + "title": "🔍 nuscore Analyzer", + "description": "Analysiert und lädt nuscore-Ressourcen für lokale Nutzung herunter", + "analyze": "🔍 nuscore analysieren", + "analyzing": "🔄 Analysiere...", + "downloadResources": "Ressourcen herunterladen", + "downloading": "⬇️ Lade herunter...", + "createLocalCopy": "🏗️ Lokale Kopie erstellen", + "creating": "🏗️ Erstelle...", + "foundResources": "📋 Gefundene Ressourcen:", + "log": "📝 Log:", + "startAnalysis": "🔍 Starte nuscore-Analyse...", + "pageLoaded": "✅ nuscore-Seite geladen", + "analysisComplete": "✅ Analyse abgeschlossen: {count} Ressourcen gefunden" + }, + "trainingTimesTab": { + "loading": "Lade Trainingszeiten...", + "addTime": "+ Zeit hinzufügen", + "weekday": "Wochentag:", + "from": "Von:", + "to": "Bis:", + "create": "Erstellen", + "cancel": "Abbrechen", + "sunday": "Sonntag", + "monday": "Montag", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "edit": "Bearbeiten", + "delete": "Löschen", + "noTimes": "Keine Trainingszeiten definiert", + "editTime": "Trainingszeit bearbeiten", + "save": "Speichern", + "saveError": "Fehler beim Speichern der Trainingszeit" + }, + "trainingGroupsTab": { + "groups": "Gruppen", + "newGroup": "+ Neue Gruppe", + "groupName": "Gruppenname", + "create": "Erstellen", + "cancel": "Abbrechen", + "edit": "Bearbeiten", + "delete": "Löschen", + "members": "Mitglieder", + "remove": "Entfernen", + "addMember": "Mitglied hinzufügen...", + "noMembersAvailable": "Keine Mitglieder verfügbar", + "editGroup": "Gruppe bearbeiten" + }, + "createClub": { + "title": "Verein anlegen", + "clubName": "Name des Vereins:", + "create": "Verein anlegen", + "nameRequired": "Bitte gib dem Verein einen aussagekräftigen Namen.", + "clubExists": "Der Verein existiert bereits.", + "unknownError": "Ein unbekannter Fehler ist aufgetreten. Bitte versuchen Sie es erneut." + }, + "legal": { + "backToHome": "Zur Startseite", + "privacyPolicy": "Datenschutzerklärung", + "imprint": "Impressum" + }, + "errors": { + "ERROR_INTERNAL_SERVER_ERROR": "Ein interner Serverfehler ist aufgetreten.", + "ERROR_UNKNOWN_ERROR": "Ein unbekannter Fehler ist aufgetreten.", + "ERROR_VALIDATION_FAILED": "Validierung fehlgeschlagen.", + "ERROR_NOT_FOUND": "Nicht gefunden.", + "ERROR_UNAUTHORIZED": "Nicht autorisiert.", + "ERROR_FORBIDDEN": "Zugriff verweigert.", + "ERROR_BAD_REQUEST": "Ungültige Anfrage.", + "ERROR_USER_NOT_FOUND": "Benutzer nicht gefunden.", + "ERROR_INVALID_PASSWORD": "Ungültiges Passwort.", + "ERROR_LOGIN_FAILED": "Login fehlgeschlagen.", + "ERROR_SESSION_EXPIRED": "Sitzung abgelaufen.", + "ERROR_MYTISCHTENNIS_USER_NOT_FOUND": "myTischtennis-Benutzer nicht gefunden.", + "ERROR_MYTISCHTENNIS_INVALID_PASSWORD": "Ungültiges myTischtennis-Passwort.", + "ERROR_MYTISCHTENNIS_LOGIN_FAILED": "myTischtennis-Login fehlgeschlagen. Bitte überprüfen Sie Ihre Zugangsdaten.", + "ERROR_MYTISCHTENNIS_ACCOUNT_NOT_LINKED": "Kein myTischtennis-Account verknüpft.", + "ERROR_MYTISCHTENNIS_PASSWORD_NOT_SAVED": "Kein Passwort gespeichert. Bitte geben Sie Ihr Passwort ein.", + "ERROR_MYTISCHTENNIS_SESSION_EXPIRED": "Session abgelaufen. Bitte erneut einloggen.", + "ERROR_MYTISCHTENNIS_NO_PASSWORD_SAVED": "Kein Passwort gespeichert und Session abgelaufen. Bitte Passwort eingeben.", + "ERROR_MYTISCHTENNIS_CAPTCHA_REQUIRED": "CAPTCHA erforderlich. MyTischtennis verwendet jetzt ein CAPTCHA beim Login. Bitte loggen Sie sich einmal direkt auf mytischtennis.de ein, um das CAPTCHA zu lösen, oder kontaktieren Sie den Support.", + "ERROR_MEMBER_NOT_FOUND": "Mitglied nicht gefunden.", + "ERROR_MEMBER_ALREADY_EXISTS": "Mitglied existiert bereits.", + "ERROR_MEMBER_FIRSTNAME_REQUIRED": "Vorname ist erforderlich.", + "ERROR_MEMBER_LASTNAME_REQUIRED": "Nachname ist erforderlich.", + "ERROR_GROUP_NOT_FOUND": "Gruppe nicht gefunden.", + "ERROR_GROUP_NAME_REQUIRED": "Bitte geben Sie einen Gruppennamen ein.", + "ERROR_GROUP_ALREADY_EXISTS": "Eine Gruppe mit diesem Namen existiert bereits.", + "ERROR_GROUP_INVALID_PRESET_TYPE": "Ungültiger Preset-Typ.", + "ERROR_GROUP_CANNOT_RENAME_PRESET": "Vorgaben-Gruppen können nicht umbenannt werden.", + "ERROR_TOURNAMENT_NOT_FOUND": "Turnier nicht gefunden.", + "ERROR_TOURNAMENT_NO_DATE": "Kein Turnierdatum vorhanden!", + "ERROR_TOURNAMENT_CLASS_NAME_REQUIRED": "Bitte geben Sie einen Klassennamen ein!", + "ERROR_TOURNAMENT_NO_PARTICIPANTS": "Keine Teilnehmer im Trainingstag für dieses Datum gefunden!", + "ERROR_TOURNAMENT_NO_VALID_PARTICIPANTS": "Keine gültigen Teilnehmer im Trainingstag für dieses Datum gefunden!", + "ERROR_TOURNAMENT_NO_TRAINING_DAY": "Kein Trainingstag für {date} gefunden!", + "ERROR_TOURNAMENT_PDF_GENERATION_FAILED": "Fehler beim Generieren des PDFs", + "ERROR_TOURNAMENT_SELECT_FIRST": "Bitte wählen Sie zuerst ein Turnier aus.", + "ERROR_DIARY_DATE_NOT_FOUND": "Datum nicht gefunden.", + "ERROR_DIARY_DATE_UPDATED": "Datum war nicht (mehr) vorhanden. Die Datums-Auswahl wurde aktualisiert. Bitte erneut versuchen.", + "ERROR_DIARY_NO_PARTICIPANTS": "Keine Teilnehmer für diesen Trainingstag vorhanden.", + "ERROR_DIARY_PDF_GENERATION_FAILED": "Fehler beim Generieren des PDFs.", + "ERROR_DIARY_IMAGE_LOAD_FAILED": "Bild konnte nicht geladen werden.", + "ERROR_DIARY_STATS_LOAD_FAILED": "Fehler beim Laden der Statistiken.", + "ERROR_DIARY_NO_EXERCISE_DATA": "Keine Übungsdaten erhalten", + "ERROR_DIARY_ACTIVITY_PARTICIPANTS_UPDATE_FAILED": "Fehler beim Aktualisieren der Aktivitäts-Teilnehmer", + "SUCCESS_DIARY_GROUP_ASSIGNMENT_UPDATED": "Gruppenzuordnung aktualisiert", + "ERROR_DIARY_GROUP_ASSIGNMENT_UPDATE_FAILED": "Fehler beim Aktualisieren der Gruppenzuordnung", + "ERROR_DIARY_ASSIGN_ALL_PARTICIPANTS_FAILED": "Fehler beim Zuordnen aller Teilnehmer", + "ERROR_DIARY_ASSIGN_GROUP_FAILED": "Fehler beim Zuordnen der Gruppe", + "ERROR_DIARY_PARTICIPANT_ASSIGN_FAILED": "Teilnehmer konnte nicht zugeordnet werden.", + "ERROR_DIARY_PARTICIPANT_GROUP_ASSIGNMENT_UPDATE_FAILED": "Fehler beim Aktualisieren der Teilnehmer-Gruppenzuordnung", + "SUCCESS_DIARY_MEMBER_CREATED": "Mitglied \"{name}\" wurde erfolgreich erstellt und hinzugefügt!", + "ERROR_DIARY_MEMBER_CREATE_FAILED": "Fehler beim Erstellen des Mitglieds", + "ERROR_TEAM_NOT_LINKED_TO_LEAGUE": "Dieses Team ist keiner Liga zugeordnet.", + "ERROR_TEAM_LINK_TO_LEAGUE_REQUIRED": "Bitte ordnen Sie dem Team zuerst eine Liga zu, damit Dokumente verarbeitet werden können.", + "ERROR_TEAM_PDF_LOAD_FAILED": "Fehler beim Laden des PDFs", + "ERROR_TEAM_STATS_LOAD_FAILED": "Statistiken konnten nicht geladen werden.", + "ERROR_ACTIVITY_IMAGE_DELETE_FAILED": "Fehler beim Löschen des Bildes", + "SUCCESS_OFFICIAL_TOURNAMENT_PDF_UPLOAD": "PDF erfolgreich hochgeladen.", + "ERROR_OFFICIAL_TOURNAMENT_PDF_UPLOAD": "Fehler beim Hochladen der PDF.", + "ERROR_CLUB_NOT_FOUND": "Verein nicht gefunden.", + "ERROR_CLUB_ALREADY_EXISTS": "Der Verein existiert bereits.", + "ERROR_CLUB_NAME_REQUIRED": "Bitte gib dem Verein einen aussagekräftigen Namen.", + "ERROR_CLUB_NAME_TOO_SHORT": "Bitte gib dem Verein einen aussagekräftigen Namen.", + "ERROR_MEMBER_TRANSFER_BULK_FAILED": "Fehler bei der Bulk-Übertragung: {message}", + "ERROR_TRAINING_STATS_LOAD_FAILED": "Fehler beim Laden der Trainings-Statistik", + "ERROR_LOG_NOT_FOUND": "Log-Eintrag nicht gefunden." }, "pdfGenerator": { + "trainingPlan": "Trainingsplan", + "date": "Datum:", + "time": "Uhrzeit:", + "startTime": "Startzeit", + "activityTimeBlock": "Aktivität / Zeitblock", + "group": "Gruppe", + "duration": "Dauer (Min)", + "timeBlock": "Zeitblock", + "phoneList": "Telefonliste - Aktive Mitglieder", + "nameFirstName": "Name, Vorname", + "birthDate": "Geburtsdatum", + "phoneNumber": "Telefon-Nr.", + "officialTournament": "Offizielles Turnier", + "member": "Mitglied:", + "hints": "Hinweise:", + "tournament": "Turnier", + "place": "Platz", + "player": "Spieler", + "points": "Punkte", + "sets": "Sätze", + "diff": "Diff", + "groupMatrices": "Gruppen-Matrizen", + "allGames": "Alle Spiele", + "noActivities": "Keine Aktivitäten für diesen Trainingstag erfasst.", + "groupLabel": "Gruppe", + "oneHourBefore": "Eine Stunde vor Beginn der Konkurrenz in der Halle sein", + "hallShoes": "Hallenschuhe (dürfen auf Boden nicht abfärben)", + "informTrainer": "Da der Verein die Meldung übernehmen möchte, die Trainer mind. eine Woche vor dem Turnier über die Teilnahme informieren", + "trainersPresent": "Die Trainer probieren bei allen Turnieren anwesend zu sein.", + "recommendations": "Empfehlungen", + "competition": "Wettbewerb", + "fee": "Gebühr", + "alsoPlayable": "Ebenfalls spielbar", + "venue": "Austragungsort", + "venues": "Austragungsorte", + "noWhiteJersey": "Kein weißes Trikot", + "sportShorts": "Sportshorts (oder Sportröckchen), am besten auch nicht weiß", + "waterBottle": "Eine Flasche Wasser dabei haben", + "overallRanking": "Gesamt-Ranking (K.O.-Runden)", + "round": "Runde", + "player1": "Spieler 1", + "player2": "Spieler 2", + "result": "Ergebnis", + "status": "Status", + "placement": "Platzierung", + "competitionName": "Konkurrenz", "teamLineupTitle": "Mannschaftsaufstellung", "clubLabel": "Verein:", "teamNameLabel": "Mannschaft:", diff --git a/frontend/src/i18n/locales/en-AU.json b/frontend/src/i18n/locales/en-AU.json index db6d8da9..4c7e0908 100644 --- a/frontend/src/i18n/locales/en-AU.json +++ b/frontend/src/i18n/locales/en-AU.json @@ -8,6 +8,7 @@ "loading": "Loading...", "save": "Save", "saved": "Saved", + "saving": "Saving...", "cancel": "Cancel", "delete": "Delete", "edit": "Edit", @@ -110,7 +111,8 @@ "accessDenied": "Access to the club was denied.", "errorLoadingRequests": "Failed to load open requests", "accessRequested": "Access has been requested.", - "accessRequestFailed": "Access request could not be submitted." + "accessRequestFailed": "Access request could not be submitted.", + "mobileSelectHint": "Please select a club first to use the app on your smartphone." }, "auth": { "login": "Login", @@ -482,6 +484,7 @@ "memberFormHandedOver": "Membership form handed over", "adultReleaseApproved": "Approved for adults", "adultReserveApproved": "Adult reserve", + "wantsToPlay": "Wants to play", "trainingGroups": "Training groups", "noGroupsAssigned": "No groups assigned", "noGroupsAvailable": "No groups available", diff --git a/frontend/src/i18n/locales/en-GB.json b/frontend/src/i18n/locales/en-GB.json index 087c45d5..fba1b7c8 100644 --- a/frontend/src/i18n/locales/en-GB.json +++ b/frontend/src/i18n/locales/en-GB.json @@ -8,6 +8,7 @@ "loading": "Loading...", "save": "Save", "saved": "Saved", + "saving": "Saving...", "cancel": "Cancel", "delete": "Delete", "edit": "Edit", @@ -110,7 +111,8 @@ "accessDenied": "Access to the club was denied.", "errorLoadingRequests": "Failed to load open requests", "accessRequested": "Access has been requested.", - "accessRequestFailed": "Access request could not be submitted." + "accessRequestFailed": "Access request could not be submitted.", + "mobileSelectHint": "Please select a club first to use the app on your smartphone." }, "auth": { "login": "Login", @@ -757,6 +759,7 @@ "memberFormHandedOver": "Membership form handed over", "adultReleaseApproved": "Approved for adults", "adultReserveApproved": "Adult reserve", + "wantsToPlay": "Wants to play", "trainingGroups": "Training groups", "noGroupsAssigned": "No groups assigned", "noGroupsAvailable": "No groups available", diff --git a/frontend/src/i18n/locales/en-US.json b/frontend/src/i18n/locales/en-US.json index 0b74aabd..49a0db1a 100644 --- a/frontend/src/i18n/locales/en-US.json +++ b/frontend/src/i18n/locales/en-US.json @@ -8,6 +8,7 @@ "loading": "Loading...", "save": "Save", "saved": "Saved", + "saving": "Saving...", "cancel": "Cancel", "delete": "Delete", "edit": "Edit", @@ -110,7 +111,8 @@ "accessDenied": "Access to the club was denied.", "errorLoadingRequests": "Failed to load open requests", "accessRequested": "Access has been requested.", - "accessRequestFailed": "Access request could not be submitted." + "accessRequestFailed": "Access request could not be submitted.", + "mobileSelectHint": "Please select a club first to use the app on your smartphone." }, "auth": { "login": "Log In", @@ -482,6 +484,7 @@ "memberFormHandedOver": "Membership form handed over", "adultReleaseApproved": "Approved for adults", "adultReserveApproved": "Adult reserve", + "wantsToPlay": "Wants to play", "trainingGroups": "Training groups", "noGroupsAssigned": "No groups assigned", "noGroupsAvailable": "No groups available", diff --git a/frontend/src/i18n/locales/es.json b/frontend/src/i18n/locales/es.json index 507aee3f..2b4858e0 100644 --- a/frontend/src/i18n/locales/es.json +++ b/frontend/src/i18n/locales/es.json @@ -7,6 +7,7 @@ "loading": "Cargando...", "save": "Guardar", "saved": "Guardado", + "saving": "Guardando...", "cancel": "Cancelar", "delete": "Eliminar", "edit": "Editar", @@ -28,6 +29,7 @@ "time": "Hora", "new": "Nuevo", "update": "Actualizar", + "move": "Mover", "refresh": "Recargar", "create": "Crear", "remove": "Quitar", @@ -109,7 +111,8 @@ "errorLoadingRequests": "Error al cargar las solicitudes abiertas", "accessRequested": "Se ha solicitado el acceso.", "accessRequestPending": "Se ha solicitado acceso a este club. Por favor, espera.", - "accessRequestFailed": "No se pudo enviar la solicitud de acceso." + "accessRequestFailed": "No se pudo enviar la solicitud de acceso.", + "mobileSelectHint": "Selecciona primero un club para usar la app en el smartphone." }, "auth": { "login": "Iniciar sesión", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "Fotos permitidas en internet", "testMembership": "Membresía de prueba", "memberFormHandedOver": "Formulario de afiliación entregado", + "adultReleaseApproved": "Aprobado para adultos", + "adultReserveApproved": "Reserva adulta", + "wantsToPlay": "Quiere jugar", "trainingGroups": "Grupos de entrenamiento", "noGroupsAssigned": "No hay grupos asignados", "noGroupsAvailable": "No hay grupos disponibles", diff --git a/frontend/src/i18n/locales/fil.json b/frontend/src/i18n/locales/fil.json index d66c654a..003f392a 100644 --- a/frontend/src/i18n/locales/fil.json +++ b/frontend/src/i18n/locales/fil.json @@ -7,6 +7,7 @@ "loading": "Naglo-load...", "save": "I-save", "saved": "Na-save", + "saving": "Sine-save...", "cancel": "Kanselahin", "delete": "Tanggalin", "edit": "I-edit", @@ -28,6 +29,7 @@ "time": "Oras", "new": "Bago", "update": "I-update", + "move": "Ilipat", "refresh": "I-reload", "create": "Lumikha", "remove": "Alisin", @@ -109,7 +111,8 @@ "errorLoadingRequests": "Error sa pag-load ng mga nakabinbing hiling", "accessRequested": "Naipadala na ang hiling sa access.", "accessRequestPending": "Humiling ka na ng access sa club na ito. Maghintay lamang.", - "accessRequestFailed": "Hindi naipadala ang hiling sa access." + "accessRequestFailed": "Hindi naipadala ang hiling sa access.", + "mobileSelectHint": "Pumili muna ng club para magamit ang app sa smartphone." }, "auth": { "login": "Mag-login", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "Pinapayagan ang larawan sa internet", "testMembership": "Trial membership", "memberFormHandedOver": "Naibigay na ang pormularyo ng kasapi", + "adultReleaseApproved": "Aprubado para sa matatanda", + "adultReserveApproved": "Adult reserve", + "wantsToPlay": "Gustong maglaro", "trainingGroups": "Mga grupo ng pagsasanay", "noGroupsAssigned": "Walang grupong nakatalaga", "noGroupsAvailable": "Walang available na grupo", diff --git a/frontend/src/i18n/locales/fr.json b/frontend/src/i18n/locales/fr.json index a6c0d3c7..35e0c145 100644 --- a/frontend/src/i18n/locales/fr.json +++ b/frontend/src/i18n/locales/fr.json @@ -7,6 +7,7 @@ "loading": "Chargement...", "save": "Enregistrer", "saved": "Enregistré", + "saving": "Enregistrement...", "cancel": "Annuler", "delete": "Supprimer", "edit": "Modifier", @@ -28,6 +29,7 @@ "time": "Heure", "new": "Nouveau", "update": "Mettre à jour", + "move": "Déplacer", "refresh": "Recharger", "create": "Créer", "remove": "Retirer", @@ -109,7 +111,8 @@ "errorLoadingRequests": "Erreur lors du chargement des demandes ouvertes", "accessRequested": "L'accès a été demandé.", "accessRequestPending": "L'accès à ce club a été demandé. Veuillez patienter.", - "accessRequestFailed": "La demande d'accès n'a pas pu être envoyée." + "accessRequestFailed": "La demande d'accès n'a pas pu être envoyée.", + "mobileSelectHint": "Veuillez d'abord sélectionner un club pour utiliser l'application sur smartphone." }, "auth": { "login": "Connexion", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "Photos autorisées en ligne", "testMembership": "Adhésion d'essai", "memberFormHandedOver": "Formulaire d'adhésion remis", + "adultReleaseApproved": "Autorisé pour les adultes", + "adultReserveApproved": "Réserve adulte", + "wantsToPlay": "Veut jouer", "trainingGroups": "Groupes d'entraînement", "noGroupsAssigned": "Aucun groupe attribué", "noGroupsAvailable": "Aucun groupe disponible", diff --git a/frontend/src/i18n/locales/it.json b/frontend/src/i18n/locales/it.json index 0e5d456c..1340f523 100644 --- a/frontend/src/i18n/locales/it.json +++ b/frontend/src/i18n/locales/it.json @@ -7,6 +7,7 @@ "loading": "Caricamento...", "save": "Salva", "saved": "Salvato", + "saving": "Salvataggio...", "cancel": "Annulla", "delete": "Elimina", "edit": "Modifica", @@ -28,6 +29,7 @@ "time": "Ora", "new": "Nuovo", "update": "Aggiorna", + "move": "Sposta", "refresh": "Ricarica", "create": "Crea", "remove": "Rimuovi", @@ -109,7 +111,8 @@ "errorLoadingRequests": "Errore durante il caricamento delle richieste aperte", "accessRequested": "Accesso richiesto.", "accessRequestPending": "L’accesso a questo club è stato richiesto. Attendere prego.", - "accessRequestFailed": "Impossibile inviare la richiesta di accesso." + "accessRequestFailed": "Impossibile inviare la richiesta di accesso.", + "mobileSelectHint": "Seleziona prima un club per usare l'app sullo smartphone." }, "auth": { "login": "Accedi", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "Foto consentite online", "testMembership": "Iscrizione di prova", "memberFormHandedOver": "Modulo di iscrizione consegnato", + "adultReleaseApproved": "Approvato per adulti", + "adultReserveApproved": "Riserva adulti", + "wantsToPlay": "Vuole giocare", "trainingGroups": "Gruppi di allenamento", "noGroupsAssigned": "Nessun gruppo assegnato", "noGroupsAvailable": "Nessun gruppo disponibile", diff --git a/frontend/src/i18n/locales/ja.json b/frontend/src/i18n/locales/ja.json index 98610685..f82305b9 100644 --- a/frontend/src/i18n/locales/ja.json +++ b/frontend/src/i18n/locales/ja.json @@ -7,6 +7,7 @@ "loading": "読み込み中...", "save": "保存", "saved": "保存済み", + "saving": "保存中...", "cancel": "キャンセル", "delete": "削除", "edit": "編集", @@ -28,6 +29,7 @@ "time": "時刻", "new": "新規", "update": "更新", + "move": "移動", "refresh": "再読み込み", "create": "作成", "remove": "削除", @@ -109,7 +111,8 @@ "errorLoadingRequests": "保留中の申請の読み込みエラー", "accessRequested": "アクセスを申請しました。", "accessRequestPending": "このクラブへのアクセスを申請しました。しばらくお待ちください。", - "accessRequestFailed": "アクセス申請を送信できませんでした。" + "accessRequestFailed": "アクセス申請を送信できませんでした。", + "mobileSelectHint": "スマートフォンでアプリを使用するには、まずクラブを選択してください。" }, "auth": { "login": "ログイン", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "インターネット掲載可", "testMembership": "体験会員", "memberFormHandedOver": "会員フォーム受け渡し済み", + "adultReleaseApproved": "一般参加承認済み", + "adultReserveApproved": "一般予備", + "wantsToPlay": "プレー希望", "trainingGroups": "練習グループ", "noGroupsAssigned": "グループ未割り当て", "noGroupsAvailable": "利用可能なグループがありません", diff --git a/frontend/src/i18n/locales/pl.json b/frontend/src/i18n/locales/pl.json index c9aadb6a..162cd45f 100644 --- a/frontend/src/i18n/locales/pl.json +++ b/frontend/src/i18n/locales/pl.json @@ -7,6 +7,7 @@ "loading": "Ładowanie...", "save": "Zapisz", "saved": "Zapisano", + "saving": "Zapisywanie...", "cancel": "Anuluj", "delete": "Usuń", "edit": "Edytuj", @@ -28,6 +29,7 @@ "time": "Czas", "new": "Nowy", "update": "Aktualizuj", + "move": "Przenieś", "refresh": "Odśwież", "create": "Utwórz", "remove": "Usuń", @@ -109,7 +111,8 @@ "errorLoadingRequests": "Błąd podczas ładowania otwartych próśb", "accessRequested": "Poproszono o dostęp.", "accessRequestPending": "Poproszono o dostęp do tego klubu. Proszę czekać.", - "accessRequestFailed": "Nie udało się wysłać prośby o dostęp." + "accessRequestFailed": "Nie udało się wysłać prośby o dostęp.", + "mobileSelectHint": "Najpierw wybierz klub, aby korzystać z aplikacji na smartfonie." }, "auth": { "login": "Zaloguj", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "Zdjęcia dozwolone w internecie", "testMembership": "Członkostwo próbne", "memberFormHandedOver": "Formularz członkowski przekazany", + "adultReleaseApproved": "Dopuszczony do dorosłych", + "adultReserveApproved": "Rezerwa dorosłych", + "wantsToPlay": "Chce grać", "trainingGroups": "Grupy treningowe", "noGroupsAssigned": "Brak przypisanych grup", "noGroupsAvailable": "Brak dostępnych grup", diff --git a/frontend/src/i18n/locales/th.json b/frontend/src/i18n/locales/th.json index 9a91d8d7..9b97a8ae 100644 --- a/frontend/src/i18n/locales/th.json +++ b/frontend/src/i18n/locales/th.json @@ -7,6 +7,7 @@ "loading": "กำลังโหลด...", "save": "บันทึก", "saved": "บันทึกแล้ว", + "saving": "กำลังบันทึก...", "cancel": "ยกเลิก", "delete": "ลบ", "edit": "แก้ไข", @@ -28,6 +29,7 @@ "time": "เวลา", "new": "ใหม่", "update": "อัปเดต", + "move": "ย้าย", "refresh": "โหลดใหม่", "create": "สร้าง", "remove": "เอาออก", @@ -109,7 +111,8 @@ "errorLoadingRequests": "เกิดข้อผิดพลาดในการโหลดคำขอที่รอดำเนินการ", "accessRequested": "ส่งคำขอเข้าถึงแล้ว", "accessRequestPending": "ได้ส่งคำขอเข้าถึงสโมสรนี้แล้ว โปรดรอสักครู่", - "accessRequestFailed": "ไม่สามารถส่งคำขอเข้าถึงได้" + "accessRequestFailed": "ไม่สามารถส่งคำขอเข้าถึงได้", + "mobileSelectHint": "โปรดเลือกสโมสรก่อนเพื่อใช้แอปบนสมาร์ทโฟน" }, "auth": { "login": "เข้าสู่ระบบ", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "อนุญาตให้ใช้รูปบนอินเทอร์เน็ต", "testMembership": "สมาชิกทดลอง", "memberFormHandedOver": "ส่งแบบฟอร์มสมาชิกแล้ว", + "adultReleaseApproved": "อนุมัติสำหรับผู้ใหญ่", + "adultReserveApproved": "ตัวสำรองผู้ใหญ่", + "wantsToPlay": "ต้องการเล่น", "trainingGroups": "กลุ่มฝึกซ้อม", "noGroupsAssigned": "ยังไม่ได้กำหนดกลุ่ม", "noGroupsAvailable": "ไม่มีกลุ่มให้เลือก", diff --git a/frontend/src/i18n/locales/tl.json b/frontend/src/i18n/locales/tl.json index fd1bd938..462c3919 100644 --- a/frontend/src/i18n/locales/tl.json +++ b/frontend/src/i18n/locales/tl.json @@ -7,6 +7,7 @@ "loading": "Naglo-load...", "save": "I-save", "saved": "Na-save", + "saving": "Sine-save...", "cancel": "Kanselahin", "delete": "Tanggalin", "edit": "I-edit", @@ -28,6 +29,7 @@ "time": "Oras", "new": "Bago", "update": "I-update", + "move": "Ilipat", "refresh": "I-reload", "create": "Lumikha", "remove": "Alisin", @@ -109,7 +111,8 @@ "errorLoadingRequests": "Error sa pag-load ng mga nakabinbing hiling", "accessRequested": "Naipadala na ang hiling sa access.", "accessRequestPending": "Humiling ka na ng access sa club na ito. Maghintay lamang.", - "accessRequestFailed": "Hindi naipadala ang hiling sa access." + "accessRequestFailed": "Hindi naipadala ang hiling sa access.", + "mobileSelectHint": "Pumili muna ng club para magamit ang app sa smartphone." }, "auth": { "login": "Mag-login", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "Pinapayagan ang larawan sa internet", "testMembership": "Trial membership", "memberFormHandedOver": "Naibigay na ang form ng miyembro", + "adultReleaseApproved": "Aprubado para sa matatanda", + "adultReserveApproved": "Adult reserve", + "wantsToPlay": "Gustong maglaro", "trainingGroups": "Mga grupo ng pagsasanay", "noGroupsAssigned": "Walang grupong nakatalaga", "noGroupsAvailable": "Walang available na grupo", diff --git a/frontend/src/i18n/locales/zh.json b/frontend/src/i18n/locales/zh.json index 84f9062a..17dc8cb2 100644 --- a/frontend/src/i18n/locales/zh.json +++ b/frontend/src/i18n/locales/zh.json @@ -7,6 +7,7 @@ "loading": "加载中...", "save": "保存", "saved": "已保存", + "saving": "正在保存...", "cancel": "取消", "delete": "删除", "edit": "编辑", @@ -28,6 +29,7 @@ "time": "时间", "new": "新建", "update": "更新", + "move": "移动", "refresh": "重新加载", "create": "创建", "remove": "移除", @@ -109,7 +111,8 @@ "errorLoadingRequests": "加载待处理申请时出错", "accessRequested": "已提交访问申请。", "accessRequestPending": "已申请访问此俱乐部。请稍候。", - "accessRequestFailed": "无法提交访问申请。" + "accessRequestFailed": "无法提交访问申请。", + "mobileSelectHint": "请先选择一个俱乐部,才能在智能手机上使用该应用。" }, "auth": { "login": "登录", @@ -445,6 +448,9 @@ "picsInInternetAllowed": "允许在互联网上发布照片", "testMembership": "试用会员", "memberFormHandedOver": "会员表格已交付", + "adultReleaseApproved": "已批准参加成人组", + "adultReserveApproved": "成人组替补", + "wantsToPlay": "想参加比赛", "trainingGroups": "训练组", "noGroupsAssigned": "未分配任何分组", "noGroupsAvailable": "没有可用分组",