diff --git a/src/i18n/request.ts b/src/i18n/request.ts index c4a5607..06b7b0d 100644 --- a/src/i18n/request.ts +++ b/src/i18n/request.ts @@ -40,6 +40,16 @@ export default getRequestConfig(async () => { elective, school, ai, + practice, + student, + errorBook, + audit, + scheduling, + coursePlans, + files, + users, + leave, + nav, ] = await Promise.all([ import(`@/shared/i18n/messages/${locale}/common.json`), import(`@/shared/i18n/messages/${locale}/auth.json`), @@ -61,6 +71,16 @@ export default getRequestConfig(async () => { import(`@/shared/i18n/messages/${locale}/elective.json`), import(`@/shared/i18n/messages/${locale}/school.json`), import(`@/shared/i18n/messages/${locale}/ai.json`), + import(`@/shared/i18n/messages/${locale}/practice.json`), + import(`@/shared/i18n/messages/${locale}/student.json`), + import(`@/shared/i18n/messages/${locale}/error-book.json`), + import(`@/shared/i18n/messages/${locale}/audit.json`), + import(`@/shared/i18n/messages/${locale}/scheduling.json`), + import(`@/shared/i18n/messages/${locale}/course-plans.json`), + import(`@/shared/i18n/messages/${locale}/files.json`), + import(`@/shared/i18n/messages/${locale}/users.json`), + import(`@/shared/i18n/messages/${locale}/leave.json`), + import(`@/shared/i18n/messages/${locale}/nav.json`), ]); return { @@ -86,6 +106,16 @@ export default getRequestConfig(async () => { elective: elective.default, school: school.default, ai: ai.default, + practice: practice.default, + student: student.default, + errorBook: errorBook.default, + audit: audit.default, + scheduling: scheduling.default, + coursePlans: coursePlans.default, + files: files.default, + users: users.default, + leave: leave.default, + nav: nav.default, }, }; }); diff --git a/src/shared/i18n/messages/en/ai.json b/src/shared/i18n/messages/en/ai.json index 20a2c8d..501cb16 100644 --- a/src/shared/i18n/messages/en/ai.json +++ b/src/shared/i18n/messages/en/ai.json @@ -142,7 +142,13 @@ "callsToday": "Calls today", "callsThisWeek": "Calls this week", "errorRate": "Error rate", - "avgDuration": "Avg duration" + "avgDuration": "Avg duration", + "settings": { + "title": "AI Settings", + "description": "Manage AI providers, API keys, and usage statistics.", + "descriptionAdmin": "Manage AI providers, API keys, and usage statistics (Admin view).", + "descriptionUser": "Manage your AI providers and API keys." + } }, "studyPath": { "title": "Your Learning Path", @@ -160,7 +166,18 @@ "title": "AI Assistant", "open": "Open AI Assistant", "close": "Close", - "contextAware": "Context-aware" + "contextAware": "Context-aware", + "dragHint": "Drag to move · Long press edge to hide", + "hidden": "Hidden", + "show": "Show", + "hide": "Hide", + "resetPosition": "Reset position", + "welcome": "Hi, I'm your AI Assistant", + "welcomeDesc": "How can I help you today?", + "newChat": "New chat", + "history": "History", + "online": "Online", + "tokens": "{count} chars" }, "safety": { "blocked": "Your message was blocked by the safety filter. Please keep the conversation educational.", diff --git a/src/shared/i18n/messages/en/attendance.json b/src/shared/i18n/messages/en/attendance.json index a450782..45f0cb6 100644 --- a/src/shared/i18n/messages/en/attendance.json +++ b/src/shared/i18n/messages/en/attendance.json @@ -49,6 +49,7 @@ "record": "Record Attendance", "stats": "Statistics", "save": "Save", + "retry": "Retry", "delete": "Delete", "cancel": "Cancel", "markAllPresent": "Mark All Present" diff --git a/src/shared/i18n/messages/en/audit.json b/src/shared/i18n/messages/en/audit.json new file mode 100644 index 0000000..e715b0f --- /dev/null +++ b/src/shared/i18n/messages/en/audit.json @@ -0,0 +1,12 @@ +{ + "title": "Audit Logs", + "description": "Track all user operations system-wide for security and compliance.", + "loginLogs": { + "title": "Login Logs", + "description": "Monitor all authentication events including sign-in, sign-out, and sign-up." + }, + "dataChanges": { + "title": "Data Change Logs", + "description": "Track all data changes (create, update, delete) for compliance." + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/en/common.json b/src/shared/i18n/messages/en/common.json index 83377c3..08f45f8 100644 --- a/src/shared/i18n/messages/en/common.json +++ b/src/shared/i18n/messages/en/common.json @@ -49,5 +49,23 @@ "next": "Next", "page": "Page {page}", "total": "{total} items" + }, + "accessDenied": "Access denied", + "accessDeniedDesc": "This resource is not available to your account.", + "somethingWentWrong": "Something went wrong", + "tryAgain": "Try again", + "user": { + "loading": "Loading...", + "notLoggedIn": "Not logged in", + "profile": "Profile", + "settings": "Settings", + "logout": "Log out" + }, + "sidebar": { + "collapse": "Collapse", + "toggleSidebar": "Toggle Sidebar" + }, + "breadcrumb": { + "home": "Home" } } diff --git a/src/shared/i18n/messages/en/course-plans.json b/src/shared/i18n/messages/en/course-plans.json new file mode 100644 index 0000000..46afd16 --- /dev/null +++ b/src/shared/i18n/messages/en/course-plans.json @@ -0,0 +1,16 @@ +{ + "title": "Course Plans", + "description": "Manage course teaching plans and weekly lesson arrangements.", + "detail": { + "title": "Course Plan Details", + "description": "View course plan details." + }, + "edit": { + "title": "Edit Course Plan", + "description": "Update course plan details." + }, + "create": { + "title": "Create Course Plan", + "description": "Create a new course teaching plan." + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/en/diagnostic.json b/src/shared/i18n/messages/en/diagnostic.json index a46d848..0960a7d 100644 --- a/src/shared/i18n/messages/en/diagnostic.json +++ b/src/shared/i18n/messages/en/diagnostic.json @@ -185,5 +185,20 @@ "noWeaknesses": "No weaknesses identified.", "reportMeta": "Period: {period} · Overall: {score}%", "historyReportMeta": "{date} · Overall: {score}%" + }, + "parent": { + "title": "Children Diagnostic", + "description": "View your children's knowledge point mastery and diagnostic reports.", + "noChildren": "No children linked", + "noChildrenDesc": "Your account is not linked to any children. Please contact the school administrator.", + "selectChild": "Select a child", + "selectChildPlaceholder": "Choose a child to view their diagnostic data", + "overallMastery": "Overall Mastery", + "knowledgePoints": "Knowledge Points", + "strengths": "Strengths", + "weaknesses": "Weaknesses", + "reports": "Diagnostic Reports", + "noReports": "No diagnostic reports for this child yet.", + "mastery": "Mastery" } } diff --git a/src/shared/i18n/messages/en/elective.json b/src/shared/i18n/messages/en/elective.json index fcd64ba..466734e 100644 --- a/src/shared/i18n/messages/en/elective.json +++ b/src/shared/i18n/messages/en/elective.json @@ -60,7 +60,8 @@ "select": "Select", "drop": "Drop", "cancel": "Cancel", - "save": "Save" + "save": "Save", + "retry": "Retry" }, "list": { "empty": "No elective courses", diff --git a/src/shared/i18n/messages/en/error-book.json b/src/shared/i18n/messages/en/error-book.json index 121f5ff..977f002 100644 --- a/src/shared/i18n/messages/en/error-book.json +++ b/src/shared/i18n/messages/en/error-book.json @@ -76,11 +76,33 @@ "parent": { "title": "Child Error Book", "description": "View your child's error statistics and learning progress", - "noChild": "No children linked" + "noChild": "No children linked", + "noChildDesc": "Your account is not linked to any children yet. Please contact the school administrator.", + "unknown": "Unknown", + "totalErrors": "Total Errors", + "dueReview": "Due Review", + "newItems": "New", + "mastered": "Mastered", + "mastery": "{rate}% Mastery", + "weakPoints": "Weak Knowledge Points", + "errorsAndMastery": "{count} errors \u00b7 {rate}% mastery" }, "admin": { "title": "School-wide Error Analysis", - "description": "School-wide error statistics and weak point analysis" + "description": "School-wide error statistics and weak point analysis", + "description2": "View school-wide error statistics and weak knowledge points by subject.", + "noPermissionTitle": "Insufficient Permissions", + "noPermissionDescription": "You do not have permission to view school-wide error analysis data.", + "noStudentsTitle": "No Student Data", + "noStudentsDescription": "No student users in the system. Unable to display error analysis.", + "topStudents": "Top 50 Students with Most Errors", + "studentsWithErrors": "{count} students with errors", + "noChapterDataTitle": "No Chapter Error Data", + "noChapterDataDescription": "Knowledge points have not been linked to chapters. Unable to display chapter-level statistics.", + "noKnowledgePointDataTitle": "No Knowledge Point Data", + "noKnowledgePointDataDescription": "Errors have not been linked to knowledge points. Unable to display weak point statistics.", + "noStudentErrorsTitle": "No Student Errors", + "noStudentErrorsDescription": "No student error data for the selected subject." }, "messages": { "added": "Error added", diff --git a/src/shared/i18n/messages/en/exam-homework.json b/src/shared/i18n/messages/en/exam-homework.json index e65234f..3833f7a 100644 --- a/src/shared/i18n/messages/en/exam-homework.json +++ b/src/shared/i18n/messages/en/exam-homework.json @@ -131,8 +131,9 @@ "description": "Manage assignments, view submission rates and grading progress.", "create": "Create Assignment", "empty": "No assignments yet", - "emptyFiltered": "No assignments in this class.", + "emptyFiltered": "No assignments match your filters", "emptyDescription": "You haven't created any assignments yet.", + "emptyFilteredDescription": "Try clearing filters or adjusting keywords.", "clearFilters": "Clear filters", "filterByClass": "Filter by class: {{className}}", "columns": { diff --git a/src/shared/i18n/messages/en/files.json b/src/shared/i18n/messages/en/files.json new file mode 100644 index 0000000..fe98e1f --- /dev/null +++ b/src/shared/i18n/messages/en/files.json @@ -0,0 +1,4 @@ +{ + "title": "File Management", + "description": "View and manage all uploaded files in the system." +} \ No newline at end of file diff --git a/src/shared/i18n/messages/en/grades.json b/src/shared/i18n/messages/en/grades.json index eb11be9..b0da111 100644 --- a/src/shared/i18n/messages/en/grades.json +++ b/src/shared/i18n/messages/en/grades.json @@ -229,6 +229,41 @@ "dismissAriaLabel": "Close entry guide" } }, + "batchByExam": { + "title": "Grade Entry by Exam Paper", + "selectExam": "Select Exam Paper", + "selectExamPlaceholder": "Please select an exam paper", + "selectClass": "Select Class", + "selectClassPlaceholder": "Please select a class", + "selectClassFirst": "Please select a class to start entry", + "guideSelectExam": "Select an exam paper from the library. The system will load the question list and full score automatically. Enter per-question scores and the total will be calculated automatically.", + "questionCount": "{count} questions", + "fullScore": "Full score: {score}", + "question": "Q{n}", + "points": "pts", + "totalScore": "Total", + "studentName": "Student", + "entered": "Entered", + "average": "Avg", + "max": "Max", + "min": "Min", + "searchStudent": "Search students...", + "noStudents": "No students in this class", + "invalidScoresBadge": "Invalid scores", + "invalidScoresError": "Invalid scores (exceed full score or wrong format), please check and retry", + "enterAtLeastOne": "Please enter at least one score", + "pasteApplied": "Pasted {count} rows", + "pasteHint": "Tip: Copy multiple rows/columns from Excel and paste to fill in bulk. Press Enter to go to next row, Tab to go to next cell.", + "confirmSwitchExam": "Switching exam will clear entered scores. Continue?", + "confirmSwitchClass": "Switching class will clear entered scores. Continue?", + "saveAll": "Save All Grades", + "saving": "Saving...", + "clear": "Clear", + "undo": "Undo", + "undoNoRecord": "No records to undo", + "undoExpired": "Undo expired (over 5 minutes)", + "undoFailed": "Undo failed, please retry" + }, "trend": { "title": "Grade Trend", "empty": "No grade records yet", @@ -249,7 +284,8 @@ "noGradesTitle": "No grades yet", "noGradesDescription": "There are no grade records for this student.", "noDataTitle": "No data", - "noDataDescription": "Student grade summary is not available." + "noDataDescription": "Student grade summary is not available.", + "recordCount": "{count} grade records" }, "empty": { "noRecords": "No grade records found.", @@ -344,11 +380,37 @@ "ariaLabelNonEmpty": "Ranking trend chart: {count} ranking records" }, "classReport": { + "caption": "Class ranking table", "noDataTitle": "No data", "noDataDescription": "No grade records found for this class.", "classRanking": "Class Ranking", "rankColumn": "Rank", "recordsColumn": "Records", "studentCountInfo": "{studentCount} students · {recordCount} grade records" + }, + "parent": { + "title": "Children Grades", + "description": "View your children's grade records.", + "noChildren": "No children linked", + "noChildrenDesc": "Your account is not linked to any children. Please contact the school administrator.", + "selectChild": "Select a child", + "selectChildPlaceholder": "Choose a child to view their grades", + "noGrades": "No grade records", + "noGradesDesc": "This child has no grade records yet.", + "subject": "Subject", + "score": "Score", + "exam": "Exam", + "semester": "Semester", + "teacher": "Teacher", + "date": "Date", + "average": "Average", + "highest": "Highest", + "lowest": "Lowest", + "totalRecords": "Total Records", + "gradeHistory": "Grade History", + "gradeSummary": "Grade Summary", + "recentGrades": "Recent Grades", + "viewAll": "View All", + "noRecentGrades": "No recent grades" } } diff --git a/src/shared/i18n/messages/en/leave.json b/src/shared/i18n/messages/en/leave.json new file mode 100644 index 0000000..3101b4c --- /dev/null +++ b/src/shared/i18n/messages/en/leave.json @@ -0,0 +1,12 @@ +{ + "title": "Leave Request", + "description": "Submit a leave request for your child.", + "backToDashboard": "Back to Dashboard", + "onlineLeave": "Online Leave Request", + "comingSoon": "Coming soon", + "comingSoonDesc": "The online leave request feature is being developed and will be available soon. For now, please contact the homeroom teacher or school office directly.", + "contactOptions": "Contact options", + "callOffice": "Call the school office during working hours", + "sendMessage": "Send a message to the homeroom teacher via the Messages page", + "goToMessages": "Go to Messages" +} \ No newline at end of file diff --git a/src/shared/i18n/messages/en/lesson-preparation.json b/src/shared/i18n/messages/en/lesson-preparation.json index f570ebc..be27dab 100644 --- a/src/shared/i18n/messages/en/lesson-preparation.json +++ b/src/shared/i18n/messages/en/lesson-preparation.json @@ -21,6 +21,12 @@ "confirm": "Confirm", "create": "Create Lesson Plan", "publish": "Publish as Homework", + "publishPlan": "Publish Lesson Plan", + "unpublishPlan": "Unpublish", + "publishPlanConfirm": "Students and parents will be able to view this lesson plan after publishing. Confirm?", + "unpublishPlanConfirm": "Students and parents will no longer be able to view this lesson plan after unpublishing. Confirm?", + "publishPlanSuccess": "Lesson plan published", + "unpublishPlanSuccess": "Lesson plan unpublished", "viewHomework": "View" }, "status": { @@ -57,6 +63,10 @@ "titlePlaceholder": "e.g., Autumn - Lesson 1", "blockCount": "{count} sections", "blankHint": "Start from scratch", + "systemSection": "System Templates", + "personalSection": "Personal Templates", + "personalBadge": "Personal", + "noPersonalTemplates": "No personal templates yet. Save one from the editor via \"Save as Template\".", "names": { "tpl_regular": "Regular Lesson", "tpl_review": "Review Lesson", @@ -101,12 +111,51 @@ "textbookContent": "Textbook Content", "textbookContentMissing": "Content node missing", "textbookContentEmpty": "(No content loaded)", + "textbookOperateHint": "Operate directly on the canvas: select text to create a range anchor, or click a position to create a point anchor.", + "rightClickHint": "Right-click for anchor menu", + "dragToResize": "Drag to resize", + "anchorListTitle": "Anchor List", + "anchorListEmpty": "No anchors yet. Select text in the content to create one.", + "anchorRangeLabel": "Range", + "anchorPointLabel": "Point", "zoomIn": "Zoom In", "zoomOut": "Zoom Out", "rangeAnchorTitle": "Link selection to a node", - "pointAnchorTitle": "Insert placeholder {number} here", + "pointAnchorTitle": "Insert placeholder at this position {number}", "anchorToSelectedNode": "Link to selected node", - "anchorToNewNode": "Link to a new node" + "anchorToNewNode": "Link to a new node", + "textbookLabel": "Textbook", + "chapterLabel": "Chapter", + "selectNodeForAnchor": "Select a node to link", + "createNewNode": "Create and link a new node" + }, + "readonly": { + "title": "View Lesson Plan", + "hint": "This is a read-only view. You cannot edit this lesson plan.", + "notFound": "Lesson plan not found or not published", + "notPublished": "Lesson plan is not published yet" + }, + "student": { + "title": "My Lesson Plans", + "description": "View lesson plans published by your teachers" + }, + "parent": { + "title": "Child's Lesson Plans", + "description": "View lesson plans published by your child's teachers" + }, + "admin": { + "title": "Lesson Plan Management", + "description": "View lesson plans across the school", + "stats": { + "total": "Total Plans", + "published": "Published", + "draft": "Draft", + "archived": "Archived" + } + }, + "gradeHead": { + "title": "Grade Lesson Plans", + "description": "View lesson plans from teachers in your grade" }, "picker": { "textbookLabel": "Select Textbook", @@ -133,7 +182,10 @@ "noChapter": "No chapter", "noTemplate": "No template", "lastSaved": "Last saved: ", - "neverSaved": "Never saved" + "neverSaved": "Never saved", + "versionCount": "{count} versions", + "versionSelectorLabel": "Version", + "versionCurrent": "Latest" }, "version": { "title": "Version History", @@ -145,7 +197,8 @@ "revertTitle": "Confirm Revert", "revertConfirm": "Revert to v{versionNo}? A new version will be created.", "revertSuccess": "Reverted to v{versionNo}", - "autoLabel": "Auto version" + "autoLabel": "Auto version", + "revertLabel": "Revert to v{versionNo}" }, "knowledgePoint": { "title": "Select Knowledge Points", @@ -212,7 +265,9 @@ "noExerciseBlock": "Exercise block not found", "noQuestions": "No questions in exercise block", "planNotFound": "Lesson plan not found", - "noPermission": "No permission to publish" + "noPermission": "No permission to publish", + "homeworkTitle": "{title} - Homework", + "homeworkDescription": "From lesson plan" }, "textStudy": { "sourceTextLabel": "Source Text", @@ -222,8 +277,86 @@ "annotationTitle": "Teaching Node", "annotationNotePlaceholder": "Teaching notes..." }, + "objective": { + "hint": "Add learning objectives across knowledge, process, and emotional dimensions", + "dimension": { + "knowledge": "Knowledge & Skills", + "process": "Process & Methods", + "emotion": "Emotional Attitudes" + }, + "textPlaceholder": "Enter learning objective...", + "addItem": "+ Add Objective" + }, + "keyPoint": { + "hint": "Mark key and difficult points of this lesson", + "type": { + "key": "Key Point", + "difficult": "Difficult Point" + }, + "textPlaceholder": "Enter key/difficult point...", + "addItem": "+ Add Point" + }, + "newTeaching": { + "hint": "Design teaching steps for the new lesson", + "pointIndex": "Step {index}", + "outlineLabel": "Teaching Outline", + "outlinePlaceholder": "Enter teaching outline...", + "boardNotesLabel": "Board Notes", + "boardNotesPlaceholder": "Enter board notes...", + "addPoint": "+ Add Step" + }, + "summary": { + "hint": "Summarize key points to help students review", + "pointPlaceholder": "Enter summary point...", + "addPoint": "+ Add Point", + "homeworkPreviewLabel": "Homework Preview", + "homeworkPreviewPlaceholder": "Briefly describe homework..." + }, + "homework": { + "hint": "Assign homework", + "type": { + "exercise": "Exercise", + "reading": "Reading", + "writing": "Writing" + }, + "refIdPlaceholder": "Homework ref ID (optional)", + "descriptionPlaceholder": "Enter homework requirements...", + "addItem": "+ Add Homework" + }, + "blackboard": { + "hint": "Design board layout", + "layoutLabel": "Board Layout", + "layout": { + "structure": "Structured", + "mindmap": "Mind Map", + "text": "Text-based" + }, + "contentLabel": "Board Content", + "contentPlaceholder": "Enter board content..." + }, + "import": { + "hint": "Design lesson introduction", + "methodLabel": "Introduction Method", + "method": { + "question": "Question-based", + "situation": "Scenario-based", + "review": "Review-based", + "other": "Other" + }, + "promptLabel": "Introduction Script", + "promptPlaceholder": "Enter introduction script...", + "durationLabel": "Estimated Duration", + "durationUnit": "min" + }, "reflection": { - "hint": "Write teaching reflection after class..." + "hint": "Write teaching reflection after class...", + "aspect": { + "effectiveness": "Effectiveness", + "problems": "Problems", + "improvements": "Improvements" + }, + "textPlaceholder": "Enter reflection...", + "addItem": "+ Add Reflection" }, "richText": { "placeholder": "Enter content..." @@ -250,7 +383,14 @@ "createFailed": "Creation failed", "loadFailed": "Page load failed", "loadFailedDesc": "Sorry, an unexpected error occurred. Please try again later.", - "retry": "Retry" + "retry": "Retry", + "invalidQuestionType": "Invalid question type", + "duplicateSuffix": " - Copy", + "titleRequired": "Title is required", + "titleTooLong": "Title cannot exceed 255 characters", + "templateRequired": "Please select a template", + "invalidDate": "Invalid date format", + "classRequired": "At least one class is required" }, "confirm": { "archive": "Archive this lesson plan?", diff --git a/src/shared/i18n/messages/en/nav.json b/src/shared/i18n/messages/en/nav.json new file mode 100644 index 0000000..dd4e32c --- /dev/null +++ b/src/shared/i18n/messages/en/nav.json @@ -0,0 +1,93 @@ +{ + "common": { + "announcements": "Announcements", + "messages": "Messages", + "aiSettings": "AI Settings" + }, + "admin": { + "dashboard": "Dashboard", + "schoolManagement": "School Management", + "schools": "Schools", + "grades": "Grades", + "gradeInsights": "Grade Insights", + "departments": "Departments", + "classes": "Classes", + "academicYear": "Academic Year", + "users": "Users", + "userList": "User List", + "importUsers": "Import Users", + "teaching": "Teaching", + "coursePlans": "Course Plans", + "electives": "Electives", + "scheduling": "Scheduling", + "rules": "Rules", + "autoSchedule": "Auto Schedule", + "changeRequests": "Change Requests", + "attendance": "Attendance", + "announcements": "Announcements", + "files": "File Management", + "errorBook": "Error Book Analytics", + "lessonPlans": "Lesson Plans", + "auditLogs": "Audit Logs", + "operationLogs": "Operation Logs", + "loginLogs": "Login Logs", + "dataChanges": "Data Changes", + "settings": "Settings" + }, + "teacher": { + "dashboard": "Dashboard", + "textbooks": "Textbooks", + "exams": "Exams", + "allExams": "All Exams", + "createExam": "Create Exam", + "homework": "Homework", + "homeworkList": "Homework List", + "submissions": "Submissions", + "grades": "Grades", + "allGrades": "All Grades", + "batchEntry": "Batch Entry", + "gradeStats": "Grade Statistics", + "gradeAnalytics": "Grade Analytics", + "questions": "Question Bank", + "classManagement": "Class Management", + "myClasses": "My Classes", + "students": "Students", + "schedule": "Schedule", + "coursePlans": "Course Plans", + "lessonPlans": "My Lesson Plans", + "attendance": "Attendance", + "attendanceRecords": "Attendance Records", + "attendanceEntry": "Record Attendance", + "attendanceStats": "Attendance Statistics", + "scheduleChanges": "Schedule Changes", + "diagnostic": "Diagnostic", + "errorBook": "Error Book Analytics", + "electives": "Electives", + "gradeManagement": "Grade Management", + "gradeClasses": "Grade Classes", + "gradeDashboard": "Grade Dashboard", + "gradeInsights": "Grade Insights" + }, + "student": { + "dashboard": "Dashboard", + "myLearning": "My Learning", + "courses": "Courses", + "assignments": "Assignments", + "textbooks": "Textbooks", + "schedule": "Schedule", + "myGrades": "My Grades", + "lessonPlans": "My Lesson Plans", + "attendance": "Attendance", + "diagnostic": "Diagnostic", + "errorBook": "Error Book", + "electives": "Electives" + }, + "parent": { + "dashboard": "Dashboard", + "grades": "Grades", + "lessonPlans": "Child's Lesson Plans", + "attendance": "Attendance", + "errorBook": "Error Book", + "leaveRequest": "Leave Request" + } +} diff --git a/src/shared/i18n/messages/en/practice.json b/src/shared/i18n/messages/en/practice.json new file mode 100644 index 0000000..8e7fb49 --- /dev/null +++ b/src/shared/i18n/messages/en/practice.json @@ -0,0 +1,163 @@ +{ + "page": { + "title": "Targeted Practice", + "description": "Smart question generation based on errors, knowledge points, and weak chapters for targeted improvement." + }, + "starter": { + "title": "Start Targeted Practice", + "description": "Choose a practice mode based on your learning progress", + "type": "Practice Type", + "knowledgePoints": "Select Knowledge Points", + "difficulty": "Difficulty", + "anyDifficulty": "Any", + "questionCount": "Question Count", + "start": "Start Practice", + "creating": "Creating..." + }, + "session": { + "progress": "Progress", + "previous": "Previous", + "next": "Next", + "submit": "Submit", + "submitting": "Submitting...", + "skip": "Skip", + "complete": "Complete", + "abandon": "Abandon", + "abandonConfirm": "Are you sure you want to abandon this practice?", + "abandonDescription": "Answered questions will be saved, but this session won't count as completed.", + "cancel": "Cancel", + "confirmAbandon": "Confirm Abandon", + "question": "Question", + "difficulty": "Difficulty", + "variant": "Variant", + "correct": "Correct", + "incorrect": "Incorrect", + "pendingReview": "Pending Review", + "skipped": "Skipped", + "yourAnswer": "Your Answer", + "true": "True", + "false": "False", + "textPlaceholder": "Enter your answer...", + "empty": "No questions in this session" + }, + "result": { + "title": "Practice Complete", + "answered": "Answered", + "correct": "Correct", + "accuracy": "Accuracy", + "review": "Question Review" + }, + "history": { + "title": "Practice History", + "empty": "No practice records yet. Start your first targeted practice!" + }, + "toasts": { + "created": "Practice created", + "createFailed": "Failed to create", + "selectKnowledgePoint": "Please select at least one knowledge point", + "selectWeakKnowledgePoint": "Please select at least one weak knowledge point", + "aiRecommendedReason": "Student-initiated AI recommended practice", + "submitted": "Submitted", + "submitFailed": "Submit failed", + "completed": "Practice completed", + "completeFailed": "Failed to complete", + "abandoned": "Practice abandoned", + "abandonFailed": "Operation failed" + }, + "stats": { + "totalSessions": "Total Sessions", + "completed": "Completed", + "totalAnswered": "Total Answered", + "accuracy": "Accuracy" + }, + "types": { + "error_variant": "Error Variant", + "knowledge_point": "Knowledge Point", + "weak_chapter": "Weak Chapter", + "ai_recommended": "AI Recommended" + }, + "status": { + "in_progress": "In Progress", + "completed": "Completed", + "abandoned": "Abandoned" + }, + "teacher": { + "title": "Practice Analytics", + "description": "View class practice stats, identify weak knowledge points, and support targeted teaching", + "noClass": "No classes available", + "noClassDescription": "You haven't been assigned to any class, so practice analytics are unavailable.", + "noStudent": "No students in class", + "noStudentDescription": "There are no students in the class, so practice analytics are unavailable.", + "noData": "No practice data", + "noDataDescription": "Students in the selected scope haven't started targeted practice yet.", + "overview": { + "totalClasses": "Classes", + "totalSessions": "Total Sessions", + "totalAnswered": "Total Answered", + "averageAccuracy": "Avg Accuracy", + "participationRate": "Participation" + }, + "classComparison": { + "title": "Class Practice Comparison", + "className": "Class", + "totalStudents": "Students", + "activeStudents": "Active", + "participationRate": "Participation", + "totalSessions": "Sessions", + "completedSessions": "Completed", + "totalAnswered": "Answered", + "averageAccuracy": "Accuracy" + }, + "typeBreakdown": { + "title": "Practice Type Breakdown", + "description": "Session count and accuracy grouped by practice type" + }, + "knowledgePointWeakness": { + "title": "Knowledge Point Weakness", + "description": "Weak knowledge points identified from practice answers", + "knowledgePoint": "Knowledge Point", + "totalAnswers": "Answers", + "wrongAnswers": "Wrong", + "errorRate": "Error Rate", + "noData": "No knowledge point data", + "noDataDescription": "Practice questions aren't linked to knowledge points, so weakness stats are unavailable." + }, + "studentRanking": { + "title": "Student Practice Ranking", + "description": "Sorted by session count to identify active and at-risk students", + "rank": "Rank", + "student": "Student", + "totalSessions": "Sessions", + "completedSessions": "Completed", + "totalAnswered": "Answered", + "accuracy": "Accuracy", + "lastPractice": "Last Practice" + }, + "inactiveStudents": { + "title": "Inactive Students", + "description": "These students haven't started any practice. Consider reaching out.", + "empty": "All students have participated in practice", + "studentCount": "Inactive Count" + } + }, + "grade": { + "title": "Grade Practice Overview", + "description": "Compare practice participation and quality across classes to support grade-level decisions", + "noGrade": "No grades managed", + "noGradeDescription": "You haven't been assigned to manage any grade, so grade practice data is unavailable.", + "overview": { + "totalClasses": "Classes", + "totalStudents": "Students", + "activeStudents": "Active", + "participationRate": "Participation", + "totalSessions": "Total Sessions", + "completedSessions": "Completed", + "totalAnswered": "Total Answered", + "averageAccuracy": "Avg Accuracy" + }, + "classComparison": { + "title": "Class Practice Comparison", + "description": "Sorted by participation rate to identify active and underperforming classes" + } + } +} diff --git a/src/shared/i18n/messages/en/scheduling.json b/src/shared/i18n/messages/en/scheduling.json new file mode 100644 index 0000000..8bacd57 --- /dev/null +++ b/src/shared/i18n/messages/en/scheduling.json @@ -0,0 +1,30 @@ +{ + "rules": { + "title": "Scheduling Rules", + "description": "Configure daily lesson limits, break windows, and balance preferences.", + "noClassesTitle": "No available classes", + "noClassesDescription": "Please create classes before configuring scheduling rules.", + "hint": "Rules saved without selecting a specific class will be used as global defaults." + }, + "auto": { + "title": "Auto Scheduling", + "description": "Auto-generate weekly schedules based on rules and subject allocation.", + "configureRules": "Configure Rules", + "noClassesTitle": "No available classes", + "noClassesDescription": "Please create classes before running auto scheduling.", + "hint": "Applying a new schedule will replace the current schedule for the selected classes." + }, + "changes": { + "title": "Schedule Change Requests", + "description": "Review, approve, or reject schedule changes and substitute requests.", + "newRequest": "New Request", + "noChangesTitle": "No schedule change requests", + "noChangesDescription": "No schedule change requests have been submitted yet.", + "conflictDetection": "Conflict Detection", + "conflictDetectionDescription": "Detect time overlaps in existing class schedules.", + "noClassesTitle": "No available classes", + "noClassesDescription": "Please create classes before running conflict detection.", + "scheduleGrid": "Schedule Grid", + "scheduleGridDescription": "View current schedule distribution by class." + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/en/school.json b/src/shared/i18n/messages/en/school.json index c69aa0d..b6f2f32 100644 --- a/src/shared/i18n/messages/en/school.json +++ b/src/shared/i18n/messages/en/school.json @@ -130,6 +130,129 @@ "selectSchool": "Select a school", "success": "Successfully promoted {count} grades", "failed": "Promotion failed" + }, + "gradeInsights": { + "title": "Grade Insights", + "description": "Grade-level homework statistics and class rankings.", + "manageGrades": "Manage Grades", + "selectGrade": "All Grades", + "selectToView": "Select a grade to view insights", + "selectToViewDescription": "Pick a grade to see latest homework and historical score statistics.", + "notFound": "Grade not found", + "notFoundDescription": "This grade may not exist or has no accessible data.", + "noData": "No homework data for this grade", + "noDataDescription": "No homework assignments were targeted to students in this grade yet.", + "classes": "Classes", + "students": "Students", + "overallAvg": "Overall Avg", + "latestAvg": "Latest Avg", + "homeworkTimeline": "Homework timeline", + "classRanking": "Class ranking", + "assignment": "Assignment", + "status": "Status", + "created": "Created", + "targeted": "Targeted", + "submitted": "Submitted", + "graded": "Graded", + "avg": "Avg", + "median": "Median", + "class": "Class", + "latestAvgCol": "Latest Avg", + "prevAvg": "Prev Avg", + "delta": "Δ", + "overallAvgCol": "Overall Avg", + "active": "Active", + "inactive": "Inactive" + }, + "gradeOverview": { + "title": "Grade Overview", + "classCount": "Classes", + "studentCount": "Students", + "teacherCount": "Teachers", + "avgScore": "Avg Score", + "passRate": "Pass Rate", + "noGrades": "No grades", + "noGradesDescription": "Create a grade to manage heads and classes.", + "viewInsights": "View Insights", + "manageClasses": "Manage Classes", + "gradeHead": "Grade Head", + "teachingHead": "Teaching Head", + "notSet": "Not set" + }, + "gradeDashboard": { + "title": "Grade Dashboard", + "description": "Comprehensive view of grade score distribution, homework completion, exams, and textbook progress.", + "selectGrade": "Select grade", + "selectToView": "Select a grade to view dashboard", + "selectToViewDescription": "Choose a grade to view score distribution, homework, exams, and textbook progress.", + "noData": "No data", + "noDataDescription": "No relevant data for this grade yet.", + "tabs": { + "distribution": "Score Distribution", + "homework": "Homework", + "exams": "Exams", + "progress": "Textbook Progress" + }, + "distribution": { + "overallStats": "Overall Stats", + "byClass": "By Class", + "totalRecords": "Total Records", + "averageScore": "Average", + "passRate": "Pass Rate", + "excellentRate": "Excellent Rate", + "scoreBuckets": "Score Buckets", + "students": "Students", + "class": "Class", + "count": "Count", + "bucket90": "90-100", + "bucket80": "80-89", + "bucket70": "70-79", + "bucket60": "60-69", + "bucketBelow60": "0-59" + }, + "homework": { + "totalAssignments": "Total Assignments", + "totalSubmissions": "Total Submissions", + "avgSubmissionRate": "Avg Submission Rate", + "gradedRate": "Graded Rate", + "assignmentList": "Assignment List", + "classComparison": "Class Comparison", + "completionRate": "Completion Rate", + "submitted": "Submitted", + "graded": "Graded", + "targeted": "Targeted" + }, + "exams": { + "totalExams": "Total Exams", + "published": "Published", + "draft": "Draft", + "totalSubmissions": "Total Submissions", + "gradedRate": "Graded Rate", + "examList": "Exam List", + "subject": "Subject", + "status": "Status", + "scheduledAt": "Scheduled At", + "submissions": "Submissions", + "graded": "Graded", + "avgScore": "Avg Score", + "createdAt": "Created At" + }, + "progress": { + "overallProgress": "Overall Progress", + "totalPlans": "Total Plans", + "totalHours": "Total Hours", + "completedHours": "Completed Hours", + "activePlans": "Active", + "completedPlans": "Completed", + "progressMatrix": "Progress Matrix", + "class": "Class", + "subject": "Subject", + "teacher": "Teacher", + "progress": "Progress", + "completedHoursCol": "Completed/Total Hours", + "items": "Items", + "status": "Status" + } } }, "departments": { diff --git a/src/shared/i18n/messages/en/settings.json b/src/shared/i18n/messages/en/settings.json index 766d8a9..e00fb10 100644 --- a/src/shared/i18n/messages/en/settings.json +++ b/src/shared/i18n/messages/en/settings.json @@ -217,6 +217,16 @@ "apiKeyPlaceholder": "Paste new key to replace", "apiKeyDesc": "Existing key won't be displayed. Leave blank to keep current.", "setDefault": "Set as default", + "visibility": "Visibility", + "visibilityDesc": "Public providers are published by admins and available to everyone; private providers are only visible to the creator.", + "visibilityPublic": "Public", + "visibilityPrivate": "Private", + "visibilityPublicLabel": "Public (available to everyone)", + "visibilityPrivateLabel": "Private (only visible to you)", + "visibilityReadOnly": "Only admins can change visibility", + "badgePublic": "Public", + "badgePrivate": "Private", + "badgeOwner": "Mine", "test": "Test", "testing": "Testing...", "save": "Save Changes", diff --git a/src/shared/i18n/messages/en/student.json b/src/shared/i18n/messages/en/student.json new file mode 100644 index 0000000..f74a86f --- /dev/null +++ b/src/shared/i18n/messages/en/student.json @@ -0,0 +1,105 @@ +{ + "schedule": { + "title": "My Schedule", + "description": "View your weekly timetable.", + "noUser": "No user found", + "noUserDesc": "Create a student user to see schedule." + }, + "courses": { + "title": "My Courses", + "description": "View your enrolled classes.", + "noUser": "No user found", + "noUserDesc": "Create a student user to see courses." + }, + "scheduleView": { + "noSchedule": "No schedule", + "noScheduleDesc": "No timetable entries found for your enrolled classes.", + "today": "Today", + "noClasses": "No classes." + }, + "scheduleFilters": { + "allClasses": "All classes", + "selectClass": "Select class" + }, + "coursesView": { + "active": "Active", + "details": "Details", + "schedule": "Schedule", + "assignments": "Assignments", + "noCourses": "No courses yet", + "noCoursesDesc": "You are not enrolled in any classes. Join a class below to get started.", + "joinClass": "Join a Class", + "joinClassDesc": "Enter the invitation code provided by your teacher to enroll.", + "invitationCode": "Invitation Code", + "invitationCodePlaceholder": "Enter 6-digit code", + "joining": "Joining...", + "joinButton": "Join Class", + "joinedSuccess": "Joined class", + "joinFailed": "Failed to join class", + "grade": "Grade {grade}", + "room": "Room {room}" + }, + "courseFilters": { + "searchPlaceholder": "Search by class name, teacher, school..." + }, + "learning": { + "title": "My Learning", + "description": "Your learning hub: courses, assignments, and textbooks.", + "noUser": "No user found", + "noUserDesc": "Create a student user to see learning.", + "courses": "Courses", + "coursesDesc": "Your enrolled classes.", + "enrolled": "{count} enrolled", + "assignments": "Assignments", + "assignmentsDesc": "Homework and practice.", + "pending": "{count} pending", + "dueSoon": " · {count} due soon", + "textbooks": "Textbooks", + "textbooksDesc": "Browse course materials.", + "available": "{count} available" + }, + "errorBook": { + "title": "Error Book", + "description": "Automatically collect wrong answers from exams and homework, review scientifically, and overcome weak points." + }, + "diagnostic": { + "title": "My Diagnostic", + "description": "Your knowledge point mastery analysis and diagnostic reports." + }, + "error": { + "title": "Something went wrong", + "description": "An unexpected error occurred. Please try again.", + "retry": "Try again" + }, + "classDetail": { + "backToCourses": "Back to Courses", + "grade": "Grade {grade}", + "room": "Room {room}", + "active": "Active", + "fullSchedule": "Full Schedule", + "assignments": "Assignments", + "teacher": "Teacher", + "noTeacher": "No teacher assigned.", + "school": "School", + "schoolNotAvailable": "School info not available.", + "classroom": "Classroom", + "roomNotAssigned": "Room not assigned.", + "homeroom": "Homeroom: {homeroom}", + "classSchedule": "Class Schedule", + "noSchedule": "No schedule", + "noScheduleDesc": "No timetable entries found for this class." + }, + "weekdays": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "assignment": { + "due": "Due: {date}", + "maxAttempts": "Max Attempts: {count}" + } +} diff --git a/src/shared/i18n/messages/en/users.json b/src/shared/i18n/messages/en/users.json new file mode 100644 index 0000000..d6d5ca7 --- /dev/null +++ b/src/shared/i18n/messages/en/users.json @@ -0,0 +1,44 @@ +{ + "title": "User Management", + "description": "Manage all system users.", + "import": { + "title": "Batch Import Users", + "description": "Batch create user accounts via Excel file.", + "back": "Back", + "subtitle": "Batch create user accounts and automatically assign students to classes.", + "instructionsTitle": "Import Guide", + "instructionsDescription": "Steps to batch import users via Excel", + "step1": "Click the 'Batch Import Users' button to download the import template.", + "step2": "Fill in user information (name, email, role, phone, class invite code) following the template format.", + "step3": "Upload the completed Excel file. The system will parse and preview the data.", + "step4": "Confirm the preview data is correct, then click 'Confirm Import' to complete batch creation.", + "notesTitle": "Important Notes", + "notesDescription": "Please read carefully before importing", + "note1": "Default password is set for all users. Please remind users to change it after first login.", + "note2": "Email must be unique. Duplicate emails will be skipped and recorded in the error report.", + "note3": "Available roles: admin / teacher / student / parent / grade_head / teaching_head.", + "note4": "Class invite code is only valid for student role. Students will be automatically added to the corresponding class.", + "note5": "Maximum file size is 10MB. Recommended no more than 500 records per import.", + "note6": "After import, the success count, failure count, and detailed error information will be displayed.", + "templateTitle": "Template Field Guide", + "templateDescription": "Excel template column meanings and requirements", + "columnName": "Column Name", + "columnRequired": "Required", + "columnDescription": "Description", + "fieldName": "Name", + "fieldNameRequired": "Required", + "fieldNameDescription": "User name", + "fieldEmail": "Email", + "fieldEmailRequired": "Required", + "fieldEmailDescription": "Login account, must be valid email format and unique", + "fieldRole": "Role", + "fieldRoleRequired": "Required", + "fieldRoleDescription": "admin / teacher / student / parent / grade_head / teaching_head", + "fieldPhone": "Phone", + "fieldPhoneRequired": "Optional", + "fieldPhoneDescription": "Contact phone number", + "fieldInviteCode": "Class Invite Code", + "fieldInviteCodeRequired": "Optional", + "fieldInviteCodeDescription": "Only valid for student role, 6-digit invite code" + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/zh-CN/ai.json b/src/shared/i18n/messages/zh-CN/ai.json index 56ad056..53a8d18 100644 --- a/src/shared/i18n/messages/zh-CN/ai.json +++ b/src/shared/i18n/messages/zh-CN/ai.json @@ -142,7 +142,13 @@ "callsToday": "今日调用", "callsThisWeek": "本周调用", "errorRate": "错误率", - "avgDuration": "平均耗时" + "avgDuration": "平均耗时", + "settings": { + "title": "AI 配置", + "description": "统一管理 AI 服务商、API 密钥与使用统计。", + "descriptionAdmin": "统一管理 AI 服务商、API 密钥与使用统计(管理员视图)。", + "descriptionUser": "管理你的 AI 服务商与 API 密钥。" + } }, "studyPath": { "title": "你的学习路径", @@ -160,7 +166,18 @@ "title": "AI 助手", "open": "打开 AI 助手", "close": "关闭", - "contextAware": "上下文感知" + "contextAware": "上下文感知", + "dragHint": "拖动移动 · 长按边缘隐藏", + "hidden": "已隐藏", + "show": "显示", + "hide": "隐藏", + "resetPosition": "重置位置", + "welcome": "你好,我是 AI 助手", + "welcomeDesc": "有什么可以帮你的吗?", + "newChat": "新对话", + "history": "历史记录", + "online": "在线", + "tokens": "{count} 字" }, "safety": { "blocked": "您的消息被安全过滤器拦截,请保持教育性对话。", diff --git a/src/shared/i18n/messages/zh-CN/attendance.json b/src/shared/i18n/messages/zh-CN/attendance.json index 981be1e..bd49f5d 100644 --- a/src/shared/i18n/messages/zh-CN/attendance.json +++ b/src/shared/i18n/messages/zh-CN/attendance.json @@ -49,6 +49,7 @@ "record": "录入考勤", "stats": "统计分析", "save": "保存", + "retry": "重试", "delete": "删除", "cancel": "取消", "markAllPresent": "全部标记到场" diff --git a/src/shared/i18n/messages/zh-CN/audit.json b/src/shared/i18n/messages/zh-CN/audit.json new file mode 100644 index 0000000..b98c980 --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/audit.json @@ -0,0 +1,12 @@ +{ + "title": "审计日志", + "description": "追踪系统内所有用户操作,保障安全与合规。", + "loginLogs": { + "title": "登录日志", + "description": "监控所有认证事件,包括登录、登出与注册。" + }, + "dataChanges": { + "title": "数据变更日志", + "description": "追踪系统所有数据变更(增删改),保障合规。" + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/zh-CN/common.json b/src/shared/i18n/messages/zh-CN/common.json index 5ef6805..52c7fc2 100644 --- a/src/shared/i18n/messages/zh-CN/common.json +++ b/src/shared/i18n/messages/zh-CN/common.json @@ -49,5 +49,23 @@ "next": "下一页", "page": "第 {page} 页", "total": "共 {total} 条" + }, + "accessDenied": "访问被拒绝", + "accessDeniedDesc": "该资源对您的账号不可用。", + "somethingWentWrong": "出了点问题", + "tryAgain": "重试", + "user": { + "loading": "加载中...", + "notLoggedIn": "未登录", + "profile": "个人资料", + "settings": "设置", + "logout": "退出登录" + }, + "sidebar": { + "collapse": "收起", + "toggleSidebar": "切换侧边栏" + }, + "breadcrumb": { + "home": "首页" } } diff --git a/src/shared/i18n/messages/zh-CN/course-plans.json b/src/shared/i18n/messages/zh-CN/course-plans.json new file mode 100644 index 0000000..864b21c --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/course-plans.json @@ -0,0 +1,16 @@ +{ + "title": "课程计划", + "description": "管理课程教学计划与周课时安排。", + "detail": { + "title": "课程计划详情", + "description": "查看课程计划详情。" + }, + "edit": { + "title": "编辑课程计划", + "description": "更新课程计划详情。" + }, + "create": { + "title": "新建课程计划", + "description": "创建新的课程教学计划。" + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/zh-CN/diagnostic.json b/src/shared/i18n/messages/zh-CN/diagnostic.json index 1aac58b..49211f4 100644 --- a/src/shared/i18n/messages/zh-CN/diagnostic.json +++ b/src/shared/i18n/messages/zh-CN/diagnostic.json @@ -185,5 +185,20 @@ "noWeaknesses": "暂无弱项知识点。", "reportMeta": "周期:{period} · 总体:{score}%", "historyReportMeta": "{date} · 总体:{score}%" + }, + "parent": { + "title": "子女学情诊断", + "description": "查看子女的知识点掌握度与诊断报告。", + "noChildren": "暂无子女关联", + "noChildrenDesc": "您的账号尚未关联子女,请联系学校管理员进行关联。", + "selectChild": "选择子女", + "selectChildPlaceholder": "请选择要查看学情诊断的子女", + "overallMastery": "总体掌握度", + "knowledgePoints": "知识点", + "strengths": "强项", + "weaknesses": "弱项", + "reports": "诊断报告", + "noReports": "该子女暂无诊断报告。", + "mastery": "掌握度" } } diff --git a/src/shared/i18n/messages/zh-CN/elective.json b/src/shared/i18n/messages/zh-CN/elective.json index f378f5e..18b4cae 100644 --- a/src/shared/i18n/messages/zh-CN/elective.json +++ b/src/shared/i18n/messages/zh-CN/elective.json @@ -60,7 +60,8 @@ "select": "选课", "drop": "退课", "cancel": "取消", - "save": "保存" + "save": "保存", + "retry": "重试" }, "list": { "empty": "暂无选修课程", diff --git a/src/shared/i18n/messages/zh-CN/error-book.json b/src/shared/i18n/messages/zh-CN/error-book.json index ccc4d18..3927816 100644 --- a/src/shared/i18n/messages/zh-CN/error-book.json +++ b/src/shared/i18n/messages/zh-CN/error-book.json @@ -76,11 +76,33 @@ "parent": { "title": "子女错题本", "description": "查看子女的错题情况与学习进度", - "noChild": "暂无子女关联" + "noChild": "暂无子女关联", + "noChildDesc": "您的账号尚未关联子女,请联系学校管理员进行关联。", + "unknown": "未知", + "totalErrors": "错题总数", + "dueReview": "待复习", + "newItems": "待学习", + "mastered": "已掌握", + "mastery": "{rate}% 掌握", + "weakPoints": "薄弱知识点", + "errorsAndMastery": "{count} 错 · {rate}% 掌握" }, "admin": { "title": "全校错题分析", - "description": "全校错题统计与薄弱知识点分析,辅助教学决策" + "description": "全校错题统计与薄弱知识点分析,辅助教学决策", + "description2": "按学科查看全校学生的错题统计与薄弱知识点。", + "noPermissionTitle": "权限不足", + "noPermissionDescription": "您没有权限查看全校错题分析数据。", + "noStudentsTitle": "暂无学生数据", + "noStudentsDescription": "系统中还没有学生用户,无法查看错题分析。", + "topStudents": "错题最多的学生 Top 50", + "studentsWithErrors": "共 {count} 名学生有错题", + "noChapterDataTitle": "暂无章节错题数据", + "noChapterDataDescription": "尚未关联知识点到章节,无法显示章节维度统计。", + "noKnowledgePointDataTitle": "暂无知识点数据", + "noKnowledgePointDataDescription": "错题尚未关联知识点,无法显示薄弱知识点统计。", + "noStudentErrorsTitle": "暂无学生错题", + "noStudentErrorsDescription": "所选学科下没有学生错题数据。" }, "messages": { "added": "错题已添加", diff --git a/src/shared/i18n/messages/zh-CN/exam-homework.json b/src/shared/i18n/messages/zh-CN/exam-homework.json index 66620d8..5608654 100644 --- a/src/shared/i18n/messages/zh-CN/exam-homework.json +++ b/src/shared/i18n/messages/zh-CN/exam-homework.json @@ -131,8 +131,9 @@ "description": "管理作业,查看提交率与批改进度。", "create": "创建作业", "empty": "暂无作业", - "emptyFiltered": "该班级还没有作业。", + "emptyFiltered": "没有匹配筛选条件的作业", "emptyDescription": "您还没有创建任何作业。", + "emptyFilteredDescription": "尝试清除筛选条件或调整关键词。", "clearFilters": "清除筛选", "filterByClass": "按班级筛选:{{className}}", "columns": { diff --git a/src/shared/i18n/messages/zh-CN/files.json b/src/shared/i18n/messages/zh-CN/files.json new file mode 100644 index 0000000..d9f0ee0 --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/files.json @@ -0,0 +1,4 @@ +{ + "title": "文件管理", + "description": "查看与管理系统中所有上传文件。" +} \ No newline at end of file diff --git a/src/shared/i18n/messages/zh-CN/grades.json b/src/shared/i18n/messages/zh-CN/grades.json index 1d2f03c..a7a7f7d 100644 --- a/src/shared/i18n/messages/zh-CN/grades.json +++ b/src/shared/i18n/messages/zh-CN/grades.json @@ -229,6 +229,41 @@ "dismissAriaLabel": "关闭录入指引" } }, + "batchByExam": { + "title": "按试卷录入成绩", + "selectExam": "选择试卷", + "selectExamPlaceholder": "请选择试卷", + "selectClass": "选择班级", + "selectClassPlaceholder": "请选择班级", + "selectClassFirst": "请选择班级以开始录入", + "guideSelectExam": "请从试卷库选择一份试卷,系统将自动带出题目列表和满分。录入时按每题得分填写,总分自动计算。", + "questionCount": "共 {count} 题", + "fullScore": "满分 {score} 分", + "question": "第{n}题", + "points": "分", + "totalScore": "总分", + "studentName": "学生姓名", + "entered": "已录入", + "average": "均分", + "max": "最高", + "min": "最低", + "searchStudent": "搜索学生...", + "noStudents": "该班级暂无学生", + "invalidScoresBadge": "存在无效分数", + "invalidScoresError": "存在无效分数(超过满分或格式错误),请检查后重试", + "enterAtLeastOne": "请至少输入一个分数", + "pasteApplied": "已粘贴 {count} 行数据", + "pasteHint": "提示:可从 Excel 复制多行多列分数,粘贴到表格中批量填充。按 Enter 跳到下一行,Tab 跳到下一格。", + "confirmSwitchExam": "切换试卷将清空已录入的分数,确认切换?", + "confirmSwitchClass": "切换班级将清空已录入的分数,确认切换?", + "saveAll": "保存全部成绩", + "saving": "保存中...", + "clear": "清空", + "undo": "撤销", + "undoNoRecord": "无可撤销的录入记录", + "undoExpired": "撤销已过期(超过 5 分钟)", + "undoFailed": "撤销失败,请重试" + }, "trend": { "title": "成绩趋势", "empty": "暂无成绩记录", @@ -249,7 +284,8 @@ "noGradesTitle": "暂无成绩", "noGradesDescription": "该学生暂无成绩记录。", "noDataTitle": "暂无数据", - "noDataDescription": "学生成绩摘要不可用。" + "noDataDescription": "学生成绩摘要不可用。", + "recordCount": "{count} 条成绩记录" }, "empty": { "noRecords": "暂无成绩记录", @@ -344,11 +380,37 @@ "ariaLabelNonEmpty": "排名趋势图:共 {count} 次排名记录" }, "classReport": { + "caption": "班级排名表", "noDataTitle": "暂无数据", "noDataDescription": "该班级暂无成绩记录。", "classRanking": "班级排名", "rankColumn": "排名", "recordsColumn": "记录数", "studentCountInfo": "{studentCount} 名学生 · {recordCount} 条成绩记录" + }, + "parent": { + "title": "子女成绩", + "description": "查看子女的成绩记录。", + "noChildren": "暂无子女关联", + "noChildrenDesc": "您的账号尚未关联子女,请联系学校管理员进行关联。", + "selectChild": "选择子女", + "selectChildPlaceholder": "请选择要查看成绩的子女", + "noGrades": "暂无成绩记录", + "noGradesDesc": "该子女暂无成绩记录。", + "subject": "科目", + "score": "分数", + "exam": "考试", + "semester": "学期", + "teacher": "教师", + "date": "日期", + "average": "平均分", + "highest": "最高分", + "lowest": "最低分", + "totalRecords": "总记录数", + "gradeHistory": "成绩历史", + "gradeSummary": "成绩摘要", + "recentGrades": "最近成绩", + "viewAll": "查看全部", + "noRecentGrades": "暂无最近成绩" } } diff --git a/src/shared/i18n/messages/zh-CN/leave.json b/src/shared/i18n/messages/zh-CN/leave.json new file mode 100644 index 0000000..2c2e60a --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/leave.json @@ -0,0 +1,12 @@ +{ + "title": "请假申请", + "description": "为您的孩子提交请假申请。", + "backToDashboard": "返回仪表盘", + "onlineLeave": "在线请假申请", + "comingSoon": "即将上线", + "comingSoonDesc": "在线请假功能正在开发中,即将上线。目前请直接联系班主任或学校办公室。", + "contactOptions": "联系方式", + "callOffice": "在工作时间致电学校办公室", + "sendMessage": "通过消息页面向班主任发送消息", + "goToMessages": "前往消息" +} \ No newline at end of file diff --git a/src/shared/i18n/messages/zh-CN/lesson-preparation.json b/src/shared/i18n/messages/zh-CN/lesson-preparation.json index ee88ddd..e438489 100644 --- a/src/shared/i18n/messages/zh-CN/lesson-preparation.json +++ b/src/shared/i18n/messages/zh-CN/lesson-preparation.json @@ -21,6 +21,12 @@ "confirm": "确认", "create": "创建课案", "publish": "发布为作业", + "publishPlan": "发布课案", + "unpublishPlan": "撤回发布", + "publishPlanConfirm": "发布后学生和家长将可查看此课案,确认发布?", + "unpublishPlanConfirm": "撤回后学生和家长将无法查看此课案,确认撤回?", + "publishPlanSuccess": "课案已发布", + "unpublishPlanSuccess": "课案已撤回", "viewHomework": "查看" }, "status": { @@ -57,6 +63,10 @@ "titlePlaceholder": "例如:《秋天》第一课时", "blockCount": "{count} 个环节", "blankHint": "从空白开始", + "systemSection": "系统模板", + "personalSection": "个人模板", + "personalBadge": "个人", + "noPersonalTemplates": "暂无个人模板,可在编辑器中「另存为模板」创建", "names": { "tpl_regular": "常规课", "tpl_review": "复习课", @@ -101,12 +111,51 @@ "textbookContent": "课文正文", "textbookContentMissing": "正文节点缺失", "textbookContentEmpty": "(未加载课文内容)", + "textbookOperateHint": "请在画布上直接操作正文:选中文本可创建区间锚点,点击位置可创建点锚点。", + "rightClickHint": "右键弹出锚点菜单", + "dragToResize": "拖拽缩放", + "anchorListTitle": "锚点列表", + "anchorListEmpty": "暂无锚点。选中正文文本即可创建。", + "anchorRangeLabel": "区间", + "anchorPointLabel": "点", "zoomIn": "放大", "zoomOut": "缩小", "rangeAnchorTitle": "为选中文本关联节点", "pointAnchorTitle": "在此位置插入占位符 {number}", "anchorToSelectedNode": "关联到当前选中节点", - "anchorToNewNode": "关联到新节点" + "anchorToNewNode": "关联到新节点", + "textbookLabel": "教材", + "chapterLabel": "课文", + "selectNodeForAnchor": "选择要关联的节点", + "createNewNode": "创建新节点并关联" + }, + "readonly": { + "title": "查看课案", + "hint": "这是只读视图,您无法编辑此课案", + "notFound": "课案不存在或未发布", + "notPublished": "课案尚未发布" + }, + "student": { + "title": "我的课案", + "description": "查看老师发布的备课内容" + }, + "parent": { + "title": "孩子课案", + "description": "查看孩子老师发布的备课内容" + }, + "admin": { + "title": "课案管理", + "description": "查看全校教师的备课情况", + "stats": { + "total": "课案总数", + "published": "已发布", + "draft": "草稿", + "archived": "已归档" + } + }, + "gradeHead": { + "title": "年级备课", + "description": "查看本年级教师的备课" }, "picker": { "textbookLabel": "选择教材", @@ -133,7 +182,10 @@ "noChapter": "无章节", "noTemplate": "无模板", "lastSaved": "最后保存:", - "neverSaved": "未保存" + "neverSaved": "未保存", + "versionCount": "{count} 个版本", + "versionSelectorLabel": "版本", + "versionCurrent": "最新" }, "version": { "title": "版本历史", @@ -145,7 +197,8 @@ "revertTitle": "确认回退", "revertConfirm": "确认回退到 v{versionNo}?将生成新版本。", "revertSuccess": "已回退到 v{versionNo}", - "autoLabel": "自动版本" + "autoLabel": "自动版本", + "revertLabel": "回退到 v{versionNo}" }, "knowledgePoint": { "title": "选择知识点", @@ -212,7 +265,9 @@ "noExerciseBlock": "练习块不存在", "noQuestions": "练习块无题目", "planNotFound": "课案不存在", - "noPermission": "无权发布" + "noPermission": "无权发布", + "homeworkTitle": "{title} - 作业", + "homeworkDescription": "来自课案" }, "textStudy": { "sourceTextLabel": "课文原文", @@ -222,8 +277,86 @@ "annotationTitle": "教学节点", "annotationNotePlaceholder": "教学说明..." }, + "objective": { + "hint": "添加教学目标,支持知识与技能、过程与方法、情感态度三个维度", + "dimension": { + "knowledge": "知识与技能", + "process": "过程与方法", + "emotion": "情感态度" + }, + "textPlaceholder": "输入教学目标...", + "addItem": "+ 添加目标" + }, + "keyPoint": { + "hint": "标记本课的重点和难点", + "type": { + "key": "重点", + "difficult": "难点" + }, + "textPlaceholder": "输入重点/难点内容...", + "addItem": "+ 添加重点/难点" + }, + "newTeaching": { + "hint": "设计新授环节的教学步骤", + "pointIndex": "步骤 {index}", + "outlineLabel": "教学提纲", + "outlinePlaceholder": "输入教学提纲...", + "boardNotesLabel": "板书要点", + "boardNotesPlaceholder": "输入板书要点...", + "addPoint": "+ 添加步骤" + }, + "summary": { + "hint": "总结本课要点,帮助学生梳理知识", + "pointPlaceholder": "输入小结要点...", + "addPoint": "+ 添加要点", + "homeworkPreviewLabel": "作业预览", + "homeworkPreviewPlaceholder": "简要描述本课作业..." + }, + "homework": { + "hint": "布置课后作业", + "type": { + "exercise": "练习", + "reading": "阅读", + "writing": "写作" + }, + "refIdPlaceholder": "作业引用 ID(可选)", + "descriptionPlaceholder": "输入作业要求...", + "addItem": "+ 添加作业" + }, + "blackboard": { + "hint": "设计板书结构", + "layoutLabel": "板书形式", + "layout": { + "structure": "结构式", + "mindmap": "思维导图", + "text": "文字式" + }, + "contentLabel": "板书内容", + "contentPlaceholder": "输入板书内容..." + }, + "import": { + "hint": "设计课堂导入环节", + "methodLabel": "导入方式", + "method": { + "question": "提问导入", + "situation": "情境导入", + "review": "复习导入", + "other": "其他" + }, + "promptLabel": "导入语", + "promptPlaceholder": "输入导入语...", + "durationLabel": "预计时长", + "durationUnit": "分钟" + }, "reflection": { - "hint": "课后填写教学反思..." + "hint": "课后填写教学反思...", + "aspect": { + "effectiveness": "教学效果", + "problems": "存在问题", + "improvements": "改进措施" + }, + "textPlaceholder": "输入反思内容...", + "addItem": "+ 添加反思" }, "richText": { "placeholder": "输入内容..." @@ -250,7 +383,14 @@ "createFailed": "创建失败", "loadFailed": "页面加载失败", "loadFailedDesc": "抱歉,页面加载时发生了意外错误。请稍后重试。", - "retry": "重试" + "retry": "重试", + "invalidQuestionType": "无效的题目类型", + "duplicateSuffix": " - 副本", + "titleRequired": "请输入课案标题", + "titleTooLong": "标题不能超过 255 个字符", + "templateRequired": "请选择模板", + "invalidDate": "日期格式无效", + "classRequired": "至少选择一个班级" }, "confirm": { "archive": "确认归档此课案?", diff --git a/src/shared/i18n/messages/zh-CN/nav.json b/src/shared/i18n/messages/zh-CN/nav.json new file mode 100644 index 0000000..a098128 --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/nav.json @@ -0,0 +1,93 @@ +{ + "common": { + "announcements": "公告", + "messages": "消息", + "aiSettings": "AI 配置" + }, + "admin": { + "dashboard": "仪表盘", + "schoolManagement": "学校管理", + "schools": "学校", + "grades": "年级", + "gradeInsights": "年级洞察", + "departments": "部门", + "classes": "班级", + "academicYear": "学年", + "users": "用户", + "userList": "用户列表", + "importUsers": "导入用户", + "teaching": "教学管理", + "coursePlans": "课程计划", + "electives": "选修课", + "scheduling": "排课", + "rules": "排课规则", + "autoSchedule": "自动排课", + "changeRequests": "调课申请", + "attendance": "考勤", + "announcements": "公告管理", + "files": "文件管理", + "errorBook": "错题分析", + "lessonPlans": "课案管理", + "auditLogs": "审计日志", + "operationLogs": "操作日志", + "loginLogs": "登录日志", + "dataChanges": "数据变更", + "settings": "设置" + }, + "teacher": { + "dashboard": "仪表盘", + "textbooks": "教材", + "exams": "考试", + "allExams": "全部考试", + "createExam": "创建考试", + "homework": "作业", + "homeworkList": "作业列表", + "submissions": "提交记录", + "grades": "成绩", + "allGrades": "全部成绩", + "batchEntry": "批量录入", + "gradeStats": "成绩统计", + "gradeAnalytics": "成绩分析", + "questions": "题库", + "classManagement": "班级管理", + "myClasses": "我的班级", + "students": "学生", + "schedule": "课表", + "coursePlans": "课程计划", + "lessonPlans": "我的备课", + "attendance": "考勤", + "attendanceRecords": "考勤记录", + "attendanceEntry": "录入考勤", + "attendanceStats": "考勤统计", + "scheduleChanges": "调课申请", + "diagnostic": "学情诊断", + "errorBook": "错题分析", + "electives": "选修课", + "gradeManagement": "年级管理", + "gradeClasses": "年级班级", + "gradeDashboard": "年级仪表盘", + "gradeInsights": "年级洞察" + }, + "student": { + "dashboard": "仪表盘", + "myLearning": "我的学习", + "courses": "课程", + "assignments": "作业", + "textbooks": "教材", + "schedule": "我的课表", + "myGrades": "我的成绩", + "lessonPlans": "我的课案", + "attendance": "考勤", + "diagnostic": "学情诊断", + "errorBook": "错题本", + "electives": "选修课" + }, + "parent": { + "dashboard": "仪表盘", + "grades": "成绩", + "lessonPlans": "孩子课案", + "attendance": "考勤", + "errorBook": "错题本", + "leaveRequest": "请假申请" + } +} diff --git a/src/shared/i18n/messages/zh-CN/practice.json b/src/shared/i18n/messages/zh-CN/practice.json new file mode 100644 index 0000000..1a748b5 --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/practice.json @@ -0,0 +1,163 @@ +{ + "page": { + "title": "专项练习", + "description": "根据错题、知识点、薄弱章节智能出题,针对性提升。" + }, + "starter": { + "title": "发起专项练习", + "description": "根据你的学习情况,选择适合的练习模式", + "type": "练习类型", + "knowledgePoints": "选择知识点", + "difficulty": "难度", + "anyDifficulty": "不限", + "questionCount": "题目数量", + "start": "开始练习", + "creating": "创建中..." + }, + "session": { + "progress": "进度", + "previous": "上一题", + "next": "下一题", + "submit": "提交", + "submitting": "提交中...", + "skip": "跳过", + "complete": "完成练习", + "abandon": "放弃练习", + "abandonConfirm": "确定要放弃本次练习吗?", + "abandonDescription": "放弃后已作答的题目将保留记录,但不会计入完成统计。", + "cancel": "取消", + "confirmAbandon": "确认放弃", + "question": "第", + "difficulty": "难度", + "variant": "变式题", + "correct": "回答正确", + "incorrect": "回答错误", + "pendingReview": "待教师批阅", + "skipped": "已跳过", + "yourAnswer": "你的答案", + "true": "正确", + "false": "错误", + "textPlaceholder": "请输入你的答案...", + "empty": "本次练习没有题目" + }, + "result": { + "title": "练习完成", + "answered": "已答题数", + "correct": "正确数", + "accuracy": "正确率", + "review": "逐题回顾" + }, + "history": { + "title": "练习记录", + "empty": "还没有练习记录,开始你的第一次专项练习吧" + }, + "toasts": { + "created": "练习已创建", + "createFailed": "创建失败", + "selectKnowledgePoint": "请至少选择一个知识点", + "selectWeakKnowledgePoint": "请至少选择一个薄弱知识点", + "aiRecommendedReason": "学生自主发起 AI 推荐练习", + "submitted": "已提交", + "submitFailed": "提交失败", + "completed": "练习已完成", + "completeFailed": "完成失败", + "abandoned": "练习已放弃", + "abandonFailed": "操作失败" + }, + "stats": { + "totalSessions": "练习总数", + "completed": "已完成", + "totalAnswered": "答题总数", + "accuracy": "正确率" + }, + "types": { + "error_variant": "错题变式", + "knowledge_point": "知识点专项", + "weak_chapter": "薄弱章节", + "ai_recommended": "AI 推荐" + }, + "status": { + "in_progress": "进行中", + "completed": "已完成", + "abandoned": "已放弃" + }, + "teacher": { + "title": "专项练习分析", + "description": "查看班级学生的专项练习情况,识别薄弱知识点,辅助精准教学", + "noClass": "暂无可查看的班级", + "noClassDescription": "您还未被分配到任何班级,无法查看练习分析数据。", + "noStudent": "班级暂无学生", + "noStudentDescription": "班级中没有学生,无法查看练习分析数据。", + "noData": "暂无练习数据", + "noDataDescription": "所选范围内学生尚未开始专项练习。", + "overview": { + "totalClasses": "覆盖班级", + "totalSessions": "练习总数", + "totalAnswered": "答题总数", + "averageAccuracy": "平均正确率", + "participationRate": "参与率" + }, + "classComparison": { + "title": "班级练习对比", + "className": "班级", + "totalStudents": "学生数", + "activeStudents": "参与学生", + "participationRate": "参与率", + "totalSessions": "练习数", + "completedSessions": "完成数", + "totalAnswered": "答题数", + "averageAccuracy": "正确率" + }, + "typeBreakdown": { + "title": "练习类型分布", + "description": "按练习类型分组的会话数与正确率" + }, + "knowledgePointWeakness": { + "title": "知识点薄弱度", + "description": "基于练习答题数据识别的薄弱知识点", + "knowledgePoint": "知识点", + "totalAnswers": "答题数", + "wrongAnswers": "错题数", + "errorRate": "错误率", + "noData": "暂无知识点数据", + "noDataDescription": "练习题目尚未关联知识点,无法显示薄弱知识点统计。" + }, + "studentRanking": { + "title": "学生练习排名", + "description": "按练习数降序排列,识别活跃与待引导学生", + "rank": "排名", + "student": "学生", + "totalSessions": "练习数", + "completedSessions": "完成数", + "totalAnswered": "答题数", + "accuracy": "正确率", + "lastPractice": "最近练习" + }, + "inactiveStudents": { + "title": "未参与练习学生", + "description": "以下学生尚未开始任何专项练习,建议教师主动引导", + "empty": "所有学生都已参与练习", + "studentCount": "未参与学生数" + } + }, + "grade": { + "title": "年级专项练习总览", + "description": "全年级各班级专项练习参与情况与质量对比,辅助年级主任宏观决策", + "noGrade": "暂无可管理的年级", + "noGradeDescription": "您还未被分配管理任何年级,无法查看年级练习数据。", + "overview": { + "totalClasses": "班级数", + "totalStudents": "学生数", + "activeStudents": "参与学生", + "participationRate": "参与率", + "totalSessions": "练习总数", + "completedSessions": "完成数", + "totalAnswered": "答题总数", + "averageAccuracy": "平均正确率" + }, + "classComparison": { + "title": "各班级练习对比", + "description": "按参与率降序排列,识别活跃班级与待提升班级" + } + } +} diff --git a/src/shared/i18n/messages/zh-CN/scheduling.json b/src/shared/i18n/messages/zh-CN/scheduling.json new file mode 100644 index 0000000..68b727b --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/scheduling.json @@ -0,0 +1,30 @@ +{ + "rules": { + "title": "排课规则", + "description": "配置每日课时上限、课间窗口与均衡偏好。", + "noClassesTitle": "暂无可用班级", + "noClassesDescription": "请先创建班级,再配置排课规则。", + "hint": "未选择具体班级时保存的规则将作为全局默认。" + }, + "auto": { + "title": "自动排课", + "description": "基于规则与学科分配自动生成周课表。", + "configureRules": "配置规则", + "noClassesTitle": "暂无可用班级", + "noClassesDescription": "请先创建班级,再进行自动排课。", + "hint": "应用新课表将替换所选班级的现有课表。" + }, + "changes": { + "title": "课表变更申请", + "description": "审核、批准或拒绝课表变更与代课申请。", + "newRequest": "新建申请", + "noChangesTitle": "暂无课表变更申请", + "noChangesDescription": "系统中尚未产生任何课表变更申请。", + "conflictDetection": "冲突检测", + "conflictDetectionDescription": "检测现有班级课表中的时间重叠。", + "noClassesTitle": "暂无可用班级", + "noClassesDescription": "请先创建班级,再进行冲突检测。", + "scheduleGrid": "课表网格", + "scheduleGridDescription": "按班级查看当前课表分布。" + } +} \ No newline at end of file diff --git a/src/shared/i18n/messages/zh-CN/school.json b/src/shared/i18n/messages/zh-CN/school.json index 3aebff4..77f7b34 100644 --- a/src/shared/i18n/messages/zh-CN/school.json +++ b/src/shared/i18n/messages/zh-CN/school.json @@ -130,6 +130,129 @@ "selectSchool": "请选择学校", "success": "成功升级 {count} 个年级", "failed": "升级失败" + }, + "gradeInsights": { + "title": "年级作业洞察", + "description": "按年级聚合的作业统计与班级排名。", + "manageGrades": "管理年级", + "selectGrade": "全部年级", + "selectToView": "请选择年级以查看洞察", + "selectToViewDescription": "选择一个年级,查看最新作业与历史成绩统计。", + "notFound": "年级未找到", + "notFoundDescription": "该年级可能不存在或无可访问数据。", + "noData": "该年级暂无作业数据", + "noDataDescription": "尚未向该年级学生布置任何作业。", + "classes": "班级数", + "students": "学生数", + "overallAvg": "总体均分", + "latestAvg": "最新均分", + "homeworkTimeline": "最新作业", + "classRanking": "班级排名", + "assignment": "作业", + "status": "状态", + "created": "创建时间", + "targeted": "目标数", + "submitted": "提交数", + "graded": "已批改", + "avg": "均分", + "median": "中位数", + "class": "班级", + "latestAvgCol": "最新均分", + "prevAvg": "上次均分", + "delta": "Δ", + "overallAvgCol": "总体均分", + "active": "在读", + "inactive": "停用" + }, + "gradeOverview": { + "title": "年级概览", + "classCount": "班级数", + "studentCount": "学生数", + "teacherCount": "教师数", + "avgScore": "平均分", + "passRate": "及格率", + "noGrades": "暂无年级", + "noGradesDescription": "创建年级以管理年级主任和班级。", + "viewInsights": "查看洞察", + "manageClasses": "管理班级", + "gradeHead": "年级主任", + "teachingHead": "教学主任", + "notSet": "未设置" + }, + "gradeDashboard": { + "title": "年级仪表盘", + "description": "年级成绩分布、作业完成、考试与课本进度的综合视图。", + "selectGrade": "请选择年级", + "selectToView": "请选择年级以查看仪表盘", + "selectToViewDescription": "选择一个年级,查看成绩分布、作业完成、考试与课本进度。", + "noData": "暂无数据", + "noDataDescription": "该年级暂无相关数据。", + "tabs": { + "distribution": "成绩分布", + "homework": "作业完成", + "exams": "考试", + "progress": "课本进度" + }, + "distribution": { + "overallStats": "整体统计", + "byClass": "班级分布对比", + "totalRecords": "成绩记录数", + "averageScore": "平均分", + "passRate": "及格率", + "excellentRate": "优秀率", + "scoreBuckets": "分数段分布", + "students": "学生数", + "class": "班级", + "count": "人数", + "bucket90": "90-100", + "bucket80": "80-89", + "bucket70": "70-79", + "bucket60": "60-69", + "bucketBelow60": "0-59" + }, + "homework": { + "totalAssignments": "作业总数", + "totalSubmissions": "提交总数", + "avgSubmissionRate": "平均提交率", + "gradedRate": "批改率", + "assignmentList": "作业列表", + "classComparison": "班级对比", + "completionRate": "完成率", + "submitted": "已提交", + "graded": "已批改", + "targeted": "目标数" + }, + "exams": { + "totalExams": "考试总数", + "published": "已发布", + "draft": "草稿", + "totalSubmissions": "提交总数", + "gradedRate": "批改率", + "examList": "考试列表", + "subject": "科目", + "status": "状态", + "scheduledAt": "计划时间", + "submissions": "提交数", + "graded": "已评分", + "avgScore": "平均分", + "createdAt": "创建时间" + }, + "progress": { + "overallProgress": "整体进度", + "totalPlans": "计划总数", + "totalHours": "总课时", + "completedHours": "已完成课时", + "activePlans": "进行中", + "completedPlans": "已完成", + "progressMatrix": "进度矩阵", + "class": "班级", + "subject": "科目", + "teacher": "教师", + "progress": "进度", + "completedHoursCol": "已完成/总课时", + "items": "条目", + "status": "状态" + } } }, "departments": { diff --git a/src/shared/i18n/messages/zh-CN/settings.json b/src/shared/i18n/messages/zh-CN/settings.json index 06a514a..86777cb 100644 --- a/src/shared/i18n/messages/zh-CN/settings.json +++ b/src/shared/i18n/messages/zh-CN/settings.json @@ -217,6 +217,16 @@ "apiKeyPlaceholder": "粘贴新密钥以替换", "apiKeyDesc": "已有密钥不会显示。留空则保留当前密钥。", "setDefault": "设为默认", + "visibility": "可见性", + "visibilityDesc": "公开 Provider 由管理员发布,全员可用;私有 Provider 仅创建者可见。", + "visibilityPublic": "公开", + "visibilityPrivate": "私有", + "visibilityPublicLabel": "公开(全员可用)", + "visibilityPrivateLabel": "私有(仅自己可见)", + "visibilityReadOnly": "仅管理员可修改可见性", + "badgePublic": "公开", + "badgePrivate": "私有", + "badgeOwner": "我的", "test": "测试", "testing": "测试中...", "save": "保存修改", diff --git a/src/shared/i18n/messages/zh-CN/student.json b/src/shared/i18n/messages/zh-CN/student.json new file mode 100644 index 0000000..9508053 --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/student.json @@ -0,0 +1,105 @@ +{ + "schedule": { + "title": "我的课表", + "description": "查看你的每周课程安排。", + "noUser": "未找到用户", + "noUserDesc": "请创建学生用户以查看课表。" + }, + "courses": { + "title": "我的课程", + "description": "查看你已加入的班级课程。", + "noUser": "未找到用户", + "noUserDesc": "请创建学生用户以查看课程。" + }, + "scheduleView": { + "noSchedule": "暂无课表", + "noScheduleDesc": "未找到你已加入班级的课表记录。", + "today": "今天", + "noClasses": "暂无课程。" + }, + "scheduleFilters": { + "allClasses": "全部班级", + "selectClass": "选择班级" + }, + "coursesView": { + "active": "进行中", + "details": "详情", + "schedule": "课表", + "assignments": "作业", + "noCourses": "暂无课程", + "noCoursesDesc": "你还未加入任何班级。使用下方邀请码加入班级。", + "joinClass": "加入班级", + "joinClassDesc": "输入老师提供的邀请码加入班级。", + "invitationCode": "邀请码", + "invitationCodePlaceholder": "输入 6 位邀请码", + "joining": "加入中...", + "joinButton": "加入班级", + "joinedSuccess": "已加入班级", + "joinFailed": "加入班级失败", + "grade": "年级 {grade}", + "room": "教室 {room}" + }, + "courseFilters": { + "searchPlaceholder": "按班级名称、教师、学校搜索..." + }, + "learning": { + "title": "我的学习", + "description": "你的学习中心:课程、作业和教材。", + "noUser": "未找到用户", + "noUserDesc": "请创建学生用户以查看学习内容。", + "courses": "课程", + "coursesDesc": "查看已加入的班级。", + "enrolled": "{count} 个已加入", + "assignments": "作业", + "assignmentsDesc": "作业与练习。", + "pending": "{count} 个待完成", + "dueSoon": " · {count} 个即将截止", + "textbooks": "教材", + "textbooksDesc": "浏览课程教材。", + "available": "{count} 本可用" + }, + "errorBook": { + "title": "错题本", + "description": "自动收录考试与作业中的错题,科学复习,攻克薄弱点。" + }, + "diagnostic": { + "title": "我的学情诊断", + "description": "查看你的知识点掌握度分析与诊断报告。" + }, + "error": { + "title": "出错了", + "description": "发生了意外错误,请稍后重试。", + "retry": "重试" + }, + "classDetail": { + "backToCourses": "返回课程", + "grade": "年级 {grade}", + "room": "教室 {room}", + "active": "进行中", + "fullSchedule": "完整课表", + "assignments": "作业", + "teacher": "教师", + "noTeacher": "暂未分配教师。", + "school": "学校", + "schoolNotAvailable": "学校信息不可用。", + "classroom": "教室", + "roomNotAssigned": "教室未分配。", + "homeroom": "班主任: {homeroom}", + "classSchedule": "班级课表", + "noSchedule": "暂无课表", + "noScheduleDesc": "该班级暂无课表记录。" + }, + "weekdays": { + "mon": "周一", + "tue": "周二", + "wed": "周三", + "thu": "周四", + "fri": "周五", + "sat": "周六", + "sun": "周日" + }, + "assignment": { + "due": "截止: {date}", + "maxAttempts": "最大尝试次数: {count}" + } +} diff --git a/src/shared/i18n/messages/zh-CN/users.json b/src/shared/i18n/messages/zh-CN/users.json new file mode 100644 index 0000000..97ec28d --- /dev/null +++ b/src/shared/i18n/messages/zh-CN/users.json @@ -0,0 +1,44 @@ +{ + "title": "用户管理", + "description": "管理系统所有用户。", + "import": { + "title": "批量导入用户", + "description": "通过 Excel 文件批量创建用户账号,支持学生自动加入班级。", + "back": "返回", + "subtitle": "批量创建用户账号,学生可自动加入对应班级。", + "instructionsTitle": "导入说明", + "instructionsDescription": "使用 Excel 批量导入用户的步骤", + "step1": "点击「批量导入用户」按钮,下载导入模板。", + "step2": "按模板格式填写用户信息(姓名、邮箱、角色、手机、班级邀请码)。", + "step3": "上传填写好的 Excel 文件,系统将解析并预览数据。", + "step4": "确认预览数据无误后,点击「确认导入」完成批量创建。", + "notesTitle": "注意事项", + "notesDescription": "导入前请仔细阅读", + "note1": "所有用户默认密码统一设置,请提示用户首次登录后修改。", + "note2": "邮箱必须唯一,重复邮箱将被跳过并记录在错误报告中。", + "note3": "角色可选:admin / teacher / student / parent / grade_head / teaching_head。", + "note4": "班级邀请码仅对 student 角色有效,填写后学生将自动加入对应班级。", + "note5": "单次最多导入 10MB 的文件,建议单次不超过 500 条记录。", + "note6": "导入完成后将显示成功数、失败数及详细错误信息。", + "templateTitle": "模板字段说明", + "templateDescription": "Excel 模板各列含义与要求", + "columnName": "列名", + "columnRequired": "是否必填", + "columnDescription": "说明", + "fieldName": "姓名", + "fieldNameRequired": "必填", + "fieldNameDescription": "用户姓名", + "fieldEmail": "邮箱", + "fieldEmailRequired": "必填", + "fieldEmailDescription": "登录账号,需符合邮箱格式且唯一", + "fieldRole": "角色", + "fieldRoleRequired": "必填", + "fieldRoleDescription": "admin / teacher / student / parent / grade_head / teaching_head", + "fieldPhone": "手机", + "fieldPhoneRequired": "选填", + "fieldPhoneDescription": "联系电话", + "fieldInviteCode": "班级邀请码", + "fieldInviteCodeRequired": "选填", + "fieldInviteCodeDescription": "仅 student 角色有效,6 位邀请码" + } +} \ No newline at end of file