feat: implement i18n localization for exam components and detail page commit

This commit is contained in:
mengstabketemaw
2026-06-30 16:46:19 +03:00
parent 9fd59f52ed
commit 7f76c862fb
9 changed files with 721 additions and 243 deletions

View File

@@ -29,6 +29,9 @@ export const am: Translations = {
locations: 'አካባቢዎች',
configuration: 'ውቅረት',
profile: 'መገለጫ',
questions: 'ጥያቄዎች',
exams: 'ፈተናዎች',
examResults: 'የፈተና ውጤቶች',
collapseSidebar: 'ሰብስብ',
expandSidebar: 'ዘርጋ',
},
@@ -96,6 +99,143 @@ export const am: Translations = {
},
},
exam: {
title: 'ፈተናዎች',
subtitle: 'ፈተናዎችን ያስተዳድሩ፣ ጥያቄዎችን ይመድቡ እና ውጤቶችን ይከታተሉ',
create: 'ፈተና ይፍጠሩ',
update: 'ፈተና ያዘምኑ',
add: 'ፈተና ይፍጠሩ',
noItems: 'ምንም ፈተናዎች አልተገኙም',
created: 'ፈተና ተፈጥሯል',
updated: 'ፈተና ዘምኗል',
deleted: 'ፈተና ተሰርዟል',
error: 'ክዋኔው አልተሳካም',
loadError: 'ፈተናዎችን በመጫን ላይ ስህተት',
cancel: 'ሰርዝ',
delete: 'ሰርዝ',
confirmDelete: 'ፈተና ይሰረዝ',
deleteConfirmText: 'እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?',
print: 'ፈተና ያትሙ',
recordResult: 'ውጤት ይመዝግቡ',
manageQuestions: 'ጥያቄዎችን ያስተዳድሩ',
saveAssignments: 'ምደባዎችን ያስቀምጡ',
randomSelect: 'በዘፈቀደ ይምረጡ',
backToExams: 'ወደ ፈተናዎች ይመለሱ',
notFound: 'ፈተና አልተገኘም።',
noQuestionsAssigned: 'ገና ምንም ጥያቄዎች አልተመደቡም።',
columns: {
title: 'ርዕስ',
certification: 'የምስክር ወረቀት',
date: 'ቀን',
type: 'አይነት',
form: 'ቅጽ',
venue: 'ቦታ',
questions: 'ጥያቄዎች',
status: 'ሁኔታ',
},
detail: {
title: 'የፈተና ዝርዝሮች',
certification: 'የምስክር ወረቀት',
type: 'አይነት',
form: 'ቅጽ',
venue: 'ቦታ',
date: 'ቀን',
administration: 'አስተዳደር',
evaluation: 'ግምገማ',
selection: 'ምርጫ',
timeAllowed: 'የተፈቀደ ጊዜ',
passMark: 'የማለፊያ ነጥብ',
totalPoints: 'ጠቅላላ ነጥብ',
questions: 'ጥያቄዎች',
directions: 'መመሪያዎች',
questionLabel: 'ጥያቄ',
questionsSection: 'ጥያቄዎች (ጠቅላላ {{pts}} ነጥብ)',
},
form: {
basicInfo: 'መሠረታዊ መረጃ',
settings: 'ቅንብሮች',
certification: 'የምስክር ወረቀት',
selectCertification: 'የምስክር ወረቀት ይምረጡ',
titleEn: 'ርዕስ (እንግሊዝኛ)',
titleEnPlaceholder: 'የፈተና ርዕስ በእንግሊዝኛ',
titleAm: 'ርዕስ (አማርኛ)',
titleAmPlaceholder: 'የፈተና ርዕስ',
directionEn: 'መመሪያ (እንግሊዝኛ)',
directionEnPlaceholder: 'መመሪያ በእንግሊዝኛ',
directionAm: 'መመሪያ (አማርኛ)',
directionAmPlaceholder: 'መመሪያ በአማርኛ',
examDate: 'የፈተና ቀን',
venue: 'ቦታ',
venuePlaceholder: 'የፈተና ቦታ',
timeAllowed: 'የተፈቀደ ጊዜ',
days: 'ቀናት',
hours: 'ሰአታት',
minutes: 'ደቂቃዎች',
written: 'ጽሑፍ',
oral: 'ቃል',
essay: 'ኢሴይ',
choice: 'ምርጫ',
offline: 'ከመስመር ውጪ',
online: 'በመስመር',
sum: 'ድምር',
average: 'አማካይ',
percentage: 'መቶኛ',
manual: 'በእጅ',
random: 'በዘፈቀደ',
cuttingPoint: 'የማለፊያ ነጥብ',
cuttingPointPlaceholder: 'ለማለፍ ዝቅተኛ ነጥብ',
status: 'ሁኔታ',
statusPlaceholder: 'የፈተና ሁኔታ',
pending: 'በመጠባበቅ ላይ',
active: 'ንቁ',
completed: 'ተጠናቋል',
cancelled: 'ተሰርዟል',
postponed: 'ተላልፏል',
published: 'ታትሟል',
},
assigner: {
title: 'ጥያቄዎችን ለፈተና ይመድቡ',
assignedTitle: 'የተመደቡ ጥያቄዎች',
available: 'የሚገኙ ጥያቄዎች',
assigned: 'የተመደቡ ጥያቄዎች',
search: 'ፈልግ...',
noQuestions: 'ምንም ጥያቄዎች የሉም',
assignSelected: 'የተመረጡትን ይመድቡ ({{count}})',
removeSelected: 'የተመረጡትን ያስወግዱ ({{count}})',
randomHint: 'ከጠቅላላ {{total}} ብቁ ጥያቄዎች ውስጥ በዘፈቀደ ይምረጡ። ምርጫው አጠቃላይ ነጥቦች የማለፊያ ነጥብ ({{pts}}) ላይ እንደሚደርሱ በራስ-ሰር ያረጋግጣል።',
selectCount: 'ብዛት',
},
status: {
PENDING: 'በመጠባበቅ ላይ',
ACTIVE: 'ንቁ',
COMPLETED: 'ተጠናቋል',
CANCELLED: 'ተሰርዟል',
POSTPONED: 'ተላልፏል',
PUBLISHED: 'ታትሟል',
},
type: {
WRITTEN: 'ጽሑፍ',
ORAL: 'ቃል',
},
formType: {
ESSAY: 'ኢሴይ',
CHOICE: 'ምርጫ',
},
admin: {
OFFLINE: 'ከመስመር ውጪ',
ONLINE: 'በመስመር',
},
eval: {
SUM: 'ድምር',
AVERAGE: 'አማካይ',
PERCENTAGE: 'መቶኛ',
},
selection: {
MANUAL: 'በእጅ',
RANDOM: 'በዘፈቀደ',
},
},
location: {
title: 'አካባቢዎች',
hierarchy: 'የአካባቢ ተዋረድ',
@@ -262,6 +402,101 @@ export const am: Translations = {
},
},
result: {
title: 'የፈተና ውጤቶች',
subtitle: 'የመርከበኞችን የፈተና ውጤቶች እና የውጤት ክፍፍል ይመልከቱ',
record: 'ውጤት ያስመዝግቡ',
noItems: 'ምንም ውጤት አልተገኘም',
noData: 'ምንም መረጃ የለም',
created: 'ውጤት በተሳካ ሁኔታ ተመዝግቧል',
updated: 'ውጤት በተሳካ ሁኔታ ዘምኗል',
deleted: 'ውጤት በተሳካ ሁኔታ ተሰርዟል',
error: 'ክዋኔው አልተሳካም',
loadError: 'ውጤቶችን በማምጣት ላይ ስህተት',
cancel: 'ሰርዝ',
delete: 'ሰርዝ',
close: 'ዝጋ',
save: 'አስቀምጥ',
saveResult: 'ውጤት አስቀምጥ',
section: 'ውጤቶች',
selectExamError: 'እባክዎ ፈተና ይምረጡ',
continue: 'ቀጥል',
confirmDelete: 'ውጤት ሰርዝ',
deleteConfirmText: 'እርግጠኛ ነዎት ይህን ውጤት መሰረዝ ይፈልጋሉ?',
stats: {
totalResults: 'ጠቅላላ ውጤቶች',
passed: 'ያለፉ',
failed: 'ያልተሳኩ',
avgScore: 'አማካይ ውጤት',
},
columns: {
seafarer: 'መርከበኛ',
exam: 'ፈተና',
totalScore: 'ጠቅላላ ውጤት',
status: 'ሁኔታ',
date: 'ቀን',
},
detail: {
title: 'የውጤት ዝርዝር',
seafarerProfile: 'የመርከበኛ መገለጫ',
examDetails: 'የፈተና ዝርዝሮች',
fullName: 'ሙሉ ስም',
gender: 'ፆታ',
dateOfBirth: 'የትውልድ ቀን',
maritalStatus: 'የትዳር ሁኔታ',
examTitle: 'የፈተና ርዕስ',
titleAm: 'ርዕስ (አማርኛ)',
type: 'አይነት',
venue: 'ቦታ',
date: 'ቀን',
passMark: 'ማለፊያ ውጤት',
status: 'ሁኔታ',
remark: 'ማስታወሻ',
scoreBreakdown: 'የውጤት ክፍፍል',
question: 'ጥያቄ',
max: 'ከፍተኛ',
score: 'ውጤት',
remarkShort: 'ማስታወሻ',
selectExam: 'ውጤት ለመመዝገብ የሚፈልጉትን ፈተና ይምረጡ።',
exam: 'ፈተና',
selectExamPlaceholder: 'ፈተና ይምረጡ',
},
recordModal: {
title: 'ውጤት ያስመዝግቡ',
seafarer: 'መርከበኛ',
seafarerPlaceholder: 'መርከበኛ ይፈልጉ እና ይምረጡ',
scorePerQuestion: 'በጥያቄ ውጤት',
question: 'ጥያቄ',
maxPoints: 'ከፍተኛ ውጤት',
score: 'ውጤት',
remark: 'ማስታወሻ',
remarkOptional: 'ማስታወሻ (አማራጭ)',
remarkPlaceholder: 'የኦፊሰር ማስታወሻ',
totalScore: 'ጠቅላላ ውጤት',
passMark: 'ማለፊያ ውጤት',
status: 'ሁኔታ',
noQuestions: 'ለዚህ ፈተና ምንም ጥያቄዎች አልተመደቡም። መጀመሪያ ጥያቄዎችን ይመድቡ።',
seafarerRequired: 'እባክዎ መርከበኛ ይምረጡ',
saveSuccess: 'ውጤት ተመዝግቧል',
saveError: 'ውጤቱን ማስቀመጥ አልተሳካም',
passed: 'አልፏል',
failed: 'አልተሳካም',
},
status: {
PASSED: 'አልፏል',
FAILED: 'አልተሳካም',
},
action: {
viewEdit: 'ተመልከት / አስተካክል',
delete: 'ሰርዝ',
},
search: {
seafarer: 'መርከበኛ ይፈልጉ...',
filterByExam: 'በፈተና አጣራ',
allExams: 'ሁሉም ፈተናዎች',
},
},
question: {
title: 'ጥያቄዎች',
pool: 'የጥያቄ ማከማቻ',

View File

@@ -27,6 +27,9 @@ export const en = {
locations: 'Locations',
configuration: 'Configuration',
profile: 'Profile',
questions: 'Questions',
exams: 'Examinations',
examResults: 'Exam Results',
collapseSidebar: 'Collapse',
expandSidebar: 'Expand sidebar',
},
@@ -94,6 +97,143 @@ export const en = {
},
},
exam: {
title: 'Examinations',
subtitle: 'Manage exams, assign questions, and track results',
create: 'Create Exam',
update: 'Update Exam',
add: 'Create Exam',
noItems: 'No exams found',
created: 'Exam created',
updated: 'Exam updated',
deleted: 'Exam deleted',
error: 'Operation failed',
loadError: 'Error loading exams',
cancel: 'Cancel',
delete: 'Delete',
confirmDelete: 'Delete Exam',
deleteConfirmText: 'Are you sure you want to delete {{name}}?',
print: 'Print Exam',
recordResult: 'Record Result',
manageQuestions: 'Manage Questions',
saveAssignments: 'Save Assignments',
randomSelect: 'Randomly Select',
backToExams: 'Back to Exams',
notFound: 'Exam not found.',
noQuestionsAssigned: 'No questions assigned yet. Click "Manage Questions" to assign.',
columns: {
title: 'Title',
certification: 'Certification',
date: 'Date',
type: 'Type',
form: 'Form',
venue: 'Venue',
questions: 'Questions',
status: 'Status',
},
detail: {
title: 'Exam Details',
certification: 'Certification',
type: 'Type',
form: 'Form',
venue: 'Venue',
date: 'Date',
administration: 'Administration',
evaluation: 'Evaluation',
selection: 'Selection',
timeAllowed: 'Time Allowed',
passMark: 'Pass Mark',
totalPoints: 'Total Points',
questions: 'Questions',
directions: 'Directions',
questionLabel: 'Question',
questionsSection: 'Questions ({{pts}} pts total)',
},
form: {
basicInfo: 'Basic Info',
settings: 'Settings',
certification: 'Certification',
selectCertification: 'Select certification',
titleEn: 'Title (English)',
titleEnPlaceholder: 'Exam title in English',
titleAm: 'Title (Amharic)',
titleAmPlaceholder: 'የፈተና ርዕስ',
directionEn: 'Direction (English)',
directionEnPlaceholder: 'Instructions in English',
directionAm: 'Direction (Amharic)',
directionAmPlaceholder: 'መመሪያ በአማርኛ',
examDate: 'Exam Date',
venue: 'Venue',
venuePlaceholder: 'Exam venue',
timeAllowed: 'Time Allowed',
days: 'Days',
hours: 'Hours',
minutes: 'Minutes',
written: 'Written',
oral: 'Oral',
essay: 'Essay',
choice: 'Choice',
offline: 'Offline',
online: 'Online',
sum: 'Sum',
average: 'Average',
percentage: 'Percentage',
manual: 'Manual',
random: 'Random',
cuttingPoint: 'Cutting Point (Pass Mark)',
cuttingPointPlaceholder: 'Minimum score to pass',
status: 'Status',
statusPlaceholder: 'Exam status',
pending: 'Pending',
active: 'Active',
completed: 'Completed',
cancelled: 'Cancelled',
postponed: 'Postponed',
published: 'Published',
},
assigner: {
title: 'Assign Questions to Exam',
assignedTitle: 'Assigned Questions',
available: 'Available Questions',
assigned: 'Assigned Questions',
search: 'Search...',
noQuestions: 'No questions',
assignSelected: 'Assign Selected ({{count}})',
removeSelected: 'Remove Selected ({{count}})',
randomHint: 'Randomly select questions from the pool of {{total}} eligible questions. The selection will automatically ensure total points meet the passing mark ({{pts}} pts).',
selectCount: 'Count',
},
status: {
PENDING: 'Pending',
ACTIVE: 'Active',
COMPLETED: 'Completed',
CANCELLED: 'Cancelled',
POSTPONED: 'Postponed',
PUBLISHED: 'Published',
},
type: {
WRITTEN: 'Written',
ORAL: 'Oral',
},
formType: {
ESSAY: 'Essay',
CHOICE: 'Choice',
},
admin: {
OFFLINE: 'Offline',
ONLINE: 'Online',
},
eval: {
SUM: 'Sum',
AVERAGE: 'Average',
PERCENTAGE: 'Percentage',
},
selection: {
MANUAL: 'Manual',
RANDOM: 'Random',
},
},
location: {
title: 'Locations',
hierarchy: 'Location Hierarchy',
@@ -261,6 +401,101 @@ export const en = {
},
},
result: {
title: 'Exam Results',
subtitle: 'View seafarer examination results and score breakdowns',
record: 'Record Result',
noItems: 'No results found',
noData: 'No data available',
created: 'Result recorded',
updated: 'Result updated',
deleted: 'Result deleted',
error: 'Operation failed',
loadError: 'Error loading results',
cancel: 'Cancel',
delete: 'Delete',
close: 'Close',
save: 'Save',
saveResult: 'Save Result',
section: 'Results',
selectExamError: 'Please select an exam',
continue: 'Continue',
confirmDelete: 'Delete Result',
deleteConfirmText: 'Are you sure you want to delete this result?',
stats: {
totalResults: 'Total Results',
passed: 'Passed',
failed: 'Failed',
avgScore: 'Avg Score',
},
columns: {
seafarer: 'Seafarer',
exam: 'Exam',
totalScore: 'Total Score',
status: 'Status',
date: 'Date',
},
detail: {
title: 'Result Detail',
seafarerProfile: 'Seafarer Profile',
examDetails: 'Exam Details',
fullName: 'Full Name',
gender: 'Gender',
dateOfBirth: 'Date of Birth',
maritalStatus: 'Marital Status',
examTitle: 'Exam Title',
titleAm: 'Title (Amharic)',
type: 'Type',
venue: 'Venue',
date: 'Date',
passMark: 'Pass Mark',
status: 'Status',
remark: 'Remark',
scoreBreakdown: 'Score Breakdown',
question: 'Question',
max: 'Max',
score: 'Score',
remarkShort: 'Remark',
selectExam: 'Choose the exam you want to record a result for.',
exam: 'Exam',
selectExamPlaceholder: 'Select an exam',
},
recordModal: {
title: 'Record Result',
seafarer: 'Seafarer',
seafarerPlaceholder: 'Search and select a seafarer',
scorePerQuestion: 'Score per Question',
question: 'Question',
maxPoints: 'Max Points',
score: 'Score',
remark: 'Remark',
remarkOptional: 'Remark (optional)',
remarkPlaceholder: 'Officer remarks',
totalScore: 'Total Score',
passMark: 'Pass Mark',
status: 'Status',
noQuestions: 'No questions assigned to this exam. Assign questions first.',
seafarerRequired: 'Please select a seafarer',
saveSuccess: 'Result recorded',
saveError: 'Failed to save result',
passed: 'PASSED',
failed: 'FAILED',
},
status: {
PASSED: 'PASSED',
FAILED: 'FAILED',
},
action: {
viewEdit: 'View / Edit',
delete: 'Delete',
},
search: {
seafarer: 'Search seafarer...',
filterByExam: 'Filter by exam',
allExams: 'All Exams',
},
},
question: {
title: 'Questions',
pool: 'Question Pool',