{
  "common": {
    "next": "Next",
    "prev": "Previous",
    "finish": "Finish",
    "cancel": "Cancel",
    "save": "Save",
    "loading": "Loading...",
    "confirm": "Confirm",
    "success": "Success",
    "error": "Error",
    "delete": "Delete",
    "edit": "Edit",
    "add": "Add",
    "search": "Search",
    "clear": "Clear",
    "close": "Close",
    "yes": "Yes",
    "no": "No",
    "submit": "Submit",
    "reset": "Reset",
    "import": "Import",
    "export": "Export",
    "create": "Create",
    "update": "Update",
    "refresh": "Refresh",
    "view": "View",
    "name": "Name",
    "status": "Status",
    "operation": "Operation",
    "description": "Description",
    "total": "Total {{count}} items",
    "noData": "No data",
    "pleaseSelect": "Please select",
    "pleaseEnter": "Please enter",
    "readOnly": "Read-only mode",
    "none": "None",
    "more": "More"
  },
  "oobe": {
    "title": "Welcome to SecScore",
    "subtitle": "Education Points Management Expert",
    "step": "Step {{current}}/{{total}}",
    "skip": "Skip",
    "steps": {
      "entry": {
        "title": "Get Started",
        "description": "Choose how you want to proceed",
        "enterOobe": "Enter OOBE",
        "connectPostgresAutoSync": "Connect PostgreSQL with Auto Sync",
        "skipDirect": "Skip OOBE and Enter"
      },
      "postgresql": {
        "title": "Connect PostgreSQL",
        "description": "Enter a PostgreSQL connection string. The app will connect and auto-sync before entering.",
        "connectionPlaceholder": "postgresql://user:password@host:port/database?sslmode=require",
        "autoSyncAndEnter": "Connect, Auto Sync, and Enter"
      },
      "language": {
        "title": "Select Language",
        "description": "Choose your preferred interface language"
      },
      "theme": {
        "title": "Set Theme",
        "description": "Choose your preferred interface appearance",
        "mode": "Mode",
        "lightMode": "Light",
        "darkMode": "Dark",
        "primaryColor": "Primary Color",
        "backgroundGradient": "Background Gradient"
      },
      "password": {
        "title": "Set Password",
        "description": "Set login password to protect your data (optional)",
        "adminPassword": "Admin Password",
        "adminPasswordHint": "Full access to all features, 6 digits",
        "pointsPassword": "Points Password",
        "pointsPasswordHint": "Points operations only, 6 digits",
        "passwordPlaceholder": "Enter 6 digits",
        "hint": "Leave empty to skip, you can configure in settings later"
      },
      "students": {
        "title": "Import Student List",
        "description": "Add student list to start points management",
        "import": "Import List",
        "manual": "Add Manually",
        "importHint": "Supports Excel (.xlsx) or JSON files",
        "manualHint": "You can paste multiple lines, one student name per line",
        "dragDrop": "Drag and drop files here, or click to select",
        "supportedFormats": "Supports .xlsx, .json formats",
        "studentName": "Student Name",
        "addStudent": "Add Student",
        "noStudents": "No students yet, please add or import",
        "studentCount": "{{count}} students added",
        "studentExists": "Student already exists",
        "importSuccess": "Successfully imported {{count}} students",
        "noNewStudents": "No new students to import",
        "parseFailed": "File parsing failed",
        "unsupportedFormat": "Unsupported file format"
      },
      "reasons": {
        "title": "Set Reasons",
        "description": "Add common point change reasons",
        "addReason": "Add Reason",
        "reasonName": "Reason Name",
        "points": "Points",
        "positive": "Add Points",
        "negative": "Deduct Points",
        "noReasons": "No reasons yet, please add common reasons",
        "reasonCount": "{{count}} reasons added",
        "reasonExists": "Reason already exists"
      },
      "start": {
        "title": "Ready to Go",
        "description": "Everything is ready. Let's start using SecScore!",
        "features": {
          "score": "Easily manage student points",
          "history": "Complete point change history",
          "settlement": "Support settlement and archiving"
        },
        "startButton": "Get Started"
      }
    }
  },
  "settings": {
    "title": "Settings",
    "tabs": {
      "appearance": "Appearance",
      "security": "Security",
      "account": "Account",
      "database": "Cloud Sync",
      "dataManagement": "Data Management",
      "urlProtocol": "URL Protocol",
      "about": "About"
    },
    "language": "Language",
    "languageHint": "Select interface display language",
    "fontFamily": "Global Font",
    "fontFamilyHint": "Select the application interface font (page refresh required for full effect)",
    "theme": "Theme",
    "password": "Set Password",
    "themeMode": "Mode",
    "lightMode": "Light",
    "darkMode": "Dark",
    "primaryColor": "Primary Color",
    "backgroundGradient": "Background Gradient",
    "searchKeyboard": {
      "title": "Search Keyboard",
      "hint": "Choose the pop-up keyboard layout under the search box",
      "disableToggle": "Disable Search Keyboard",
      "disableHint": "When enabled, the keyboard will no longer pop up below the search box",
      "options": {
        "qwerty26": "26-key (QWERTY)",
        "t9": "9-key (T9)"
      }
    },
    "interfaceZoom": "Interface Zoom",
    "zoomOptions": {
      "small70": "Small (70%)",
      "default100": "Default (100%)",
      "large150": "Large (150%)"
    },
    "general": {
      "saved": "Saved",
      "saveFailed": "Save failed"
    },
    "zoomHint": "Adjust the overall size of the application interface",
    "mobile": {
      "navigationTitle": "Page Shortcuts",
      "bottomNav": {
        "label": "Bottom Navigation Features",
        "hint": "Choose which features appear in the mobile bottom bar. The bar shows up to 4 items; extra items go under \"More\"."
      },
      "dragHint": "Drag to reorder. The first 4 items appear in the bottom bar; the rest stay in \"More\".",
      "dropHere": "Release to drop here",
      "bottomSection": "Bottom Bar (up to 4)",
      "moreSection": "More",
      "moveToMore": "Move to More",
      "moveToBottom": "Move to Bottom"
    },
    "zoomUpdated": "Interface zoom updated",
    "updateFailed": "Update failed",
    "security": {
      "title": "Password Protection System",
      "adminPassword": "Admin Password",
      "pointsPassword": "Points Password",
      "recoveryString": "Recovery String",
      "set": "Set",
      "notSet": "Not Set",
      "generated": "Generated",
      "notGenerated": "Not Generated",
      "enterPassword": "Enter 6-digit number (leave empty to skip)",
      "adminPasswordPlaceholder": "Enter 6-digit admin password (leave empty to skip)",
      "pointsPasswordPlaceholder": "Enter 6-digit points password (leave empty to skip)",
      "recoveryPlaceholder": "Enter recovery string",
      "savePassword": "Save Password",
      "savePasswords": "Save Passwords",
      "generateRecovery": "Generate Recovery String",
      "clearAllPasswords": "Clear All Passwords",
      "recoveryReset": "Recovery String Reset",
      "enterRecovery": "Enter recovery string",
      "resetPassword": "Reset Password",
      "resetHint": "Reset will clear admin/points passwords and generate a new recovery string.",
      "confirmClear": "Confirm clearing all passwords?",
      "clearHint": "After clearing, protection will be disabled (no password defaults to admin permission).",
      "saved": "Password updated",
      "saveFailed": "Update failed",
      "generateFailed": "Generate failed",
      "resetFailed": "Reset failed",
      "cleared": "Cleared",
      "clearFailed": "Clear failed",
      "passwordClearedNewRecovery": "Password cleared, new recovery string",
      "newRecoveryString": "New recovery string (please save it)"
    },
    "account": {
      "title": "SECTL Auth Account",
      "notLoggedIn": "Not logged in to SECTL Auth",
      "oauthHint": "Use SECTL Auth account to login, enjoy unified authentication and remote logout",
      "loginButton": "Login with SECTL Auth",
      "loginSuccess": "Login successful",
      "logout": "Logout",
      "userId": "User ID",
      "permission": "Permission Level"
    },
    "database": {
      "title": "Database Connection",
      "currentStatus": "Current Database Status",
      "sqliteLocal": "SQLite Local Database",
      "postgresqlRemote": "PostgreSQL Remote Database",
      "connected": "Connected",
      "disconnected": "Disconnected",
      "postgresqlConnection": "PostgreSQL Remote Connection",
      "connectionHint": "Enter PostgreSQL connection string to connect to remote database for multi-device sync.",
      "testConnection": "Test Connection",
      "switchToPostgreSQL": "Switch to PostgreSQL",
      "switchToSQLite": "Switch to Local SQLite",
      "connectionTestSuccess": "Connection test successful",
      "connectionTestFailed": "Connection test failed",
      "switchedTo": "Switched to {{type}} database",
      "switchedToSQLite": "Switched to SQLite local database",
      "switchFailed": "Switch failed",
      "syncDescription": "Multi-device Sync Info",
      "syncPoint1": "Using PostgreSQL remote database enables multi-device data synchronization.",
      "syncPoint2": "Built-in operation queue mechanism ensures data consistency during simultaneous operations.",
      "syncPoint3": "Application restart required after switching database.",
      "syncPoint4": "Recommended cloud database services: Neon, Supabase, AWS RDS, etc.",
      "enterConnectionString": "Please enter PostgreSQL connection string",
      "connectionExample": "Example: postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require",
      "uploadButton": "Upload Local Data to Remote",
      "uploadHint": "After connecting remote database, upload and merge local SQLite history into remote.",
      "uploadNeedRemote": "Please connect to PostgreSQL remote database first",
      "noNeedUpload": "Local and remote data are already consistent",
      "uploadConfirmTitle": "Upload local data to remote?",
      "uploadConfirmContent": "Sync will prefer local data. Detected local-only {{localOnly}}, remote-only {{remoteOnly}}, conflicts {{conflicts}}.",
      "uploadSuccess": "Local data uploaded to remote",
      "uploadFailed": "Upload failed"
    },
    "cloudSync": {
      "title": "Cloud Sync",
      "selectMethod": "Select Sync Method",
      "selectMethodHint": "Choose a data sync method. The two methods are mutually exclusive. Switching will use the new sync channel.",
      "postgresql": "Self-hosted PostgreSQL",
      "postgresqlDesc": "Connect to your own PostgreSQL database for full data control. Ideal for users with their own server.",
      "sectlCloud": "SECTL Cloud Sync",
      "sectlCloudDesc": "Sync data via SECTL cloud platform. No self-hosted database needed, works out of the box.",
      "loginRequired": "Please log in to SECTL Auth first",
      "loginHint": "SECTL Cloud Sync requires a SECTL Auth account. Please go to the 'Account' tab to log in.",
      "statusTitle": "Sync Status",
      "configured": "Ready",
      "notConfigured": "Not Ready",
      "syncing": "Syncing...",
      "lastSync": "Last synced",
      "never": "Never synced",
      "syncActions": "Sync Actions",
      "syncDirection": "Sync Direction",
      "bidirectional": "Bidirectional (Recommended) — Automatically merge local and cloud data",
      "pushOnly": "Upload only — Overwrite cloud data with local data",
      "pullOnly": "Download only — Overwrite local data with cloud data",
      "startSync": "Start Sync",
      "uploadToCloud": "Upload to Cloud",
      "downloadFromCloud": "Download from Cloud",
      "fullSync": "Bidirectional Sync",
      "syncInProgress": "Sync is in progress, please wait",
      "syncConfirm": "Confirm {{direction}}?",
      "storageUsage": "Storage Usage",
      "usedStorage": "Used",
      "table": "Table",
      "records": "Records",
      "size": "Size",
      "clickToLoadStats": "Click refresh to load stats",
      "description": "SECTL Cloud Sync Guide",
      "descriptionPoint1": "Sync data via SECTL cloud service. No self-hosted database needed. Data is isolated by SECTL Auth account.",
      "descriptionPoint2": "Based on KV storage architecture. Each data table is stored as a key-value pair for efficient read/write.",
      "descriptionPoint3": "Supports bidirectional, upload-only, and download-only modes for different scenarios.",
      "descriptionPoint4": "Data is transmitted over HTTPS with OAuth 2.0 authentication for security."
    },
    "data": {
      "title": "Data Management",
      "settlement": "Settlement",
      "settlementAndRestart": "Settle and Restart",
      "settlementHint": "Mark current records as a phase and reset all student points to zero.",
      "importExport": "Import / Export",
      "exportJson": "Export JSON",
      "importJson": "Import JSON",
      "importHint": "Import will overwrite existing students/reasons/records/settings (security settings excluded).",
      "logs": "Logs",
      "logLevel": "Log Level",
      "logOperation": "Log Operation",
      "viewLogs": "View Logs",
      "exportLogs": "Export Logs",
      "clearLogs": "Clear Logs",
      "logsCleared": "Logs cleared",
      "systemLogs": "System Logs (Last 200)",
      "noLogs": "No logs",
      "logLevelUpdated": "Log level updated",
      "readLogsFailed": "Failed to read logs",
      "logsExported": "Logs exported",
      "exportFailed": "Export failed",
      "exportSuccess": "Export successful",
      "importSuccess": "Import successful, refreshing",
      "importFailed": "Import failed",
      "clearFailed": "Clear failed",
      "confirmSettlement": "Confirm settlement and restart?",
      "settlementConfirm1": "This will archive current unsettled records as a phase and reset all student points to zero.",
      "settlementConfirm2": "Student list remains unchanged; settlement history available in 'Settlements' page.",
      "settlementSuccess": "Settlement successful, points restarted",
      "settlementFailed": "Settlement failed",
      "settle": "Settle",
      "logLevels": {
        "debug": "DEBUG",
        "info": "INFO",
        "warn": "WARN",
        "error": "ERROR"
      }
    },
    "url": {
      "title": "URL Protocol (secscore://)",
      "protocol": "URL Protocol",
      "description": "Can invoke SecScore via URL to perform actions, for example:",
      "register": "Register URL Protocol",
      "registered": "URL protocol registered",
      "registerFailed": "Registration failed",
      "installerRequired": "Requires installed SecScore, may not work in development mode.",
      "checkStatus": "Check Status",
      "reRegister": "Re-register",
      "unregister": "Unregister",
      "unregistered": "URL protocol unregistered",
      "unregisterFailed": "Failed to unregister",
      "statusRegistered": "Registered",
      "statusNotRegistered": "Not Registered",
      "statusCheckFailed": "Status check failed",
      "retrying": "Retrying ({{current}}/{{max}})",
      "retryFailed": "Max retries reached, registration failed",
      "retrySuccess": "Retry #{{n}} succeeded",
      "operationLog": "Operation Log",
      "logRegisterStart": "Starting URL protocol registration...",
      "logRegisterVerify": "Registration command executed, verifying...",
      "logRegisterSuccess": "Registration verified successfully",
      "logRegisterFailed": "Registration verification failed",
      "logUnregisterStart": "Unregistering...",
      "logUnregisterSuccess": "Unregistered successfully",
      "logUnregisterFailed": "Unregister failed",
      "logMaxRetries": "Max retries (7) reached"
    },
    "elevation": {
      "title": "Administrator Privileges",
      "description": "Check if the application is running with administrator/root privileges. Some features (like port listening, system-level operations) require elevated privileges.",
      "elevated": "Elevated",
      "notElevated": "Not Elevated",
      "request": "Request Admin Privileges",
      "requestSuccess": "Admin privileges requested, application will restart",
      "requestFailed": "Failed to request admin privileges",
      "windowsHint": "Windows: A UAC prompt will appear. After confirmation, the app will restart as administrator.",
      "macosHint": "macOS: A system authentication dialog will appear. Enter admin password to restart the app.",
      "linuxHint": "Linux: Uses pkexec to request root privileges. Enter password to restart the app."
    },
    "mcp": {
      "title": "MCP Service",
      "description": "Manage the built-in MCP HTTP service for external MCP clients.",
      "running": "Running",
      "stopped": "Stopped",
      "noUrl": "No URL",
      "host": "Host",
      "port": "Port",
      "start": "Start",
      "stop": "Stop",
      "refresh": "Refresh Status",
      "hint": "Recommended to bind only to 127.0.0.1; after start, endpoint is http://host:port/mcp",
      "hostRequired": "Please enter MCP host",
      "portInvalid": "Please enter a valid port (1-65535)",
      "startSuccess": "MCP server started",
      "startFailed": "Failed to start MCP server",
      "stopSuccess": "MCP server stopped",
      "stopFailed": "Failed to stop MCP server",
      "startTimeout": "MCP server start timed out, please try again",
      "stopTimeout": "MCP server stop timed out, please try again"
    },
    "app": {
      "title": "App Controls",
      "description": "Quickly restart or quit the app.",
      "restart": "Restart App",
      "quit": "Quit App",
      "confirmRestartTitle": "Restart the app now?",
      "confirmRestartContent": "The app will close and start again immediately.",
      "confirmQuitTitle": "Quit the app now?",
      "confirmQuitContent": "The app will exit immediately.",
      "restartFailed": "Restart failed",
      "quitFailed": "Quit failed"
    },
    "about": {
      "title": "About",
      "appName": "Education Points Management",
      "version": "Version",
      "copyright": "Copyright",
      "ipcStatus": "IPC Status",
      "ipcConnected": "Connected",
      "ipcDisconnected": "Disconnected (Preload failed)",
      "environment": "Environment",
      "toggleDevTools": "Toggle Developer Tools",
      "license": "SecScore is licensed under GPL3.0",
      "copyRightText": "CopyRight © 2025-{{year}} SECTL"
    }
  },
  "sidebar": {
    "home": "Home",
    "students": "Students",
    "score": "Score",
    "boards": "Boards",
    "leaderboard": "Leaderboard",
    "settlements": "Settlements",
    "reasons": "Reasons",
    "autoScore": "Automation",
    "rewardExchange": "Reward Exchange",
    "rewardSettings": "Reward Settings",
    "settings": "Settings",
    "remoteDb": "Remote Database",
    "refreshStatus": "Refresh Status",
    "syncNow": "Sync Now",
    "syncSuccess": "Sync successful",
    "syncFailed": "Sync failed",
    "getDbStatusFailed": "Failed to get database status",
    "notRemoteMode": "Not in remote database mode, please restart application",
    "dbNotConnected": "Database not connected",
    "plugins": "Plugins"
  },
  "auth": {
    "unlock": "Unlock Permission",
    "unlockHint": "Enter 6-digit password: Admin password = full access, Points password = points operations only.",
    "unlockButton": "Unlock",
    "unlocked": "Permission unlocked",
    "logout": "Switched to read-only",
    "passwordPlaceholder": "e.g. 123456",
    "passwordError": "Incorrect password",
    "enterPassword": "Enter Password",
    "lock": "Lock"
  },
  "languages": {
    "zh-CN": "简体中文",
    "en-US": "English"
  },
  "theme": {
    "colorAndBackground": "Color & Background",
    "gradientLabels": {
      "blue": "Fresh Blue",
      "pink": "Soft Pink",
      "cyan": "Cyan",
      "purple": "Purple"
    },
    "gradientDirections": {
      "vertical": "Vertical",
      "horizontal": "Horizontal",
      "diagonal": "Diagonal"
    },
    "generate": "Generate",
    "saved": "Saved",
    "saveFailed": "Save failed",
    "mode": "Mode",
    "myTheme": "My Theme"
  },
  "permissions": {
    "admin": "Admin",
    "points": "Points",
    "view": "Read-only"
  },
  "home": {
    "title": "Student Points Home",
    "subtitle": "{{count}} students total, click card to operate",
    "searchPlaceholder": "Search name/pinyin...",
    "sortBy": {
      "alphabet": "Name Sort",
      "surname": "Surname Group",
      "group": "Group Sort",
      "score": "Points Rank"
    },
    "layoutBy": {
      "grouped": "Grouped List",
      "squareGrid": "Square Grid",
      "largeAvatar": "Large Avatar"
    },
    "noStudents": "No student data, please add in Student Management",
    "noMatch": "No matching students found",
    "clearSearch": "Clear search",
    "points": "pts",
    "currentScore": "Current Points",
    "quickOptions": "Quick Options",
    "adjustPoints": "Adjust Points",
    "customPoints": "Custom Points",
    "customPointsHint": "Enter any value in the input box",
    "reason": "Reason",
    "reasonPlaceholder": "Enter reason for points change (optional)",
    "preview": "Change Preview",
    "noReason": "(No reason)",
    "ungrouped": "Ungrouped",
    "category": {
      "others": "Others"
    },
    "scoreAdded": "Added {{points}} points for {{name}}",
    "scoreDeducted": "Deducted {{points}} points for {{name}}",
    "submitFailed": "Submit failed",
    "pleaseSelectPoints": "Please select or enter points",
    "reasonDefault": "{{action}} {{points}} points",
    "studentCount": "{{count}} students",
    "operationTitle": "Points Operation: {{name}}",
    "submitOperation": "Submit Operation",
    "operationTitleBatch": "Points Operation: {{count}} Selected",
    "undoLastAction": "Undo Last",
    "undoLastHint": "Undo latest: {{name}} {{delta}}",
    "undoUnavailable": "No points operation available to undo",
    "undoLastSuccess": "Last points operation has been undone",
    "multiSelect": "Multi-select",
    "batchMode": "Batch Mode",
    "selectAll": "Select All",
    "clearSelected": "Clear Selected",
    "batchOperate": "Batch Points",
    "selected": "Selected",
    "selectedCount": "{{count}} selected",
    "batchSuccess": "Submitted points for {{count}} students",
    "batchPartial": "Successfully submitted for {{success}}/{{total}} students",
    "selectStudentFirst": "Please select student(s) first",
    "addPoints": "Add Points",
    "deductPoints": "Deduct Points",
    "pointsChange": "Points Change",
    "reasonLabel": "Reason: "
  },
  "students": {
    "title": "Student Management",
    "importList": "Import List",
    "addStudent": "Add Student",
    "name": "Name",
    "group": "Group",
    "avatar": "Avatar",
    "currentScore": "Current Points",
    "tags": "Tags",
    "noTags": "No tags",
    "editTags": "Edit Tags",
    "editAvatar": "Set Avatar",
    "deleteConfirm": "Confirm delete this student?",
    "addTitle": "Add Student",
    "addConfirm": "Add",
    "namePlaceholder": "Enter student name",
    "groupPlaceholder": "Enter group name (optional)",
    "nameRequired": "Please enter name",
    "nameExists": "Student name already exists",
    "addSuccess": "Added successfully",
    "addFailed": "Add failed",
    "deleteSuccess": "Deleted successfully",
    "deleteFailed": "Delete failed",
    "tagSaveSuccess": "Tags saved successfully",
    "tagSaveFailed": "Failed to save tags",
    "importTitle": "Import List",
    "importTextHint": "Paste multiple lines, one student name per line",
    "importTextPlaceholder": "Example:\nAlice\nBob\nCharlie",
    "importByText": "Import from Text",
    "importByXlsx": "Import via xlsx",
    "importByBanyou": "Import from BanYou",
    "xlsxPreview": "XLSX Preview & Import",
    "file": "File",
    "selectNameCol": "Click header to select name column",
    "previewRows": "Preview first 50 rows",
    "importConfirm": "Import",
    "importComplete": "Import complete: {{inserted}} added, {{skipped}} skipped",
    "workerNotReady": "Worker not initialized",
    "parseXlsxFailed": "Failed to parse xlsx",
    "selectNameColFirst": "Please select \"Name Column\" first",
    "noNamesFound": "No importable names found in selected column",
    "importFailed": "Import failed",
    "banyouCookieHint": "After signing in to BanYou Web, copy the full Cookie and paste it below.",
    "banyouCookiePlaceholder": "uid=...; accessToken=...; ...",
    "banyouCookieRequired": "Please paste Cookie first",
    "banyouFetch": "Fetch Classrooms",
    "banyouFetchSuccess": "Fetched {{count}} classrooms",
    "banyouFetchFailed": "Failed to fetch BanYou classrooms",
    "banyouCreatedClasses": "Classes I Created",
    "banyouJoinedClasses": "Classes I Joined",
    "banyouNoClasses": "No classroom data",
    "banyouClassTeacher": "Teacher: ",
    "banyouStudentCount": "Students: ",
    "banyouPraiseCount": "Praise: ",
    "banyouFetchDetailFailed": "Failed to fetch classroom details",
    "banyouClassDetail": "Classroom Details",
    "banyouDetailEmpty": "No classroom detail data",
    "banyouReasonList": "Reason List",
    "banyouStudentList": "Student List",
    "banyouTeamList": "Group List",
    "banyouNoTeams": "No group data (try filling teamPlanId and reopen)",
    "banyouTeamPlanSelector": "Group Plan",
    "banyouLoadTeamPlan": "Load This Plan",
    "banyouTeamPlanSource": "Plan source API: ",
    "banyouSelectTeamPlanFirst": "Please select a group plan first",
    "banyouImportSelected": "Import Selected",
    "banyouNothingSelected": "Please select at least one item to import",
    "banyouImportSummary": "BanYou import done: Students +{{studentsInserted}}/{{studentsSkipped}} skipped; Reasons +{{reasonsInserted}}/{{reasonsSkipped}} skipped; Groups updated {{groupsUpdated}}/{{groupsSkipped}} skipped",
    "editTagTitle": "Edit Tags - {{name}}",
    "editGroup": "Set Group",
    "editGroupTitle": "Set Group - {{name}}",
    "groupSaveSuccess": "Group saved",
    "groupSaveFailed": "Failed to save group",
    "existingGroups": "Existing groups (click to fill)",
    "noExistingGroups": "No existing groups yet",
    "groupBoardEdit": "Edit Groups",
    "groupBoardTitle": "Quick Group Editor",
    "groupBoardHint": "Drag students across group columns and save to apply in batch.",
    "groupBoardNewGroupPlaceholder": "Enter new group name",
    "groupBoardAddGroup": "New Group",
    "groupBoardGroupExists": "Group already exists",
    "groupBoardGroupNameRequired": "Please enter group name",
    "groupBoardGroupNameInvalid": "Invalid group name",
    "groupBoardEmpty": "Drag students here",
    "groupBoardNoChanges": "No group changes",
    "groupBoardSaveSuccess": "Updated groups for {{count}} students",
    "groupBoardSaveFailed": "Save failed, {{failed}} students were not updated",
    "noGroup": "Ungrouped",
    "editAvatarTitle": "Set Avatar - {{name}}",
    "avatarUpload": "Upload Image",
    "avatarClear": "Clear Avatar",
    "noAvatar": "No Avatar",
    "avatarTip": "Supports common image formats, up to 2MB",
    "avatarSaveSuccess": "Avatar saved",
    "avatarSaveFailed": "Failed to save avatar",
    "avatarInvalidFile": "Please choose an image file",
    "avatarTooLarge": "Image must be smaller than 2MB",
    "avatarReadFailed": "Failed to read image",
    "avatarClipboardImport": "Import from Clipboard",
    "avatarClipboardUnsupported": "Clipboard image read is not supported",
    "avatarClipboardNoImage": "No image found in clipboard",
    "avatarClipboardReadFailed": "Failed to read clipboard image"
  },
  "score": {
    "title": "Points Management",
    "student": "Student",
    "change": "Change",
    "reason": "Reason",
    "time": "Time",
    "undoConfirm": "Confirm undo this record? Student points will be rolled back.",
    "undo": "Undo",
    "undoSuccess": "Operation undone",
    "undoFailed": "Undo failed",
    "recentRecords": "Recent Records",
    "pleaseSelectStudent": "Please select or search student",
    "selectAllStudents": "Whole Class",
    "clearSelectedStudents": "Clear",
    "selectedCount": "Selected {{selected}} / {{total}}",
    "points": "Points",
    "addPoints": "Add",
    "deductPoints": "Deduct",
    "quickReason": "Quick Reason",
    "selectReason": "Select preset reason",
    "reasonContent": "Reason Content",
    "reasonPlaceholder": "Manual input or select quick reason",
    "submit": "Confirm Submit",
    "pleaseEnterInfo": "Please fill in complete information",
    "pleaseEnterPoints": "Please enter points or select preset reason",
    "batchSuccess": "Submitted points for {{count}} students",
    "batchPartial": "Successfully submitted for {{success}}/{{total}} students"
  },
  "reasons": {
    "title": "Reason Management",
    "addReason": "Add Preset Reason",
    "category": "Category",
    "content": "Reason Content",
    "presetPoints": "Preset Points",
    "deleteConfirm": "Confirm delete this reason?",
    "addTitle": "Add Reason",
    "addConfirm": "Add",
    "categoryPlaceholder": "e.g. Study, Discipline",
    "contentPlaceholder": "Enter reason",
    "pointsPlaceholder": "e.g. 2 or -2",
    "contentRequired": "Please enter reason content",
    "pointsRequired": "Please enter preset points",
    "reasonExists": "Same reason already exists in this category",
    "addSuccess": "Added successfully",
    "addFailed": "Add failed",
    "deleteSuccess": "Deleted successfully",
    "deleteFailed": "Delete failed",
    "others": "Others"
  },
  "rewardExchange": {
    "title": "Reward Exchange",
    "enterMode": "Enter Exchange Mode",
    "exitMode": "Exit Exchange Mode",
    "modeHint": "Reward exchange mode is active. Click a student card to choose an available reward.",
    "normalHint": "Current cards show original score. Enter mode to display redeemable reward points.",
    "remainingRewardPoints": "Remaining Reward Points",
    "currentScore": "Current Score",
    "chooseRewardTitle": "Choose Reward for {{name}}",
    "currentRewardPoints": "Current reward points: {{points}}",
    "costLabel": "Cost points: {{points}}",
    "redeemNow": "Redeem",
    "noAffordableRewards": "No rewards can be redeemed now. Earn more points first.",
    "redeemSuccess": "{{student}} redeemed \"{{reward}}\" and spent {{points}} points",
    "redeemFailed": "Redeem failed",
    "recordsTitle": "Redemption Records",
    "recordStudent": "Student",
    "recordReward": "Reward",
    "recordCost": "Cost",
    "recordTime": "Redeemed At"
  },
  "rewardSettings": {
    "title": "Reward Settings",
    "addReward": "Add Reward",
    "addTitle": "Add Reward",
    "editTitle": "Edit Reward",
    "rewardName": "Reward Name",
    "costPoints": "Cost Points",
    "namePlaceholder": "e.g. Homework-Free Card",
    "costPlaceholder": "Enter cost points",
    "nameRequired": "Please enter reward name",
    "costRequired": "Please enter positive integer points",
    "createSuccess": "Reward created",
    "createFailed": "Create reward failed",
    "updateSuccess": "Reward updated",
    "updateFailed": "Update reward failed",
    "deleteSuccess": "Reward deleted",
    "deleteFailed": "Delete reward failed",
    "deleteConfirm": "Delete reward \"{{name}}\"?"
  },
  "board": {
    "title": "Boards",
    "editable": "Editable",
    "readonly": "Read-only",
    "addBoard": "Add Board",
    "removeBoard": "Delete Board",
    "removeBoardConfirm": "Delete current board?",
    "boardConfig": "Board Config",
    "boardNamePlaceholder": "Enter board name",
    "renameBoard": "Rename Board",
    "newBoard": "New Board",
    "untitledBoard": "Untitled Board",
    "addList": "Add Student List",
    "removeList": "Delete List",
    "removeListConfirm": "Delete current student list?",
    "editList": "Edit",
    "sqlEditorTitle": "Edit Student List",
    "splitHorizontal": "Split Left/Right",
    "splitVertical": "Split Top/Bottom",
    "dragHandle": "Drag to resize layout",
    "listNamePlaceholder": "Enter list name",
    "newList": "New List",
    "applyPreset": "Apply Preset",
    "run": "Run SQL",
    "runAll": "Run All",
    "viewModes": {
      "list": "List View",
      "card": "Card View",
      "grid": "Grid View",
      "largeAvatar": "Large Avatar"
    },
    "scoreDisplayModes": {
      "total": "Show Total Score",
      "split": "Show Add & Deduct"
    },
    "metrics": {
      "totalScore": "Score",
      "addScore": "Added",
      "deductScore": "Deducted",
      "rewardPoints": "Reward",
      "weekChange": "7d",
      "weekDeducted": "7d Deduct",
      "todayAnswered": "Today"
    },
    "sqlPlaceholder": "Enter SQL (single SELECT / WITH query only)",
    "templateHint": "Template variables: {{today_start}}, {{this_week_start}}, {{last_week_start}}, {{since_7d}}, {{since_30d}}, {{now}}",
    "templateDescription": "Use template variables directly in SQL. They will be replaced with ISO timestamps at runtime for both SQLite and PostgreSQL.",
    "saving": "Saving...",
    "saveFailed": "Failed to save boards",
    "runFailed": "Failed to run query",
    "keepAtLeastOneBoard": "Keep at least one board",
    "keepAtLeastOneList": "Keep at least one student list",
    "presets": {
      "weekLowDeduct": {
        "name": "Low Deduction (7d)",
        "description": "Rank students with weekly deduction < 3"
      },
      "todayActive": {
        "name": "Today's Activity",
        "description": "Sort by today's answer count and score change"
      },
      "rewardRanking": {
        "name": "Reward Ranking",
        "description": "Sort by reward points and total score"
      }
    }
  },
  "leaderboard": {
    "title": "Points Leaderboard",
    "rank": "Rank",
    "name": "Name",
    "totalScore": "Total Points",
    "todayChange": "Today's Change",
    "weekChange": "This Week's Change",
    "monthChange": "This Month's Change",
    "viewHistory": "View",
    "exportXlsx": "Export XLSX",
    "exportSuccess": "Export successful",
    "queryFailed": "Query failed",
    "historyTitle": "{{name}} - Operation History",
    "close": "Close",
    "today": "Today",
    "week": "This Week",
    "month": "This Month",
    "operationRecord": "Operation Record",
    "change": "Change"
  },
  "settlements": {
    "title": "Settlement History",
    "phase": "Phase #{{id}}",
    "viewLeaderboard": "View Leaderboard",
    "recordCount": "Records: {{count}}",
    "noRecords": "No settlement records",
    "noSettlements": "No settlement records",
    "back": "Back",
    "leaderboardTitle": "Settlement Leaderboard",
    "phaseScore": "Phase Points",
    "queryFailed": "Query failed",
    "rank": "Rank",
    "name": "Name"
  },
  "autoScore": {
    "title": "Automation Management",
    "name": "Automation Name",
    "namePlaceholder": "e.g. Daily Check-in Points",
    "nameRequired": "Please enter automation name",
    "triggers": "Triggers",
    "actions": "Actions",
    "applicableStudents": "Applicable Students",
    "allStudents": "All Students",
    "lastExecuted": "Last Executed",
    "notExecuted": "Not executed",
    "invalidTime": "Invalid time",
    "addTrigger": "Add Rule",
    "addAction": "Add Action",
    "whenTriggered": "When the following rules trigger",
    "triggerScheduleHint": "Note: whether a rule runs is still scheduled by the interval trigger. Tags, SQL, and AND / OR / NOT only decide which students are matched for that run.",
    "triggeredActions": "Actions triggered when rules are met",
    "addAutomation": "Add Automation",
    "updateAutomation": "Update Automation",
    "cancelEdit": "Cancel Edit",
    "resetForm": "Reset Form",
    "deleteConfirm": "Confirm delete this automation?",
    "adminRequired": "Admin permission required to view auto score automation",
    "adminCreateRequired": "Admin permission required to create or update auto score automation",
    "adminDeleteRequired": "Admin permission required to delete auto score automation",
    "adminToggleRequired": "Admin permission required to enable/disable auto score automation",
    "fetchFailed": "Failed to get automation",
    "unsupportedLogic": "Saving currently supports AND-only conditions. OR / NOT logic is not wired to backend persistence yet",
    "triggerRequired": "Please add at least one trigger",
    "intervalTriggerRequired": "Please add at least one interval trigger, otherwise the rule will never run automatically",
    "actionRequired": "Please add at least one action",
    "createSuccess": "Automation created successfully",
    "updateSuccess": "Automation updated successfully",
    "createFailed": "Failed to create automation",
    "updateFailed": "Failed to update automation",
    "deleteSuccess": "Automation deleted successfully",
    "deleteFailed": "Failed to delete automation",
    "enabled": "Automation enabled",
    "disabled": "Automation disabled",
    "enableFailed": "Failed to enable automation",
    "disableFailed": "Failed to disable automation",
    "noTriggerAvailable": "No trigger types available, please check configuration",
    "noActionAvailable": "No action types available, please check configuration",
    "sort": "Sort",
    "status": "Status",
    "triggerCount": "{{count}} triggers",
    "actionCount": "{{count}} actions",
    "studentCount": "{{count}} students",
    "studentPlaceholder": "Please select or search students (leave empty for all students)",
    "triggerCondition": "Trigger Condition",
    "executeAction": "Execute Action",
    "addOperation": "Add Operation",
    "scoreLabel": "Score",
    "tagNameLabel": "Tag Name",
    "operationNoteLabel": "Operation Note (Optional)",
    "intervalMinutesPlaceholder": "e.g. 1440",
    "tagNamesPlaceholder": "e.g. excellent_student,class_monitor",
    "triggerIntervalTime": "Interval Time",
    "triggerStudentTag": "Student Tag",
    "triggerStudentScore": "Student Score",
    "triggerStudentScoreGreater": "Student Score Greater Than",
    "triggerStudentSql": "Custom SQL Condition",
    "triggerStudentSqlPlaceholder": "Enter student SQL or a WHERE condition",
    "actionAddScore": "Add Score",
    "actionAddTag": "Add Tag",
    "actionSettleScore": "Settle Score",
    "actionSettleScoreHint": "No parameters required",
    "rewardRequired": "Please select a reward",
    "startAt": "Start Time",
    "startAtPlaceholder": "Select start time (empty means start now)",
    "startAtHint": "Empty means start immediately; when set, interval will use this as base time",
    "startAtWaitHint": "{{minutes}} minutes until start",
    "startAtElapsedHint": "{{elapsed}} minutes elapsed since start, about {{remain}} minutes to next run",
    "cooldownMinutes": "Cooldown (minutes)",
    "maxStudentsPerRun": "Max Students Per Run",
    "maxRunsPerDay": "Max Runs Per Day",
    "maxScoreDeltaPerDay": "Max Score Delta Per Day",
    "filterGroups": "Filter by Group",
    "filterGrades": "Filter by Grade",
    "filterMinScore": "Min Current Score",
    "filterMaxScore": "Max Current Score",
    "filterRecentEventDays": "Recent Event Days",
    "filterMinRecentEventCount": "Min Recent Event Count",
    "batchLogs": "Execution Logs",
    "batchId": "Batch",
    "batchRollback": "Rollback",
    "batchRolledBack": "Rolled Back",
    "batchRollbackConfirm": "Confirm rollback this execution batch?",
    "batchRollbackSuccess": "Batch rollback succeeded",
    "batchRollbackFailed": "Batch rollback failed",
    "intervalAmountPlaceholder": "Enter interval time",
    "intervalUnitMonth": "month(s) later",
    "intervalUnitDay": "day(s) later",
    "intervalUnitMinute": "minute(s) later",
    "intervalPartDay": "Days",
    "intervalPartHour": "Hours",
    "intervalPartMinute": "Minutes",
    "minutesPlaceholder": "Enter minutes",
    "minutes": "minutes",
    "tagsPlaceholder": "Enter tag name",
    "scorePlaceholder": "Enter score",
    "tagNamePlaceholder": "Enter tag name",
    "reasonPlaceholder": "Enter reason",
    "relationAnd": "AND",
    "relationOr": "OR",
    "operatorContains": "Contains",
    "relationNot": "Not",
    "openFile": "Open File",
    "openFileFailed": "Failed to open automation file",
    "backfillConfirmTitle": "Offline automation replay available",
    "backfillConfirmSummary": "From {{from}} to {{to}}, about {{runs}} automation runs ({{rules}} rules) can be replayed. Replay now?",
    "backfillPreviewLine": "{{name}}: {{runs}} run(s)",
    "backfillPreviewMore": "{{count}} more rules not shown",
    "backfillPreviewTruncated": "{{count}} rules are capped to at most {{max}} replay runs",
    "backfillApplySuccess": "Replay completed: {{runs}} runs applied, {{events}} score records created",
    "backfillApplyFailed": "Failed to replay offline auto score runs"
  },
  "triggers": {
    "studentTag": {
      "label": "When student matches tag",
      "description": "Trigger automation when student matches specific tag",
      "placeholder": "Please select tag",
      "required": "Please enter tag name"
    },
    "randomTime": {
      "label": "Random time trigger",
      "description": "Trigger automation randomly within specified time range",
      "from": "From",
      "to": "To",
      "hour": "h",
      "minHourPlaceholder": "Min hour",
      "maxHourPlaceholder": "Max hour",
      "required": "Please enter valid time range (minutes)"
    },
    "intervalTime": {
      "label": "Interval time trigger",
      "description": "Trigger automation when interval time is reached",
      "monthLabel": "Month",
      "weekLabel": "Week",
      "timeLabel": "Time",
      "days": "Days",
      "minutes": "Minutes",
      "placeholderMinutes": "Enter interval (minutes)",
      "placeholderDays": "Enter interval (days)",
      "required": "Please enter valid time interval (minutes)"
    }
  },
  "actions": {
    "sendNotification": {
      "label": "Send Notification",
      "description": "Send notification to student",
      "placeholder": "Enter notification content"
    },
    "addTag": {
      "label": "Add Tag",
      "description": "Add tag to student",
      "placeholder": "Enter tag"
    },
    "addScore": {
      "label": "Add Score",
      "description": "Add score to student",
      "pointsPlaceholder": "Enter points",
      "reasonPlaceholder": "Enter reason"
    }
  },
  "wizard": {
    "welcomeTitle": "Welcome to SecScore Points Management",
    "welcomeDesc": "Thanks for choosing SecScore. Before starting, please spend a minute to complete basic configuration.",
    "configComplete": "Configuration complete!",
    "configFailed": "Configuration save failed",
    "startJourney": "Start Points Journey"
  },
  "tags": {
    "editTitle": "Edit Tags",
    "inputPlaceholder": "Enter tag name, press Enter to add",
    "selectedTags": "Selected Tags (click to remove)",
    "noTagsSelected": "No tags selected",
    "availableTags": "Available Tags (click to select)",
    "noAvailableTags": "No available tags",
    "fetchFailed": "Failed to fetch tags",
    "nameTooLong": "Tag name cannot exceed 30 characters",
    "addFailed": "Failed to add tag",
    "deleteSuccess": "Tag deleted successfully",
    "deleteFailed": "Failed to delete tag"
  },
  "recovery": {
    "title": "SecScore Recovery String",
    "saved": "I have saved",
    "export": "Export Text File",
    "exportHint": "It is recommended to export and store offline. If lost, it cannot be recovered.",
    "hint": "Recommended to save offline after export, cannot be recovered if lost."
  },
  "plugin": {
    "title": "Plugin Manager",
    "name": "Plugin Name",
    "author": "Author",
    "description": "Description",
    "version": "Version",
    "status": "Status",
    "enabled": "Enabled",
    "disabled": "Disabled",
    "operation": "Operation",
    "install": "Install Plugin",
    "uninstall": "Uninstall",
    "uninstallConfirm": "Confirm uninstall plugin?",
    "uninstallDescription": "Uninstall removes the plugin copy installed inside the app plugin directory.",
    "installSuccess": "Plugin installed successfully",
    "installFailed": "Plugin installation failed",
    "uninstallSuccess": "Plugin uninstalled successfully",
    "uninstallFailed": "Plugin uninstallation failed",
    "toggleFailed": "Failed to toggle plugin status",
    "invalidManifest": "Invalid plugin manifest file",
    "pluginFolder": "Plugin Folder",
    "folderPlaceholder": "Select folder containing manifest.json",
    "installHint": "Select a folder containing manifest.json to install the plugin.",
    "selectFolder": "Please select plugin folder",
    "totalPlugins": "Total Plugins",
    "enabledPlugins": "Enabled",
    "disabledPlugins": "Disabled",
    "noPlugins": "No plugins installed",
    "installedAt": "Installed At"
  }
}
