{
  "app": {
    "name": "训练日记",
    "title": "训练日记"
  },
  "common": {
    "loading": "加载中...",
    "save": "保存",
    "saved": "已保存",
    "cancel": "取消",
    "delete": "删除",
    "edit": "编辑",
    "add": "添加",
    "close": "关闭",
    "confirm": "确认",
    "yes": "是",
    "no": "否",
    "search": "搜索",
    "filter": "筛选",
    "actions": "操作",
    "back": "返回",
    "next": "下一步",
    "previous": "上一步",
    "submit": "提交",
    "reset": "重置"
  },
  "navigation": {
    "home": "首页",
    "members": "成员",
    "diary": "日记",
    "approvals": "审批",
    "statistics": "训练统计",
    "tournaments": "锦标赛",
    "clubTournaments": "俱乐部锦标赛",
    "tournamentParticipations": "锦标赛参赛记录",
    "schedule": "赛程",
    "clubSettings": "俱乐部设置",
    "predefinedActivities": "预定义活动",
    "teamManagement": "团队管理",
    "permissions": "权限",
    "logs": "系统日志",
    "memberTransfer": "成员转移",
    "myTischtennisAccount": "myTischtennis账户",
    "personalSettings": "个人设置",
    "logout": "退出登录",
    "login": "登录",
    "register": "注册",
    "dailyBusiness": "日常事务",
    "competitions": "比赛",
    "settings": "设置"
  },
  "club": {
    "select": "选择俱乐部",
    "selectPlaceholder": "选择俱乐部...",
    "new": "新俱乐部",
    "load": "加载",
    "name": "俱乐部名称",
    "create": "创建俱乐部",
    "accessRequestPending": "Access to this club has been requested. Please be patient."
  },
  "auth": {
    "login": "登录",
    "logout": "退出登录",
    "register": "注册",
    "email": "电子邮件",
    "password": "密码",
    "forgotPassword": "忘记密码？",
    "rememberMe": "记住我",
    "loginSuccess": "登录成功",
    "logoutSuccess": "退出成功",
    "sessionExpired": "您的会话已过期。您将被登出。",
    "noAccount": "还没有账号？",
    "toLogin": "去登录",
    "loginFailed": "登录失败。请检查您的凭据。",
    "activationFailed": "激活失败。请检查链接。",
    "forgotPasswordDescription": "输入您的电子邮件地址。您将收到重置密码的链接。",
    "sendResetLink": "发送链接",
    "sending": "发送中...",
    "resetEmailSent": "如果该邮箱存在账号，已发送重置链接。请检查收件箱（和垃圾邮件文件夹）。",
    "resetRequestFailed": "请求失败。请重试。",
    "resetPassword": "设置新密码",
    "newPassword": "新密码",
    "confirmPassword": "确认密码",
    "saveNewPassword": "保存密码",
    "saving": "保存中...",
    "passwordResetSuccess": "密码已成功更改。您现在可以使用新密码登录。",
    "passwordsDoNotMatch": "密码不匹配。",
    "passwordTooShort": "密码至少需要6个字符。",
    "resetFailed": "无法更改密码。链接可能已过期。"
  },
  "settings": {
    "title": "设置",
    "personalSettings": "个人设置",
    "language": "语言",
    "languageDescription": "选择您偏好的应用程序语言",
    "languageChanged": "语言已成功更改",
    "selectLanguage": "选择语言"
  },
  "languages": {
    "de": "Deutsch (德语)",
    "en-GB": "English (英语（GB）)",
    "en-US": "English (英语（US）)",
    "en-AU": "English (英语（AU）)",
    "de-CH": "Schwiizerdütsch (瑞士德语)",
    "fr": "Français (法语)",
    "es": "Español (西班牙语)",
    "it": "Italiano (意大利语)",
    "pl": "Polski (波兰语)",
    "ja": "日本語 (日语)",
    "zh": "中文",
    "tl": "Tagalog (他加禄语)",
    "th": "ไทย (泰语)",
    "fil": "Filipino (菲律宾语)"
  },
  "messages": {
    "success": "成功",
    "error": "错误",
    "warning": "警告",
    "info": "信息",
    "confirm": "确认",
    "cancel": "取消"
  },
  "tournaments": {
    "numberOfTables": "球台数量",
    "table": "球台",
    "playerOne": "选手 1",
    "playerTwo": "选手 2",
    "groupsLabel": "分组",
    "knockoutLabel": "KO",
    "distributeTables": "分配空闲球台",
    "distributeTablesResult": "球台分配",
    "noFreeTables": "没有可用的空闲球台。",
    "noAssignableMatches": "没有两位选手都空闲的比赛。",
    "tablesDistributed": "球台已分配。",
    "errorDistributingTables": "分配球台时出错。",
    "missingDataPDF": "缺失数据导出为PDF",
    "missingDataPDFTitle": "参赛者缺失数据 – 迷你锦标赛",
    "missingDataPDFSubtitle": "请向参赛者收集缺失数据（标记为____）并在此记录。",
    "allDataComplete": "所有参赛者数据已完整。",
    "allDataCompleteTop3": "前3名的所有数据已完整。",
    "noTop3Yet": "前3名尚未确定。",
    "missingDataPDFTitleTop3": "缺失数据 – 前3名迷你锦标赛",
    "missingDataPDFSubtitleTop3": "请收集前3名的缺失数据（标记为____）并在此记录。",
    "address": "地址",
    "phone": "电话",
    "generatingPDF": "正在生成PDF...",
    "page": "页",
    "statusOpen": "未开始",
    "statusLive": "进行中",
    "statusFinished": "已完成",
    "dataNotRecorded": "尚未录入",
    "resultsRanking": "排名",
    "newSetPlaceholder": "新一局，例如 11:7",
    "finishMatch": "结束比赛",
    "correctMatch": "更正",
    "markMatchLive": "标记为进行中",
    "unmarkMatchLive": "移除进行中标记",
    "stageConfigTitle": "中间轮与决赛轮",
    "stageConfigLoading": "正在加载轮次配置…",
    "stageConfigIntro": "中间轮是可选的。如果启用，之后总会有一个决赛轮。淘汰赛决赛轮会生成为单一对阵表。",
    "useIntermediateStage": "使用中间轮",
    "intermediateRound": "中间轮（第2轮）",
    "finalRound": "决赛轮",
    "playThirdPlace": "进行三四名决赛",
    "roundMode": "模式",
    "roundGroupCount": "小组数量",
    "promotionRule12": "晋级：预赛 → 中间轮 (1→2)",
    "promotionRuleFinal": "晋级：第 {from} 轮 → 第 {to} 轮",
    "addPoolRule": "添加分组规则",
    "noPoolRulesYet12": "还没有规则。示例：第1和第2名 -> 第2轮上层小组。",
    "noPoolRulesYetFinal": "还没有规则。示例：第1和第2名 -> 决赛轮。",
    "placesFromEachGroup": "每组名次（例如 1,2）",
    "target": "目标",
    "targetGroupCount": "目标小组数量",
    "saveRounds": "保存轮次",
    "createFinalFromPreliminary": "从预赛创建决赛轮",
    "createIntermediateFromPreliminary": "从预赛创建中间轮",
    "createFinalFromIntermediate": "从中间轮创建决赛轮",
    "stageConfigMissingIds": "无法保存：缺少俱乐部或赛事 ID。",
    "stageConfigLoadError": "加载轮次配置时出错。",
    "stageConfigBadServerResponse": "服务器响应无效。",
    "stageCreated": "第 {round} 轮已创建。",
    "atLeastOnePoolRule": "请至少为 {label} 添加一条分组规则（例如名次 1,2）。",
    "enterMiniLocation": "请输入地点。",
    "selectTournamentFirst": "请先选择一个赛事。",
    "errorGeneratingPdf": "生成 PDF 时出错。",
    "orphanedMatchesRemoved": "已移除 {count} 场孤立比赛。",
    "noOrphanedMatchesFound": "未找到孤立比赛。",
    "enterClassName": "请输入组别名称。",
    "deleteClassTitle": "删除组别",
    "deleteClassConfirm": "确定要删除组别“{name}”吗？",
    "deleteClassParticipantsDetached": "所有参赛者将从该组别中移除。",
    "enterExternalParticipantName": "请至少输入名字和姓氏。",
    "noTournamentDate": "没有赛事日期。",
    "noValidTrainingParticipants": "在该日期的训练中未找到有效参赛者。",
    "noTrainingParticipants": "在该日期的训练中未找到参赛者。",
    "noTrainingOnDate": "未找到 {date} 的训练。",
    "selectTwoDifferentPlayers": "请选择两位不同的选手。",
    "pairingAlreadyExists": "该配对已存在。",
    "participantNotFound": "未找到参赛者。",
    "minimumParticipantsForPairings": "配对至少需要 2 名参赛者。",
    "deleteExistingPairingsConfirm": "现有配对将被删除。是否继续？",
    "pairingsCreatedWithErrors": "已创建 {successCount} 个配对，错误 {errorCount} 个。",
    "participantConflicts": "冲突",
    "unpairedDoubles": "双打未配对",
    "noEligibleClass": "未找到合适的组别。",
    "eligibleClassesHint": "适合: {classes}",
    "warningClassMissing": "未找到组别",
    "warningGenderMismatch": "性别与组别不匹配",
    "warningGenderMissing": "该组别缺少性别信息",
    "warningBirthDateMissing": "该组别缺少出生日期",
    "warningTooOldForClass": "对该组别来说年龄过大",
    "warningTooYoungForClass": "对该组别来说年龄过小",
    "warningMissingPairing": "缺少双打搭档",
    "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",
    "statusUnpairedDoubles": "{count} doubles without partner",
    "statusActionPair": "Pair",
    "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.",
    "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}",
    "poolRulePlacesLabel": "Which places advance?",
    "poolRulePlacesHelp": "Example: 1 or 1,2",
    "poolRuleTargetLabel": "Where do these places go?",
    "poolRuleQuickExamples": "Quick examples:",
    "targetGroupsLabel": "{count} groups",
    "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",
    "stageParticipantsTransferred": "Qualified players were moved into {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.",
    "poolRulePreview": "From each group, places {places} advance to {target}.",
    "poolRuleTargetKnockout": "the knockout bracket",
    "poolRuleTargetGroupsDetailed": "{count} target groups",
    "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.",
    "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": "Suggestion: {value}",
    "stageValidationRulePlacesGap": "The place definition has gaps. Usually a continuous order such as 1,2 or 1,2,3 is intended.",
    "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}.",
    "stageValidationApplyFix": "Apply",
    "stageValidationApplyTargetTypeFix": "Switch to {target}",
    "stageValidationApplyTargetGroupFix": "Set to {count} target groups",
    "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",
    "stageValidationApplyAllFixes": "Apply {count} quick fix(es)",
    "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}",
    "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.",
    "stageFlowPreviewRuleWithCount": "{base} (expected qualifiers: {count})",
    "stageFlowReadinessNoGroups": "No matching groups exist yet",
    "stageFlowReadinessIncompleteGroups": "{count} group(s) are not fully decided yet",
    "stageFlowReadinessReady": "Transition is ready to start",
    "stageFlowQualifiedPreviewTitle": "Currently qualified",
    "stageFlowQualifiedPreviewEntry": "G{group} · Place {position} · {name}"
  },
  "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",
    "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",
    "openTasks": "Open tasks",
    "noOpenTasks": "No open tasks",
    "taskVerifyForm": "Verify form",
    "taskReviewTrialStatus": "Review trial status",
    "taskCheckTrainingStatus": "Review training status",
    "taskCheckClickTt": "Review Click-TT eligibility",
    "taskActionVerify": "Verify",
    "taskActionMarkRegular": "Mark regular",
    "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."
  }
}
