feat(shared): update db schema, i18n messages, rate-limit, auth-session-provider

- Update src/shared/db/schema.ts

- Update i18n messages for en and zh-CN (error-book, exam-homework, leave,

  lesson-preparation, notifications, rbac, student, textbooks, diagnostic)

- Update src/shared/lib/rate-limit/index.ts and redis-limiter.ts

- Update src/shared/components/auth-session-provider.tsx
This commit is contained in:
SpecialX
2026-07-04 10:23:29 +08:00
parent 3569d83b8e
commit d2c250a1b3
21 changed files with 848 additions and 331 deletions

View File

@@ -70,7 +70,7 @@
"3": "中等",
"4": "偏难",
"5": "困难",
"ariaLabel": "难度等级 {{level}}{{label}}"
"ariaLabel": "难度等级 {level}{label}"
},
"actions": {
"preview": "预览考试",
@@ -83,7 +83,7 @@
"archive": "归档",
"delete": "删除",
"deleteConfirmTitle": "确定要删除吗?",
"deleteConfirmDescription": "此操作不可撤销。将永久删除考试\"{{title}}\"及所有关联数据。",
"deleteConfirmDescription": "此操作不可撤销。将永久删除考试\"{title}\"及所有关联数据。",
"cancel": "取消",
"deleteSuccess": "考试已删除",
"deleteFailed": "删除考试失败",
@@ -165,7 +165,7 @@
"richEditorHint": "切换到富文本编辑器",
"loaded": "已加载",
"startHint": "从右侧面板添加题目开始",
"itemsInStructure": "结构中有 {{count}} 项",
"itemsInStructure": "结构中有 {count} 项",
"saveSuccess": "考试草稿已保存",
"saveFailed": "保存失败",
"publishSuccess": "考试已发布",
@@ -280,7 +280,7 @@
"sectionLabel": "分卷",
"partLabel": "部分",
"groupLabel": "大题",
"questionCountSummary": "(共 {{count}} 题,{{score}} 分)",
"questionCountSummary": "(共 {count} 题,{score} 分)",
"typeSingleChoice": "单选",
"typeMultipleChoice": "多选",
"typeJudgment": "判断",
@@ -310,8 +310,8 @@
"taskInterrupted": "页面刷新后任务已中断,请重新生成",
"untitledExam": "未命名试卷",
"queuedSuccess": "已加入后台队列,可继续编辑页面",
"backgroundComplete": "后台生成完成:{{title}}",
"backgroundFailed": "后台生成失败:{{title}}",
"backgroundComplete": "后台生成完成:{title}",
"backgroundFailed": "后台生成失败:{title}",
"selectQuestionFirst": "请先选择一个题目",
"questionNotFound": "未找到选中的题目",
"enterRewriteInstruction": "请输入重写指令",
@@ -321,7 +321,7 @@
"pasteSourceFirst": "请先粘贴试卷文本"
},
"paperPreview": {
"scoreWithUnit": "({{score}}分)"
"scoreWithUnit": "({score}分)"
},
"actionMessages": {
"enterRewriteInstruction": "请输入重写指令",
@@ -361,16 +361,16 @@
"noQuestionText": "(无题目文本)"
},
"card": {
"level": "难度 {{level}}",
"minutes": "{{count}} 分钟",
"points": "{{count}} 分",
"questions": "{{count}} 题"
"level": "难度 {level}",
"minutes": "{count} 分钟",
"points": "{count} 分",
"questions": "{count} 题"
},
"viewer": {
"section": "分卷",
"group": "大题",
"score": "分值",
"scoreLabel": "分值:{{score}}",
"scoreLabel": "分值:{score}",
"noQuestions": "暂无题目",
"unknown": "未知"
},
@@ -379,7 +379,7 @@
"title": "试卷预览",
"generating": "生成预览中...",
"fullPreview": "完整试卷预览",
"summary": "{{count}} 题 · {{subject}} · {{grade}} · {{minutes}} 分钟 · {{total}} 分",
"summary": "{count} 题 · {subject} · {grade} · {minutes} 分钟 · {total} 分",
"noPreview": "暂无预览内容",
"confirmCreate": "确认并创建",
"untitledQuestion": "未命名题目",
@@ -390,7 +390,7 @@
"label": "选项",
"addOption": "新增选项",
"correct": "正确",
"markCorrectAria": "标记选项 {{id}} 为正确答案",
"markCorrectAria": "标记选项 {id} 为正确答案",
"deleteOptionAria": "删除选项"
},
"editorExtensions": {
@@ -400,7 +400,7 @@
"group": {
"titlePlaceholder": "大题标题(如:一、选择题)",
"instructionPlaceholder": "说明(如:每小题3分,共24分)—— 可留空,总分自动统计",
"statsSummary": "共 {{count}} 题 · {{score}} 分"
"statsSummary": "共 {count} 题 · {score} 分"
},
"question": {
"typeSingleChoice": "单选",
@@ -416,7 +416,7 @@
"levelVolume": "卷",
"levelPart": "部分",
"levelSubVolume": "分卷",
"statsSummary": "共 {{count}} 题 · {{score}} 分"
"statsSummary": "共 {count} 题 · {score} 分"
}
}
},
@@ -430,7 +430,7 @@
"emptyDescription": "您还没有创建任何作业。",
"emptyFilteredDescription": "尝试清除筛选条件或调整关键词。",
"clearFilters": "清除筛选",
"filterByClass": "按班级筛选:{{className}}",
"filterByClass": "按班级筛选:{className}",
"columns": {
"title": "标题",
"status": "状态",
@@ -488,7 +488,7 @@
},
"take": {
"questions": "题目",
"question": "第 {{index}} 题",
"question": "第 {index} 题",
"points": "分",
"startAssignment": "开始作答",
"submitAssignment": "提交作业",
@@ -505,12 +505,12 @@
"readyDescription": "点击上方\"开始作答\"按钮。点击\"保存答案\"将保存您的答案。",
"startNow": "立即开始",
"back": "返回",
"timedExam": "限时考试:{{minutes}} 分钟",
"timedExam": "限时考试:{minutes} 分钟",
"timeRemaining": "剩余时间",
"timeUpAutoSubmit": "时间到,正在自动提交...",
"confirmSubmit": "确认提交",
"confirmSubmitDescription": "所有题目已作答。提交后答案不可修改,确定要提交吗?",
"unansweredWarning": "您有 {{count}} 道题未作答。提交后答案不可修改,确定要提交吗?",
"unansweredWarning": "您有 {count} 道题未作答。提交后答案不可修改,确定要提交吗?",
"cancel": "取消",
"confirmSubmitAction": "确认提交",
"submitSuccess": "已提交",
@@ -521,15 +521,15 @@
"status": "状态",
"dueDate": "截止时间",
"overdue": "已逾期",
"hoursLeft": "还剩 {{hours}} 小时",
"hoursLeft": "还剩 {hours} 小时",
"lessThanOneHour": "不足 1 小时",
"attempts": "尝试次数",
"attemptsUsed": "已用 {{used}} / {{max}}",
"attemptsRemaining": "· 剩余 {{remaining}} 次",
"attemptsUsed": "已用 {used} / {max}",
"attemptsRemaining": "· 剩余 {remaining} 次",
"description": "描述",
"noDescription": "无描述。",
"progress": "进度",
"jumpToQuestion": "跳转到第 {{index}} 题",
"jumpToQuestion": "跳转到第 {index} 题",
"answered": "已作答",
"unanswered": "未作答",
"yourAnswer": "你的答案",
@@ -550,12 +550,12 @@
"scanDescription": "在纸上作答后,拍照上传整卷答题图片",
"selectImageFiles": "请选择图片文件",
"uploadFailed": "上传失败",
"uploadSuccess": "已上传 {{count}} 张图片",
"uploadSuccess": "已上传 {count} 张图片",
"deleteScan": "删除",
"moveUp": "上移",
"moveDown": "下移",
"dragDropHint": "拖拽图片到此处,或点击选择文件",
"pageLabel": "第 {{page}} 页",
"pageLabel": "第 {page} 页",
"scanDisabled": "已提交,无法修改答题图片"
},
"grade": {
@@ -589,7 +589,7 @@
"scoreLabel": "分数",
"addFeedback": "添加反馈",
"hideFeedback": "隐藏反馈",
"feedbackPlaceholder": "为 {{name}} 添加反馈...",
"feedbackPlaceholder": "为 {name} 添加反馈...",
"submitGrades": "提交成绩",
"saving": "保存中...",
"gradesSaved": "批改已保存",
@@ -600,7 +600,7 @@
"next": "下一页",
"gradesAutoSaveNote": "点击提交后成绩将自动保存。学生将在您提交后立即看到成绩和反馈。",
"batchAutoGrade": "批量自动批改",
"batchSelected": "已选 {{count}} 份提交",
"batchSelected": "已选 {count} 份提交",
"batchSelectAtLeastOne": "请至少选择一份提交",
"batchFailed": "批量批改失败",
"selectAll": "全选",
@@ -616,9 +616,9 @@
"noScans": "暂无答题图片",
"saveFailed": "保存失败",
"scanFeedbackPlaceholder": "批改评语(可选)...",
"scoreOutOf": "/ {{max}} 分",
"questionsCount": "题目与批改({{count}} 题)",
"scanPagesCount": "学生答题图片({{count}} 页)"
"scoreOutOf": "/ {max} 分",
"questionsCount": "题目与批改({count} 题)",
"scanPagesCount": "学生答题图片({count} 页)"
},
"review": {
"title": "复习",
@@ -700,15 +700,15 @@
"questionPreview": "题目预览",
"errorAnalysis": "错误分析",
"errorRateOverview": "错误率概览",
"errorRateAriaLabel": "错误率 {{rate}}%",
"errorRateAriaLabel": "错误率 {rate}%",
"question": "题目",
"errors": "错误数",
"errorRateLabel": "错误率",
"wrongAnswersWithCount": "错答 ({{count}})",
"wrongAnswersWithCount": "错答 ({count})",
"wrongAnswers": "错答",
"noWrongAnswers": "暂无错答记录。",
"studentAnswer": "学生答案",
"studentCount": "{{count}} 名学生",
"studentCount": "{count} 名学生",
"notAnswered": "未作答",
"selectQuestionHint": "请从左侧选择题目",
"selectQuestionHintDesc": "查看错误分析",
@@ -721,9 +721,9 @@
"zoomIn": "放大",
"rotate": "旋转",
"fullscreen": "全屏",
"pageIndicator": "第 {{current}} / {{total}} 页",
"answerImageAlt": "答题图 第{{page}}页",
"thumbnailAlt": "缩略图 {{page}}"
"pageIndicator": "第 {current} / {total} 页",
"answerImageAlt": "答题图 第{page}页",
"thumbnailAlt": "缩略图 {page}"
},
"submissions": {
"title": "作业提交",
@@ -744,26 +744,26 @@
},
"excellent": {
"title": "优秀作业展示",
"description": "本作业中得分率达到 {{minPercentage}}% 及以上的优秀样例。",
"description": "本作业中得分率达到 {minPercentage}% 及以上的优秀样例。",
"empty": "暂无符合条件的优秀作业。",
"emptyHint": "完成批改后将自动汇总展示。",
"loading": "加载优秀作业...",
"loadFailed": "加载失败",
"retry": "重试",
"rank": "第 {{rank}} 名",
"rank": "第 {rank} 名",
"scoreLabel": "得分",
"scoreValue": "{{score}} / {{max}}",
"percentage": "{{value}}%",
"scoreValue": "{score} / {max}",
"percentage": "{value}%",
"lateTag": "迟交",
"viewDetail": "查看详情",
"submittedAt": "提交于 {{date}}",
"submittedAt": "提交于 {date}",
"studentAnon": "同学"
},
"parentExam": {
"examsTaken": "已参加考试",
"averageScore": "平均分",
"bestScore": "最高分",
"examResults": "{{name}} 的考试成绩",
"examResults": "{name} 的考试成绩",
"examResultsDescription": "近期考试分数与表现趋势",
"noResults": "暂无考试成绩",
"noResultsHint": "考试成绩将在批改完成后显示。",