diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1a617e0..6b12cdf 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" rust-version = "1.70" [lib] -name = "secscore" +name = "secscore_lib" crate-type = ["staticlib", "cdylib", "lib"] [build-dependencies] diff --git a/src-tauri/src/commands/data.rs b/src-tauri/src/commands/data.rs index fbe48b5..50cf2e7 100644 --- a/src-tauri/src/commands/data.rs +++ b/src-tauri/src/commands/data.rs @@ -1,6 +1,6 @@ use parking_lot::RwLock; use std::sync::Arc; -use tauri::{AppHandle, Emitter, State}; +use tauri::{AppHandle, Emitter, Manager, State}; use crate::db::connection::{create_sqlite_connection, DatabaseType}; use crate::db::migration::Migration; @@ -34,10 +34,10 @@ fn sqlite_db_path(app_handle: &AppHandle) -> Result { std::fs::create_dir_all(&data_dir) .map_err(|e| format!("Failed to create data directory: {}", e))?; let db_path = data_dir.join("data.sql"); - db_path - .to_str() - .map(|s| s.to_string()) - .ok_or_else(|| "Invalid sqlite database path".to_string()) + match db_path.to_str() { + Some(path) => Ok(path.to_owned()), + None => Err("Invalid sqlite database path".to_string()), + } } #[tauri::command] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index b978201..da852c1 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,5 +1,5 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { - secscore::run(); + secscore_lib::run(); } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 7faf278..d01e574 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -1,47 +1,47 @@ -{ - "common": { - "next": "下一步", - "prev": "上一步", - "finish": "完成", - "cancel": "取消", - "save": "保存", - "loading": "加载中...", - "confirm": "确认", - "success": "成功", - "error": "错误", - "delete": "删除", - "edit": "编辑", - "add": "添加", - "search": "搜索", - "clear": "清空", - "close": "关闭", - "yes": "是", - "no": "否", - "submit": "提交", - "reset": "重置", - "import": "导入", - "export": "导出", - "create": "创建", - "update": "更新", - "refresh": "刷新", - "view": "查看", - "name": "姓名", - "status": "状态", - "operation": "操作", - "description": "描述", - "total": "共 {{count}} 条", - "noData": "暂无数据", - "pleaseSelect": "请选择", - "pleaseEnter": "请输入", - "readOnly": "当前为只读权限", - "none": "无" +{ + "common": { + "next": "下一步", + "prev": "上一步", + "finish": "完成", + "cancel": "取消", + "save": "保存", + "loading": "加载中...", + "confirm": "确认", + "success": "成功", + "error": "错误", + "delete": "删除", + "edit": "编辑", + "add": "添加", + "search": "搜索", + "clear": "清空", + "close": "关闭", + "yes": "是", + "no": "否", + "submit": "提交", + "reset": "重置", + "import": "导入", + "export": "导出", + "create": "创建", + "update": "更新", + "refresh": "刷新", + "view": "查看", + "name": "姓名", + "status": "状态", + "operation": "操作", + "description": "描述", + "total": "共 {{count}} 条", + "noData": "暂无数据", + "pleaseSelect": "请选择", + "pleaseEnter": "请输入", + "readOnly": "当前为只读权限", + "none": "无" }, "oobe": { "title": "SecScore 快速设置", "subtitle": "几步完成基础配置,马上开始使用", - "step": "第 {{current}}/{{total}} 步", - "skip": "跳过", - "steps": { + "step": "第 {{current}}/{{total}} 步", + "skip": "跳过", + "steps": { "entry": { "title": "开始配置", "description": "请选择接下来要进行的操作", @@ -49,185 +49,185 @@ "connectPostgresAutoSync": "连接PostgreSQL自动同步", "skipDirect": "跳过快速设置,直接进入" }, - "postgresql": { - "title": "连接 PostgreSQL", - "description": "输入 PostgreSQL 连接字符串,系统将自动连接并同步后进入应用", - "connectionPlaceholder": "postgresql://user:password@host:port/database?sslmode=require", - "autoSyncAndEnter": "连接并自动同步后进入" - }, - "language": { - "title": "选择语言", - "description": "请选择您偏好的界面语言" - }, - "theme": { - "title": "设置主题", - "description": "选择您喜欢的界面外观", - "mode": "模式", - "lightMode": "浅色", - "darkMode": "深色", - "primaryColor": "主色", - "backgroundGradient": "背景渐变" - }, - "password": { - "title": "设置密码", - "description": "设置登录密码以保护您的数据(可选)", - "adminPassword": "管理密码", - "adminPasswordHint": "可管理所有功能,6位数字", - "pointsPassword": "积分密码", - "pointsPasswordHint": "仅可操作积分,6位数字", - "passwordPlaceholder": "请输入6位数字", - "hint": "留空则不设置密码,之后可在设置中配置" - }, - "students": { - "title": "导入名单", - "description": "添加学生名单以便开始积分管理", - "import": "导入名单", - "manual": "手动添加", - "importHint": "支持 Excel (.xlsx) 或 JSON 文件", - "manualHint": "支持粘贴多行文本,一行一个姓名", - "dragDrop": "拖拽文件到此处,或点击选择", - "supportedFormats": "支持 .xlsx, .json 格式", - "studentName": "学生姓名", - "addStudent": "添加学生", - "noStudents": "暂无学生,请添加或导入", - "studentCount": "已添加 {{count}} 名学生", - "studentExists": "学生已存在", - "importSuccess": "成功导入 {{count}} 名学生", - "noNewStudents": "没有新学生可导入", - "parseFailed": "文件解析失败", - "unsupportedFormat": "不支持的文件格式" - }, - "reasons": { - "title": "设置理由", - "description": "添加常用的积分变动理由", - "addReason": "添加理由", - "reasonName": "理由名称", - "points": "积分", - "positive": "加分", - "negative": "扣分", - "noReasons": "暂无理由,请添加常用理由", - "reasonCount": "已添加 {{count}} 个理由", - "reasonExists": "理由已存在" - }, - "start": { - "title": "准备就绪", - "description": "一切准备就绪,开始使用 SecScore 吧!", - "features": { - "score": "轻松管理学生积分", - "history": "完整的积分变动历史", - "settlement": "支持结算与归档" - }, - "startButton": "开始使用" - } - } - }, - "settings": { - "title": "系统设置", - "tabs": { - "appearance": "外观", - "security": "安全", - "database": "数据库连接", - "dataManagement": "数据管理", - "urlProtocol": "URL 链接", - "about": "关于" - }, - "language": "语言", - "languageHint": "选择界面显示语言", - "theme": "主题", - "password": "设置密码", - "themeMode": "模式", - "lightMode": "浅色", - "darkMode": "深色", - "primaryColor": "主色", - "backgroundGradient": "背景渐变", - "searchKeyboard": { - "title": "搜索小键盘", - "hint": "选择搜索框下方弹出的小键盘布局", - "disableToggle": "禁用搜索小键盘", - "disableHint": "开启后,搜索框下方不再弹出小键盘", - "options": { - "qwerty26": "26 键(QWERTY)", - "t9": "9 键(T9)" - } - }, - "interfaceZoom": "界面缩放", - "zoomOptions": { - "small70": "小 (70%)", - "default100": "默认 (100%)", - "large150": "大 (150%)" - }, - "general": { - "saved": "已保存", - "saveFailed": "保存失败" - }, - "zoomHint": "调节应用界面的整体大小", - "zoomUpdated": "界面缩放已更新", - "updateFailed": "更新失败", - "security": { - "title": "密码保护系统", - "adminPassword": "管理密码", - "pointsPassword": "积分密码", - "recoveryString": "找回字符串", - "set": "已设置", - "notSet": "未设置", - "generated": "已生成", - "notGenerated": "未生成", - "enterPassword": "输入6位数字(留空则不修改)", - "adminPasswordPlaceholder": "输入6位数字管理密码(留空则不修改)", - "pointsPasswordPlaceholder": "输入6位数字积分密码(留空则不修改)", - "recoveryPlaceholder": "输入找回字符串", - "savePassword": "保存密码", - "savePasswords": "保存密码", - "generateRecovery": "生成找回字符串", - "clearAllPasswords": "清空所有密码", - "recoveryReset": "找回字符串重置", - "enterRecovery": "输入找回字符串", - "resetPassword": "重置密码", - "resetHint": "重置会清空管理/积分密码,并生成新的找回字符串。", - "confirmClear": "确认清空所有密码?", - "clearHint": "清空后将关闭保护(无密码时默认视为管理权限)。", - "saved": "密码已更新", - "saveFailed": "更新失败", - "generateFailed": "生成失败", - "resetFailed": "重置失败", - "cleared": "已清空", - "clearFailed": "清空失败", - "passwordClearedNewRecovery": "密码已清空,新的找回字符串", - "newRecoveryString": "新的找回字符串(请保存)" - }, - "database": { - "title": "数据库连接", - "currentStatus": "当前数据库状态", - "sqliteLocal": "SQLite 本地数据库", - "postgresqlRemote": "PostgreSQL 远程数据库", - "connected": "已连接", - "disconnected": "未连接", - "postgresqlConnection": "PostgreSQL 远程连接", - "connectionHint": "输入 PostgreSQL 连接字符串以连接远程数据库,支持多端同步操作。", - "testConnection": "测试连接", - "switchToPostgreSQL": "切换到 PostgreSQL", - "switchToSQLite": "切换到本地 SQLite", - "connectionTestSuccess": "连接测试成功", - "connectionTestFailed": "连接测试失败", - "switchedTo": "已切换到 {{type}} 数据库", - "switchedToSQLite": "已切换到 SQLite 本地数据库", - "switchFailed": "切换失败", - "syncDescription": "多端同步说明", - "syncPoint1": "使用 PostgreSQL 远程数据库可以实现多端数据同步。", - "syncPoint2": "系统内置操作队列机制,确保多端同时操作时数据一致性。", - "syncPoint3": "切换数据库后需要重启应用以生效。", - "syncPoint4": "建议使用云数据库服务(如 Neon、Supabase、AWS RDS 等)。", - "enterConnectionString": "请输入 PostgreSQL 连接字符串", - "connectionExample": "示例:postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require", - "uploadButton": "上传本地数据到远程", - "uploadHint": "连接远程数据库后,可将本地 SQLite 历史数据上传并合并到远程。", - "uploadNeedRemote": "请先切换并连接到 PostgreSQL 远程数据库", - "noNeedUpload": "本地与远程数据已一致,无需上传", - "uploadConfirmTitle": "确认上传本地数据到远程?", - "uploadConfirmContent": "将以本地数据为优先进行同步。检测到本地新增 {{localOnly}} 条、远程新增 {{remoteOnly}} 条、冲突 {{conflicts}} 条。", - "uploadSuccess": "本地数据已上传到远程", - "uploadFailed": "上传失败" - }, + "postgresql": { + "title": "连接 PostgreSQL", + "description": "输入 PostgreSQL 连接字符串,系统将自动连接并同步后进入应用", + "connectionPlaceholder": "postgresql://user:password@host:port/database?sslmode=require", + "autoSyncAndEnter": "连接并自动同步后进入" + }, + "language": { + "title": "选择语言", + "description": "请选择您偏好的界面语言" + }, + "theme": { + "title": "设置主题", + "description": "选择您喜欢的界面外观", + "mode": "模式", + "lightMode": "浅色", + "darkMode": "深色", + "primaryColor": "主色", + "backgroundGradient": "背景渐变" + }, + "password": { + "title": "设置密码", + "description": "设置登录密码以保护您的数据(可选)", + "adminPassword": "管理密码", + "adminPasswordHint": "可管理所有功能,6位数字", + "pointsPassword": "积分密码", + "pointsPasswordHint": "仅可操作积分,6位数字", + "passwordPlaceholder": "请输入6位数字", + "hint": "留空则不设置密码,之后可在设置中配置" + }, + "students": { + "title": "导入名单", + "description": "添加学生名单以便开始积分管理", + "import": "导入名单", + "manual": "手动添加", + "importHint": "支持 Excel (.xlsx) 或 JSON 文件", + "manualHint": "支持粘贴多行文本,一行一个姓名", + "dragDrop": "拖拽文件到此处,或点击选择", + "supportedFormats": "支持 .xlsx, .json 格式", + "studentName": "学生姓名", + "addStudent": "添加学生", + "noStudents": "暂无学生,请添加或导入", + "studentCount": "已添加 {{count}} 名学生", + "studentExists": "学生已存在", + "importSuccess": "成功导入 {{count}} 名学生", + "noNewStudents": "没有新学生可导入", + "parseFailed": "文件解析失败", + "unsupportedFormat": "不支持的文件格式" + }, + "reasons": { + "title": "设置理由", + "description": "添加常用的积分变动理由", + "addReason": "添加理由", + "reasonName": "理由名称", + "points": "积分", + "positive": "加分", + "negative": "扣分", + "noReasons": "暂无理由,请添加常用理由", + "reasonCount": "已添加 {{count}} 个理由", + "reasonExists": "理由已存在" + }, + "start": { + "title": "准备就绪", + "description": "一切准备就绪,开始使用 SecScore 吧!", + "features": { + "score": "轻松管理学生积分", + "history": "完整的积分变动历史", + "settlement": "支持结算与归档" + }, + "startButton": "开始使用" + } + } + }, + "settings": { + "title": "系统设置", + "tabs": { + "appearance": "外观", + "security": "安全", + "database": "数据库连接", + "dataManagement": "数据管理", + "urlProtocol": "URL 链接", + "about": "关于" + }, + "language": "语言", + "languageHint": "选择界面显示语言", + "theme": "主题", + "password": "设置密码", + "themeMode": "模式", + "lightMode": "浅色", + "darkMode": "深色", + "primaryColor": "主色", + "backgroundGradient": "背景渐变", + "searchKeyboard": { + "title": "搜索小键盘", + "hint": "选择搜索框下方弹出的小键盘布局", + "disableToggle": "禁用搜索小键盘", + "disableHint": "开启后,搜索框下方不再弹出小键盘", + "options": { + "qwerty26": "26 键(QWERTY)", + "t9": "9 键(T9)" + } + }, + "interfaceZoom": "界面缩放", + "zoomOptions": { + "small70": "小 (70%)", + "default100": "默认 (100%)", + "large150": "大 (150%)" + }, + "general": { + "saved": "已保存", + "saveFailed": "保存失败" + }, + "zoomHint": "调节应用界面的整体大小", + "zoomUpdated": "界面缩放已更新", + "updateFailed": "更新失败", + "security": { + "title": "密码保护系统", + "adminPassword": "管理密码", + "pointsPassword": "积分密码", + "recoveryString": "找回字符串", + "set": "已设置", + "notSet": "未设置", + "generated": "已生成", + "notGenerated": "未生成", + "enterPassword": "输入6位数字(留空则不修改)", + "adminPasswordPlaceholder": "输入6位数字管理密码(留空则不修改)", + "pointsPasswordPlaceholder": "输入6位数字积分密码(留空则不修改)", + "recoveryPlaceholder": "输入找回字符串", + "savePassword": "保存密码", + "savePasswords": "保存密码", + "generateRecovery": "生成找回字符串", + "clearAllPasswords": "清空所有密码", + "recoveryReset": "找回字符串重置", + "enterRecovery": "输入找回字符串", + "resetPassword": "重置密码", + "resetHint": "重置会清空管理/积分密码,并生成新的找回字符串。", + "confirmClear": "确认清空所有密码?", + "clearHint": "清空后将关闭保护(无密码时默认视为管理权限)。", + "saved": "密码已更新", + "saveFailed": "更新失败", + "generateFailed": "生成失败", + "resetFailed": "重置失败", + "cleared": "已清空", + "clearFailed": "清空失败", + "passwordClearedNewRecovery": "密码已清空,新的找回字符串", + "newRecoveryString": "新的找回字符串(请保存)" + }, + "database": { + "title": "数据库连接", + "currentStatus": "当前数据库状态", + "sqliteLocal": "SQLite 本地数据库", + "postgresqlRemote": "PostgreSQL 远程数据库", + "connected": "已连接", + "disconnected": "未连接", + "postgresqlConnection": "PostgreSQL 远程连接", + "connectionHint": "输入 PostgreSQL 连接字符串以连接远程数据库,支持多端同步操作。", + "testConnection": "测试连接", + "switchToPostgreSQL": "切换到 PostgreSQL", + "switchToSQLite": "切换到本地 SQLite", + "connectionTestSuccess": "连接测试成功", + "connectionTestFailed": "连接测试失败", + "switchedTo": "已切换到 {{type}} 数据库", + "switchedToSQLite": "已切换到 SQLite 本地数据库", + "switchFailed": "切换失败", + "syncDescription": "多端同步说明", + "syncPoint1": "使用 PostgreSQL 远程数据库可以实现多端数据同步。", + "syncPoint2": "系统内置操作队列机制,确保多端同时操作时数据一致性。", + "syncPoint3": "切换数据库后需要重启应用以生效。", + "syncPoint4": "建议使用云数据库服务(如 Neon、Supabase、AWS RDS 等)。", + "enterConnectionString": "请输入 PostgreSQL 连接字符串", + "connectionExample": "示例:postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require", + "uploadButton": "上传本地数据到远程", + "uploadHint": "连接远程数据库后,可将本地 SQLite 历史数据上传并合并到远程。", + "uploadNeedRemote": "请先切换并连接到 PostgreSQL 远程数据库", + "noNeedUpload": "本地与远程数据已一致,无需上传", + "uploadConfirmTitle": "确认上传本地数据到远程?", + "uploadConfirmContent": "将以本地数据为优先进行同步。检测到本地新增 {{localOnly}} 条、远程新增 {{remoteOnly}} 条、冲突 {{conflicts}} 条。", + "uploadSuccess": "本地数据已上传到远程", + "uploadFailed": "上传失败" + }, "data": { "title": "数据管理", "settlement": "结算", @@ -237,23 +237,23 @@ "resetAllAndReenter": "删除所有数据并重新进入快速设置", "resetHint": "删除学生、理由、记录、奖励、标签和全部设置,然后重新进入快速设置。", "importExport": "导入 / 导出", - "exportJson": "导出 JSON", - "importJson": "导入 JSON", - "importHint": "导入会覆盖现有学生/理由/积分记录/设置(安全相关设置不会导入)。", - "logs": "日志", - "logLevel": "日志级别", - "logOperation": "日志操作", - "viewLogs": "查看日志", - "exportLogs": "导出日志", - "clearLogs": "清空日志", - "logsCleared": "日志已清空", - "systemLogs": "系统日志 (最后200条)", - "noLogs": "暂无日志", - "logLevelUpdated": "日志级别已更新", - "readLogsFailed": "读取日志失败", - "logsExported": "日志已导出", - "exportFailed": "导出失败", - "exportSuccess": "导出成功", + "exportJson": "导出 JSON", + "importJson": "导入 JSON", + "importHint": "导入会覆盖现有学生/理由/积分记录/设置(安全相关设置不会导入)。", + "logs": "日志", + "logLevel": "日志级别", + "logOperation": "日志操作", + "viewLogs": "查看日志", + "exportLogs": "导出日志", + "clearLogs": "清空日志", + "logsCleared": "日志已清空", + "systemLogs": "系统日志 (最后200条)", + "noLogs": "暂无日志", + "logLevelUpdated": "日志级别已更新", + "readLogsFailed": "读取日志失败", + "logsExported": "日志已导出", + "exportFailed": "导出失败", + "exportSuccess": "导出成功", "importSuccess": "导入成功,正在刷新", "importFailed": "导入失败", "resetSuccess": "已重置,正在重新进入快速设置", @@ -268,550 +268,550 @@ "settlementSuccess": "结算成功,已重新开始积分", "settlementFailed": "结算失败", "settle": "结算", - "logLevels": { - "debug": "DEBUG (调试)", - "info": "INFO (信息)", - "warn": "WARN (警告)", - "error": "ERROR (错误)" - } - }, - "url": { - "title": "URL 协议 (secscore://)", - "protocol": "URL 协议", - "description": "可以通过 URL 链接唤起 SecScore 并执行操作,例如:", - "register": "注册 URL 协议", - "registered": "URL 协议已注册", - "registerFailed": "注册失败", - "installerRequired": "需要安装版 SecScore,开发模式下可能无效。" - }, - "mcp": { - "title": "MCP 服务", - "description": "管理内置 MCP HTTP 服务,供外部 MCP 客户端调用。", - "running": "运行中", - "stopped": "已停止", - "noUrl": "暂无地址", - "host": "主机", - "port": "端口", - "start": "启动", - "stop": "停止", - "refresh": "刷新状态", - "hint": "建议仅绑定到 127.0.0.1;启动后 MCP 入口为 http://host:port/mcp", - "hostRequired": "请输入 MCP 主机地址", - "portInvalid": "请输入有效端口(1-65535)", - "startSuccess": "MCP 服务启动成功", - "startFailed": "MCP 服务启动失败", - "stopSuccess": "MCP 服务已停止", - "stopFailed": "MCP 服务停止失败", - "startTimeout": "启动 MCP 服务超时,请稍后重试", - "stopTimeout": "停止 MCP 服务超时,请稍后重试" - }, - "app": { - "title": "应用控制", - "description": "快速重启或退出应用。", - "restart": "重启应用", - "quit": "退出应用", - "confirmRestartTitle": "确认重启应用?", - "confirmRestartContent": "应用将立即关闭并重新启动。", - "confirmQuitTitle": "确认退出应用?", - "confirmQuitContent": "应用将立即退出。", - "restartFailed": "重启失败", - "quitFailed": "退出失败" - }, - "about": { - "title": "关于", - "appName": "教育积分管理", - "version": "版本", - "copyright": "版权", - "ipcStatus": "IPC 状态", - "ipcConnected": "已连接", - "ipcDisconnected": "未连接 (Preload 失败)", - "environment": "环境", - "toggleDevTools": "切换开发者工具", - "license": "SecScore遵循GPL3.0协议", - "copyRightText": "CopyRight © 2025-{{year}} SECTL" - } - }, - "sidebar": { - "home": "首页", - "students": "学生管理", - "score": "积分操作", - "boards": "看板", - "leaderboard": "排行榜", - "settlements": "结算历史", - "reasons": "理由管理", - "autoScore": "自动加分", - "rewardExchange": "奖励兑换", - "rewardSettings": "奖励设置", - "settings": "系统设置", - "remoteDb": "远程数据库", - "refreshStatus": "刷新状态", - "syncNow": "立即同步", - "syncSuccess": "同步成功", - "syncFailed": "同步失败", - "getDbStatusFailed": "获取数据库状态失败", - "notRemoteMode": "当前不是远程数据库模式,请重启应用后重试", - "dbNotConnected": "数据库未连接" - }, - "auth": { - "unlock": "权限解锁", - "unlockHint": "输入 6 位数字密码:管理密码=全功能,积分密码=仅积分操作。", - "unlockButton": "解锁", - "unlocked": "权限已解锁", - "logout": "已切换为只读", - "passwordPlaceholder": "例如 123456", - "passwordError": "密码错误", - "enterPassword": "输入密码", - "lock": "锁定" - }, - "languages": { - "zh-CN": "简体中文", - "en-US": "English" - }, - "theme": { - "colorAndBackground": "颜色与背景", - "gradientLabels": { - "blue": "清爽蓝", - "pink": "柔和粉", - "cyan": "青蓝", - "purple": "紫韵" - }, - "gradientDirections": { - "vertical": "纵向", - "horizontal": "横向", - "diagonal": "对角" - }, - "generate": "生成", - "saved": "已保存", - "saveFailed": "保存失败", - "mode": "模式", - "myTheme": "我的主题" - }, - "permissions": { - "admin": "管理权限", - "points": "积分权限", - "view": "只读" - }, - "home": { - "title": "学生积分主页", - "subtitle": "共 {{count}} 名学生,点击卡片进行积分操作", - "searchPlaceholder": "搜索姓名/拼音...", - "sortBy": { - "alphabet": "姓名排序", - "surname": "姓氏分组", - "score": "积分排行" - }, - "layoutBy": { - "grouped": "分组列表", - "squareGrid": "正方形网格" - }, - "noStudents": "暂无学生数据,请前往学生管理添加", - "noMatch": "未找到匹配的学生", - "clearSearch": "清除搜索", - "points": "分", - "currentScore": "当前积分", - "quickOptions": "快捷选项", - "adjustPoints": "调整分值", - "customPoints": "自定义分值", - "customPointsHint": "可在输入框微调特输入任意分值", - "reason": "操作理由", - "reasonPlaceholder": "输入加分/扣分的原因(可选)", - "preview": "变更预览", - "noReason": "(无理由)", - "category": { - "others": "其他" - }, - "scoreAdded": "已为 {{name}} 加{{points}}分", - "scoreDeducted": "已为 {{name}} 扣{{points}}分", - "submitFailed": "提交失败", - "pleaseSelectPoints": "请选择或输入分值", - "reasonDefault": "{{action}}{{points}}分", - "studentCount": "{{count}} 人", - "operationTitle": "积分操作:{{name}}", - "submitOperation": "提交操作", - "operationTitleBatch": "积分操作:已选 {{count}} 人", - "undoLastAction": "撤销上一步", - "undoLastHint": "撤销上一条:{{name}} {{delta}}", - "undoUnavailable": "当前没有可撤销的积分操作", - "undoLastSuccess": "已撤销上一步积分操作", - "multiSelect": "多选", - "batchMode": "多选模式", - "selectAll": "全选", - "clearSelected": "清空已选", - "batchOperate": "批量积分", - "selected": "已选", - "selectedCount": "已选 {{count}} 人", - "batchSuccess": "已为 {{count}} 名学生提交积分", - "batchPartial": "成功提交 {{success}}/{{total}} 名学生积分", - "selectStudentFirst": "请先选择学生", - "addPoints": "加分", - "deductPoints": "扣分", - "pointsChange": "积分变更", - "reasonLabel": "理由:" - }, - "students": { - "title": "学生管理", - "importList": "导入名单", - "addStudent": "添加学生", - "name": "姓名", - "avatar": "头像", - "currentScore": "当前积分", - "tags": "标签", - "noTags": "无标签", - "editTags": "编辑标签", - "editAvatar": "设置头像", - "deleteConfirm": "确认删除该学生?", - "addTitle": "添加学生", - "addConfirm": "添加", - "namePlaceholder": "请输入学生姓名", - "nameRequired": "请输入姓名", - "nameExists": "学生姓名已存在", - "addSuccess": "添加成功", - "addFailed": "添加失败", - "deleteSuccess": "删除成功", - "deleteFailed": "删除失败", - "tagSaveSuccess": "标签保存成功", - "tagSaveFailed": "保存标签失败", - "importTitle": "导入名单", - "importTextHint": "支持粘贴多行文本,一行一个姓名", - "importTextPlaceholder": "例如:\n张三\n李四\n王五", - "importByText": "从文本导入", - "importByXlsx": "通过 xlsx 导入", - "xlsxPreview": "xlsx 预览与导入", - "file": "文件", - "selectNameCol": "点击表头选择姓名列", - "previewRows": "预览前 50 行", - "importConfirm": "导入", - "importComplete": "导入完成:新增 {{inserted}},跳过 {{skipped}}", - "workerNotReady": "Worker 未初始化", - "parseXlsxFailed": "解析 xlsx 失败", - "selectNameColFirst": "请先点击选择\"姓名列\"", - "noNamesFound": "所选列未解析到可导入的姓名", - "importFailed": "导入失败", - "editTagTitle": "编辑标签 - {{name}}", - "editAvatarTitle": "设置头像 - {{name}}", - "avatarUpload": "上传图片", - "avatarClear": "清除头像", - "noAvatar": "无头像", - "avatarTip": "支持常见图片格式,文件大小不超过 2MB", - "avatarSaveSuccess": "头像保存成功", - "avatarSaveFailed": "头像保存失败", - "avatarInvalidFile": "请选择图片文件", - "avatarTooLarge": "图片不能超过 2MB", - "avatarReadFailed": "读取图片失败" - }, - "score": { - "title": "积分管理", - "student": "学生", - "change": "变动", - "reason": "理由", - "time": "时间", - "undoConfirm": "确定要撤销这条记录吗?学生积分将回滚。", - "undo": "撤销", - "undoSuccess": "已撤销操作", - "undoFailed": "撤销失败", - "recentRecords": "最近记录", - "pleaseSelectStudent": "请选择或搜索学生", - "selectAllStudents": "全班", - "clearSelectedStudents": "清空", - "selectedCount": "已选 {{selected}} / {{total}} 人", - "points": "分数", - "addPoints": "加分", - "deductPoints": "扣分", - "quickReason": "快捷理由", - "selectReason": "选择预设理由", - "reasonContent": "理由内容", - "reasonPlaceholder": "手动输入或选择快捷理由", - "submit": "确认提交", - "pleaseEnterInfo": "请填写完整信息", - "pleaseEnterPoints": "请填写分值或选择预设理由", - "batchSuccess": "已为 {{count}} 名学生提交积分", - "batchPartial": "成功提交 {{success}}/{{total}} 名学生的积分" - }, - "reasons": { - "title": "理由管理", - "addReason": "添加预设理由", - "category": "分类", - "content": "理由内容", - "presetPoints": "预设分值", - "deleteConfirm": "确认删除该理由?", - "addTitle": "添加理由", - "addConfirm": "添加", - "categoryPlaceholder": "例如: 学习, 纪律", - "contentPlaceholder": "请输入理由", - "pointsPlaceholder": "例如: 2 或 -2", - "contentRequired": "请输入理由内容", - "pointsRequired": "请输入预设分值", - "reasonExists": "该分类下已存在相同理由", - "addSuccess": "添加成功", - "addFailed": "添加失败", - "deleteSuccess": "删除成功", - "deleteFailed": "删除失败", - "others": "其他" - }, - "rewardExchange": { - "title": "奖励兑换", - "enterMode": "进入奖励兑换模式", - "exitMode": "退出奖励兑换模式", - "modeHint": "当前为奖励兑换模式,点击学生卡可选择可兑换奖励。", - "normalHint": "当前显示学生原始积分,点击按钮后将显示可兑换积分。", - "remainingRewardPoints": "剩余兑换积分", - "currentScore": "当前积分", - "chooseRewardTitle": "为 {{name}} 选择奖励", - "currentRewardPoints": "当前可兑换积分:{{points}}", - "costLabel": "消耗积分:{{points}}", - "redeemNow": "立即兑换", - "noAffordableRewards": "当前没有可兑换的奖励,请先积累积分。", - "redeemSuccess": "{{student}} 成功兑换「{{reward}}」,消耗 {{points}} 分", - "redeemFailed": "兑换失败", - "recordsTitle": "兑换记录", - "recordStudent": "学生", - "recordReward": "奖励", - "recordCost": "消耗积分", - "recordTime": "兑换时间" - }, - "rewardSettings": { - "title": "奖励设置", - "addReward": "添加奖励", - "addTitle": "添加奖励", - "editTitle": "编辑奖励", - "rewardName": "奖励名称", - "costPoints": "消耗积分", - "namePlaceholder": "例如:免作业券", - "costPlaceholder": "请输入消耗积分", - "nameRequired": "请输入奖励名称", - "costRequired": "请输入正整数积分", - "createSuccess": "奖励创建成功", - "createFailed": "奖励创建失败", - "updateSuccess": "奖励更新成功", - "updateFailed": "奖励更新失败", - "deleteSuccess": "奖励删除成功", - "deleteFailed": "奖励删除失败", - "deleteConfirm": "确认删除奖励「{{name}}」?" - }, - "board": { - "title": "看板", - "editable": "可编辑", - "readonly": "只读", - "addBoard": "新增看板", - "removeBoard": "删除看板", - "removeBoardConfirm": "确认删除当前看板?", - "boardConfig": "看板配置", - "boardNamePlaceholder": "输入看板名称", - "renameBoard": "重命名看板", - "newBoard": "新看板", - "untitledBoard": "未命名看板", - "addList": "新增学生列表", - "removeList": "删除列表", - "removeListConfirm": "确认删除当前学生列表?", - "editList": "编辑", - "sqlEditorTitle": "编辑学生列表", - "splitHorizontal": "左右拆分", - "splitVertical": "上下拆分", - "dragHandle": "拖动调整布局", - "listNamePlaceholder": "输入列表名称", - "newList": "新列表", - "applyPreset": "套用预设", - "run": "运行 SQL", - "runAll": "运行全部", - "viewModes": { - "list": "列表视图", - "card": "卡片视图", - "grid": "网格视图" - }, - "metrics": { - "totalScore": "总分", - "rewardPoints": "奖励分", - "weekChange": "近7天", - "weekDeducted": "近7天扣分", - "todayAnswered": "今日回答" - }, - "sqlPlaceholder": "输入 SQL(仅支持单条 SELECT / WITH 查询)", - "templateHint": "支持时间模板变量:{{today_start}}、{{since_7d}}、{{since_30d}}、{{now}}", - "templateDescription": "可直接在 SQL 中使用模板变量,运行时会自动替换为 ISO 时间,兼容 SQLite 与 PostgreSQL。", - "saving": "保存中...", - "saveFailed": "保存看板失败", - "runFailed": "查询执行失败", - "keepAtLeastOneBoard": "至少保留一个看板", - "keepAtLeastOneList": "至少保留一个学生列表", - "presets": { - "weekLowDeduct": { - "name": "上周低扣分排行", - "description": "上一周扣分 < 3 的学生积分榜" - }, - "todayActive": { - "name": "今日活跃榜", - "description": "按今日回答次数与积分变化排序" - }, - "rewardRanking": { - "name": "奖励积分榜", - "description": "按奖励积分和总积分排序" - } - } - }, - "leaderboard": { - "title": "积分排行榜", - "rank": "排名", - "name": "姓名", - "totalScore": "总积分", - "todayChange": "今日变化", - "weekChange": "本周变化", - "monthChange": "本月变化", - "viewHistory": "查看", - "exportXlsx": "导出 XLSX", - "exportSuccess": "导出成功", - "queryFailed": "查询失败", - "historyTitle": "{{name}} - 操作记录", - "close": "关闭", - "today": "今天", - "week": "本周", - "month": "本月", - "operationRecord": "操作记录", - "change": "变化" - }, - "settlements": { - "title": "结算历史", - "phase": "阶段 #{{id}}", - "viewLeaderboard": "查看排行榜", - "recordCount": "记录数: {{count}}", - "noRecords": "暂无结算记录", - "noSettlements": "暂无结算记录", - "back": "返回", - "leaderboardTitle": "结算排行榜", - "phaseScore": "阶段积分", - "queryFailed": "查询失败", - "rank": "排名", - "name": "姓名" - }, - "autoScore": { - "title": "自动化加分管理", - "name": "自动化名称", - "namePlaceholder": "例如:每日签到加分", - "nameRequired": "请输入自动化名称", - "triggers": "触发器", - "actions": "行动", - "applicableStudents": "适用学生", - "allStudents": "所有学生", - "lastExecuted": "最后执行", - "notExecuted": "未执行", - "invalidTime": "无效时间", - "addTrigger": "添加规则", - "addAction": "添加行动", - "whenTriggered": "当以下规则触发时", - "triggeredActions": "满足规则时触发的行动", - "addAutomation": "添加自动化", - "updateAutomation": "更新自动化", - "cancelEdit": "取消编辑", - "resetForm": "重置表单", - "deleteConfirm": "确定要删除这条自动化吗?", - "adminRequired": "需要管理员权限以查看自动加分自动化,请先登录管理员账号", - "adminCreateRequired": "需要管理员权限以创建或更新自动加分自动化", - "adminDeleteRequired": "需要管理员权限以删除自动加分自动化", - "adminToggleRequired": "需要管理员权限以启用/禁用自动加分自动化", - "fetchFailed": "获取自动化失败", - "triggerRequired": "请至少添加一个触发器", - "actionRequired": "请至少添加一个行动", - "createSuccess": "自动化创建成功", - "updateSuccess": "自动化更新成功", - "createFailed": "创建自动化失败", - "updateFailed": "更新自动化失败", - "deleteSuccess": "自动化删除成功", - "deleteFailed": "删除自动化失败", - "enabled": "自动化已启用", - "disabled": "自动化已禁用", - "enableFailed": "启用自动化失败", - "disableFailed": "禁用自动化失败", - "noTriggerAvailable": "没有可用的触发器类型,请检查配置", - "noActionAvailable": "没有可用的行动类型,请检查配置", - "sort": "排序", - "status": "状态", - "triggerCount": "{{count}} 个触发器", - "actionCount": "{{count}} 个行动", - "studentCount": "{{count}} 名学生", - "studentPlaceholder": "请选择或搜索学生(留空表示所有学生)", - "triggerCondition": "触发条件", - "executeAction": "执行操作", - "addOperation": "添加操作", - "scoreLabel": "分数", - "tagNameLabel": "标签名称", - "operationNoteLabel": "操作说明(可选)", - "triggerIntervalTime": "间隔时间", - "triggerStudentTag": "学生标签", - "actionAddScore": "加分", - "actionAddTag": "添加标签", - "minutesPlaceholder": "请输入分钟数", - "minutes": "分钟", - "tagsPlaceholder": "请输入标签名称", - "scorePlaceholder": "请输入分数", - "tagNamePlaceholder": "请输入标签名称", - "reasonPlaceholder": "请输入理由", - "relationAnd": "并且", - "relationOr": "或者" - }, - "triggers": { - "studentTag": { - "label": "学生标签", - "description": "当学生匹配特定标签时触发自动化", - "placeholder": "请选择标签", - "required": "请输入标签名称" - }, - "randomTime": { - "label": "随机时间触发", - "description": "在指定时间范围内随机触发自动化", - "required": "请输入有效的时间范围(分钟)" - }, - "intervalTime": { - "label": "间隔时间", - "description": "当间隔时间到达时触发自动化", - "placeholder": "请输入时间间隔", - "required": "请输入有效的时间", - "monthLabel": "月", - "weekLabel": "周", - "timeLabel": "时间" - } - }, - "actions": { - "sendNotification": { - "label": "发送通知", - "description": "向学生发送通知", - "placeholder": "请输入通知内容" - }, - "addTag": { - "label": "添加标签", - "description": "为学生添加标签", - "placeholder": "请输入标签" - }, - "addScore": { - "label": "添加分数", - "description": "为学生添加分数", - "pointsPlaceholder": "请输入分数", - "reasonPlaceholder": "请输入理由" - } - }, - "wizard": { - "welcomeTitle": "欢迎使用 SecScore 积分管理", - "welcomeDesc": "感谢选择 SecScore。在开始之前,请花一分钟完成基础配置。", - "configComplete": "配置完成!", - "configFailed": "配置保存失败", - "startJourney": "开启积分之旅" - }, - "tags": { - "editTitle": "编辑标签", - "inputPlaceholder": "输入标签名称,按 Enter 添加", - "selectedTags": "已选标签(点击取消)", - "noTagsSelected": "未选择标签", - "availableTags": "可选标签(点击选择)", - "noAvailableTags": "无可用标签", - "fetchFailed": "获取标签列表失败", - "nameTooLong": "标签名称不能超过 30 个字符", - "addFailed": "添加标签失败", - "deleteSuccess": "标签删除成功", - "deleteFailed": "删除标签失败" - }, - "recovery": { - "title": "SecScore 找回字符串", - "saved": "我已保存", - "export": "导出文本文件", - "exportHint": "建议导出后离线保存,遗失将无法找回。", - "hint": "建议导出后离线保存,遗失将无法找回。" - } -} + "logLevels": { + "debug": "DEBUG (调试)", + "info": "INFO (信息)", + "warn": "WARN (警告)", + "error": "ERROR (错误)" + } + }, + "url": { + "title": "URL 协议 (secscore://)", + "protocol": "URL 协议", + "description": "可以通过 URL 链接唤起 SecScore 并执行操作,例如:", + "register": "注册 URL 协议", + "registered": "URL 协议已注册", + "registerFailed": "注册失败", + "installerRequired": "需要安装版 SecScore,开发模式下可能无效。" + }, + "mcp": { + "title": "MCP 服务", + "description": "管理内置 MCP HTTP 服务,供外部 MCP 客户端调用。", + "running": "运行中", + "stopped": "已停止", + "noUrl": "暂无地址", + "host": "主机", + "port": "端口", + "start": "启动", + "stop": "停止", + "refresh": "刷新状态", + "hint": "建议仅绑定到 127.0.0.1;启动后 MCP 入口为 http://host:port/mcp", + "hostRequired": "请输入 MCP 主机地址", + "portInvalid": "请输入有效端口(1-65535)", + "startSuccess": "MCP 服务启动成功", + "startFailed": "MCP 服务启动失败", + "stopSuccess": "MCP 服务已停止", + "stopFailed": "MCP 服务停止失败", + "startTimeout": "启动 MCP 服务超时,请稍后重试", + "stopTimeout": "停止 MCP 服务超时,请稍后重试" + }, + "app": { + "title": "应用控制", + "description": "快速重启或退出应用。", + "restart": "重启应用", + "quit": "退出应用", + "confirmRestartTitle": "确认重启应用?", + "confirmRestartContent": "应用将立即关闭并重新启动。", + "confirmQuitTitle": "确认退出应用?", + "confirmQuitContent": "应用将立即退出。", + "restartFailed": "重启失败", + "quitFailed": "退出失败" + }, + "about": { + "title": "关于", + "appName": "积分管理", + "version": "版本", + "copyright": "版权", + "ipcStatus": "IPC 状态", + "ipcConnected": "已连接", + "ipcDisconnected": "未连接 (Preload 失败)", + "environment": "环境", + "toggleDevTools": "切换开发者工具", + "license": "SecScore遵循GPL3.0协议", + "copyRightText": "CopyRight © 2025-{{year}} SECTL" + } + }, + "sidebar": { + "home": "首页", + "students": "学生管理", + "score": "积分操作", + "boards": "看板", + "leaderboard": "排行榜", + "settlements": "结算历史", + "reasons": "理由管理", + "autoScore": "自动加分", + "rewardExchange": "奖励兑换", + "rewardSettings": "奖励设置", + "settings": "系统设置", + "remoteDb": "远程数据库", + "refreshStatus": "刷新状态", + "syncNow": "立即同步", + "syncSuccess": "同步成功", + "syncFailed": "同步失败", + "getDbStatusFailed": "获取数据库状态失败", + "notRemoteMode": "当前不是远程数据库模式,请重启应用后重试", + "dbNotConnected": "数据库未连接" + }, + "auth": { + "unlock": "权限解锁", + "unlockHint": "输入 6 位数字密码:管理密码=全功能,积分密码=仅积分操作。", + "unlockButton": "解锁", + "unlocked": "权限已解锁", + "logout": "已切换为只读", + "passwordPlaceholder": "例如 123456", + "passwordError": "密码错误", + "enterPassword": "输入密码", + "lock": "锁定" + }, + "languages": { + "zh-CN": "简体中文", + "en-US": "English" + }, + "theme": { + "colorAndBackground": "颜色与背景", + "gradientLabels": { + "blue": "清爽蓝", + "pink": "柔和粉", + "cyan": "青蓝", + "purple": "紫韵" + }, + "gradientDirections": { + "vertical": "纵向", + "horizontal": "横向", + "diagonal": "对角" + }, + "generate": "生成", + "saved": "已保存", + "saveFailed": "保存失败", + "mode": "模式", + "myTheme": "我的主题" + }, + "permissions": { + "admin": "管理权限", + "points": "积分权限", + "view": "只读" + }, + "home": { + "title": "学生积分主页", + "subtitle": "共 {{count}} 名学生,点击卡片进行积分操作", + "searchPlaceholder": "搜索姓名/拼音...", + "sortBy": { + "alphabet": "姓名排序", + "surname": "姓氏分组", + "score": "积分排行" + }, + "layoutBy": { + "grouped": "分组列表", + "squareGrid": "正方形网格" + }, + "noStudents": "暂无学生数据,请前往学生管理添加", + "noMatch": "未找到匹配的学生", + "clearSearch": "清除搜索", + "points": "分", + "currentScore": "当前积分", + "quickOptions": "快捷选项", + "adjustPoints": "调整分值", + "customPoints": "自定义分值", + "customPointsHint": "可在输入框微调特输入任意分值", + "reason": "操作理由", + "reasonPlaceholder": "输入加分/扣分的原因(可选)", + "preview": "变更预览", + "noReason": "(无理由)", + "category": { + "others": "其他" + }, + "scoreAdded": "已为 {{name}} 加{{points}}分", + "scoreDeducted": "已为 {{name}} 扣{{points}}分", + "submitFailed": "提交失败", + "pleaseSelectPoints": "请选择或输入分值", + "reasonDefault": "{{action}}{{points}}分", + "studentCount": "{{count}} 人", + "operationTitle": "积分操作:{{name}}", + "submitOperation": "提交操作", + "operationTitleBatch": "积分操作:已选 {{count}} 人", + "undoLastAction": "撤销上一步", + "undoLastHint": "撤销上一条:{{name}} {{delta}}", + "undoUnavailable": "当前没有可撤销的积分操作", + "undoLastSuccess": "已撤销上一步积分操作", + "multiSelect": "多选", + "batchMode": "多选模式", + "selectAll": "全选", + "clearSelected": "清空已选", + "batchOperate": "批量积分", + "selected": "已选", + "selectedCount": "已选 {{count}} 人", + "batchSuccess": "已为 {{count}} 名学生提交积分", + "batchPartial": "成功提交 {{success}}/{{total}} 名学生积分", + "selectStudentFirst": "请先选择学生", + "addPoints": "加分", + "deductPoints": "扣分", + "pointsChange": "积分变更", + "reasonLabel": "理由:" + }, + "students": { + "title": "学生管理", + "importList": "导入名单", + "addStudent": "添加学生", + "name": "姓名", + "avatar": "头像", + "currentScore": "当前积分", + "tags": "标签", + "noTags": "无标签", + "editTags": "编辑标签", + "editAvatar": "设置头像", + "deleteConfirm": "确认删除该学生?", + "addTitle": "添加学生", + "addConfirm": "添加", + "namePlaceholder": "请输入学生姓名", + "nameRequired": "请输入姓名", + "nameExists": "学生姓名已存在", + "addSuccess": "添加成功", + "addFailed": "添加失败", + "deleteSuccess": "删除成功", + "deleteFailed": "删除失败", + "tagSaveSuccess": "标签保存成功", + "tagSaveFailed": "保存标签失败", + "importTitle": "导入名单", + "importTextHint": "支持粘贴多行文本,一行一个姓名", + "importTextPlaceholder": "例如:\n张三\n李四\n王五", + "importByText": "从文本导入", + "importByXlsx": "通过 xlsx 导入", + "xlsxPreview": "xlsx 预览与导入", + "file": "文件", + "selectNameCol": "点击表头选择姓名列", + "previewRows": "预览前 50 行", + "importConfirm": "导入", + "importComplete": "导入完成:新增 {{inserted}},跳过 {{skipped}}", + "workerNotReady": "Worker 未初始化", + "parseXlsxFailed": "解析 xlsx 失败", + "selectNameColFirst": "请先点击选择\"姓名列\"", + "noNamesFound": "所选列未解析到可导入的姓名", + "importFailed": "导入失败", + "editTagTitle": "编辑标签 - {{name}}", + "editAvatarTitle": "设置头像 - {{name}}", + "avatarUpload": "上传图片", + "avatarClear": "清除头像", + "noAvatar": "无头像", + "avatarTip": "支持常见图片格式,文件大小不超过 2MB", + "avatarSaveSuccess": "头像保存成功", + "avatarSaveFailed": "头像保存失败", + "avatarInvalidFile": "请选择图片文件", + "avatarTooLarge": "图片不能超过 2MB", + "avatarReadFailed": "读取图片失败" + }, + "score": { + "title": "积分管理", + "student": "学生", + "change": "变动", + "reason": "理由", + "time": "时间", + "undoConfirm": "确定要撤销这条记录吗?学生积分将回滚。", + "undo": "撤销", + "undoSuccess": "已撤销操作", + "undoFailed": "撤销失败", + "recentRecords": "最近记录", + "pleaseSelectStudent": "请选择或搜索学生", + "selectAllStudents": "全班", + "clearSelectedStudents": "清空", + "selectedCount": "已选 {{selected}} / {{total}} 人", + "points": "分数", + "addPoints": "加分", + "deductPoints": "扣分", + "quickReason": "快捷理由", + "selectReason": "选择预设理由", + "reasonContent": "理由内容", + "reasonPlaceholder": "手动输入或选择快捷理由", + "submit": "确认提交", + "pleaseEnterInfo": "请填写完整信息", + "pleaseEnterPoints": "请填写分值或选择预设理由", + "batchSuccess": "已为 {{count}} 名学生提交积分", + "batchPartial": "成功提交 {{success}}/{{total}} 名学生的积分" + }, + "reasons": { + "title": "理由管理", + "addReason": "添加预设理由", + "category": "分类", + "content": "理由内容", + "presetPoints": "预设分值", + "deleteConfirm": "确认删除该理由?", + "addTitle": "添加理由", + "addConfirm": "添加", + "categoryPlaceholder": "例如: 学习, 纪律", + "contentPlaceholder": "请输入理由", + "pointsPlaceholder": "例如: 2 或 -2", + "contentRequired": "请输入理由内容", + "pointsRequired": "请输入预设分值", + "reasonExists": "该分类下已存在相同理由", + "addSuccess": "添加成功", + "addFailed": "添加失败", + "deleteSuccess": "删除成功", + "deleteFailed": "删除失败", + "others": "其他" + }, + "rewardExchange": { + "title": "奖励兑换", + "enterMode": "进入奖励兑换模式", + "exitMode": "退出奖励兑换模式", + "modeHint": "当前为奖励兑换模式,点击学生卡可选择可兑换奖励。", + "normalHint": "当前显示学生原始积分,点击按钮后将显示可兑换积分。", + "remainingRewardPoints": "剩余兑换积分", + "currentScore": "当前积分", + "chooseRewardTitle": "为 {{name}} 选择奖励", + "currentRewardPoints": "当前可兑换积分:{{points}}", + "costLabel": "消耗积分:{{points}}", + "redeemNow": "立即兑换", + "noAffordableRewards": "当前没有可兑换的奖励,请先积累积分。", + "redeemSuccess": "{{student}} 成功兑换「{{reward}}」,消耗 {{points}} 分", + "redeemFailed": "兑换失败", + "recordsTitle": "兑换记录", + "recordStudent": "学生", + "recordReward": "奖励", + "recordCost": "消耗积分", + "recordTime": "兑换时间" + }, + "rewardSettings": { + "title": "奖励设置", + "addReward": "添加奖励", + "addTitle": "添加奖励", + "editTitle": "编辑奖励", + "rewardName": "奖励名称", + "costPoints": "消耗积分", + "namePlaceholder": "例如:免作业券", + "costPlaceholder": "请输入消耗积分", + "nameRequired": "请输入奖励名称", + "costRequired": "请输入正整数积分", + "createSuccess": "奖励创建成功", + "createFailed": "奖励创建失败", + "updateSuccess": "奖励更新成功", + "updateFailed": "奖励更新失败", + "deleteSuccess": "奖励删除成功", + "deleteFailed": "奖励删除失败", + "deleteConfirm": "确认删除奖励「{{name}}」?" + }, + "board": { + "title": "看板", + "editable": "可编辑", + "readonly": "只读", + "addBoard": "新增看板", + "removeBoard": "删除看板", + "removeBoardConfirm": "确认删除当前看板?", + "boardConfig": "看板配置", + "boardNamePlaceholder": "输入看板名称", + "renameBoard": "重命名看板", + "newBoard": "新看板", + "untitledBoard": "未命名看板", + "addList": "新增学生列表", + "removeList": "删除列表", + "removeListConfirm": "确认删除当前学生列表?", + "editList": "编辑", + "sqlEditorTitle": "编辑学生列表", + "splitHorizontal": "左右拆分", + "splitVertical": "上下拆分", + "dragHandle": "拖动调整布局", + "listNamePlaceholder": "输入列表名称", + "newList": "新列表", + "applyPreset": "套用预设", + "run": "运行 SQL", + "runAll": "运行全部", + "viewModes": { + "list": "列表视图", + "card": "卡片视图", + "grid": "网格视图" + }, + "metrics": { + "totalScore": "总分", + "rewardPoints": "奖励分", + "weekChange": "近7天", + "weekDeducted": "近7天扣分", + "todayAnswered": "今日回答" + }, + "sqlPlaceholder": "输入 SQL(仅支持单条 SELECT / WITH 查询)", + "templateHint": "支持时间模板变量:{{today_start}}、{{since_7d}}、{{since_30d}}、{{now}}", + "templateDescription": "可直接在 SQL 中使用模板变量,运行时会自动替换为 ISO 时间,兼容 SQLite 与 PostgreSQL。", + "saving": "保存中...", + "saveFailed": "保存看板失败", + "runFailed": "查询执行失败", + "keepAtLeastOneBoard": "至少保留一个看板", + "keepAtLeastOneList": "至少保留一个学生列表", + "presets": { + "weekLowDeduct": { + "name": "上周低扣分排行", + "description": "上一周扣分 < 3 的学生积分榜" + }, + "todayActive": { + "name": "今日活跃榜", + "description": "按今日回答次数与积分变化排序" + }, + "rewardRanking": { + "name": "奖励积分榜", + "description": "按奖励积分和总积分排序" + } + } + }, + "leaderboard": { + "title": "积分排行榜", + "rank": "排名", + "name": "姓名", + "totalScore": "总积分", + "todayChange": "今日变化", + "weekChange": "本周变化", + "monthChange": "本月变化", + "viewHistory": "查看", + "exportXlsx": "导出 XLSX", + "exportSuccess": "导出成功", + "queryFailed": "查询失败", + "historyTitle": "{{name}} - 操作记录", + "close": "关闭", + "today": "今天", + "week": "本周", + "month": "本月", + "operationRecord": "操作记录", + "change": "变化" + }, + "settlements": { + "title": "结算历史", + "phase": "阶段 #{{id}}", + "viewLeaderboard": "查看排行榜", + "recordCount": "记录数: {{count}}", + "noRecords": "暂无结算记录", + "noSettlements": "暂无结算记录", + "back": "返回", + "leaderboardTitle": "结算排行榜", + "phaseScore": "阶段积分", + "queryFailed": "查询失败", + "rank": "排名", + "name": "姓名" + }, + "autoScore": { + "title": "自动化加分管理", + "name": "自动化名称", + "namePlaceholder": "例如:每日签到加分", + "nameRequired": "请输入自动化名称", + "triggers": "触发器", + "actions": "行动", + "applicableStudents": "适用学生", + "allStudents": "所有学生", + "lastExecuted": "最后执行", + "notExecuted": "未执行", + "invalidTime": "无效时间", + "addTrigger": "添加规则", + "addAction": "添加行动", + "whenTriggered": "当以下规则触发时", + "triggeredActions": "满足规则时触发的行动", + "addAutomation": "添加自动化", + "updateAutomation": "更新自动化", + "cancelEdit": "取消编辑", + "resetForm": "重置表单", + "deleteConfirm": "确定要删除这条自动化吗?", + "adminRequired": "需要管理员权限以查看自动加分自动化,请先登录管理员账号", + "adminCreateRequired": "需要管理员权限以创建或更新自动加分自动化", + "adminDeleteRequired": "需要管理员权限以删除自动加分自动化", + "adminToggleRequired": "需要管理员权限以启用/禁用自动加分自动化", + "fetchFailed": "获取自动化失败", + "triggerRequired": "请至少添加一个触发器", + "actionRequired": "请至少添加一个行动", + "createSuccess": "自动化创建成功", + "updateSuccess": "自动化更新成功", + "createFailed": "创建自动化失败", + "updateFailed": "更新自动化失败", + "deleteSuccess": "自动化删除成功", + "deleteFailed": "删除自动化失败", + "enabled": "自动化已启用", + "disabled": "自动化已禁用", + "enableFailed": "启用自动化失败", + "disableFailed": "禁用自动化失败", + "noTriggerAvailable": "没有可用的触发器类型,请检查配置", + "noActionAvailable": "没有可用的行动类型,请检查配置", + "sort": "排序", + "status": "状态", + "triggerCount": "{{count}} 个触发器", + "actionCount": "{{count}} 个行动", + "studentCount": "{{count}} 名学生", + "studentPlaceholder": "请选择或搜索学生(留空表示所有学生)", + "triggerCondition": "触发条件", + "executeAction": "执行操作", + "addOperation": "添加操作", + "scoreLabel": "分数", + "tagNameLabel": "标签名称", + "operationNoteLabel": "操作说明(可选)", + "triggerIntervalTime": "间隔时间", + "triggerStudentTag": "学生标签", + "actionAddScore": "加分", + "actionAddTag": "添加标签", + "minutesPlaceholder": "请输入分钟数", + "minutes": "分钟", + "tagsPlaceholder": "请输入标签名称", + "scorePlaceholder": "请输入分数", + "tagNamePlaceholder": "请输入标签名称", + "reasonPlaceholder": "请输入理由", + "relationAnd": "并且", + "relationOr": "或者" + }, + "triggers": { + "studentTag": { + "label": "学生标签", + "description": "当学生匹配特定标签时触发自动化", + "placeholder": "请选择标签", + "required": "请输入标签名称" + }, + "randomTime": { + "label": "随机时间触发", + "description": "在指定时间范围内随机触发自动化", + "required": "请输入有效的时间范围(分钟)" + }, + "intervalTime": { + "label": "间隔时间", + "description": "当间隔时间到达时触发自动化", + "placeholder": "请输入时间间隔", + "required": "请输入有效的时间", + "monthLabel": "月", + "weekLabel": "周", + "timeLabel": "时间" + } + }, + "actions": { + "sendNotification": { + "label": "发送通知", + "description": "向学生发送通知", + "placeholder": "请输入通知内容" + }, + "addTag": { + "label": "添加标签", + "description": "为学生添加标签", + "placeholder": "请输入标签" + }, + "addScore": { + "label": "添加分数", + "description": "为学生添加分数", + "pointsPlaceholder": "请输入分数", + "reasonPlaceholder": "请输入理由" + } + }, + "wizard": { + "welcomeTitle": "欢迎使用 SecScore 积分管理", + "welcomeDesc": "感谢选择 SecScore。在开始之前,请花一分钟完成基础配置。", + "configComplete": "配置完成!", + "configFailed": "配置保存失败", + "startJourney": "开启积分之旅" + }, + "tags": { + "editTitle": "编辑标签", + "inputPlaceholder": "输入标签名称,按 Enter 添加", + "selectedTags": "已选标签(点击取消)", + "noTagsSelected": "未选择标签", + "availableTags": "可选标签(点击选择)", + "noAvailableTags": "无可用标签", + "fetchFailed": "获取标签列表失败", + "nameTooLong": "标签名称不能超过 30 个字符", + "addFailed": "添加标签失败", + "deleteSuccess": "标签删除成功", + "deleteFailed": "删除标签失败" + }, + "recovery": { + "title": "SecScore 找回字符串", + "saved": "我已保存", + "export": "导出文本文件", + "exportHint": "建议导出后离线保存,遗失将无法找回。", + "hint": "建议导出后离线保存,遗失将无法找回。" + } +}