feat(shared,tests): add error boundaries, lib utils, i18n messages, and integration tests
Some checks failed
CI / scheduled-backup (push) Has been skipped
CI / backup-verify (push) Has been skipped
CI / weekly-dr-drill (push) Failing after 0s
CI / build-deploy (push) Has been cancelled
CI / security-scan (push) Has been cancelled

shared:

- Add class-filter, error-state, route-error, section-error-boundary, widget-boundary components

- Add ui/alert component

- Add constants directory

- Add breached-password, export-utils, permission-bitmap, rate-limit, resolve-action-error, route-permissions, route-resolver, type-guards lib

- Add i18n messages (en, zh-CN) for invitation-codes, parent, questions, rbac

tests:

- Add integration tests for elective

- Add tests/setup/empty-stub

scripts:

- Add update-md.cjs, tmp_append_en.ps1, tmp_merge_en.ps1 utilities
This commit is contained in:
SpecialX
2026-07-03 10:26:38 +08:00
parent 21142f9b99
commit 0e63c24ed9
97 changed files with 9753 additions and 819 deletions

View File

@@ -120,7 +120,10 @@
},
"error": {
"notFound": "考试不存在",
"loadFailed": "加载考试失败"
"loadFailed": "加载考试失败",
"boundaryTitle": "考试数据加载失败",
"boundaryDescription": "该区块数据加载时发生错误,请重试。",
"retry": "重试"
},
"analytics": {
"title": "考试分析",
@@ -149,6 +152,59 @@
"noData": "暂无分析数据,需等待学生提交并批改后生成",
"viewAnalytics": "查看分析"
},
"build": {
"title": "组卷",
"description": "为考试组装题目。",
"examStructure": "试卷结构",
"questionBank": "题库",
"preview": "预览",
"totalScore": "总分",
"saveDraft": "保存草稿",
"publish": "发布",
"richEditor": "富文本编辑器",
"richEditorHint": "切换到富文本编辑器",
"loaded": "已加载",
"startHint": "从右侧面板添加题目开始",
"itemsInStructure": "结构中有 {{count}} 项",
"saveSuccess": "考试草稿已保存",
"saveFailed": "保存失败",
"publishSuccess": "考试已发布",
"publishFailed": "发布失败",
"loadQuestionsFailed": "加载题目失败",
"newGroup": "新分组",
"newSection": "新分卷",
"score": "分值",
"sectionTitlePlaceholder": "分卷标题(如:第Ⅰ卷)",
"groupTitlePlaceholder": "分组标题",
"pts": "分",
"dragItemsHere": "拖拽题目到此处",
"addGroup": "+ 添加分组",
"addSection": "+ 添加分卷",
"section": "分卷",
"group": "分组",
"question": "题目",
"questionContent": "题目内容",
"noQuestionsFound": "未找到匹配筛选条件的题目。",
"noContentPreview": "无内容预览",
"loading": "加载中...",
"loadMore": "加载更多",
"aiVariant": "AI 变体",
"noQuestionsSelected": "尚未选择题目。从题库添加题目或创建分组。",
"createGroup": "创建分组",
"createSection": "创建分卷",
"dragGroupsHere": "拖拽分组或题目到此处",
"dragQuestionsHere": "拖拽题目到此处或从题库添加",
"untitledGroup": "未命名分组",
"previewSubject": "科目",
"previewGrade": "年级",
"previewTime": "时间",
"previewTotal": "总分",
"previewClass": "班级",
"previewName": "姓名",
"previewNo": "学号",
"emptyExamPaper": "空试卷",
"minutes": "分钟"
},
"richEditor": {
"title": "富文本组卷",
"description": "粘贴试卷文本,使用工具栏标记题目/分组/填空/加点字,右侧实时预览",
@@ -201,6 +257,167 @@
"essay": "作文题",
"text": "文本题"
}
},
"preview": {
"selectQuestionHint": "请选择左侧题目后进行编辑",
"editorTitle": "题目编辑",
"editorDescription": "直接修改或通过 AI 指令重写当前题目",
"stem": "题干",
"aiRewriteInstruction": "AI 重写指令",
"aiRewritePlaceholder": "例如:把这题改成更难、增加一个干扰项、保持总分不变。",
"aiRewriteButton": "AI 重写当前题目",
"rawModelOutput": "模型原始输出"
},
"subQuestions": {
"title": "子题",
"add": "新增子题",
"contentPlaceholder": "子题内容",
"answerPlaceholder": "参考答案",
"scorePlaceholder": "分值",
"empty": "当前题目没有子题"
},
"richForm": {
"sectionLabel": "分卷",
"partLabel": "部分",
"groupLabel": "大题",
"questionCountSummary": "(共 {{count}} 题,{{score}} 分)",
"typeSingleChoice": "单选",
"typeMultipleChoice": "多选",
"typeJudgment": "判断",
"typeComposite": "复合",
"typeShortAnswer": "简答",
"scoreUnit": "分",
"emptyPreview": "暂无题目,请在左侧编辑器中添加",
"missingExamId": "缺少试卷 ID",
"backToBuild": "返回组卷"
},
"editor": {
"loading": "编辑器加载中...",
"contentPlaceholder": "在此粘贴或输入试卷内容,选中文本可标记为题目/分组/加点字/填空..."
},
"selectionToolbar": {
"ariaLabel": "选区标记工具栏",
"sectionLabel": "分卷",
"groupLabel": "大题",
"singleChoice": "单选",
"blankShortAnswer": "填空/简答",
"composite": "复合",
"image": "图片",
"defaultGroupTitle": "一、选择题",
"defaultSectionTitle": "第Ⅰ卷 选择题"
},
"previewHook": {
"taskInterrupted": "页面刷新后任务已中断,请重新生成",
"untitledExam": "未命名试卷",
"queuedSuccess": "已加入后台队列,可继续编辑页面",
"backgroundComplete": "后台生成完成:{{title}}",
"backgroundFailed": "后台生成失败:{{title}}",
"selectQuestionFirst": "请先选择一个题目",
"questionNotFound": "未找到选中的题目",
"enterRewriteInstruction": "请输入重写指令",
"aiRewriteFailed": "AI 重写失败",
"aiRewriteSuccess": "题目已按指令重写",
"generatePreviewFailed": "生成预览失败",
"pasteSourceFirst": "请先粘贴试卷文本"
},
"paperPreview": {
"scoreWithUnit": "({{score}}分)"
},
"actionMessages": {
"enterRewriteInstruction": "请输入重写指令",
"noSelectedQuestion": "未选择题目数据",
"questionFormatInvalid": "选中题目格式无效",
"questionsDataInvalid": "题目数据格式无效",
"structureDataInvalid": "试卷结构数据格式无效",
"dbCreateFailed": "数据库错误:创建考试失败",
"createdSuccess": "考试创建成功",
"analyzeFirst": "请先分析预览后再创建",
"pasteSourceFirst": "请先粘贴完整试卷文本",
"aiQuestionFormatInvalid": "AI 题目格式无效",
"invalidUpdateData": "更新数据无效",
"onlyOwnUpdate": "只能更新自己创建的考试",
"dbUpdateFailed": "数据库错误:更新考试失败",
"updated": "考试已更新",
"invalidDeleteData": "删除数据无效",
"onlyOwnDelete": "只能删除自己创建的考试",
"dbDeleteFailed": "数据库错误:删除考试失败",
"deleted": "考试已删除",
"invalidDuplicateData": "复制数据无效",
"notFound": "考试不存在",
"dbDuplicateFailed": "数据库错误:复制考试失败",
"duplicated": "考试已复制",
"loadPreviewFailed": "加载考试预览失败",
"loadSubjectsFailed": "加载科目失败",
"loadGradesFailed": "加载年级失败",
"invalidGradeId": "年级 ID 无效",
"titleRequired": "请填写试卷标题",
"contentRequired": "试卷内容不能为空",
"contentInvalid": "试卷内容格式无效",
"contentParseFailed": "试卷内容解析失败",
"draftCreated": "试卷草稿已创建",
"examUpdated": "试卷已更新",
"sourceTextRequired": "试卷文本不能为空",
"autoMarkCompleted": "AI 自动标记完成",
"noQuestionText": "(无题目文本)"
},
"card": {
"level": "难度 {{level}}",
"minutes": "{{count}} 分钟",
"points": "{{count}} 分",
"questions": "{{count}} 题"
},
"viewer": {
"section": "分卷",
"group": "大题",
"score": "分值",
"scoreLabel": "分值:{{score}}",
"noQuestions": "暂无题目",
"unknown": "未知"
},
"previewDialog": {
"section": "分卷",
"title": "试卷预览",
"generating": "生成预览中...",
"fullPreview": "完整试卷预览",
"summary": "{{count}} 题 · {{subject}} · {{grade}} · {{minutes}} 分钟 · {{total}} 分",
"noPreview": "暂无预览内容",
"confirmCreate": "确认并创建",
"untitledQuestion": "未命名题目",
"untitledSubQuestion": "未命名子题",
"scoreUnit": "分"
},
"questionOptions": {
"label": "选项",
"addOption": "新增选项",
"correct": "正确",
"markCorrectAria": "标记选项 {{id}} 为正确答案",
"deleteOptionAria": "删除选项"
},
"editorExtensions": {
"blank": {
"ariaLabel": "填空"
},
"group": {
"titlePlaceholder": "大题标题(如:一、选择题)",
"instructionPlaceholder": "说明(如:每小题3分,共24分)—— 可留空,总分自动统计",
"statsSummary": "共 {{count}} 题 · {{score}} 分"
},
"question": {
"typeSingleChoice": "单选",
"typeMultipleChoice": "多选",
"typeJudgment": "判断",
"typeText": "填空/简答",
"typeComposite": "复合",
"scoreUnit": "分"
},
"section": {
"titlePlaceholder": "分卷标题(如:第Ⅰ卷 选择题)",
"levelTitle": "层级",
"levelVolume": "卷",
"levelPart": "部分",
"levelSubVolume": "分卷",
"statsSummary": "共 {{count}} 题 · {{score}} 分"
}
}
},
"homework": {
@@ -255,7 +472,19 @@
"titleRequired": "请输入标题",
"selectClassRequired": "请选择班级",
"createSuccess": "作业已创建",
"createFailed": "创建失败"
"createFailed": "创建失败",
"createDescription": "快速发布文本作业或从考试派生。",
"noClassesAvailable": "暂无可用班级",
"noClassesDescription": "请先创建班级,然后向该班级发布作业。",
"goToClasses": "前往班级",
"error": {
"invalidDate": "日期格式无效",
"titleRequired": "请输入标题",
"dueAfterAvailable": "截止时间必须晚于可用时间",
"lateDueAfterDue": "迟交截止时间必须晚于正常截止时间",
"lateDueRequired": "允许迟交时必须设置迟交截止时间",
"invalidForm": "表单数据无效"
}
},
"take": {
"questions": "题目",
@@ -454,10 +683,101 @@
"notAvailableYet": "作业尚未开放",
"noAttemptsLeft": "尝试次数已用完",
"assignmentNotFound": "作业不存在",
"assignmentNotAvailable": "作业不可用"
"assignmentNotAvailable": "作业不可用",
"loadFailed": "加载失败,请稍后重试",
"scanNotFound": "扫描图不存在或无权访问"
},
"filters": {
"searchPlaceholder": "搜索作业...",
"status": "状态",
"allStatus": "全部状态",
"statusPending": "待提交",
"statusSubmitted": "已提交",
"statusGraded": "已批改"
},
"analytics": {
"examContent": "考试内容",
"questionPreview": "题目预览",
"errorAnalysis": "错误分析",
"errorRateOverview": "错误率概览",
"errorRateAriaLabel": "错误率 {{rate}}%",
"question": "题目",
"errors": "错误数",
"errorRateLabel": "错误率",
"wrongAnswersWithCount": "错答 ({{count}})",
"wrongAnswers": "错答",
"noWrongAnswers": "暂无错答记录。",
"studentAnswer": "学生答案",
"studentCount": "{{count}} 名学生",
"notAnswered": "未作答",
"selectQuestionHint": "请从左侧选择题目",
"selectQuestionHintDesc": "查看错误分析",
"noGradedSubmissions": "暂无已批改的提交。"
},
"scanViewer": {
"noImages": "该学生未上传答题图片",
"noImagesHint": "学生可在答题页拍摄上传纸质答案",
"zoomOut": "缩小",
"zoomIn": "放大",
"rotate": "旋转",
"fullscreen": "全屏",
"pageIndicator": "第 {{current}} / {{total}} 页",
"answerImageAlt": "答题图 第{{page}}页",
"thumbnailAlt": "缩略图 {{page}}"
},
"submissions": {
"title": "作业提交",
"description": "按作业查看提交与批改进度。",
"emptyDescription": "还没有可批改的作业。",
"quickAssignment": "快速作业",
"columns": {
"assignment": "作业"
}
},
"detail": {
"viewSubmissions": "查看提交",
"dueLabel": "截止时间",
"noDueDate": "无截止时间",
"submissionsLabel": "提交数",
"performanceAnalytics": "成绩分析",
"assignmentContent": "作业内容"
},
"excellent": {
"title": "优秀作业展示",
"description": "本作业中得分率达到 {{minPercentage}}% 及以上的优秀样例。",
"empty": "暂无符合条件的优秀作业。",
"emptyHint": "完成批改后将自动汇总展示。",
"loading": "加载优秀作业...",
"loadFailed": "加载失败",
"retry": "重试",
"rank": "第 {{rank}} 名",
"scoreLabel": "得分",
"scoreValue": "{{score}} / {{max}}",
"percentage": "{{value}}%",
"lateTag": "迟交",
"viewDetail": "查看详情",
"submittedAt": "提交于 {{date}}",
"studentAnon": "同学"
},
"parentExam": {
"examsTaken": "已参加考试",
"averageScore": "平均分",
"bestScore": "最高分",
"examResults": "{{name}} 的考试成绩",
"examResultsDescription": "近期考试分数与表现趋势",
"noResults": "暂无考试成绩",
"noResultsHint": "考试成绩将在批改完成后显示。",
"pass": "及格",
"belowPass": "不及格",
"viewGrades": "查看成绩详情"
}
},
"proctoring": {
"page": {
"noPermission": "您没有监考权限。",
"title": "考试监考",
"description": "监控考试期间的学生活动。"
},
"mode": {
"title": "考试模式",
"description": "选择考试模式并配置相关选项。监考模式会启用防作弊监控。",