{
  "app": {
    "name": "Training Diary",
    "title": "Training Diary"
  },
  "common": {
    "loading": "Loading...",
    "save": "Save",
    "saved": "Saved",
    "cancel": "Cancel",
    "delete": "Delete",
    "edit": "Edit",
    "add": "Add",
    "close": "Close",
    "details": "Details",
    "confirm": "Confirm",
    "yes": "Yes",
    "no": "No",
    "search": "Search",
    "filter": "Filter",
    "actions": "Actions",
    "back": "Back",
    "next": "Next",
    "previous": "Previous",
    "submit": "Submit",
    "reset": "Reset"
  },
  "navigation": {
    "home": "Home",
    "members": "Members",
    "diary": "Diary",
    "approvals": "Approvals",
    "statistics": "Training Statistics",
    "tournaments": "Tournaments",
    "clubTournaments": "Club Tournaments",
    "tournamentParticipations": "Tournament Participations",
    "schedule": "Schedules",
    "clubSettings": "Club Settings",
    "predefinedActivities": "Predefined Activities",
    "teamManagement": "Team Management",
    "permissions": "Permissions",
    "logs": "System Logs",
    "memberTransfer": "Member Transfer",
    "myTischtennisAccount": "myTischtennis Account",
    "clickTtAccount": "HTTV / click-TT Account",
    "clickTtBrowser": "HTTV / click-TT",
    "personalSettings": "Personal Settings",
    "logout": "Logout",
    "login": "Login",
    "register": "Register",
    "dailyBusiness": "Daily Business",
    "competitions": "Competitions",
    "settings": "Settings"
  },
  "club": {
    "select": "Select Club",
    "selectPlaceholder": "Choose club...",
    "new": "New Club",
    "load": "Load",
    "name": "Club Name",
    "create": "Create Club",
    "accessRequestPending": "Access to this club has been requested. Please be patient."
  },
  "auth": {
    "login": "Login",
    "logout": "Logout",
    "register": "Register",
    "email": "Email",
    "password": "Password",
    "forgotPassword": "Forgot password?",
    "rememberMe": "Remember me",
    "loginSuccess": "Successfully logged in",
    "logoutSuccess": "Successfully logged out",
    "sessionExpired": "Your session has expired. You will be logged out.",
    "noAccount": "Don't have an account?",
    "hasAccount": "Already have an account?",
    "toLogin": "Go to login",
    "loginFailed": "Login failed. Please check your credentials and try again.",
    "registerSuccess": "Registration successful! Please check your email to activate your account.",
    "registerFailed": "Registration failed. Please try again.",
    "activate": "Activate",
    "activateAccount": "Activate account",
    "accountActivated": "Account activated! You can now log in.",
    "activationFailed": "Activation failed. Please check the link or try again.",
    "forgotPasswordDescription": "Enter your email address. You will receive a link to reset your password.",
    "sendResetLink": "Send link",
    "sending": "Sending...",
    "resetEmailSent": "If an account with this email exists, a reset link has been sent. Please check your inbox (and spam folder).",
    "resetRequestFailed": "Request failed. Please try again.",
    "resetPassword": "Set new password",
    "newPassword": "New password",
    "confirmPassword": "Confirm password",
    "saveNewPassword": "Save password",
    "saving": "Saving...",
    "passwordResetSuccess": "Your password has been changed successfully. You can now log in with your new password.",
    "passwordsDoNotMatch": "Passwords do not match.",
    "passwordTooShort": "Password must be at least 6 characters long.",
    "resetFailed": "Password could not be changed. The link may have expired."
  },
  "settings": {
    "title": "Settings",
    "personalSettings": "Personal Settings",
    "language": "Language",
    "languageDescription": "Choose your preferred language for the application",
    "languageChanged": "Language successfully changed",
    "selectLanguage": "Select Language"
  },
  "languages": {
    "de": "Deutsch (German)",
    "en-GB": "English",
    "en-US": "English (US English)",
    "en-AU": "English (Australian English)",
    "de-CH": "Schwiizerdütsch (Swiss German)",
    "fr": "Français (French)",
    "es": "Español (Spanish)",
    "it": "Italiano (Italian)",
    "pl": "Polski (Polish)",
    "ja": "日本語 (Japanese)",
    "zh": "中文 (Chinese)",
    "tl": "Tagalog",
    "th": "ไทย (Thai)",
    "fil": "Filipino"
  },
  "messages": {
    "success": "Success",
    "error": "Error",
    "warning": "Warning",
    "info": "Information",
    "confirm": "Confirm",
    "cancel": "Cancel"
  },
  "diary": {
    "standardActivities": "Standard activities",
    "standardDurationShort": "Min",
    "standardActivityAddError": "Standard activity could not be added.",
    "statusReady": "Times and training plan are set.",
    "filterExcused": "Excused",
    "participantStatusNone": "No status",
    "participantStatusExcused": "Excused",
    "participantStatusCancelled": "Cancelled"
  },
  "predefinedActivities": {
    "excludeFromStats": "Exclude from statistics",
    "filterAll": "All",
    "filterStandard": "Standard activities",
    "filterCustom": "Custom"
  },
  "courtDrawing": {
    "title": "Configure table tennis exercise",
    "cancel": "Cancel",
    "ok": "OK",
    "durationMinutes": "Duration (minutes)",
    "durationText": "Duration (text)",
    "durationTextPlaceholder": "e.g. 2x5",
    "group": "Group",
    "selectGroup": "Select group..."
  },
  "tournaments": {
    "numberOfTables": "Number of tables",
    "table": "Table",
    "playerOne": "Player 1",
    "playerTwo": "Player 2",
    "groupsLabel": "Groups",
    "knockoutLabel": "KO",
    "distributeTables": "Distribute free tables",
    "distributeTablesResult": "Table distribution",
    "noFreeTables": "No free tables available.",
    "noAssignableMatches": "No matches available where both players are free.",
    "tablesDistributed": "Tables have been distributed.",
    "errorDistributingTables": "Error distributing tables.",
    "missingDataPDF": "Missing data as PDF",
    "missingDataPDFTitle": "Missing participant data – Mini championship",
    "missingDataPDFSubtitle": "Please collect the missing data (marked with ____) from participants and note them here.",
    "allDataComplete": "All participant data is complete.",
    "allDataCompleteTop3": "All data for the top 3 placed players is complete.",
    "noTop3Yet": "No top 3 placements have been determined yet.",
    "missingDataPDFTitleTop3": "Missing data – Top 3 Mini championship",
    "missingDataPDFSubtitleTop3": "Please collect missing data of the top 3 (marked with ____) and note them here.",
    "address": "Address",
    "phone": "Phone",
    "generatingPDF": "Generating PDF...",
    "page": "Page",
    "statusOpen": "Open",
    "statusLive": "Live",
    "statusFinished": "Finished",
    "dataNotRecorded": "Not yet recorded",
    "resultsRanking": "Ranking",
    "newSetPlaceholder": "New set, e.g. 11:7",
    "finishMatch": "Finish",
    "correctMatch": "Correct",
    "markMatchLive": "Mark as live",
    "unmarkMatchLive": "Remove live marker",
    "stageConfigTitle": "Intermediate & Final Round",
    "stageConfigLoading": "Loading round configuration…",
    "stageConfigIntro": "The intermediate round is optional. If you activate it, a final round follows afterwards. A knockout final round is created as a single bracket.",
    "stageConfigCurrentSetup": "Current structure",
    "stageFlowWithIntermediate": "Preliminary round -> intermediate round ({stage2}) -> final round ({final})",
    "stageFlowDirectFinal": "Preliminary round -> final round ({final})",
    "stageStep1": "Step 1",
    "stageStep2": "Step 2",
    "stageStep3": "Step 3",
    "stageStep1Title": "Decide on an intermediate round",
    "stageStep1Description": "First decide whether there should be an additional round after the preliminary round.",
    "stageStep2Description": "Define what the intermediate round should look like and how many groups it needs.",
    "stageFinalDescription": "Decide whether the final round should be played as groups or directly as a knockout bracket.",
    "useIntermediateStage": "Use intermediate round",
    "intermediateRound": "Intermediate round (round 2)",
    "finalRound": "Final round",
    "playThirdPlace": "Play third place match",
    "roundMode": "Mode",
    "roundGroupCount": "Number of groups",
    "promotionRule12": "Advance: preliminary round → intermediate round (1→2)",
    "promotionRuleFinal": "Advance: round {from} → round {to}",
    "promotionRuleDescription12": "Define which places from each preliminary group advance to the intermediate round.",
    "promotionRuleDescriptionFinalKnockout": "Define which places from the previous round advance to the knockout bracket.",
    "promotionRuleDescriptionFinalGroups": "Define which places from the previous round advance to the final-round groups.",
    "poolRuleLabel": "Rule {number}",
    "poolRuleSummary": "Places {places} go to {target}",
    "poolRulePreview": "From each group, places {places} advance to {target}.",
    "poolRulePlacesLabel": "Which places advance?",
    "poolRulePlacesHelp": "Example: 1 or 1,2",
    "poolRuleTargetLabel": "Where do these places go?",
    "poolRuleQuickExamples": "Quick examples:",
    "targetGroupsLabel": "{count} groups",
    "poolRuleTargetKnockout": "the knockout bracket",
    "poolRuleTargetGroupsDetailed": "{count} target groups",
    "addPoolRule": "Add pool rule",
    "noPoolRulesYet12": "No rules yet. Example: places 1 and 2 -> top round-2 groups.",
    "noPoolRulesYetFinal": "No rules yet. Example: places 1 and 2 -> final round.",
    "placesFromEachGroup": "Places from each group (e.g. 1,2)",
    "target": "Target",
    "targetGroupCount": "Target number of groups",
    "saveRounds": "Save rounds",
    "createFinalFromPreliminary": "Create final round from preliminary round",
    "createIntermediateFromPreliminary": "Create intermediate round from preliminary round",
    "createFinalFromIntermediate": "Create final round from intermediate round",
    "transferQualifiedToFinalFromPreliminary": "Move qualified players straight into the final round",
    "transferQualifiedToIntermediate": "Move qualified players into the intermediate round",
    "transferQualifiedToFinalFromIntermediate": "Move qualified players into the final round",
    "transferQualifiedToFinalFromPreliminaryDesc": "Uses the preliminary-round to final-round rules and creates the qualified players directly there.",
    "transferQualifiedToIntermediateDesc": "Uses the preliminary-round to intermediate-round rules and moves the qualified players across.",
    "transferQualifiedToFinalFromIntermediateDesc": "Uses the intermediate-round to final-round rules and moves the qualified players across.",
    "stageActionsTitle": "Next actions",
    "stageActionsDescription": "These steps move qualified players into the next round.",
    "stageActionRun": "Run now",
    "stageActionMissingRulesHint": "Create at least one advancement rule first before moving players into the next round.",
    "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.",
    "stageValidationNoRules": "There is no advancement rule yet for {stage}.",
    "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": "The place definition has gaps. Usually a continuous order such as 1,2 or 1,2,3 is intended.",
    "stageValidationRulesOverlap": "Place {place} is assigned twice, in rule {first} and rule {second}.",
    "stageValidationTargetGroupsRequired": "Please enter a valid number of target groups.",
    "stageValidationTargetGroupCountMismatch": "The number of target groups must match the target round. Expected: {expected}.",
    "stageValidationTargetTypeMismatch": "The target of this rule must match the target round. Expected: {target}.",
    "stageValidationKnockoutTargetOnly": "For a knockout final round, only the knockout bracket is allowed as the target here.",
    "stageValidationKnockoutNeedsTwoPlayers": "A knockout bracket needs at least 2 qualified players.",
    "stageValidationKnockoutByesLikely": "With an expected {count} qualifiers, the knockout bracket will very likely include byes.",
    "stageValidationNotEnoughQualifiersForGroups": "With only {count} qualifiers for {groups} target groups, empty groups would be created.",
    "stageValidationThinGroupsLikely": "With {count} qualifiers across {groups} target groups, the groups will likely be very small.",
    "stageValidationSuggestion": "Suggestion: {value}",
    "stageValidationApplyFix": "Apply",
    "stageValidationApplyAllFixes": "Apply {count} quick fix(es)",
    "stageValidationApplyTargetTypeFix": "Switch to {target}",
    "stageValidationApplyTargetGroupFix": "Set to {count} target groups",
    "stageValidationSaveBlocked": "Please fix the highlighted configuration errors first.",
    "ruleStatusOk": "Looks good",
    "ruleStatusReview": "Review",
    "ruleStatusBlocked": "Blocked",
    "ruleStatusOkDescription": "This rule matches the current target round and can be used as-is.",
    "stageFlowHealthOk": "Round logic looks good",
    "stageFlowHealthOkDescription": "The transitions between rounds are fully configured and currently coherent.",
    "stageFlowHealthIncomplete": "Round logic is incomplete",
    "stageFlowHealthMissingRules": "At least one transition does not yet have a complete advancement rule.",
    "stageFlowHealthReviewDescription": "The round logic is basically usable, but should still be reviewed because of open hints.",
    "stageFlowHealthBlocked": "Round logic is contradictory",
    "stageFlowHealthBlockedDescription": "At least one rule currently does not match the target round or contains blocking configuration errors.",
    "stageFlowBreakdownOk": "Configuration looks good",
    "stageFlowBreakdownWarnings": "{count} warning(s) open",
    "stageFlowBreakdownErrors": "{count} blocking error(s)",
    "stageFlowBreakdownMissingRule": "No complete rule has been added yet",
    "stageFlowBreakdownActionAddRule": "Add rule",
    "stageFlowBreakdownActionReview": "Review issues",
    "stageFlowBreakdownActionOpen": "Open rule",
    "stageFlowReadinessNoGroups": "No matching groups exist yet",
    "stageFlowReadinessIncompleteGroups": "{count} group(s) are not fully decided yet",
    "stageFlowReadinessReady": "Transition is ready to start",
    "stageFlowRecommendationTitle": "Recommended next step",
    "stageFlowRecommendationFixes": "The typical configuration problems can be cleaned up automatically right away.",
    "stageFlowRecommendationMissingRule": "A complete rule is still missing for {label}. That is the best place to continue.",
    "stageFlowRecommendationError": "Review the first blocking error in the round logic first.",
    "stageFlowRecommendationWarnings": "There are still warnings that should be reviewed before saving.",
    "stageFlowRecommendationSave": "The round logic is coherent. You can save the configuration now.",
    "stageFlowPreviewMissing": "No rule has been configured yet.",
    "stageFlowPreviewRule": "Places {places} go to {target}",
    "stageFlowPreviewRuleWithCount": "{base} (expected qualifiers: {count})",
    "stageFlowQualifiedPreviewTitle": "Currently qualified",
    "stageFlowQualifiedPreviewEntry": "G{group} · Place {position} · {name}",
    "stageConfigMissingIds": "Cannot save: club or tournament ID is missing.",
    "stageConfigLoadError": "Error loading round configuration.",
    "stageConfigBadServerResponse": "Invalid server response.",
    "stageCreated": "Round {round} was created.",
    "stageParticipantsTransferred": "Qualified players were moved into {round}.",
    "atLeastOnePoolRule": "Please add at least one pool rule for {label} (e.g. places 1,2).",
    "enterMiniLocation": "Please enter a location.",
    "selectTournamentFirst": "Please select a tournament first.",
    "errorGeneratingPdf": "Error generating the PDF.",
    "orphanedMatchesRemoved": "{count} orphaned matches removed.",
    "noOrphanedMatchesFound": "No orphaned matches found.",
    "enterClassName": "Please enter a class name.",
    "deleteClassTitle": "Delete class",
    "deleteClassConfirm": "Do you really want to delete class \"{name}\"?",
    "deleteClassParticipantsDetached": "All participants will be detached from this class.",
    "enterExternalParticipantName": "Please enter at least first name and last name.",
    "noTournamentDate": "No tournament date available.",
    "noValidTrainingParticipants": "No valid participants were found in the training session for this date.",
    "noTrainingParticipants": "No participants were found in the training session for this date.",
    "noTrainingOnDate": "No training session found for {date}.",
    "selectTwoDifferentPlayers": "Please select two different players.",
    "pairingAlreadyExists": "This pairing already exists.",
    "participantNotFound": "Participant not found.",
    "minimumParticipantsForPairings": "At least 2 participants are required for pairings.",
    "deleteExistingPairingsConfirm": "Existing pairings will be deleted. Continue?",
    "pairingsCreatedWithErrors": "{successCount} pairings created, {errorCount} errors.",
    "participantsNeedClassAssignment": "{count} participants are not assigned to a class yet. These should be assigned first.",
    "autoAssignableParticipantsHint": "{count} of them can be assigned automatically.",
    "assignmentReviewTitle": "{count} participants need a choice:",
    "conflictSuggestionLabel": "Suggestions:",
    "workspaceProblemsTitle": "{count} open issues",
    "problemConfigTitle": "Configuration incomplete",
    "problemConfigDescription": "Check date, name, winning sets and at least one class.",
    "problemUnassignedTitle": "{count} participants without class",
    "problemUnassignedDescription": "These participants still need a manual class assignment.",
    "problemUnassignedAutoDescription": "{count} of them can be assigned automatically right away.",
    "problemConflictsTitle": "{count} participants with conflicts",
    "problemConflictsDescription": "Review invalid classes, missing data or unclear assignments.",
    "problemDoublesTitle": "{count} open doubles partners",
    "problemDoublesDescription": "One or more doubles classes still need partner assignments.",
    "problemDoublesAutoDescription": "The open doubles class can be paired automatically right away.",
    "problemGroupsMissingTitle": "Groups not created yet",
    "problemGroupsMissingDescription": "The group tournament needs groups to be created first.",
    "problemGroupMatchesTitle": "Group matches not generated yet",
    "problemGroupMatchesDescription": "The groups are ready, but the matches have not been created yet.",
    "problemKnockoutReadyTitle": "Knockout can be started",
    "problemKnockoutReadyDescription": "The group stage is complete and the final round can be generated now.",
    "autoAssignEligible": "Assign automatically",
    "autoAssignEligibleNone": "There are currently no participants with a single automatic class assignment.",
    "autoAssignEligibleDone": "{count} participants were assigned automatically.",
    "autoAssignEligiblePartial": "{successCount} participants were assigned automatically, {errorCount} failed.",
    "doublesPairingHint": "{count} participants in this doubles class still need a partner.",
    "createSuggestedPairings": "Create pairings",
    "placementsPendingTitle": "Placings not available yet",
    "placementsPendingSelectedClass": "There are no placings for the currently selected class yet.",
    "placementsPendingNoGroups": "Placings will appear here once group matches or a final round exist.",
    "placementsPendingGroups": "Group placings will appear once group matches exist.",
    "placementsPendingFinals": "Final placings will appear once multiple groups or a final round exist.",
    "showingTournamentCount": "{visible} of {total}",
    "noMatchingTournamentsTitle": "No matching tournaments",
    "noTournamentsCreatedYet": "No tournaments have been created yet.",
    "adjustTournamentSearch": "Adjust the search term or create a new tournament.",
    "selectedTournament": "Active tournament",
    "createGroupMatches": "Create group matches",
    "participantConflicts": "Conflicts",
    "unpairedDoubles": "Doubles without partner",
    "noEligibleClass": "No suitable class found.",
    "eligibleClassesHint": "Suitable for: {classes}",
    "warningClassMissing": "Class not found",
    "warningGenderMismatch": "Gender does not match class",
    "warningGenderMissing": "Gender is missing for this class",
    "warningBirthDateMissing": "Birth date is missing for this class",
    "warningTooOldForClass": "Too old for this class",
    "warningTooYoungForClass": "Too young for this class",
    "warningMissingPairing": "Doubles partner missing",
    "statusConfigReady": "Configuration ready",
    "statusConfigIncomplete": "Configuration incomplete",
    "statusParticipantsUnassigned": "{count} without class",
    "statusParticipantsConflicts": "{count} participants with conflicts",
    "statusParticipantsReady": "{count} participants conflict-free",
    "statusUnpairedDoubles": "{count} doubles without partner",
    "statusGroupsMissing": "Groups not created yet",
    "statusGroupsReady": "Groups ready",
    "statusGroupsRunning": "Group stage in progress",
    "statusKnockoutReady": "Knockout ready to start",
    "statusKnockoutRunning": "Knockout in progress",
    "statusTournamentCompleted": "Tournament completed",
    "statusActionAssign": "Assign",
    "statusActionReview": "Review",
    "statusActionPair": "Pair",
    "statusActionCreate": "Create",
    "statusActionGenerate": "Generate",
    "statusActionStart": "Start"
  },
  "schedule": {
    "title": "Schedules",
    "subtitle": "Select teams, review fixtures and keep league tables in view.",
    "importSchedule": "Import schedule",
    "galleryLoading": "Loading gallery…",
    "gallery": "Member gallery",
    "overallSchedule": "Overall schedule",
    "adultSchedule": "Adult schedule",
    "noTeamsFound": "No teams found for this season",
    "noMatchingTeams": "No teams match the current search.",
    "searchTeams": "Search team or league",
    "selection": "Selection",
    "activeSelection": "Active selection",
    "noSelectionTitle": "No active selection yet",
    "noSelectionMessage": "Choose the overall schedule, the adult schedule or a team from the left.",
    "scheduleTab": "Schedule",
    "tableTab": "Table",
    "downloadPDF": "Download PDF",
    "refreshTable": "Refresh table",
    "tableLoading": "Loading table…",
    "fetchTeamData": "Fetch schedule & results",
    "fetchingTeamData": "Fetching…",
    "fetchStartFailed": "The fetch could not be started.",
    "fetchDataFailed": "Team data could not be fetched.",
    "fetchTimedOut": "Timed out while fetching data.",
    "teamDataFetched": "Team data updated successfully.",
    "teamDataFetchedDetails": "Team: {team}\nProcessed records: {count}",
    "gamesFor": "Matches for",
    "date": "Date",
    "time": "Time",
    "homeTeam": "Home team",
    "guestTeam": "Away team",
    "result": "Result",
    "ageClass": "Age group",
    "code": "Code",
    "homePin": "Home PIN",
    "guestPin": "Away PIN",
    "noGames": "No matches available",
    "leagueTable": "League table",
    "position": "Position",
    "team": "Team",
    "teams": "Teams",
    "matches": "Matches",
    "completedShort": "Completed",
    "pendingShort": "Open",
    "nextMatch": "Next match",
    "workspaceScheduleDescription": "{matches} matches, {completed} completed and {pending} open.",
    "workspaceTableDescription": "{count} table rows currently loaded.",
    "matchOverviewTitle": "Match overview",
    "matchOverviewDescription": "Controls which matches from the currently selected league are shown in the schedule.",
    "ownTeamMatches": "Own team",
    "allLeagueMatches": "All matches",
    "otherTeamMatches": "Other team",
    "selectOtherTeam": "Select other team",
    "sets": "Sets",
    "points": "Pts",
    "balls": "Balls",
    "noTableData": "No table data available",
    "galleryTitle": "Member gallery - click an image to mark as ready",
    "imageSize": "Image size",
    "noMembersWithImages": "No members with images found.",
    "playerSelection": "Player selection",
    "vs": "vs",
    "loadingMembers": "Loading members...",
    "player": "Player",
    "ready": "Ready",
    "planned": "Planned",
    "played": "Played",
    "noActiveMembers": "No active members found",
    "save": "Save",
    "cancel": "Cancel",
    "openMatchReport": "Open match report",
    "copyCode": "Copy code",
    "copyHomePin": "Copy home PIN",
    "copyGuestPin": "Copy away PIN",
    "errorLoadingMembers": "Failed to load the member list.",
    "playerSelectionSaved": "Player selection saved",
    "errorSavingPlayerSelection": "Failed to save the player selection",
    "pleaseSelectGame": "Please select a match first",
    "errorLoadingGallery": "The gallery could not be loaded.",
    "errorLoadingTeams": "Failed to load teams",
    "noLeagueForTeam": "No league is assigned to this team. Please assign a league first.",
    "errorLoadingMatches": "Failed to load matches",
    "errorLoadingOverallSchedule": "Failed to load the overall schedule",
    "errorLoadingAdultSchedule": "Failed to load the adult schedule",
    "noMatchesForPDF": "No matches found to generate a PDF.",
    "errorCopying": "Error while copying",
    "schedulePDF": "Schedules.pdf",
    "selectSpecificLeague": "Please select a specific league to load the table.",
    "tableDataLoaded": "League table data loaded successfully from myTischtennis.",
    "errorLoadingTable": "Failed to load league table data from myTischtennis",
    "scheduleImportSuccess": "Schedule imported successfully.",
    "errorImportingCSV": "Failed to import the CSV file"
  },
  "members": {
    "subtitle": "Search, filter and edit members directly.",
    "closeEditor": "Close editor",
    "visibleMembers": "Visible members",
    "search": "Search",
    "searchPlaceholder": "Search by name, city, phone or email",
    "memberScope": "Member scope",
    "scopeAll": "All",
    "scopeActive": "Active",
    "scopeTest": "Trial",
    "scopeNeedsForm": "Form unverified",
    "scopeDataIncomplete": "Data incomplete",
    "scopeInactive": "Inactive",
    "resultsVisible": "members visible",
    "editHint": "Click a row to open the editor.",
    "editorCreateHint": "Create a new member and capture contact details directly.",
    "editorEditHint": "Edit the details for {name}.",
    "transferSuccessTitle": "Transfer successful",
    "transferErrorTitle": "Transfer error",
    "clickTtRequestPending": "Click-TT request in progress",
    "clickTtRequestAction": "Request click-TT eligibility",
    "clickTtRequestTitle": "Start Click-TT request",
    "clickTtRequestConfirm": "Start the automated Click-TT request for {name}?",
    "clickTtRequestHint": "The request is processed automatically by the backend Click-TT workflow.",
    "clickTtRequestSuccess": "Please sign in to click-tt and submit the request there.",
    "clickTtRequestError": "The Click-TT request could not be submitted.",
    "clickTtRequestFailedLog": "Click-TT request failed",
    "deleteImageTitle": "Delete image",
    "deleteImageConfirm": "Do you really want to delete this image?",
    "parentFallback": "Parent",
    "loadingMembers": "Loading members...",
    "errorLoadingMembers": "Failed to load the member list.",
    "scopeNotTraining": "No longer training",
    "notInTrainingTooltip": "No participation for {weeks} training weeks",
    "status": "Status",
    "contact": "Contact",
    "noPhoneShort": "No phone",
    "noEmailShort": "No email",
    "noAddressShort": "No address",
    "clickTtSubmitted": "Click-TT submitted",
    "markRegular": "Mark regular",
    "markFormReceived": "Mark form verified",
    "clickTtRequestShort": "Click-TT",
    "clickTtRequestPendingShort": "Pending ...",
    "memberDetails": "Member details",
    "previewLastTraining": "Last training",
    "previewNoLastTraining": "No participation yet",
    "phoneListForSelection": "Phone list for selection",
    "markFormsForSelection": "Verify forms for selection",
    "markRegularForSelection": "Mark selection regular",
    "phoneListSelectionFile": "phone-list-selection.pdf",
    "batchFormsMarkedSuccess": "Marked {count} form(s) as verified.",
    "batchFormsMarkedEmpty": "There are no unverified forms in the current selection.",
    "batchMarkedRegularSuccess": "Marked {count} trial member(s) as regular.",
    "batchMarkedRegularEmpty": "There are no trial members in the current selection.",
    "batchPartialFailure": "{success} succeeded, {failed} failed.",
    "sortBy": "Sort by",
    "sortLastName": "Last name",
    "sortFirstName": "First name",
    "sortBirthday": "Birthday",
    "sortAge": "Age",
    "age": "Age",
    "dataQuality": "Data quality",
    "dataQualityComplete": "Data complete",
    "dataIssueBirthdate": "Birthdate missing",
    "dataIssuePhone": "Phone missing",
    "dataIssueEmail": "Email missing",
    "dataIssueAddress": "Address missing",
    "dataIssueGender": "Gender unclear",
    "openTasks": "Open tasks",
    "noOpenTasks": "No open tasks",
    "taskVerifyForm": "Verify form",
    "taskReviewTrialStatus": "Review trial status",
    "taskCheckTrainingStatus": "Review training status",
    "taskCheckDataQuality": "Review data quality",
    "taskCheckClickTt": "Review Click-TT eligibility",
    "taskActionVerify": "Verify",
    "taskActionMarkRegular": "Mark regular",
    "taskActionReview": "Open",
    "taskActionRequest": "Request",
    "toggleSortDirection": "Toggle sort direction",
    "sortLastTraining": "Last training",
    "sortOpenTasks": "Open tasks",
    "exportPreview": "Export preview",
    "exportMembersSelected": "members currently selected",
    "exportPhones": "Phone",
    "exportReachableByPhone": "with phone number",
    "exportEmails": "Email",
    "exportReachableByEmail": "with email address",
    "exportPreviewNames": "Preview",
    "exportPreviewEmpty": "No members in the current selection",
    "exportCsv": "Export CSV",
    "exportCsvFile": "member-selection.csv",
    "copyPhones": "Copy phones",
    "copyEmails": "Copy emails",
    "copyPhonesSuccess": "Phone list copied to clipboard.",
    "copyPhonesEmpty": "There are no phone numbers in the current selection.",
    "copyEmailsSuccess": "Email list copied to clipboard.",
    "copyEmailsEmpty": "There are no email addresses in the current selection.",
    "composeEmail": "Compose email",
    "copyContactSummary": "Copy contact summary",
    "copyContactSummarySuccess": "Contact summary copied to clipboard."
  },
  "teamManagement": {
    "title": "Team Management",
    "subtitle": "Select teams, review configuration and maintain league data in one place.",
    "ratingUpdates": "Rating updates",
    "lastRun": "Last run",
    "updated": "updated",
    "error": "Error",
    "matchResults": "Match results",
    "fetched": "fetched",
    "newTeam": "New team",
    "basicSettings": "Basic settings",
    "basicSettingsIntro": "Review and adjust team name and league in a calmer form.",
    "editTeam": "Edit team",
    "createNewTeam": "Create new team",
    "teamName": "Team name",
    "teamNamePlaceholder": "e.g. Men 1, Women 2",
    "league": "League",
    "team": "Team",
    "teamId": "Team ID",
    "groupId": "Group ID",
    "association": "Association",
    "groupName": "Group name",
    "noLeague": "No league",
    "change": "Change",
    "createAndEdit": "Create & edit",
    "clearFields": "Clear fields",
    "playerStats": "Appearances",
    "playerStatsIntro": "Quick overview of this team's appearances in the current season.",
    "refreshStats": "Refresh",
    "loadingStats": "Loading statistics...",
    "noPlayerStats": "No appearances recorded.",
    "player": "Player",
    "qttr": "(Q)TTR rating",
    "season": "Season",
    "seasonFull": "Full season (from 1 July)",
    "firstHalf": "First half",
    "firstHalfFull": "First half (July - December)",
    "secondHalf": "Second half",
    "secondHalfFull": "Second half (from 1 January)",
    "documents": "Documents",
    "documentsIntro": "Upload, review and re-parse code lists and PIN lists when needed.",
    "documentAvailable": "Available",
    "documentMissing": "Missing",
    "latestUpload": "Last uploaded: {date}",
    "noDocumentUploadYet": "No document uploaded yet.",
    "uploadNewVersion": "Upload new version",
    "openDocument": "Open",
    "parseDocument": "Parse again",
    "codeList": "Code list",
    "pinList": "PIN list",
    "automaticJobs": "Automatic jobs",
    "lastUpdated": "Last updated",
    "status": "Status",
    "successful": "Successful",
    "noAutomaticUpdate": "No automatic update yet",
    "myTischtennis": "myTischtennis",
    "myTischtennisIntro": "Paste a URL, review the configuration and fetch data manually when needed.",
    "configurationStatus": "Configuration status",
    "manualFetch": "Fetch",
    "noIssues": "No open configuration issues.",
    "parseUrlAction": "Check URL",
    "myTischtennisUrlPlaceholder": "myTischtennis URL...",
    "teams": "Teams",
    "activeTeam": "Active team",
    "searchTeams": "Search team",
    "openInWorkspace": "Open to edit",
    "filterAll": "All",
    "filterConfigured": "Configured",
    "filterNeedsAttention": "Needs review",
    "filterNoLeague": "Without league",
    "seasonUnknown": "unknown",
    "noTeamsYet": "No teams yet. Create your first team.",
    "noMatchingTeams": "No teams match the current search or filter.",
    "edit": "Edit",
    "delete": "Delete",
    "noAssignment": "No assignment",
    "created": "Created",
    "unknown": "Unknown",
    "fullyConfigured": "Fully configured",
    "partiallyConfigured": "Partially configured",
    "notConfigured": "Not configured",
    "never": "Never",
    "showCodeList": "Show code list",
    "showPinList": "Show PIN list",
    "deleteTeamTitle": "Delete club team",
    "deleteTeamConfirm": "Do you really want to delete the club team \"{name}\"?",
    "errorDeletingTeam": "Failed to delete the club team.",
    "teamHasNoLeague": "This team is not assigned to a league.",
    "assignLeagueBeforeDocuments": "Please assign a league to the team first so documents can be processed.",
    "assignLeagueBeforeParsing": "Please assign a league to the team first to parse PDF files.",
    "documentParsedSummary": "{label} uploaded and parsed successfully.\n\nMatches found: {matchesFound}\nNew matches created: {created}\nMatches updated: {updated}",
    "errorsCount": "Errors: {count}",
    "moreErrors": "... and {count} more",
    "noMatchesFoundTitle": "No matches found",
    "noMatchesFoundDetails": "Note: No matches detected.\nLines in document: {lines}",
    "documentUploaded": "{label} \"{fileName}\" was uploaded successfully.",
    "errorUploadingDocument": "Failed to upload and parse the file.",
    "matchesSummary": "Matches found: {matchesFound}\nNew matches created: {created}\nMatches updated: {updated}",
    "errorParsingPdf": "Failed to parse the PDF file",
    "documentNotFound": "The selected document could not be found.",
    "missingLeagueForTeam": "No league was provided for the selected team.",
    "pdfFileNotFound": "The PDF file could not be found.",
    "reuploadFile": "Please upload the file again and try once more.",
    "errorLoadingPdf": "Failed to load the PDF.",
    "errorParsingUrl": "The URL could not be parsed. Please check the format.",
    "configureLeagueTitle": "Configure league?",
    "tableUrlDetected": "Table URL detected",
    "configureLeagueDetails": "Association: {association}\nSeason: {season}\nLeague: {league}\nGroup ID: {groupId}\n\nDo you want to configure this league in the database? This enables automatic table data retrieval.",
    "selectTeamTitle": "Select team",
    "selectTeamFirst": "Please select a team first",
    "selectTeamForConfiguration": "To activate the myTischtennis configuration, you must first select a team from the list.",
    "teamConfiguredSuccess": "Team configured successfully. Automatic data retrieval is now active.",
    "teamConfiguredDetails": "League: {league}\nSeason: {season}\nAutomatic data retrieval is now active.",
    "errorConfiguringTeam": "The team could not be configured.",
    "leagueConfiguredSuccess": "League configured successfully. Table data can now be retrieved automatically.",
    "leagueConfiguredDetails": "League: {league}\nSeason: {season}\nAssociation: {association}\nGroup ID: {groupId}\n\nTable data can now be retrieved automatically.",
    "errorConfiguringLeague": "The league could not be configured.",
    "notCreated": "Not created",
    "autoFetchEnabled": "Automatic data retrieval is enabled",
    "missingItems": "Missing: {items}",
    "enterUrlForAutoConfig": "Enter a myTischtennis URL for automatic configuration",
    "errorLoadingStats": "Statistics could not be loaded.",
    "asyncJobStartFailed": "The async job could not be started.",
    "dataFetchFailed": "Data could not be fetched.",
    "fetchTimedOut": "Timed out while fetching data (async job took too long).",
    "teamDataFetched": "Team data fetched successfully.",
    "unknownTeam": "Unknown team",
    "teamDataFetchedDetails": "Team: {team}\nFetched records: {count}",
    "tableUpdateLabel": "Table update:",
    "mytischtennisLoginRequired": "Login to myTischtennis required",
    "fetchTimeoutShort": "Timed out while fetching data.",
    "invalidFileTypeTitle": "Invalid file type",
    "invalidFileExtension": "{label} must have one of the following extensions: {extensions}.",
    "invalidMimeType": "{label} has an unexpected MIME type: {type}.",
    "fileTooLargeTitle": "File too large",
    "fileTooLarge": "{label} must not exceed 10 MB."
  }
}
