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
201 lines
7.0 KiB
JSON
201 lines
7.0 KiB
JSON
{
|
|
"title": {
|
|
"adminList": "Elective Courses",
|
|
"create": "Create Course",
|
|
"edit": "Edit Course",
|
|
"detail": "Course Details",
|
|
"teacher": "My Elective Courses",
|
|
"student": "Course Selection"
|
|
},
|
|
"description": {
|
|
"adminList": "Manage elective courses, open/close selection and lottery.",
|
|
"create": "Create a new elective course.",
|
|
"edit": "Update elective course details.",
|
|
"detail": "View elective course details and student selections.",
|
|
"teacher": "View and manage the elective courses you teach.",
|
|
"student": "Browse available courses and make selections."
|
|
},
|
|
"status": {
|
|
"draft": "Draft",
|
|
"open": "Open",
|
|
"closed": "Closed",
|
|
"cancelled": "Cancelled"
|
|
},
|
|
"selectionMode": {
|
|
"fcfs": "First Come First Served",
|
|
"lottery": "Lottery"
|
|
},
|
|
"filters": {
|
|
"allStatuses": "All Modes"
|
|
},
|
|
"selectionStatus": {
|
|
"selected": "Selected",
|
|
"enrolled": "Enrolled",
|
|
"waitlist": "Waitlist",
|
|
"dropped": "Dropped",
|
|
"rejected": "Rejected"
|
|
},
|
|
"fields": {
|
|
"name": "Course Name",
|
|
"subject": "Subject",
|
|
"teacher": "Teacher",
|
|
"grade": "Grade",
|
|
"description": "Description",
|
|
"capacity": "Capacity",
|
|
"enrolled": "Enrolled",
|
|
"classroom": "Classroom",
|
|
"schedule": "Schedule",
|
|
"startDate": "Start Date",
|
|
"endDate": "End Date",
|
|
"selectionStart": "Selection Start",
|
|
"selectionEnd": "Selection End",
|
|
"selectionMode": "Selection Mode",
|
|
"credit": "Credit",
|
|
"dropDeadline": "Drop Deadline",
|
|
"dropReason": "Drop Reason"
|
|
},
|
|
"actions": {
|
|
"create": "Create Course",
|
|
"edit": "Edit",
|
|
"delete": "Delete",
|
|
"openSelection": "Open Selection",
|
|
"closeSelection": "Close Selection",
|
|
"runLottery": "Run Lottery",
|
|
"select": "Select",
|
|
"drop": "Drop",
|
|
"cancel": "Cancel",
|
|
"save": "Save",
|
|
"retry": "Retry"
|
|
},
|
|
"list": {
|
|
"empty": "No elective courses",
|
|
"emptyStudent": "No available courses",
|
|
"emptyDescription": "No elective courses have been created yet."
|
|
},
|
|
"form": {
|
|
"createTitle": "Create Elective Course",
|
|
"editTitle": "Edit Elective Course",
|
|
"namePlaceholder": "Enter course name",
|
|
"descriptionPlaceholder": "Enter course description",
|
|
"nameLabel": "Course Name *",
|
|
"subjectLabel": "Subject",
|
|
"gradeLabel": "Grade",
|
|
"teacherLabel": "Teacher",
|
|
"capacityLabel": "Capacity",
|
|
"classroomLabel": "Classroom",
|
|
"scheduleLabel": "Schedule",
|
|
"schedulePlaceholder": "e.g. Mon 14:00-15:30",
|
|
"creditLabel": "Credit",
|
|
"startDateLabel": "Start Date",
|
|
"endDateLabel": "End Date",
|
|
"selectionStartLabel": "Selection Start",
|
|
"selectionEndLabel": "Selection End",
|
|
"dropDeadlineLabel": "Drop Deadline",
|
|
"dropDeadlineHint": "Students cannot drop after this time. Leave empty for no restriction.",
|
|
"descriptionLabel": "Description",
|
|
"cancelButton": "Cancel",
|
|
"saveButton": "Save",
|
|
"createButton": "Create",
|
|
"savingButton": "Saving...",
|
|
"selectSubjectPlaceholder": "Select a subject",
|
|
"selectGradePlaceholder": "Select a grade",
|
|
"selectTeacherPlaceholder": "Select a teacher",
|
|
"selectModePlaceholder": "Select selection mode",
|
|
"invalidFormState": "Invalid form state",
|
|
"saveFailed": "Failed to save course"
|
|
},
|
|
"stats": {
|
|
"totalCourses": "Total Courses",
|
|
"totalEnrolled": "Total Enrolled",
|
|
"avgUtilization": "Avg Utilization",
|
|
"pendingLottery": "Pending Lottery",
|
|
"utilization": "{enrolled}/{capacity}",
|
|
"utilizationRate": "{rate}%"
|
|
},
|
|
"parent": {
|
|
"title": "Children Elective",
|
|
"description": "View your children's elective selections.",
|
|
"noChildrenTitle": "No Children Linked",
|
|
"noChildrenDescription": "You have no linked children, cannot view elective info.",
|
|
"noRecordsTitle": "No Selections",
|
|
"noRecordsDescription": "Your child has not selected any courses."
|
|
},
|
|
"student": {
|
|
"mySelections": "My Selections",
|
|
"availableCourses": "Available Courses",
|
|
"selected": "Selected",
|
|
"enrolled": "Enrolled",
|
|
"waitlist": "Waitlist",
|
|
"capacityFull": "Capacity full",
|
|
"selectSuccess": "Course selected successfully",
|
|
"dropSuccess": "Course dropped successfully",
|
|
"confirmDrop": "Are you sure you want to drop this course?",
|
|
"dropReasonPlaceholder": "Optional: enter drop reason (max 255 chars)"
|
|
},
|
|
"detail": {
|
|
"studentsTitle": "Selection Roster",
|
|
"noStudents": "No Students",
|
|
"noStudentsDescription": "No students have selected this course yet.",
|
|
"back": "Back to List",
|
|
"editCourse": "Edit Course",
|
|
"studentName": "Student Name",
|
|
"priority": "Priority",
|
|
"selectedAt": "Selected At",
|
|
"enrolledAt": "Enrolled At"
|
|
},
|
|
"lottery": {
|
|
"result": "Lottery result: {enrolled} enrolled, {waitlist} waitlisted",
|
|
"running": "Running lottery..."
|
|
},
|
|
"errors": {
|
|
"notFound": "Course not found",
|
|
"noOwnership": "You do not own this course",
|
|
"capacityFull": "Course capacity is full",
|
|
"alreadySelected": "You have already selected this course",
|
|
"selectionClosed": "Selection is closed",
|
|
"selectionNotOpen": "Selection is not open",
|
|
"selectionNotStarted": "Selection has not started yet",
|
|
"selectionEnded": "Selection has ended",
|
|
"courseNotFound": "Course not found",
|
|
"noActiveSelection": "No active selection found",
|
|
"gradeMismatch": "Your grade does not match the course requirement",
|
|
"scheduleConflict": "Schedule conflicts with your existing courses",
|
|
"creditExceeded": "Credit limit exceeded ({current}/{max})",
|
|
"invalidForm": "Invalid form data",
|
|
"unexpected": "Unexpected error",
|
|
"dropDeadlinePassed": "Drop deadline has passed, cannot drop course",
|
|
"title": "Loading failed",
|
|
"description": "Page data failed to load, please retry later."
|
|
},
|
|
"export": {
|
|
"courseSheetName": "Course List",
|
|
"selectionSheetName": "Selection Roster",
|
|
"statusHeader": "Status",
|
|
"priorityHeader": "Priority",
|
|
"selectedAtHeader": "Selected At",
|
|
"enrolledAtHeader": "Enrolled At",
|
|
"indexHeader": "#"
|
|
},
|
|
"messages": {
|
|
"created": "Elective course created",
|
|
"updated": "Elective course updated",
|
|
"deleted": "Elective course deleted",
|
|
"selectionOpened": "Selection opened",
|
|
"selectionClosed": "Selection closed",
|
|
"lotteryCompleted": "Lottery completed: {enrolled} enrolled, {waitlist} waitlisted",
|
|
"courseDropped": "Course dropped",
|
|
"ownershipCheckFailed": "Ownership check failed"
|
|
},
|
|
"settings": {
|
|
"creditLimitDefault": "Default Credit Limit",
|
|
"creditLimitDefaultDescription": "Global term credit limit used when no grade-specific limit is configured.",
|
|
"capacityNotifyThreshold": "Capacity Notify Threshold",
|
|
"capacityNotifyThresholdDescription": "Notify teacher/admin when enrolled count reaches this fraction of capacity (0-1, default 0.9).",
|
|
"saved": "Settings saved"
|
|
},
|
|
"notifications": {
|
|
"capacityWarningTitle": "Capacity Warning: {courseName}",
|
|
"capacityWarningContent": "Course \"{courseName}\" has reached {enrolled}/{capacity} enrollments ({percent}% threshold). Consider expanding capacity or closing selection."
|
|
}
|
|
}
|