{ "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 Easicare", "banyouLoginMethodTitle": "Choose Easicare Login Method", "banyouBrowserLogin": "Login to Easicare in Browser (Recommended)", "banyouBrowserLoginHint": "A Playwright browser window will open. Complete login there, then SecScore will capture the Cookie and close the browser automatically.", "banyouManualCookie": "Enter Cookie Manually", "banyouBrowserLoginWaiting": "Browser opened. Please complete Easicare login.", "banyouBrowserCookieSuccess": "Easicare Cookie captured", "banyouBrowserLoginFailed": "Failed to login to Easicare in browser", "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 Easicare 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 Easicare 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": "Easicare 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" } }