mirror of
https://github.com/SECTL/SecScore.git
synced 2026-07-19 06:04:22 +08:00
1068 lines
44 KiB
JSON
1068 lines
44 KiB
JSON
{
|
|
"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"
|
|
}
|
|
}
|