@tinyweb_dev/oe-exam-sdk 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/dist/api/exam-create.js +1 -179
  2. package/dist/api/exam-create.types.js +1 -1
  3. package/dist/api/exam-questions.js +1 -98
  4. package/dist/api/exam-questions.types.js +1 -1
  5. package/dist/api/exam-taking.js +1 -73
  6. package/dist/api/exam-taking.types.js +1 -1
  7. package/dist/api/index.js +1 -6
  8. package/dist/api/result-review.js +1 -50
  9. package/dist/api/result-review.types.js +1 -1
  10. package/dist/components/CueCardEditor.js +1 -58
  11. package/dist/components/common/ResolvedImage.js +1 -15
  12. package/dist/components/exams/CreateExamInfoForm.js +1 -35
  13. package/dist/components/exams/CreateExamPageContainer.js +1 -103
  14. package/dist/components/exams/ExamCreator.js +1 -89
  15. package/dist/components/exams/ExamPartTabs.js +1 -40
  16. package/dist/components/exams/ExamQuestionGrid.js +1 -18
  17. package/dist/components/exams/ExamQuestionsPageContainer.js +1 -90
  18. package/dist/components/exams/PartAudioUploader.js +1 -9
  19. package/dist/components/exams/TemplateSelector.js +1 -66
  20. package/dist/components/exams/api.js +1 -3
  21. package/dist/components/exams/create-exam.validation.js +1 -18
  22. package/dist/components/exams/exam-template.utils.js +1 -18
  23. package/dist/components/exams/index.js +1 -10
  24. package/dist/components/exams/take/ExamTakingPageContainer.js +1 -153
  25. package/dist/components/exams/take/GenericQuestionRenderer.js +1 -14
  26. package/dist/components/exams/take/exam-taking.utils.js +1 -88
  27. package/dist/components/exams/take/hooks/useSpeakingRecorder.js +1 -24
  28. package/dist/components/exams/take/index.js +1 -2
  29. package/dist/components/exams/take/types.js +1 -1
  30. package/dist/components/index.js +1 -42
  31. package/dist/components/questions/_shared/config/question-types.config.js +1 -333
  32. package/dist/components/questions/_shared/constants/color-palette.js +1 -21
  33. package/dist/components/questions/_shared/hooks/useAnswerGroupQuestionGroup.js +1 -105
  34. package/dist/components/questions/_shared/hooks/useBasicQuestionGroup.js +1 -222
  35. package/dist/components/questions/_shared/hooks/useCompareImagesGroup.js +1 -140
  36. package/dist/components/questions/_shared/hooks/useImageQuestionGroup.js +1 -123
  37. package/dist/components/questions/_shared/hooks/useInfoExchangeGroup.js +1 -50
  38. package/dist/components/questions/_shared/hooks/useQuestionFormState.js +1 -54
  39. package/dist/components/questions/_shared/hooks/useQuestionInitialization.js +1 -123
  40. package/dist/components/questions/_shared/hooks/useQuestionListGroup.js +1 -121
  41. package/dist/components/questions/_shared/hooks/useQuestionOnChange.js +1 -70
  42. package/dist/components/questions/_shared/hooks/useSceneQuestionGroup.js +1 -194
  43. package/dist/components/questions/_shared/index.js +1 -7
  44. package/dist/components/questions/_shared/types/answer-the-question.type.js +1 -1
  45. package/dist/components/questions/_shared/types/arrange-letters-into-words.type.js +1 -1
  46. package/dist/components/questions/_shared/types/choose-correct-adjective.type.js +1 -3
  47. package/dist/components/questions/_shared/types/color-region.config.js +1 -1
  48. package/dist/components/questions/_shared/types/fill-in-blank.type.js +1 -1
  49. package/dist/components/questions/_shared/types/fill-missing-words-in-grid.type.js +1 -1
  50. package/dist/components/questions/_shared/types/gn-speaking-interview.type.js +1 -1
  51. package/dist/components/questions/_shared/types/index.js +1 -12
  52. package/dist/components/questions/_shared/types/label-the-picture.type.js +1 -1
  53. package/dist/components/questions/_shared/types/listen-and-choose-from-answer-group.type.js +1 -1
  54. package/dist/components/questions/_shared/types/listen-and-choose-objects-in-scene.type.js +1 -1
  55. package/dist/components/questions/_shared/types/listen-and-drag-objects-into-scene.type.js +1 -1
  56. package/dist/components/questions/_shared/types/listen-and-speak-answer.type.js +1 -1
  57. package/dist/components/questions/_shared/types/listen-and-speak-compare-images.type.js +1 -1
  58. package/dist/components/questions/_shared/types/listen-and-speak-image-group.type.js +1 -1
  59. package/dist/components/questions/_shared/types/listen-and-speak-info-exchange.type.js +1 -1
  60. package/dist/components/questions/_shared/types/listen-and-speak-odd-one-out.type.js +1 -3
  61. package/dist/components/questions/_shared/types/listen-and-speak-question-list.type.js +1 -1
  62. package/dist/components/questions/_shared/types/listen-and-speak-with-story-images.type.js +1 -3
  63. package/dist/components/questions/_shared/types/listen-and-tick-answer.type.js +1 -1
  64. package/dist/components/questions/_shared/types/listening-drawline.type.js +1 -1
  65. package/dist/components/questions/_shared/types/look-and-choose-answer.type.js +1 -1
  66. package/dist/components/questions/_shared/types/look-picture-fill-word-hint.type.js +1 -1
  67. package/dist/components/questions/_shared/types/match-by-writing-answer.type.js +1 -1
  68. package/dist/components/questions/_shared/types/multiple-choice.type.js +1 -1
  69. package/dist/components/questions/_shared/types/question-group.type.js +1 -11
  70. package/dist/components/questions/_shared/types/read-and-color-objects.type.js +1 -1
  71. package/dist/components/questions/_shared/types/read-displayed-content.type.js +1 -1
  72. package/dist/components/questions/_shared/types/read-passage-and-answer-questions.type.js +1 -1
  73. package/dist/components/questions/_shared/types/speaking-describe-image.type.js +1 -1
  74. package/dist/components/questions/_shared/types/spontaneous-qa.type.js +1 -1
  75. package/dist/components/questions/_shared/types/word-fill-paragraph-with-options.type.js +1 -1
  76. package/dist/components/questions/_shared/types/word-fill-paragraph.type.js +1 -1
  77. package/dist/components/questions/_shared/types/word-fill-structured-form.type.js +1 -1
  78. package/dist/components/questions/_shared/types/word-ordering.type.js +1 -1
  79. package/dist/components/questions/_shared/types/write-a-short-letter.type.js +1 -1
  80. package/dist/components/questions/_shared/types/write-correct-verb-form.type.js +1 -3
  81. package/dist/components/questions/_shared/types/write-sentences.type.js +1 -1
  82. package/dist/components/questions/_shared/types/write-short-paragraph.type.js +1 -1
  83. package/dist/components/questions/_shared/utils/answer-builder.js +1 -79
  84. package/dist/components/questions/_shared/utils/createColorRegionRegistration.js +1 -39
  85. package/dist/components/questions/_shared/utils/id-generator.js +1 -3
  86. package/dist/components/questions/_shared/utils/question-validation.js +1 -21
  87. package/dist/components/questions/components/ColorNode.js +1 -85
  88. package/dist/components/questions/components/ColorRegionClient.js +1 -545
  89. package/dist/components/questions/components/ColorRegionCreator.js +1 -420
  90. package/dist/components/questions/components/ColorRegionNode.js +1 -59
  91. package/dist/components/questions/components/CreatorGuide.js +1 -103
  92. package/dist/components/questions/components/NameNode.js +1 -26
  93. package/dist/components/questions/components/QuestionBankOption.js +1 -46
  94. package/dist/components/questions/components/QuestionBasicInfoForm.js +1 -9
  95. package/dist/components/questions/components/QuestionCommonFields.js +1 -33
  96. package/dist/components/questions/components/QuestionSearchDropdown.js +1 -258
  97. package/dist/components/questions/components/QuestionTypeSelector.js +1 -32
  98. package/dist/components/questions/components/QuestionTypeSpecificForms.js +1 -6
  99. package/dist/components/questions/components/RegionNode.js +1 -94
  100. package/dist/components/questions/components/index.js +1 -14
  101. package/dist/components/questions/creator/QuestionCreator.js +1 -90
  102. package/dist/components/questions/creator/QuestionGroupCreator.js +1 -119
  103. package/dist/components/questions/creator/dedicated-component-router.js +1 -79
  104. package/dist/components/questions/creator/index.js +1 -3
  105. package/dist/components/questions/creator/question-type-registry.js +1 -80
  106. package/dist/components/questions/groups/ArticlesGroupCard.js +1 -121
  107. package/dist/components/questions/groups/BasicQuestionGroupCard.js +1 -50
  108. package/dist/components/questions/groups/DocumentGroupCard.js +1 -114
  109. package/dist/components/questions/groups/MatchAnswerGroupCard.js +1 -25
  110. package/dist/components/questions/index.js +1 -10
  111. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionClient.js +1 -37
  112. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionCreator.js +1 -351
  113. package/dist/components/questions/types/answer-the-question/register.js +1 -67
  114. package/dist/components/questions/types/answer-the-question/transform.js +1 -36
  115. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsClient.js +1 -141
  116. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsCreator.js +1 -118
  117. package/dist/components/questions/types/arrange-letters-into-words/index.js +1 -2
  118. package/dist/components/questions/types/arrange-letters-into-words/register.js +1 -4
  119. package/dist/components/questions/types/arrange-letters-into-words/transform.js +1 -24
  120. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveClient.js +1 -64
  121. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveCreator.js +1 -169
  122. package/dist/components/questions/types/choose-correct-adjective/index.js +1 -2
  123. package/dist/components/questions/types/choose-correct-adjective/register.js +1 -55
  124. package/dist/components/questions/types/choose-correct-adjective/transform.js +1 -16
  125. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerClient.js +1 -131
  126. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerCreator.js +1 -581
  127. package/dist/components/questions/types/choose-the-correct-answer/index.js +1 -2
  128. package/dist/components/questions/types/choose-the-correct-answer/register.js +1 -101
  129. package/dist/components/questions/types/choose-the-correct-answer/transform.js +1 -43
  130. package/dist/components/questions/types/fill-in-blank/FillInBlankClient.js +1 -275
  131. package/dist/components/questions/types/fill-in-blank/FillInBlankCreator.js +1 -448
  132. package/dist/components/questions/types/fill-in-blank/index.js +1 -2
  133. package/dist/components/questions/types/fill-in-blank/register.js +1 -138
  134. package/dist/components/questions/types/fill-in-blank/transform.js +1 -59
  135. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridClient.js +1 -117
  136. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridCreator.js +1 -671
  137. package/dist/components/questions/types/fill-missing-words-in-grid/index.js +1 -2
  138. package/dist/components/questions/types/fill-missing-words-in-grid/register.js +1 -37
  139. package/dist/components/questions/types/fill-missing-words-in-grid/transform.js +1 -15
  140. package/dist/components/questions/types/gn-speaking-interview/GNSpeakingInterviewCreator.js +1 -262
  141. package/dist/components/questions/types/gn-speaking-interview/register.js +1 -121
  142. package/dist/components/questions/types/gn-speaking-interview/transform.js +1 -48
  143. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingClient.js +1 -16
  144. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingCreator.js +1 -27
  145. package/dist/components/questions/types/image-object-matching/index.js +1 -2
  146. package/dist/components/questions/types/image-object-matching/register.js +1 -3
  147. package/dist/components/questions/types/image-object-matching/transform.js +1 -2
  148. package/dist/components/questions/types/label-the-picture/LabelThePictureClient.js +1 -102
  149. package/dist/components/questions/types/label-the-picture/LabelThePictureCreator.js +1 -344
  150. package/dist/components/questions/types/label-the-picture/index.js +1 -2
  151. package/dist/components/questions/types/label-the-picture/register.js +1 -54
  152. package/dist/components/questions/types/label-the-picture/transform.js +1 -28
  153. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupClient.js +1 -78
  154. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupCreator.js +1 -232
  155. package/dist/components/questions/types/listen-and-choose-from-answer-group/index.js +1 -2
  156. package/dist/components/questions/types/listen-and-choose-from-answer-group/register.js +1 -82
  157. package/dist/components/questions/types/listen-and-choose-from-answer-group/transform.js +1 -27
  158. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneClient.js +1 -70
  159. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneCreator.js +1 -386
  160. package/dist/components/questions/types/listen-and-choose-objects-in-scene/index.js +1 -2
  161. package/dist/components/questions/types/listen-and-choose-objects-in-scene/register.js +1 -100
  162. package/dist/components/questions/types/listen-and-choose-objects-in-scene/transform.js +1 -33
  163. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneClient.js +1 -106
  164. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneCreator.js +1 -457
  165. package/dist/components/questions/types/listen-and-drag-objects-into-scene/index.js +1 -2
  166. package/dist/components/questions/types/listen-and-drag-objects-into-scene/register.js +1 -110
  167. package/dist/components/questions/types/listen-and-drag-objects-into-scene/transform.js +1 -35
  168. package/dist/components/questions/types/listen-and-speak-answer/ArrowIndicator.js +1 -8
  169. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerClient.js +1 -22
  170. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerCreator.js +1 -291
  171. package/dist/components/questions/types/listen-and-speak-answer/index.js +1 -2
  172. package/dist/components/questions/types/listen-and-speak-answer/register.js +1 -84
  173. package/dist/components/questions/types/listen-and-speak-answer/transform.js +1 -27
  174. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesClient.js +1 -32
  175. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesCreator.js +1 -295
  176. package/dist/components/questions/types/listen-and-speak-compare-images/register.js +1 -79
  177. package/dist/components/questions/types/listen-and-speak-compare-images/transform.js +1 -27
  178. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupClient.js +1 -34
  179. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupCreator.js +1 -285
  180. package/dist/components/questions/types/listen-and-speak-image-group/register.js +1 -81
  181. package/dist/components/questions/types/listen-and-speak-image-group/transform.js +1 -26
  182. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeClient.js +1 -38
  183. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeCreator.js +1 -385
  184. package/dist/components/questions/types/listen-and-speak-info-exchange/register.js +1 -87
  185. package/dist/components/questions/types/listen-and-speak-info-exchange/transform.js +1 -32
  186. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutClient.js +1 -26
  187. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutCreator.js +1 -247
  188. package/dist/components/questions/types/listen-and-speak-odd-one-out/register.js +1 -59
  189. package/dist/components/questions/types/listen-and-speak-odd-one-out/transform.js +1 -18
  190. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListClient.js +1 -26
  191. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListCreator.js +1 -256
  192. package/dist/components/questions/types/listen-and-speak-question-list/register.js +1 -81
  193. package/dist/components/questions/types/listen-and-speak-question-list/transform.js +1 -26
  194. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesClient.js +1 -26
  195. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesCreator.js +1 -230
  196. package/dist/components/questions/types/listen-and-speak-with-story-images/register.js +1 -56
  197. package/dist/components/questions/types/listen-and-speak-with-story-images/transform.js +1 -16
  198. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerClient.js +1 -72
  199. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerCreator.js +1 -230
  200. package/dist/components/questions/types/look-picture-choose-correct-answer/index.js +1 -1
  201. package/dist/components/questions/types/look-picture-choose-correct-answer/register.js +1 -66
  202. package/dist/components/questions/types/look-picture-choose-correct-answer/transform.js +1 -42
  203. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerClient.js +1 -96
  204. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerCreator.js +1 -238
  205. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/index.js +1 -2
  206. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/register.js +1 -76
  207. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/transform.js +1 -19
  208. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintClient.js +1 -134
  209. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintCreator.js +1 -617
  210. package/dist/components/questions/types/look-picture-fill-word-hint/index.js +1 -2
  211. package/dist/components/questions/types/look-picture-fill-word-hint/register.js +1 -82
  212. package/dist/components/questions/types/look-picture-fill-word-hint/transform.js +1 -29
  213. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerClient.js +1 -38
  214. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerCreator.js +1 -359
  215. package/dist/components/questions/types/match-by-writing-answer/index.js +1 -3
  216. package/dist/components/questions/types/match-by-writing-answer/register.js +1 -58
  217. package/dist/components/questions/types/match-by-writing-answer/transform.js +1 -61
  218. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsClient.js +1 -16
  219. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsCreator.js +1 -23
  220. package/dist/components/questions/types/read-and-color-objects/index.js +1 -2
  221. package/dist/components/questions/types/read-and-color-objects/register.js +1 -3
  222. package/dist/components/questions/types/read-and-color-objects/transform.js +1 -36
  223. package/dist/components/questions/types/read-displayed-content/ReadDisplayedContentCreator.js +1 -125
  224. package/dist/components/questions/types/read-displayed-content/register.js +1 -64
  225. package/dist/components/questions/types/read-displayed-content/transform.js +1 -12
  226. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsClient.js +1 -64
  227. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsCreator.js +1 -511
  228. package/dist/components/questions/types/read-passage-and-answer-questions/index.js +1 -2
  229. package/dist/components/questions/types/read-passage-and-answer-questions/register.js +1 -58
  230. package/dist/components/questions/types/read-passage-and-answer-questions/transform.js +1 -28
  231. package/dist/components/questions/types/speaking-conversation/SpeakingConversationCreator.js +1 -373
  232. package/dist/components/questions/types/speaking-conversation/SpeakingConversationPreviewClient.js +1 -41
  233. package/dist/components/questions/types/speaking-conversation/register.js +1 -110
  234. package/dist/components/questions/types/speaking-conversation/transform.js +1 -34
  235. package/dist/components/questions/types/speaking-cue-card/SpeakingCueCardCreator.js +1 -74
  236. package/dist/components/questions/types/speaking-cue-card/register.js +1 -52
  237. package/dist/components/questions/types/speaking-cue-card/transform.js +1 -12
  238. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageClient.js +1 -10
  239. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageCreator.js +1 -161
  240. package/dist/components/questions/types/speaking-describe-image/index.js +1 -2
  241. package/dist/components/questions/types/speaking-describe-image/register.js +1 -69
  242. package/dist/components/questions/types/speaking-describe-image/transform.js +1 -16
  243. package/dist/components/questions/types/spontaneous-qa/SpontaneousQACreator.js +1 -234
  244. package/dist/components/questions/types/spontaneous-qa/register.js +1 -93
  245. package/dist/components/questions/types/spontaneous-qa/transform.js +1 -34
  246. package/dist/components/questions/types/true-false/TrueFalseClient.js +1 -75
  247. package/dist/components/questions/types/true-false/TrueFalseCreator.js +1 -244
  248. package/dist/components/questions/types/true-false/index.js +1 -2
  249. package/dist/components/questions/types/true-false/register.js +1 -77
  250. package/dist/components/questions/types/true-false/transform.js +1 -32
  251. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphClient.js +1 -233
  252. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphCreator.js +1 -631
  253. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphWrapper.js +1 -28
  254. package/dist/components/questions/types/word-fill-paragraph/index.js +1 -2
  255. package/dist/components/questions/types/word-fill-paragraph/register.js +1 -136
  256. package/dist/components/questions/types/word-fill-paragraph/transform.js +1 -56
  257. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormClient.js +1 -138
  258. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.js +1 -261
  259. package/dist/components/questions/types/word-fill-structured-form/index.js +1 -2
  260. package/dist/components/questions/types/word-fill-structured-form/register.js +1 -67
  261. package/dist/components/questions/types/word-fill-structured-form/transform.js +1 -40
  262. package/dist/components/questions/types/word-ordering/WordOrderingClient.js +1 -84
  263. package/dist/components/questions/types/word-ordering/WordOrderingCreator.js +1 -192
  264. package/dist/components/questions/types/word-ordering/index.js +1 -2
  265. package/dist/components/questions/types/word-ordering/register.js +1 -46
  266. package/dist/components/questions/types/word-ordering/transform.js +1 -24
  267. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterClient.js +1 -98
  268. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterCreator.js +1 -320
  269. package/dist/components/questions/types/write-a-short-letter/index.js +1 -2
  270. package/dist/components/questions/types/write-a-short-letter/register.js +1 -68
  271. package/dist/components/questions/types/write-a-short-letter/transform.js +1 -25
  272. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormClient.js +1 -61
  273. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormCreator.js +1 -196
  274. package/dist/components/questions/types/write-correct-verb-form/index.js +1 -2
  275. package/dist/components/questions/types/write-correct-verb-form/register.js +1 -62
  276. package/dist/components/questions/types/write-correct-verb-form/transform.js +1 -17
  277. package/dist/components/questions/types/write-sentences/WriteSentencesClient.js +1 -22
  278. package/dist/components/questions/types/write-sentences/WriteSentencesCreator.js +1 -174
  279. package/dist/components/questions/types/write-sentences/index.js +1 -2
  280. package/dist/components/questions/types/write-sentences/register.js +1 -58
  281. package/dist/components/questions/types/write-sentences/transform.js +1 -28
  282. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphClient.js +1 -96
  283. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphCreator.js +1 -161
  284. package/dist/components/questions/types/write-short-paragraph/index.js +1 -2
  285. package/dist/components/questions/types/write-short-paragraph/register.js +1 -4
  286. package/dist/components/questions/types/write-short-paragraph/transform.js +1 -21
  287. package/dist/components/questions/viewer/QuestionGroupViewer.js +1 -36
  288. package/dist/components/questions/viewer/QuestionViewer.js +1 -446
  289. package/dist/components/questions/viewer/index.js +1 -2
  290. package/dist/components/results/ResultReviewPageContainer.js +1 -98
  291. package/dist/components/results/ReviewQuestionRenderer.js +1 -72
  292. package/dist/components/results/index.js +1 -2
  293. package/dist/components/results/result-review.utils.js +1 -6
  294. package/dist/components/results/review-data.js +1 -150
  295. package/dist/components/results/review-renderer.utils.js +1 -97
  296. package/dist/components/results/review-types.js +1 -1
  297. package/dist/components/themes/cambridge-yle/CambridgeYleAudioPlayer.js +1 -138
  298. package/dist/components/themes/cambridge-yle/CambridgeYleBottomNav.js +1 -12
  299. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.js +1 -18
  300. package/dist/components/themes/cambridge-yle/CambridgeYleExampleText.js +1 -11
  301. package/dist/components/themes/cambridge-yle/CambridgeYleHeader.js +1 -11
  302. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.js +1 -9
  303. package/dist/components/themes/cambridge-yle/CambridgeYleNavButton.js +1 -13
  304. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.js +1 -8
  305. package/dist/components/themes/cambridge-yle/CambridgeYleProgressBar.js +1 -6
  306. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCard.js +1 -5
  307. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCardFullWidth.js +1 -9
  308. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.js +1 -41
  309. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.js +1 -25
  310. package/dist/components/themes/cambridge-yle/index.js +1 -13
  311. package/dist/components/themes/english-certification/EcAnswerTheQuestion.js +1 -24
  312. package/dist/components/themes/english-certification/EcMatchByWritingAnswer.js +1 -88
  313. package/dist/components/themes/english-certification/EcWordFillParagraph.js +1 -55
  314. package/dist/components/themes/english-certification/EcWordFillStructuredForm.js +1 -156
  315. package/dist/components/themes/english-certification/EcWritingTask.js +1 -34
  316. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.js +1 -114
  317. package/dist/components/themes/english-certification/EnglishCertificationBrand.js +1 -11
  318. package/dist/components/themes/english-certification/EnglishCertificationExamLayout.js +1 -21
  319. package/dist/components/themes/english-certification/EnglishCertificationFlagButton.js +1 -15
  320. package/dist/components/themes/english-certification/EnglishCertificationFooterBar.js +1 -19
  321. package/dist/components/themes/english-certification/EnglishCertificationGroupedQuestion.js +1 -148
  322. package/dist/components/themes/english-certification/EnglishCertificationHeader.js +1 -31
  323. package/dist/components/themes/english-certification/EnglishCertificationNavigationPanel.js +1 -71
  324. package/dist/components/themes/english-certification/EnglishCertificationOptionSelector.js +1 -33
  325. package/dist/components/themes/english-certification/EnglishCertificationPassagePanel.js +1 -16
  326. package/dist/components/themes/english-certification/EnglishCertificationQuestionCard.js +1 -22
  327. package/dist/components/themes/english-certification/EnglishCertificationQuestionItem.js +1 -37
  328. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.js +1 -72
  329. package/dist/components/themes/english-certification/EnglishCertificationReadingSection.js +1 -90
  330. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestion.js +1 -18
  331. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestionList.js +1 -29
  332. package/dist/components/themes/english-certification/english-certification-theme.js +1 -58
  333. package/dist/components/themes/english-certification/grouped-question-utils.js +1 -218
  334. package/dist/components/themes/english-certification/index.js +1 -21
  335. package/dist/components/themes/index.js +1 -6
  336. package/dist/components/themes/summer-sky/SummerSkyAudioPlayer.js +1 -170
  337. package/dist/components/themes/summer-sky/SummerSkyLayout.js +1 -221
  338. package/dist/components/themes/summer-sky/SummerSkySubmitModal.js +1 -18
  339. package/dist/components/themes/summer-sky/SummerSkyWaitingRoom.js +1 -194
  340. package/dist/components/themes/types.js +1 -1
  341. package/dist/components/ui/alert-dialog.js +1 -26
  342. package/dist/components/ui/alert.js +1 -22
  343. package/dist/components/ui/avatar.js +1 -12
  344. package/dist/components/ui/badge.js +1 -38
  345. package/dist/components/ui/button.js +1 -35
  346. package/dist/components/ui/calendar.js +1 -76
  347. package/dist/components/ui/card.js +1 -16
  348. package/dist/components/ui/carousel.js +1 -91
  349. package/dist/components/ui/checkbox.js +1 -9
  350. package/dist/components/ui/collapsible.js +1 -13
  351. package/dist/components/ui/command.js +1 -34
  352. package/dist/components/ui/confirm-dialog.js +1 -49
  353. package/dist/components/ui/dialog.js +1 -23
  354. package/dist/components/ui/drawer.js +1 -35
  355. package/dist/components/ui/dropdown-menu.js +1 -33
  356. package/dist/components/ui/file-upload.js +1 -155
  357. package/dist/components/ui/form.js +1 -62
  358. package/dist/components/ui/hover-card.js +1 -10
  359. package/dist/components/ui/image-preview.js +1 -29
  360. package/dist/components/ui/input.js +1 -8
  361. package/dist/components/ui/label.js +1 -9
  362. package/dist/components/ui/language-switcher.js +1 -15
  363. package/dist/components/ui/multi-select.js +1 -90
  364. package/dist/components/ui/points-input.js +1 -33
  365. package/dist/components/ui/popover.js +1 -26
  366. package/dist/components/ui/progress.js +1 -16
  367. package/dist/components/ui/radio-group.js +1 -12
  368. package/dist/components/ui/scroll-area.js +1 -11
  369. package/dist/components/ui/select.js +1 -38
  370. package/dist/components/ui/separator.js +1 -8
  371. package/dist/components/ui/sheet.js +1 -40
  372. package/dist/components/ui/single-select.js +1 -76
  373. package/dist/components/ui/skeleton.js +1 -6
  374. package/dist/components/ui/switch.js +1 -8
  375. package/dist/components/ui/table.js +1 -20
  376. package/dist/components/ui/tabs.js +1 -17
  377. package/dist/components/ui/textarea.js +1 -8
  378. package/dist/components/ui/tooltip.js +1 -11
  379. package/dist/index.js +1 -19
  380. package/dist/mcp/config.js +1 -32
  381. package/dist/mcp/http-client.js +1 -48
  382. package/dist/mcp/index.js +1 -29
  383. package/dist/mcp/tools/_helpers.js +1 -25
  384. package/dist/mcp/tools/exams.js +1 -439
  385. package/dist/mcp/tools/index.js +1 -6
  386. package/dist/mcp/tools/results.js +1 -19
  387. package/dist/shared/constants/ApiConstant.js +1 -276
  388. package/dist/shared/constants/QueryKeyConstant.js +1 -112
  389. package/dist/shared/constants/exam-level.enum.js +1 -41
  390. package/dist/shared/constants/landings/placement-test.constants.js +1 -431
  391. package/dist/shared/constants/question-skills.js +1 -267
  392. package/dist/shared/constants/routes.js +1 -81
  393. package/dist/shared/index.js +1 -7
  394. package/dist/shared/lib/hooks/index.js +1 -10
  395. package/dist/shared/lib/hooks/useAlertDialog.js +1 -57
  396. package/dist/shared/lib/hooks/useAudioPlayCounter.js +1 -30
  397. package/dist/shared/lib/hooks/useAudioPreview.js +1 -81
  398. package/dist/shared/lib/hooks/useAudioUpload.js +1 -24
  399. package/dist/shared/lib/hooks/useConfirmDialog.js +1 -89
  400. package/dist/shared/lib/hooks/useDebouncedCallback.js +1 -32
  401. package/dist/shared/lib/hooks/useDelayedAutoPlay.js +1 -12
  402. package/dist/shared/lib/hooks/useFileUpload.js +1 -24
  403. package/dist/shared/lib/hooks/useImageUrl.js +1 -5
  404. package/dist/shared/lib/hooks/usePresignedFileUrl.js +1 -10
  405. package/dist/shared/lib/hooks/useReactHookForm.js +1 -31
  406. package/dist/shared/lib/hooks/useToast.js +1 -62
  407. package/dist/shared/lib/i18n/index.js +1 -54
  408. package/dist/shared/lib/i18n/messages/en/admin.js +1 -2104
  409. package/dist/shared/lib/i18n/messages/en/auth.js +1 -86
  410. package/dist/shared/lib/i18n/messages/en/common.js +1 -140
  411. package/dist/shared/lib/i18n/messages/en/file-upload.js +1 -18
  412. package/dist/shared/lib/i18n/messages/en/student.js +1 -133
  413. package/dist/shared/lib/i18n/messages/en/terms.js +1 -37
  414. package/dist/shared/lib/i18n/messages/en.js +1 -15
  415. package/dist/shared/lib/i18n/messages/vi/admin.js +1 -2104
  416. package/dist/shared/lib/i18n/messages/vi/auth.js +1 -86
  417. package/dist/shared/lib/i18n/messages/vi/common.js +1 -140
  418. package/dist/shared/lib/i18n/messages/vi/file-upload.js +1 -18
  419. package/dist/shared/lib/i18n/messages/vi/student.js +1 -133
  420. package/dist/shared/lib/i18n/messages/vi/terms.js +1 -37
  421. package/dist/shared/lib/i18n/messages/vi.js +1 -15
  422. package/dist/shared/lib/i18n/types.js +1 -1
  423. package/dist/shared/lib/stores/examQuestionStore.js +1 -212
  424. package/dist/shared/lib/stores/localeStore.js +1 -10
  425. package/dist/shared/lib/utils/public-page.js +1 -44
  426. package/dist/shared/lib/utils/question-transform-types.js +1 -1
  427. package/dist/shared/lib/utils/question-transform.js +1 -174
  428. package/dist/shared/lib/utils.js +1 -168
  429. package/dist/shared/lib/validation/choose-correct-answer.validation.js +1 -111
  430. package/dist/shared/lib/validation/label-the-picture.validation.js +1 -19
  431. package/dist/shared/lib/validation/listen-and-choose-from-answer-group.validation.js +1 -46
  432. package/dist/shared/lib/validation/listen-and-choose-objects-in-scene.validation.js +1 -21
  433. package/dist/shared/lib/validation/listen-and-drag-objects-into-scene.validation.js +1 -34
  434. package/dist/shared/lib/validation/listen-and-speak-answer.validation.js +1 -40
  435. package/dist/shared/lib/validation/listen-and-speak-compare-images.validation.js +1 -45
  436. package/dist/shared/lib/validation/listen-and-speak-image-group.validation.js +1 -19
  437. package/dist/shared/lib/validation/listen-and-speak-info-exchange.validation.js +1 -39
  438. package/dist/shared/lib/validation/listen-and-speak-odd-one-out.validation.js +1 -32
  439. package/dist/shared/lib/validation/listen-and-speak-question-list.validation.js +1 -19
  440. package/dist/shared/lib/validation/listen-and-speak-with-story-images.validation.js +1 -28
  441. package/dist/shared/lib/validation/look-picture-choose-correct-answer.validation.js +1 -12
  442. package/dist/shared/lib/validation/look-picture-fill-blank-choose-answer.validation.js +1 -47
  443. package/dist/shared/lib/validation/read-and-color-objects.validation.js +1 -29
  444. package/dist/shared/lib/validation/read-displayed-content.validation.js +1 -28
  445. package/dist/shared/lib/validation/speaking-conversation.validation.js +1 -75
  446. package/dist/shared/lib/validation/speaking-describe-image.validation.js +1 -31
  447. package/dist/shared/lib/validation/spontaneous-qa.validation.js +1 -48
  448. package/dist/shared/lib/validation/word-fill-paragraph-default.validation.js +1 -38
  449. package/dist/shared/lib/validation/word-fill-paragraph-with-options.validation.js +1 -39
  450. package/dist/shared/lib/validation/word-fill-paragraph.validation.js +1 -43
  451. package/dist/shared/lib/validation/word-ordering.validation.js +1 -33
  452. package/dist/shared/types/branch.types.js +1 -6
  453. package/dist/shared/types/common.types.js +1 -50
  454. package/dist/shared/types/entities/exam-schedule.types.js +1 -5
  455. package/dist/shared/types/entities/exam.types.js +1 -1
  456. package/dist/shared/types/entities/question.types.js +1 -4
  457. package/dist/shared/types/entities/result.types.js +1 -4
  458. package/dist/shared/types/entities/user.types.js +1 -4
  459. package/dist/shared/types/exam-taking.types.js +1 -2
  460. package/dist/shared/types/history.types.js +1 -34
  461. package/dist/shared/types/index.js +1 -1
  462. package/dist/shared/types/questions/choose-correct-adjective.js +1 -4
  463. package/dist/shared/types/questions/choose-the-correct-answer.js +1 -9
  464. package/dist/shared/types/questions/fill-missing-words-in-grid.js +1 -11
  465. package/dist/shared/types/questions/index.js +1 -40
  466. package/dist/shared/types/questions/listen-and-speak-answer.js +1 -1
  467. package/dist/shared/types/questions/listen-and-speak-compare-images.js +1 -1
  468. package/dist/shared/types/questions/listen-and-speak-image-group.js +1 -1
  469. package/dist/shared/types/questions/listen-and-speak-info-exchange.js +1 -3
  470. package/dist/shared/types/questions/listen-and-speak-odd-one-out.js +1 -3
  471. package/dist/shared/types/questions/listen-and-speak-question-list.js +1 -1
  472. package/dist/shared/types/questions/listen-and-speak-with-story-images.js +1 -3
  473. package/dist/shared/types/questions/look-picture-choose-correct-answer.js +1 -5
  474. package/dist/shared/types/questions/look-picture-fill-blank-choose-answer.js +1 -9
  475. package/dist/shared/types/questions/look-picture-fill-word-hint.js +1 -7
  476. package/dist/shared/types/questions/read-displayed-content.js +1 -1
  477. package/dist/shared/types/questions/speaking-conversation.js +1 -7
  478. package/dist/shared/types/questions/speaking-describe-image.js +1 -1
  479. package/dist/shared/types/questions/spontaneous-qa.js +1 -1
  480. package/dist/shared/types/questions/write-correct-verb-form.js +1 -12
  481. package/dist/shared/types/role.types.js +1 -1
  482. package/dist/shared/types/structure-management.js +1 -28
  483. package/dist/shared/types/student.types.js +1 -54
  484. package/dist/shared/types/teacher-dashboard-rooms.js +1 -2
  485. package/package.json +4 -2
@@ -1,2104 +1 @@
1
- const admin = {
2
- // User management
3
- 'admin.user.create.success': 'User created successfully!',
4
- 'admin.user.update.success': 'User updated successfully!',
5
- 'admin.user.update.error': 'An error occurred while updating the user!',
6
- 'admin.user.delete.success': 'User deleted successfully!',
7
- 'admin.user.delete.error': 'An error occurred while deleting the user!',
8
- // Exam management
9
- 'admin.exam.create.error': 'Unable to create exam. Please try again!',
10
- 'admin.exam.update.error': 'Unable to update exam. Please try again!',
11
- 'admin.exam.delete.error': 'Unable to delete exam. Please try again!',
12
- 'admin.exam.template.update.error': 'Unable to update template. Please try again!',
13
- 'admin.exam.copy.success': 'Exam copied successfully: {name} ({count} questions)',
14
- 'admin.exam.copy.error': 'Unable to copy exam. Please try again!',
15
- 'admin.exam.toggle.activated': 'Exam "{name}" activated!',
16
- 'admin.exam.toggle.deactivated': 'Exam "{name}" deactivated!',
17
- 'admin.exam.toggle.error': 'Unable to change exam status. Please try again!',
18
- 'admin.exam.variants.delete.success': 'Successfully deleted {count} shuffled variants!',
19
- 'admin.exam.variants.delete.empty': 'No shuffled variants to delete.',
20
- 'admin.exam.variants.delete.error': 'Unable to delete shuffled variants. Please try again!',
21
- // Question management
22
- 'admin.question.batchCreate.partial': 'Created {successCount}/{total} questions successfully. {errorCount} failed.',
23
- 'admin.question.batchCreate.itemError': 'Question {index}: {error}',
24
- 'admin.question.batchCreate.error': 'Error creating questions: {message}',
25
- // Question bank
26
- 'admin.questionBank.update.success': 'Question updated successfully!',
27
- 'admin.questionBank.update.error': 'Unable to update question. Please try again!',
28
- 'admin.questionBank.delete.success': 'Question deleted successfully!',
29
- 'admin.questionBank.delete.error': 'Unable to delete question. Please try again!',
30
- 'admin.questionBank.create.missingInfo': 'Missing information',
31
- 'admin.questionBank.create.success': 'Success!',
32
- 'admin.questionBank.create.error': 'Error',
33
- 'admin.questionBank.create.preview': 'Preview',
34
- // Question bank - Page
35
- 'admin.questionBank.page.title': 'Question Bank',
36
- 'admin.questionBank.page.subtitle': 'Manage and organize questions for exams',
37
- 'admin.questionBank.btn.add': 'Add question',
38
- 'admin.questionBank.fetch.error': 'Error',
39
- 'admin.questionBank.fetch.errorDesc': 'Unable to load question list',
40
- 'admin.questionBank.delete.successMsg': 'Question deleted',
41
- 'admin.questionBank.delete.successDesc': 'Deleted question {code}',
42
- 'admin.questionBank.delete.errorMsg': 'Error',
43
- 'admin.questionBank.delete.errorDesc': 'Unable to delete question',
44
- 'admin.questionBank.update.successMsg': 'Updated',
45
- 'admin.questionBank.update.successDesc': 'Updated question {code}!',
46
- 'admin.questionBank.update.errorMsg': 'Error',
47
- 'admin.questionBank.update.errorDesc': 'Unable to update question',
48
- 'admin.questionBank.create.successMsg': 'Question created',
49
- 'admin.questionBank.create.successDesc': 'Successfully created question {code}!',
50
- // Question bank - Statistics
51
- 'admin.questionBank.stats.totalQuestions': 'Total Questions',
52
- 'admin.questionBank.stats.inBank': 'In question bank',
53
- 'admin.questionBank.stats.totalUsage': 'Usage Count',
54
- 'admin.questionBank.stats.inExams': 'In exams',
55
- 'admin.questionBank.stats.avgPoints': 'Avg Points',
56
- 'admin.questionBank.stats.avgScore': 'Average score',
57
- 'admin.questionBank.stats.difficultyDistribution': 'Difficulty Distribution',
58
- 'admin.questionBank.stats.questions': 'questions',
59
- // Question bank - Difficulty
60
- 'admin.questionBank.difficulty.easy': 'Easy',
61
- 'admin.questionBank.difficulty.medium': 'Medium',
62
- 'admin.questionBank.difficulty.hard': 'Hard',
63
- // Question bank - Table
64
- 'admin.questionBank.table.title': 'Question List',
65
- 'admin.questionBank.table.loading': 'Loading...',
66
- 'admin.questionBank.table.showing': 'Showing {count} / {total} questions',
67
- 'admin.questionBank.table.empty': 'No questions found',
68
- 'admin.questionBank.table.loadingData': 'Loading data...',
69
- 'admin.questionBank.table.created': 'Created: {date}',
70
- 'admin.questionBank.table.pointsUnit': 'pts',
71
- 'admin.questionBank.table.usageUnit': 'times',
72
- // Question bank - Filter
73
- 'admin.questionBank.filter.searchPlaceholder': 'Search by content...',
74
- 'admin.questionBank.filter.typePlaceholder': 'Question type',
75
- 'admin.questionBank.filter.typeAll': 'All types',
76
- 'admin.questionBank.filter.difficultyPlaceholder': 'Difficulty',
77
- 'admin.questionBank.filter.difficultyAll': 'All difficulties',
78
- 'admin.questionBank.filter.skillPlaceholder': 'Skill',
79
- 'admin.questionBank.filter.skillAll': 'All skills',
80
- 'admin.questionBank.filter.clear': 'Clear filters',
81
- // Question bank - Table columns
82
- 'admin.questionBank.col.code': 'CODE',
83
- 'admin.questionBank.col.title': 'Title',
84
- 'admin.questionBank.col.type': 'TYPE',
85
- 'admin.questionBank.col.difficulty': 'DIFFICULTY',
86
- 'admin.questionBank.col.skill': 'SKILL',
87
- 'admin.questionBank.col.points': 'POINTS',
88
- 'admin.questionBank.col.usage': 'USAGE',
89
- 'admin.questionBank.col.actions': 'ACTIONS',
90
- // Question bank - Action buttons
91
- 'admin.questionBank.action.view': 'View details',
92
- 'admin.questionBank.action.edit': 'Edit',
93
- 'admin.questionBank.action.delete': 'Delete',
94
- // Question bank - Add Dialog
95
- 'admin.questionBank.dialog.add.title': 'Add New Question',
96
- 'admin.questionBank.dialog.add.section1': 'Basic Information',
97
- 'admin.questionBank.dialog.add.section2': 'Question Type',
98
- 'admin.questionBank.dialog.add.section3': 'Question Content',
99
- 'admin.questionBank.dialog.add.code': 'Question Code',
100
- 'admin.questionBank.dialog.add.codePlaceholder': 'E.g.: QB001',
101
- 'admin.questionBank.dialog.add.titleLabel': 'Title',
102
- 'admin.questionBank.dialog.add.titlePlaceholder': 'Brief description of the question',
103
- 'admin.questionBank.dialog.add.difficulty': 'Difficulty Level',
104
- 'admin.questionBank.dialog.add.skill': 'Skill',
105
- 'admin.questionBank.dialog.add.typePlaceholder': 'Select question type...',
106
- 'admin.questionBank.dialog.add.typeNoOptions': 'No question types for {skill}',
107
- 'admin.questionBank.dialog.add.noTypeSelected': 'No question type selected',
108
- 'admin.questionBank.dialog.add.selectTypeHint': 'Please select a question type in step 2',
109
- 'admin.questionBank.dialog.add.required': 'Required',
110
- 'admin.questionBank.dialog.add.cancel': 'Cancel',
111
- 'admin.questionBank.dialog.add.saving': 'Saving...',
112
- 'admin.questionBank.dialog.add.save': 'Add question',
113
- 'admin.questionBank.dialog.add.codeError': 'Please enter question code',
114
- 'admin.questionBank.dialog.add.titleError': 'Please enter title',
115
- 'admin.questionBank.dialog.add.typeError': 'Please select question type',
116
- // Question bank - Edit Dialog
117
- 'admin.questionBank.dialog.edit.title': 'Edit Question',
118
- 'admin.questionBank.dialog.edit.section1': 'Basic Information',
119
- 'admin.questionBank.dialog.edit.section2': 'Question Type',
120
- 'admin.questionBank.dialog.edit.section3': 'Question Content',
121
- 'admin.questionBank.dialog.edit.code': 'Question Code',
122
- 'admin.questionBank.dialog.edit.codePlaceholder': 'Enter question code',
123
- 'admin.questionBank.dialog.edit.titleLabel': 'Title',
124
- 'admin.questionBank.dialog.edit.titlePlaceholder': 'Brief description of the question',
125
- 'admin.questionBank.dialog.edit.difficulty': 'Difficulty Level',
126
- 'admin.questionBank.dialog.edit.skill': 'Skill',
127
- 'admin.questionBank.dialog.edit.unchangeable': '(Cannot be changed)',
128
- 'admin.questionBank.dialog.edit.required': 'Required',
129
- 'admin.questionBank.dialog.edit.cancel': 'Cancel',
130
- 'admin.questionBank.dialog.edit.saving': 'Saving...',
131
- 'admin.questionBank.dialog.edit.save': 'Save changes',
132
- 'admin.questionBank.dialog.edit.codeError': 'Please enter question code',
133
- 'admin.questionBank.dialog.edit.titleError': 'Please enter title',
134
- // Question bank - Delete Dialog
135
- 'admin.questionBank.dialog.delete.title': 'Confirm Delete Question',
136
- 'admin.questionBank.dialog.delete.message': 'Are you sure you want to delete question',
137
- 'admin.questionBank.dialog.delete.warning': 'This action cannot be undone.',
138
- 'admin.questionBank.dialog.delete.cancel': 'Cancel',
139
- 'admin.questionBank.dialog.delete.deleting': 'Deleting...',
140
- 'admin.questionBank.dialog.delete.confirm': 'Delete question',
141
- // Question bank - View Dialog
142
- 'admin.questionBank.dialog.view.title': 'Question Details',
143
- 'admin.questionBank.dialog.view.points': 'points',
144
- 'admin.questionBank.dialog.view.usage': 'Used {count} times',
145
- 'admin.questionBank.dialog.view.preview': 'Question Preview',
146
- 'admin.questionBank.dialog.view.explanation': 'Answer Explanation',
147
- // Question bank - Create Page
148
- 'admin.questionBank.createPage.title': 'Create New Question',
149
- 'admin.questionBank.createPage.subtitle': 'Add question to the Bank for reuse in exam sets',
150
- 'admin.questionBank.createPage.breadcrumb.list': 'Question Bank',
151
- 'admin.questionBank.createPage.breadcrumb.create': 'Create New',
152
- 'admin.questionBank.createPage.infoTitle': 'Creating question type: {type}',
153
- 'admin.questionBank.createPage.infoDesc': 'Fill in the complete question information below. You can preview the question before saving.',
154
- 'admin.questionBank.createPage.loading': 'Loading...',
155
- 'admin.questionBank.createPage.back': 'Go back',
156
- 'admin.questionBank.createPage.preview': 'Preview',
157
- 'admin.questionBank.createPage.saving': 'Saving...',
158
- 'admin.questionBank.createPage.save': 'Save question',
159
- 'admin.questionBank.createPage.cancelTitle': 'Cancel question creation?',
160
- 'admin.questionBank.createPage.cancelMessage': 'You have unsaved changes. If you cancel, all information will be lost. Are you sure you want to cancel?',
161
- 'admin.questionBank.createPage.continueEditing': 'Continue editing',
162
- 'admin.questionBank.createPage.cancelAndExit': 'Cancel and exit',
163
- 'admin.questionBank.createPage.missingInfoDesc': 'Please fill in all question information',
164
- 'admin.questionBank.createPage.savedDesc': 'Saved question "{title}" to the bank',
165
- 'admin.questionBank.createPage.saveErrorDesc': 'Unable to save question. Please try again.',
166
- 'admin.questionBank.createPage.previewDesc': 'Preview feature is under development',
167
- // Schedule management
168
- 'admin.schedule.update.success': 'Schedule updated successfully!',
169
- 'admin.schedule.delete.success': 'Deleted schedule {id}',
170
- // Schedule page
171
- 'admin.schedules.title': 'Schedule Management',
172
- 'admin.schedules.subtitle': 'Schedule and manage exam times for contests',
173
- 'admin.schedules.viewCalendar': 'Calendar',
174
- 'admin.schedules.viewList': 'List',
175
- // Schedule stats
176
- 'admin.schedules.stats.totalSchedules': 'Total Schedules',
177
- 'admin.schedules.stats.totalSchedulesDesc': 'All exam schedules',
178
- 'admin.schedules.stats.confirmed': 'Confirmed',
179
- 'admin.schedules.stats.confirmedDesc': 'Schedules ready',
180
- 'admin.schedules.stats.totalStudents': 'Total Students',
181
- 'admin.schedules.stats.totalStudentsDesc': 'Assigned to schedules',
182
- // Schedule filters
183
- 'admin.schedules.filters.searchPlaceholder': 'Search schedules...',
184
- 'admin.schedules.filters.skill': 'Skill',
185
- 'admin.schedules.filters.allSkills': 'All skills',
186
- 'admin.schedules.filters.status': 'Status',
187
- 'admin.schedules.filters.allStatuses': 'All statuses',
188
- 'admin.schedules.filters.statusOpen': 'Open',
189
- 'admin.schedules.filters.statusLocked': 'Locked',
190
- 'admin.schedules.filters.clear': 'Clear filters',
191
- // Schedule calendar
192
- 'admin.schedules.calendar.today': 'Today',
193
- 'admin.schedules.calendar.daySun': 'Sun',
194
- 'admin.schedules.calendar.dayMon': 'Mon',
195
- 'admin.schedules.calendar.dayTue': 'Tue',
196
- 'admin.schedules.calendar.dayWed': 'Wed',
197
- 'admin.schedules.calendar.dayThu': 'Thu',
198
- 'admin.schedules.calendar.dayFri': 'Fri',
199
- 'admin.schedules.calendar.daySat': 'Sat',
200
- 'admin.schedules.calendar.loading': 'Loading schedules...',
201
- 'admin.schedules.calendar.noLimit': 'No limit',
202
- // Schedule list
203
- 'admin.schedules.list.title': 'Schedule List',
204
- 'admin.schedules.list.loading': 'Loading...',
205
- 'admin.schedules.list.loadingList': 'Loading schedule list...',
206
- 'admin.schedules.list.showing': 'Showing {current} / {total} schedules',
207
- 'admin.schedules.list.empty': 'No schedules found',
208
- 'admin.schedules.list.locked': 'Locked',
209
- 'admin.schedules.list.open': 'Open',
210
- 'admin.schedules.list.contest': 'Contest:',
211
- 'admin.schedules.list.exam': 'Exam:',
212
- 'admin.schedules.list.startTime': 'Start:',
213
- 'admin.schedules.list.endTime': 'End:',
214
- 'admin.schedules.list.noLimit': 'No limit',
215
- 'admin.schedules.list.locationUnknown': 'Not specified',
216
- 'admin.schedules.list.noSupervisor': 'Not assigned',
217
- 'admin.schedules.list.participants': '{count} participants',
218
- 'admin.schedules.list.page': 'Page {current} / {total}',
219
- 'admin.schedules.list.prev': 'Previous',
220
- 'admin.schedules.list.next': 'Next',
221
- // Schedule dialogs (calendar & list view)
222
- 'admin.schedules.dialog.detailTitle': 'Schedule Details',
223
- 'admin.schedules.dialog.room': 'Exam Room',
224
- 'admin.schedules.dialog.contest': 'Contest',
225
- 'admin.schedules.dialog.exam': 'Exam',
226
- 'admin.schedules.dialog.startTime': 'Start Time',
227
- 'admin.schedules.dialog.endTime': 'End Time',
228
- 'admin.schedules.dialog.duration': 'Duration',
229
- 'admin.schedules.dialog.status': 'Status',
230
- 'admin.schedules.dialog.participantCount': 'Participants',
231
- 'admin.schedules.dialog.participants': '{count} participants',
232
- 'admin.schedules.dialog.notAssigned': 'Not assigned',
233
- 'admin.schedules.dialog.notSet': 'Not specified',
234
- 'admin.schedules.dialog.noLimit': 'No limit',
235
- 'admin.schedules.dialog.locked': 'Locked',
236
- 'admin.schedules.dialog.open': 'Open',
237
- 'admin.schedules.dialog.durationMinutes': '{duration} minutes',
238
- 'admin.schedules.dialog.location': 'Location',
239
- 'admin.schedules.dialog.supervisor': 'Supervisor',
240
- 'admin.schedules.dialog.noSupervisor': 'Not assigned',
241
- // Schedule view dialog (ExamSchedule detail)
242
- 'admin.schedules.view.title': 'Schedule Details',
243
- 'admin.schedules.view.contest': 'Contest',
244
- 'admin.schedules.view.skill': 'Skill',
245
- 'admin.schedules.view.status': 'Status',
246
- 'admin.schedules.view.examDate': 'Exam Date',
247
- 'admin.schedules.view.startTime': 'Start Time',
248
- 'admin.schedules.view.endTime': 'End Time',
249
- 'admin.schedules.view.location': 'Location',
250
- 'admin.schedules.view.supervisor': 'Supervisor',
251
- 'admin.schedules.view.studentCount': 'Student Count',
252
- 'admin.schedules.view.duration': 'Duration',
253
- 'admin.schedules.view.durationMinutes': '{duration} minutes',
254
- // Schedule edit dialog
255
- 'admin.schedules.edit.title': 'Edit Schedule',
256
- 'admin.schedules.edit.contest': 'Contest',
257
- 'admin.schedules.edit.skill': 'Skill',
258
- 'admin.schedules.edit.skillPlaceholder': 'Select skill',
259
- 'admin.schedules.edit.examDate': 'Exam Date',
260
- 'admin.schedules.edit.startTime': 'Start Time',
261
- 'admin.schedules.edit.endTime': 'End Time',
262
- 'admin.schedules.edit.room': 'Exam Room',
263
- 'admin.schedules.edit.roomPlaceholder': 'Select room',
264
- 'admin.schedules.edit.invigilator': 'Invigilator',
265
- 'admin.schedules.edit.invigilatorPlaceholder': 'Select invigilator',
266
- 'admin.schedules.edit.capacity': 'Capacity',
267
- 'admin.schedules.edit.status': 'Status',
268
- 'admin.schedules.edit.statusPlaceholder': 'Select status',
269
- 'admin.schedules.edit.location': 'Location',
270
- 'admin.schedules.edit.locationPlaceholder': 'Enter location (e.g., Floor 1, Building A)',
271
- 'admin.schedules.edit.notes': 'Notes',
272
- 'admin.schedules.edit.notesPlaceholder': 'Enter notes about the schedule (optional)',
273
- 'admin.schedules.edit.cancel': 'Cancel',
274
- 'admin.schedules.edit.save': 'Save Changes',
275
- // Schedule delete dialog
276
- 'admin.schedules.delete.title': 'Confirm Delete Schedule',
277
- 'admin.schedules.delete.message': 'Are you sure you want to delete schedule',
278
- 'admin.schedules.delete.warning': 'This action cannot be undone.',
279
- 'admin.schedules.delete.cancel': 'Cancel',
280
- 'admin.schedules.delete.confirm': 'Delete Schedule',
281
- // Schedule utils
282
- 'admin.schedules.utils.notSet': 'Not set',
283
- 'admin.schedules.utils.noLimit': 'No limit',
284
- 'admin.schedules.utils.statusDraft': 'Draft',
285
- 'admin.schedules.utils.statusConfirmed': 'Confirmed',
286
- 'admin.schedules.utils.statusInProgress': 'In Progress',
287
- 'admin.schedules.utils.statusCompleted': 'Completed',
288
- 'admin.schedules.utils.statusCancelled': 'Cancelled',
289
- // Reports
290
- 'admin.report.exam.loadError': 'Unable to load exam report data',
291
- 'admin.report.exam.exportError': 'Unable to export report',
292
- 'admin.report.room.loadError': 'Unable to load room report data',
293
- 'admin.report.room.exportSuccess': 'Exported {format} report successfully',
294
- 'admin.report.room.exportError': 'Unable to export report',
295
- 'admin.report.branch.loadError': 'Unable to load branch report data',
296
- 'admin.report.branch.exportError': 'Unable to export report',
297
- // User management extras
298
- 'admin.user.resetPassword.success': 'Password reset for {name}!',
299
- 'admin.user.resetPassword.error': 'An error occurred while resetting the password!',
300
- 'admin.user.lock.success': 'Account {name} has been locked',
301
- 'admin.user.unlock.success': 'Account {name} has been unlocked',
302
- 'admin.user.toggleStatus.error': 'An error occurred while changing account status!',
303
- 'admin.user.export.success': 'Excel file exported successfully!',
304
- 'admin.user.export.error': 'An error occurred while exporting the Excel file!',
305
- 'admin.user.syncEBM.success': 'EBM sync successful!',
306
- 'admin.user.syncEBM.error': 'An error occurred while syncing EBM!',
307
- // Users page — page header
308
- 'admin.users.title': 'User Management',
309
- 'admin.users.subtitle': 'Manage Admin, Teacher and Student accounts',
310
- // Users page — table
311
- 'admin.users.table.title': 'User List',
312
- 'admin.users.table.loading': 'Loading data...',
313
- 'admin.users.table.showing': 'Showing {count} / {total} users',
314
- 'admin.users.table.empty': 'No users found',
315
- 'admin.users.table.neverLoggedIn': 'Never logged in',
316
- 'admin.users.table.exportExcel': 'Export Excel',
317
- 'admin.users.table.syncEBM': 'Sync EBM',
318
- 'admin.users.table.addUser': 'Add User',
319
- // Users page — columns
320
- 'admin.users.col.userInfo': 'USER INFO',
321
- 'admin.users.col.branch': 'BRANCH',
322
- 'admin.users.col.contact': 'CONTACT',
323
- 'admin.users.col.role': 'ROLE',
324
- 'admin.users.col.source': 'SOURCE',
325
- 'admin.users.col.status': 'STATUS',
326
- 'admin.users.col.lastLogin': 'LAST LOGIN',
327
- 'admin.users.col.actions': 'ACTIONS',
328
- // Users page — filters
329
- 'admin.users.filter.searchPlaceholder': 'Search by email, username, phone...',
330
- 'admin.users.filter.allRoles': 'All roles',
331
- 'admin.users.filter.allStatuses': 'All statuses',
332
- 'admin.users.filter.active': 'Active',
333
- 'admin.users.filter.inactive': 'Inactive',
334
- 'admin.users.filter.clearFilters': 'Clear filters',
335
- 'admin.users.filter.searchLabel': 'Search:',
336
- 'admin.users.filter.roleLabel': 'Role:',
337
- 'admin.users.filter.statusLabel': 'Status:',
338
- // Users page — role labels
339
- 'admin.users.role.systemAdmin': 'System Admin',
340
- 'admin.users.role.admin': 'Admin',
341
- 'admin.users.role.teacher': 'Teacher',
342
- 'admin.users.role.student': 'Student',
343
- // Users page — row actions
344
- 'admin.users.action.view': 'View details',
345
- 'admin.users.action.viewDetail': 'View user detail page',
346
- 'admin.users.action.edit': 'Edit',
347
- 'admin.users.action.resetPassword': 'Reset password',
348
- 'admin.users.action.lock': 'Lock account',
349
- 'admin.users.action.unlock': 'Unlock account',
350
- 'admin.users.action.delete': 'Delete user',
351
- // Users page — form fields (shared between Add & Edit)
352
- 'admin.users.field.branch': 'Branch',
353
- 'admin.users.field.branchPlaceholder': 'Search and select branch...',
354
- 'admin.users.field.fullName': 'Full name',
355
- 'admin.users.field.fullNamePlaceholder': 'Enter full name...',
356
- 'admin.users.field.email': 'Email',
357
- 'admin.users.field.emailPlaceholder': 'Enter email...',
358
- 'admin.users.field.phone': 'Phone number',
359
- 'admin.users.field.phonePlaceholder': 'Enter phone number...',
360
- 'admin.users.field.address': 'Address',
361
- 'admin.users.field.addressPlaceholder': 'Enter address...',
362
- 'admin.users.field.usernamePlaceholder': 'Enter username...',
363
- 'admin.users.field.usernameHint': 'Start with a letter, only letters, numbers and _ allowed',
364
- 'admin.users.field.password': 'Password',
365
- 'admin.users.field.passwordPlaceholder': 'Enter password...',
366
- 'admin.users.field.passwordHint': 'At least 8 characters including uppercase, lowercase, number and special character',
367
- 'admin.users.field.role': 'Role',
368
- 'admin.users.field.rolePlaceholder': 'Select role...',
369
- 'admin.users.field.activeStatus': 'Account status',
370
- 'admin.users.field.activeHint': 'Account will be active immediately after creation',
371
- 'admin.users.field.inactiveHint': 'Account will be locked, can be activated later',
372
- 'admin.users.field.activeStatusDesc': 'Account is active',
373
- 'admin.users.field.inactiveStatusDesc': 'Account is locked',
374
- 'admin.users.field.registrationSource': 'Registration source',
375
- 'admin.users.field.createdAt': 'Created at',
376
- 'admin.users.field.updatedAt': 'Last updated',
377
- 'admin.users.field.status': 'Status',
378
- 'admin.users.field.dateOfBirth': 'Date of birth',
379
- 'admin.users.field.dateOfBirthPlaceholder': 'Select date of birth...',
380
- // Users page — add dialog
381
- 'admin.users.add.title': 'Add New User',
382
- 'admin.users.add.desc': 'Fill in the information to create a new user account',
383
- 'admin.users.add.submitting': 'Creating...',
384
- 'admin.users.add.submit': 'Add User',
385
- // Users page — edit dialog
386
- 'admin.users.edit.title': 'Edit User',
387
- 'admin.users.edit.desc': 'Update user information: {name}',
388
- 'admin.users.edit.submitting': 'Updating...',
389
- 'admin.users.edit.submit': 'Update',
390
- // Users page — delete dialog
391
- 'admin.users.delete.title': 'Confirm Delete User',
392
- 'admin.users.delete.desc': 'Are you sure you want to delete user {name}?',
393
- 'admin.users.delete.warning': 'This action cannot be undone.',
394
- 'admin.users.delete.confirm': 'Delete User',
395
- // Users page — view dialog
396
- 'admin.users.view.title': 'User Information',
397
- 'admin.users.view.subtitle': 'Account details',
398
- 'admin.users.view.close': 'Close',
399
- // Users page — reset password dialog
400
- 'admin.users.resetPassword.title': 'Reset Password',
401
- 'admin.users.resetPassword.desc': 'Enter a new password for user {name}',
402
- 'admin.users.resetPassword.label': 'New password',
403
- 'admin.users.resetPassword.placeholder': 'Enter new password...',
404
- 'admin.users.resetPassword.hint': 'Password should be at least 8 characters including uppercase, lowercase and numbers',
405
- 'admin.users.resetPassword.submit': 'Reset Password',
406
- // Users page — lock dialog
407
- 'admin.users.lock.title': 'Lock Account',
408
- 'admin.users.lock.desc': 'Are you sure you want to lock the account {name}? The user will not be able to log in.',
409
- 'admin.users.lock.confirm': 'Lock Account',
410
- // Users page — unlock dialog
411
- 'admin.users.unlock.title': 'Unlock Account',
412
- 'admin.users.unlock.desc': 'Are you sure you want to unlock the account {name}? The user will be able to log in.',
413
- 'admin.users.unlock.confirm': 'Unlock Account',
414
- // Reports — UI labels
415
- 'admin.reports.title': 'Reports',
416
- 'admin.reports.subtitle': 'View overview and analyze exam results',
417
- 'admin.reports.viewDetail': 'View details →',
418
- 'admin.reports.overview.title': 'Overview Report',
419
- 'admin.reports.overview.desc': 'System-wide statistics',
420
- 'admin.reports.overview.content': 'View exam results overview, student numbers, average scores over time',
421
- 'admin.reports.class.title': 'Class Report',
422
- 'admin.reports.class.desc': 'Details by class',
423
- 'admin.reports.class.content': 'Analyze exam results, rankings and learning progress by class',
424
- 'admin.reports.branch.title': 'Branch Report',
425
- 'admin.reports.branch.desc': 'Compare between branches',
426
- 'admin.reports.branch.content': 'Compare performance and learning results between branches',
427
- 'admin.reports.exam.title': 'Exam Report',
428
- 'admin.reports.exam.desc': 'Statistics by exam',
429
- 'admin.reports.exam.content': 'Statistics on results, scores and pass rates by exam',
430
- 'admin.reports.room.title': 'Room Report',
431
- 'admin.reports.room.desc': 'Details by room',
432
- 'admin.reports.room.content': 'Statistics on exam results, scores, pass rates by room',
433
- 'admin.reports.competency.title': 'Student Competency Report',
434
- 'admin.reports.competency.desc': 'Skill analysis by student',
435
- 'admin.reports.competency.content': 'Analyze scores by 4 skills: Reading, Listening, Writing, Speaking per student',
436
- // Reports — Room report page
437
- 'admin.reports.room.pageTitle': 'Room Report',
438
- 'admin.reports.room.pageSubtitle': 'Detailed statistics about exam rooms',
439
- 'admin.reports.room.export': 'Export report',
440
- 'admin.reports.room.exporting': 'Exporting...',
441
- 'admin.reports.room.exportExcel': 'Export Excel (.xlsx)',
442
- 'admin.reports.room.exportCsv': 'Export CSV (.csv)',
443
- 'admin.reports.room.viewFull': 'View full report',
444
- 'admin.reports.room.totalRooms': 'Total Rooms',
445
- 'admin.reports.room.totalStudents': 'Total Students',
446
- 'admin.reports.room.totalSubmitted': 'Submitted',
447
- 'admin.reports.room.avgScore': 'Avg Score',
448
- 'admin.reports.room.passRate': 'Pass Rate',
449
- 'admin.reports.room.avgDuration': 'Avg Duration',
450
- 'admin.reports.room.scoreDistribution': 'Score Distribution',
451
- 'admin.reports.room.topRooms': 'Top Scoring Rooms',
452
- 'admin.reports.room.noData': 'No data yet',
453
- 'admin.reports.room.excellent': 'Excellent (9-10)',
454
- 'admin.reports.room.good': 'Good (7-8.9)',
455
- 'admin.reports.room.average': 'Average (5-6.9)',
456
- 'admin.reports.room.poor': 'Poor (<5)',
457
- 'admin.reports.room.searchPlaceholder': 'Search rooms...',
458
- 'admin.reports.room.statusPlaceholder': 'Status',
459
- 'admin.reports.room.statusAll': 'All statuses',
460
- 'admin.reports.room.statusScheduled': 'Scheduled',
461
- 'admin.reports.room.statusInProgress': 'In Progress',
462
- 'admin.reports.room.statusCompleted': 'Completed',
463
- 'admin.reports.room.clearFilters': 'Clear filters',
464
- 'admin.reports.room.roomList': 'Room List',
465
- 'admin.reports.room.colRoom': 'Room',
466
- 'admin.reports.room.colContest': 'Contest',
467
- 'admin.reports.room.colStatus': 'Status',
468
- 'admin.reports.room.colStudents': 'Students',
469
- 'admin.reports.room.colAvgScore': 'Avg Score',
470
- 'admin.reports.room.colHighLow': 'High/Low',
471
- 'admin.reports.room.colPassRate': 'Pass Rate',
472
- 'admin.reports.room.colTeachers': 'Proctors',
473
- 'admin.reports.room.empty': 'No rooms found',
474
- 'admin.reports.room.loading': 'Loading data...',
475
- 'admin.reports.room.dialogTitle': 'Room Report',
476
- 'admin.reports.room.dialogDesc': 'Detailed exam results statistics by room',
477
- // Reports — Common labels (shared across report dialogs)
478
- 'admin.reports.exporting': 'Exporting...',
479
- 'admin.reports.exportExcel': 'Export Excel',
480
- 'admin.reports.loading': 'Loading data...',
481
- 'admin.reports.close': 'Close',
482
- 'admin.reports.common.avgScore': 'Avg Score',
483
- 'admin.reports.common.passRate': 'Pass Rate',
484
- 'admin.reports.common.totalStudents': 'Total Students',
485
- 'admin.reports.common.students': 'Students',
486
- 'admin.reports.common.teachers': 'Teachers',
487
- 'admin.reports.common.classes': 'Classes',
488
- // Reports — Stats Cards (main page)
489
- 'admin.reports.stats.totalExams': 'Total Exams',
490
- 'admin.reports.stats.totalStudents': 'Participants',
491
- 'admin.reports.stats.avgScore': 'Average Score',
492
- 'admin.reports.stats.passRate': 'Pass Rate',
493
- 'admin.reports.stats.vsLastMonth': 'vs last month',
494
- // Reports — Overview dialog
495
- 'admin.reports.overview.dialogTitle': 'Overview Report',
496
- 'admin.reports.overview.dialogDesc': 'System-wide statistics for Ocean Edu',
497
- 'admin.reports.overview.totalExams': 'Total Exams',
498
- 'admin.reports.overview.totalStudents': 'Students',
499
- 'admin.reports.overview.avgScore': 'System Avg Score',
500
- 'admin.reports.overview.passRate': 'Pass Rate',
501
- 'admin.reports.overview.vsPrevPeriod': 'vs previous period',
502
- 'admin.reports.overview.questions': 'Questions',
503
- 'admin.reports.overview.classes': 'Classes',
504
- 'admin.reports.overview.examRooms': 'Exam Rooms',
505
- 'admin.reports.overview.activeContests': 'Active Contests',
506
- 'admin.reports.overview.examsByLevel': 'Statistics by Exam Level',
507
- 'admin.reports.overview.examsUnit': 'exams',
508
- 'admin.reports.overview.questionsByType': 'Question Type Distribution',
509
- 'admin.reports.overview.questionsUnit': 'questions',
510
- 'admin.reports.overview.recentActivity': 'Recent Activity',
511
- 'admin.reports.overview.minutesAgo': '{count} minutes ago',
512
- 'admin.reports.overview.hoursAgo': '{count} hours ago',
513
- 'admin.reports.overview.daysAgo': '{count} days ago',
514
- // Reports — Class dialog
515
- 'admin.reports.class.dialogTitle': 'Class Report',
516
- 'admin.reports.class.dialogDesc': 'Learning performance statistics by class',
517
- 'admin.reports.class.gradeAll': 'All',
518
- 'admin.reports.class.totalClasses': 'Total Classes',
519
- 'admin.reports.class.totalStudents': 'Total Students',
520
- 'admin.reports.class.avgPassRate': 'Avg Pass Rate',
521
- 'admin.reports.class.classList': 'Class List',
522
- 'admin.reports.class.colClass': 'Class',
523
- 'admin.reports.class.colLevel': 'Level',
524
- 'admin.reports.class.colSize': 'Size',
525
- 'admin.reports.class.colAvgScore': 'Avg Score',
526
- 'admin.reports.class.colPassRate': 'Pass Rate',
527
- 'admin.reports.class.colTeacher': 'Teacher',
528
- 'admin.reports.class.topStudents': 'Top 5 Outstanding Students',
529
- 'admin.reports.class.totalExams': 'Exams',
530
- 'admin.reports.class.searchPlaceholder': 'Search by class name or code...',
531
- // Reports — Branch dialog
532
- 'admin.reports.branch.dialogTitle': 'Branch Report',
533
- 'admin.reports.branch.dialogDesc': 'Compare performance between branches',
534
- 'admin.reports.branch.totalBranches': 'Total Branches',
535
- 'admin.reports.branch.totalStudents': 'Total Students',
536
- 'admin.reports.branch.totalClasses': 'Total Classes',
537
- 'admin.reports.branch.avgScore': 'Overall Avg Score',
538
- 'admin.reports.branch.comparison': 'Branch Comparison',
539
- // Reports — Exam (contest) dialog
540
- 'admin.reports.exam.dialogTitle': 'Exam Report',
541
- 'admin.reports.exam.dialogDesc': 'Results statistics by contest',
542
- 'admin.reports.exam.statusDraft': 'Draft',
543
- 'admin.reports.exam.statusPublished': 'Published',
544
- 'admin.reports.exam.statusActive': 'In Progress',
545
- 'admin.reports.exam.statusCompleted': 'Completed',
546
- 'admin.reports.exam.totalContests': 'Total Contests',
547
- 'admin.reports.exam.totalStudents': 'Total Students',
548
- 'admin.reports.exam.avgScore': 'Avg Score',
549
- 'admin.reports.exam.passRate': 'Pass Rate',
550
- 'admin.reports.exam.contestList': 'Contest List',
551
- 'admin.reports.exam.code': 'Code: {code}',
552
- 'admin.reports.exam.noData': 'No data yet',
553
- // Reports — Competency dialog
554
- 'admin.reports.competency.dialogTitle': 'Student Competency Report',
555
- 'admin.reports.competency.dialogDesc': 'Skill-based score analysis',
556
- 'admin.reports.competency.searchPlaceholder': 'Search by name or email...',
557
- 'admin.reports.competency.totalStudents': 'Total Students',
558
- 'admin.reports.competency.avgScore': 'Avg Score',
559
- 'admin.reports.competency.passRate': 'Pass Rate',
560
- 'admin.reports.competency.bestSkill': 'Best Skill',
561
- 'admin.reports.competency.skillDistribution': 'Score Distribution by Skill',
562
- 'admin.reports.competency.avgScoreTooltip': 'Avg Score',
563
- 'admin.reports.competency.studentList': 'Student List ({count})',
564
- 'admin.reports.competency.colName': 'Name',
565
- 'admin.reports.competency.colClass': 'Class',
566
- 'admin.reports.competency.colReading': 'Reading',
567
- 'admin.reports.competency.colListening': 'Listening',
568
- 'admin.reports.competency.colWriting': 'Writing',
569
- 'admin.reports.competency.colSpeaking': 'Speaking',
570
- 'admin.reports.competency.colTotal': 'Total',
571
- 'admin.reports.competency.colExams': 'Exams',
572
- 'admin.reports.competency.noData': 'No data',
573
- 'admin.reports.competency.page': 'Page {page} / {totalPages}',
574
- 'admin.reports.competency.prev': 'Previous',
575
- 'admin.reports.competency.next': 'Next',
576
- 'admin.reports.competency.reading': 'Reading',
577
- 'admin.reports.competency.listening': 'Listening',
578
- 'admin.reports.competency.writing': 'Writing',
579
- 'admin.reports.competency.speaking': 'Speaking',
580
- // Reports — Competency full page (new)
581
- 'admin.reports.competency.pageTitle': 'Student Competency Report',
582
- 'admin.reports.competency.pageSubtitle': 'Score analysis by skill',
583
- 'admin.reports.competency.backToReports': 'Back to Reports',
584
- 'admin.reports.competency.export': 'Export Excel',
585
- 'admin.reports.competency.exporting': 'Exporting...',
586
- 'admin.reports.competency.atRisk': 'At-Risk Students',
587
- 'admin.reports.competency.atRiskDesc': 'Below 5.0',
588
- 'admin.reports.competency.radarTitle': 'Competency by Skill',
589
- 'admin.reports.competency.radarClassAvg': 'This Class',
590
- 'admin.reports.competency.radarSysAvg': 'System Average',
591
- 'admin.reports.competency.trendTitle': 'Score Trend Over Time',
592
- 'admin.reports.competency.trend3m': '3 Months',
593
- 'admin.reports.competency.trend6m': '6 Months',
594
- 'admin.reports.competency.trend12m': '12 Months',
595
- 'admin.reports.competency.skillBreakdownTitle': 'Skill Analysis',
596
- 'admin.reports.competency.strengthsTitle': 'Strengths',
597
- 'admin.reports.competency.weaknessesTitle': 'Weaknesses',
598
- 'admin.reports.competency.noStrengths': 'No data',
599
- 'admin.reports.competency.noWeaknesses': 'No data',
600
- 'admin.reports.competency.bandExcellent': 'Excellent',
601
- 'admin.reports.competency.bandGood': 'Good',
602
- 'admin.reports.competency.bandAverage': 'Average',
603
- 'admin.reports.competency.bandWeak': 'Weak',
604
- 'admin.reports.competency.colTrend': 'Trend',
605
- 'admin.reports.competency.colBand': 'Band',
606
- 'admin.reports.competency.filterAll': 'All',
607
- 'admin.reports.competency.filterWeak': 'Needs Support',
608
- 'admin.reports.competency.filterGood': 'Good - Excellent',
609
- 'admin.reports.competency.searchPlaceholder2': 'Find student...',
610
- 'admin.reports.competency.examRoomFilter.placeholder': 'All exam rooms',
611
- 'admin.reports.competency.examRoomFilter.searchPlaceholder': 'Search exam rooms...',
612
- 'admin.reports.competency.examRoomFilter.noRooms': 'No exam rooms found',
613
- 'admin.reports.competency.examRoomFilter.allRooms': 'All exam rooms',
614
- // Reports — Period selector
615
- 'admin.reports.period.week': 'This week',
616
- 'admin.reports.period.month': 'This month',
617
- 'admin.reports.period.quarter': 'This quarter',
618
- 'admin.reports.period.year': 'This year',
619
- 'admin.reports.period.custom': 'Custom',
620
- 'admin.reports.period.fromDate': 'From date',
621
- 'admin.reports.period.toDate': 'To date',
622
- // Dashboard
623
- 'admin.dashboard.title': 'Admin Dashboard',
624
- 'admin.dashboard.subtitle': 'Manage Ocean Edu online exam system',
625
- 'admin.dashboard.totalStudents': 'Total Students',
626
- 'admin.dashboard.totalStudents.monthly': '+{count} new students this month',
627
- 'admin.dashboard.totalStudents.growth': 'M{lastMonth} {action} {percent}% vs M{prevMonth}',
628
- 'admin.dashboard.totalExams': 'Exams',
629
- 'admin.dashboard.totalExams.weekly': '+{count} new exams this week',
630
- 'admin.dashboard.examRooms': 'Exam Rooms',
631
- 'admin.dashboard.examRooms.active': '{count} rooms active',
632
- 'admin.dashboard.teachers': 'Teachers',
633
- 'admin.dashboard.teachers.yearly': '+{count} new teachers this year',
634
- 'admin.dashboard.contests': 'Contests',
635
- 'admin.dashboard.contests.ongoing': '{count} ongoing',
636
- 'admin.dashboard.inProgressRooms': 'Rooms In Progress',
637
- 'admin.dashboard.inProgressRooms.status': 'In progress',
638
- 'admin.dashboard.studentsInExam': 'Students In Exam',
639
- 'admin.dashboard.studentsInExam.rooms': 'In {count} rooms',
640
- 'admin.dashboard.pendingGrading': 'Pending Grading',
641
- 'admin.dashboard.pendingGrading.action': 'Needs attention',
642
- 'admin.dashboard.userGrowth.title': 'User Growth',
643
- 'admin.dashboard.userGrowth.desc': 'Student and teacher count over the last 6 months',
644
- 'admin.dashboard.userGrowth.students': 'Students',
645
- 'admin.dashboard.userGrowth.teachers': 'Teachers',
646
- 'admin.dashboard.examStats.title': 'Exam Statistics',
647
- 'admin.dashboard.examStats.desc': 'Completed and pending exams by subject',
648
- 'admin.dashboard.examStats.completed': 'Completed',
649
- 'admin.dashboard.examStats.pending': 'Pending',
650
- 'admin.dashboard.recentActivity.title': 'Recent Activity',
651
- 'admin.dashboard.recentActivity.desc': 'Latest activities in the system',
652
- 'admin.dashboard.recentActivity.colActivity': 'Activity',
653
- 'admin.dashboard.recentActivity.colUser': 'User',
654
- 'admin.dashboard.recentActivity.colStatus': 'Status',
655
- 'admin.dashboard.recentActivity.colTime': 'Time',
656
- 'admin.dashboard.recentActivity.empty': 'No activities yet',
657
- 'admin.dashboard.growth.increase': 'increased',
658
- 'admin.dashboard.growth.decrease': 'decreased',
659
- 'admin.dashboard.growth.unchanged': 'unchanged',
660
- 'admin.dashboard.time.justNow': 'just now',
661
- 'admin.dashboard.time.minutesAgo': '{count} minutes ago',
662
- 'admin.dashboard.time.hoursAgo': '{count} hours ago',
663
- 'admin.dashboard.time.daysAgo': '{count} days ago',
664
- 'admin.dashboard.time.weeksAgo': '{count} weeks ago',
665
- 'admin.dashboard.time.monthsAgo': '{count} months ago',
666
- // Branch management — toast messages
667
- 'admin.branch.create.success': 'Branch created successfully',
668
- 'admin.branch.create.successDesc': 'New branch created with {count} teachers. PLACEMENT TEST room has been automatically created.',
669
- 'admin.branch.create.successDescNoTeacher': 'New branch created. PLACEMENT TEST room has been automatically created.',
670
- 'admin.branch.update.success': 'Branch updated successfully',
671
- 'admin.branch.update.successDesc': 'Branch information updated ({count} teacher changes)',
672
- 'admin.branch.update.successDescNoChange': 'Branch information updated',
673
- 'admin.branch.delete.success': 'Branch deleted successfully',
674
- 'admin.branch.delete.successDesc': 'Branch {code} - {name} has been deleted',
675
- 'admin.branch.activate.success': 'Branch activated successfully',
676
- 'admin.branch.deactivate.success': 'Branch deactivated successfully',
677
- 'admin.branch.toggleStatus.successDesc': 'Branch {code} - {name} has been {status}',
678
- 'admin.branch.toggleStatus.activated': 'activated',
679
- 'admin.branch.toggleStatus.deactivated': 'deactivated',
680
- // Branches page — page header & loading
681
- 'admin.branches.title': 'Branch Management',
682
- 'admin.branches.subtitle': 'Manage branch information in the system',
683
- 'admin.branches.loading': 'Loading data...',
684
- // Branches page — stats cards
685
- 'admin.branches.stats.total': 'Total Branches',
686
- 'admin.branches.stats.active': 'Active',
687
- 'admin.branches.stats.inactive': 'Inactive',
688
- 'admin.branches.stats.distribution': 'Manager Distribution',
689
- 'admin.branches.stats.activeBranches': 'Active',
690
- 'admin.branches.stats.inactiveBranches': 'Inactive',
691
- 'admin.branches.stats.withManager': 'Has Manager',
692
- 'admin.branches.stats.withoutManager': 'No Manager',
693
- 'admin.branches.stats.branchUnit': 'branches',
694
- // Branches page — table
695
- 'admin.branches.table.title': 'Branch List',
696
- 'admin.branches.table.showing': 'Showing {count} / {total} branches',
697
- 'admin.branches.table.addBranch': 'Add Branch',
698
- 'admin.branches.table.loading': 'Loading...',
699
- 'admin.branches.table.empty': 'No branches found',
700
- 'admin.branches.table.notUpdated': 'Not updated',
701
- 'admin.branches.table.notAssigned': 'Not assigned',
702
- // Branches page — columns
703
- 'admin.branches.col.code': 'BRANCH CODE',
704
- 'admin.branches.col.name': 'BRANCH NAME',
705
- 'admin.branches.col.address': 'ADDRESS',
706
- 'admin.branches.col.contact': 'CONTACT',
707
- 'admin.branches.col.manager': 'MANAGER',
708
- 'admin.branches.col.status': 'STATUS',
709
- 'admin.branches.col.actions': 'ACTIONS',
710
- // Branches page — filters
711
- 'admin.branches.filter.searchPlaceholder': 'Search by name or branch code',
712
- 'admin.branches.filter.statusPlaceholder': 'Status',
713
- 'admin.branches.filter.allStatuses': 'All statuses',
714
- 'admin.branches.filter.active': 'Active',
715
- 'admin.branches.filter.inactive': 'Inactive',
716
- 'admin.branches.filter.clearFilters': 'Clear filters',
717
- 'admin.branches.filter.searchLabel': 'Search:',
718
- 'admin.branches.filter.statusLabel': 'Status:',
719
- // Branches page — status badges
720
- 'admin.branches.status.active': 'Active',
721
- 'admin.branches.status.activeDetail': 'Active',
722
- 'admin.branches.status.inactive': 'Inactive',
723
- // Branches page — row actions
724
- 'admin.branches.action.view': 'View details',
725
- 'admin.branches.action.edit': 'Edit',
726
- 'admin.branches.action.delete': 'Delete',
727
- // Branches page — form fields (shared between Add & Edit)
728
- 'admin.branches.field.basicInfo': 'Basic Information',
729
- 'admin.branches.field.code': 'Branch code',
730
- 'admin.branches.field.codePlaceholder': 'E.g.: CN-HN-01',
731
- 'admin.branches.field.name': 'Branch name',
732
- 'admin.branches.field.namePlaceholder': 'E.g.: Hanoi Branch',
733
- 'admin.branches.field.address': 'Address',
734
- 'admin.branches.field.addressPlaceholder': 'Enter branch address...',
735
- 'admin.branches.field.contactInfo': 'Contact Information',
736
- 'admin.branches.field.phone': 'Phone number',
737
- 'admin.branches.field.phonePlaceholder': 'E.g.: 0912345678',
738
- 'admin.branches.field.email': 'Email',
739
- 'admin.branches.field.emailPlaceholder': 'E.g.: branch@ocean.edu.vn',
740
- 'admin.branches.field.managerSection': 'Manager',
741
- 'admin.branches.field.selectManager': 'Select manager',
742
- 'admin.branches.field.selectManagerPlaceholder': 'Select manager...',
743
- 'admin.branches.field.managerHint': 'The manager will have administrative rights for this branch',
744
- 'admin.branches.field.statusSection': 'Status',
745
- // Branches page — teacher selection
746
- 'admin.branches.teacher.title': 'Select Teachers',
747
- 'admin.branches.teacher.searchPlaceholder': 'Search teachers by name, email or phone number',
748
- 'admin.branches.teacher.colName': 'Full name',
749
- 'admin.branches.teacher.colEmail': 'Email',
750
- 'admin.branches.teacher.colPhone': 'Phone',
751
- 'admin.branches.teacher.notFound': 'No teachers found',
752
- 'admin.branches.teacher.empty': 'No teachers in the system',
753
- 'admin.branches.teacher.selected': 'Selected: {count} teachers',
754
- 'admin.branches.teacher.clearAll': 'Clear all',
755
- // Branches page — add dialog
756
- 'admin.branches.add.title': 'Add New Branch',
757
- 'admin.branches.add.desc': 'Enter information for the new branch',
758
- 'admin.branches.add.activateLabel': 'Activate branch',
759
- 'admin.branches.add.activateDescActive': 'Branch will be active immediately after creation',
760
- 'admin.branches.add.activateDescInactive': 'Branch will be inactive after creation',
761
- 'admin.branches.add.submitting': 'Processing...',
762
- 'admin.branches.add.submit': 'Add Branch',
763
- // Branches page — edit dialog
764
- 'admin.branches.edit.title': 'Edit Branch',
765
- 'admin.branches.edit.desc': 'Update information for branch: {name}',
766
- 'admin.branches.edit.statusLabel': 'Active status',
767
- 'admin.branches.edit.statusDescActive': 'Branch is currently active',
768
- 'admin.branches.edit.statusDescInactive': 'Branch is currently inactive',
769
- 'admin.branches.edit.submitting': 'Processing...',
770
- 'admin.branches.edit.submit': 'Update',
771
- // Branches page — delete dialog
772
- 'admin.branches.delete.title': 'Confirm Delete Branch',
773
- 'admin.branches.delete.desc': 'Are you sure you want to delete this branch?',
774
- 'admin.branches.delete.warning': 'This action cannot be undone and will delete all data related to this branch.',
775
- 'admin.branches.delete.submitting': 'Processing...',
776
- 'admin.branches.delete.confirm': 'Delete Branch',
777
- // Branches page — toggle status dialog
778
- 'admin.branches.toggleStatus.activateTitle': 'Activate Branch',
779
- 'admin.branches.toggleStatus.deactivateTitle': 'Deactivate Branch',
780
- 'admin.branches.toggleStatus.activateDesc': 'Are you sure you want to activate this branch?',
781
- 'admin.branches.toggleStatus.deactivateDesc': 'Are you sure you want to deactivate this branch?',
782
- 'admin.branches.toggleStatus.activateInfo': 'The branch will be activated and operate normally.',
783
- 'admin.branches.toggleStatus.deactivateInfo': 'The branch will be deactivated but data will be preserved.',
784
- 'admin.branches.toggleStatus.submitting': 'Processing...',
785
- 'admin.branches.toggleStatus.activate': 'Activate',
786
- 'admin.branches.toggleStatus.deactivate': 'Deactivate',
787
- // Branches page — view dialog
788
- 'admin.branches.view.title': 'Branch Details: {name}',
789
- 'admin.branches.view.desc': 'View detailed branch information',
790
- 'admin.branches.view.basicInfo': 'Basic Information',
791
- 'admin.branches.view.codeLabel': 'Branch Code',
792
- 'admin.branches.view.nameLabel': 'Branch Name',
793
- 'admin.branches.view.statusLabel': 'Status',
794
- 'admin.branches.view.contactInfo': 'Contact Information',
795
- 'admin.branches.view.addressLabel': 'Address',
796
- 'admin.branches.view.phoneLabel': 'Phone Number',
797
- 'admin.branches.view.emailLabel': 'Email',
798
- 'admin.branches.view.notUpdated': 'Not updated',
799
- 'admin.branches.view.managerSection': 'Manager',
800
- 'admin.branches.view.noManager': 'No manager assigned',
801
- 'admin.branches.view.teacherSection': 'Teachers',
802
- 'admin.branches.view.noTeachers': 'No teachers assigned',
803
- 'admin.branches.view.moreTeachers': 'and {count} more teachers...',
804
- 'admin.branches.view.changeHistory': 'Change History',
805
- 'admin.branches.view.createdAt': 'Created',
806
- 'admin.branches.view.createdBy': 'by',
807
- 'admin.branches.view.noCreator': 'No creator information',
808
- 'admin.branches.view.updatedAt': 'Last Updated',
809
- 'admin.branches.view.noUpdater': 'No updater information',
810
- 'admin.branches.view.branchId': 'Branch ID',
811
- // Class Rooms page — page header
812
- // Class Rooms page — table
813
- // Class Rooms page — filters
814
- // Class Rooms page — columns
815
- // Class Rooms page — status
816
- // Class Rooms page — row actions
817
- // Class Rooms page — add dialog
818
- // Class Rooms page — edit dialog
819
- // Class Rooms page — form fields
820
- // Class Rooms page — view dialog
821
- // Class Room — load errors
822
- // Class Room — delete
823
- // Class Room — students
824
- // Class Room Exams dialog
825
- // ─── Rooms page ──────────────────────────────────────────────────────────────
826
- // Rooms page — page header
827
- 'admin.rooms.title': 'Exam Room Management',
828
- 'admin.rooms.subtitle': 'Create and manage exam rooms',
829
- 'admin.rooms.loading': 'Loading data...',
830
- // Rooms page — stats cards
831
- 'admin.rooms.stats.totalRooms': 'Total Rooms',
832
- 'admin.rooms.stats.activeRooms': '{count} active rooms',
833
- 'admin.rooms.stats.students': 'Students',
834
- 'admin.rooms.stats.totalStudents': 'Total enrolled students',
835
- 'admin.rooms.stats.completed': 'Completed',
836
- 'admin.rooms.stats.completedRooms': 'Rooms completed',
837
- 'admin.rooms.stats.statusDistribution': 'Status distribution',
838
- 'admin.rooms.stats.ongoing': 'In progress',
839
- 'admin.rooms.stats.scheduled': 'Scheduled',
840
- 'admin.rooms.stats.roomUnit': 'rooms',
841
- // Rooms page — table
842
- 'admin.rooms.table.title': 'Exam Room List',
843
- 'admin.rooms.table.showing': 'Showing {count} / {total} rooms',
844
- 'admin.rooms.table.addRoom': 'Create Room',
845
- 'admin.rooms.table.loading': 'Loading...',
846
- 'admin.rooms.table.empty': 'No exam rooms found',
847
- 'admin.rooms.table.notAssigned': 'Not assigned',
848
- 'admin.rooms.table.unlimited': 'Unlimited',
849
- // Rooms page — columns
850
- 'admin.rooms.col.name': 'ROOM NAME',
851
- 'admin.rooms.col.code': 'ROOM CODE',
852
- 'admin.rooms.col.branch': 'BRANCH',
853
- 'admin.rooms.col.exam': 'EXAM & QUESTIONS',
854
- 'admin.rooms.col.time': 'TIME',
855
- 'admin.rooms.col.progress': 'PROGRESS',
856
- 'admin.rooms.col.lock': 'LOCK',
857
- 'admin.rooms.col.actions': 'ACTIONS',
858
- // Rooms page — filters
859
- 'admin.rooms.filter.searchPlaceholder': 'Search by room name or room code',
860
- 'admin.rooms.filter.statusPlaceholder': 'Status',
861
- 'admin.rooms.filter.allStatuses': 'All statuses',
862
- 'admin.rooms.filter.branchPlaceholder': 'Branch',
863
- 'admin.rooms.filter.allBranches': 'All branches',
864
- 'admin.rooms.filter.clearFilters': 'Clear filters',
865
- // Rooms page — status labels (table)
866
- 'admin.rooms.status.completed': 'Completed',
867
- 'admin.rooms.status.inProgress': 'In Progress',
868
- 'admin.rooms.status.scheduled': 'Scheduled',
869
- // Rooms page — exam cell actions
870
- 'admin.rooms.exam.viewContent': 'View content',
871
- 'admin.rooms.exam.changeExam': 'Change exam',
872
- 'admin.rooms.exam.selectExam': '+ Select exam',
873
- // Rooms page — row action titles
874
- 'admin.rooms.action.view': 'View details',
875
- 'admin.rooms.action.edit': 'Edit',
876
- 'admin.rooms.action.schedule': 'Edit schedule',
877
- 'admin.rooms.action.delete': 'Delete',
878
- // Rooms page — toast messages (RoomsPageContainer)
879
- 'admin.rooms.toast.loadError': 'Failed to load data',
880
- 'admin.rooms.toast.loadRoomsError': 'Unable to load exam rooms. Please try again later.',
881
- 'admin.rooms.toast.loadTeachersError': 'Unable to load supervisors. Please try again later.',
882
- 'admin.rooms.toast.loadStudentsError': 'Unable to load students. Please try again later.',
883
- 'admin.rooms.toast.loadExamsError': 'Unable to load exams. Please try again later.',
884
- 'admin.rooms.toast.loadContestsError': 'Unable to load contests. Please try again later.',
885
- 'admin.rooms.toast.loadClassesError': 'Unable to load classes. Please try again later.',
886
- 'admin.rooms.toast.loadBranchesError': 'Unable to load branches. Please try again later.',
887
- 'admin.rooms.toast.cannotChangeExam': 'Cannot change exam',
888
- 'admin.rooms.toast.cannotChangeExamDesc': 'Rooms that have started or completed cannot have their exam changed',
889
- 'admin.rooms.toast.assignExamSuccess': 'Exam assigned successfully',
890
- 'admin.rooms.toast.assignExamSuccessDesc': 'Exam "{examName}" with {childCount} variants has been assigned to room {roomCode}',
891
- 'admin.rooms.toast.cannotRemoveExam': 'Cannot remove exam',
892
- 'admin.rooms.toast.cannotRemoveExamDesc': 'Rooms that have started or completed cannot have their exam removed',
893
- 'admin.rooms.toast.removeExamSuccess': 'Exam removed successfully',
894
- 'admin.rooms.toast.removeExamSuccessDesc': 'Exam has been removed from room {roomCode}',
895
- 'admin.rooms.toast.saveSettingsSuccess': 'Settings saved successfully',
896
- 'admin.rooms.toast.saveSettingsSuccessDesc': 'Your exam settings have been saved',
897
- 'admin.rooms.toast.updateScheduleSuccess': 'Schedule updated successfully',
898
- 'admin.rooms.toast.updateScheduleSuccessDesc': 'Schedule for room {roomCode} has been updated',
899
- 'admin.rooms.toast.updateScheduleError': 'Failed to update schedule',
900
- 'admin.rooms.toast.updateScheduleErrorDesc': 'Error updating schedule for room {roomCode}',
901
- // Rooms page — AddRoomDialog
902
- 'admin.rooms.add.title': 'Add New Exam Room',
903
- 'admin.rooms.add.description': 'Enter information for the new exam room',
904
- 'admin.rooms.add.cancel': 'Cancel',
905
- 'admin.rooms.add.submit': 'Add Room',
906
- 'admin.rooms.add.success': 'Room created successfully',
907
- 'admin.rooms.add.successDesc': 'Exam room {code} has been created',
908
- 'admin.rooms.add.error': 'Failed to create room',
909
- 'admin.rooms.add.errorDesc': 'An error occurred while creating the exam room',
910
- // Rooms page — EditRoomDialog
911
- 'admin.rooms.edit.title': 'Edit Room: {name}',
912
- 'admin.rooms.edit.description': 'Update exam room information',
913
- 'admin.rooms.edit.cancel': 'Cancel',
914
- 'admin.rooms.edit.saving': 'Saving...',
915
- 'admin.rooms.edit.submit': 'Save Changes',
916
- 'admin.rooms.edit.success': 'Room updated successfully',
917
- 'admin.rooms.edit.successDesc': 'Exam room {code} has been updated',
918
- 'admin.rooms.edit.error': 'Failed to update room',
919
- 'admin.rooms.edit.errorDesc': 'An error occurred while updating the exam room',
920
- // Rooms page — DeleteRoomDialog
921
- 'admin.rooms.delete.title': 'Confirm Delete Room',
922
- 'admin.rooms.delete.description': 'Are you sure you want to delete room',
923
- 'admin.rooms.delete.warning': 'This action cannot be undone and will delete all related data.',
924
- 'admin.rooms.delete.cancel': 'Cancel',
925
- 'admin.rooms.delete.processing': 'Processing...',
926
- 'admin.rooms.delete.submit': 'Delete Room',
927
- 'admin.rooms.delete.success': 'Room deleted successfully',
928
- 'admin.rooms.delete.successDesc': 'Exam room {code} has been deleted',
929
- 'admin.rooms.delete.error': 'Failed to delete room',
930
- 'admin.rooms.delete.errorDesc': 'Unable to delete exam room. Please try again later.',
931
- // Rooms page — ViewRoomDialog
932
- 'admin.rooms.view.title': 'Room Details: {name}',
933
- 'admin.rooms.view.close': 'Close',
934
- 'admin.rooms.view.locked': 'Locked',
935
- 'admin.rooms.view.unlocked': 'Unlocked',
936
- 'admin.rooms.view.undetermined': 'Not set',
937
- 'admin.rooms.unlimitedTime': 'Unlimited time',
938
- 'admin.rooms.view.stats.candidates': 'Candidates',
939
- 'admin.rooms.view.stats.supervisors': 'Supervisors',
940
- 'admin.rooms.view.stats.submitted': 'Submitted',
941
- 'admin.rooms.view.stats.submissionRate': 'Submission rate',
942
- 'admin.rooms.view.section.basicInfo': 'Basic Information',
943
- 'admin.rooms.view.section.time': 'Schedule',
944
- 'admin.rooms.view.section.exams': 'Exams',
945
- 'admin.rooms.view.section.supervisors': 'Supervisors',
946
- 'admin.rooms.view.section.classes': 'Classes',
947
- 'admin.rooms.view.section.assignedStudents': 'Assigned Students',
948
- 'admin.rooms.view.field.contest': 'Contest',
949
- 'admin.rooms.view.field.location': 'Location',
950
- 'admin.rooms.view.field.branch': 'Branch',
951
- 'admin.rooms.view.field.candidateSelection': 'Candidate selection',
952
- 'admin.rooms.view.field.description': 'Description',
953
- 'admin.rooms.view.field.start': 'Start',
954
- 'admin.rooms.view.field.end': 'End',
955
- 'admin.rooms.view.field.createdAt': 'Created at:',
956
- 'admin.rooms.view.field.updatedAt': 'Updated at:',
957
- 'admin.rooms.view.selectionType.all': 'All students',
958
- 'admin.rooms.view.selectionType.specific': 'Specific students',
959
- 'admin.rooms.view.locationNotSet': 'Not set',
960
- 'admin.rooms.view.noSupervisors': 'No supervisors assigned',
961
- 'admin.rooms.view.examOriginal': 'Original exam',
962
- 'admin.rooms.view.examVariants': 'Exam variants ({count})',
963
- 'admin.rooms.view.status.scheduled': 'Scheduled',
964
- 'admin.rooms.view.status.inProgress': 'In Progress',
965
- 'admin.rooms.view.status.completed': 'Completed',
966
- 'admin.rooms.view.type.contest': 'Contest',
967
- 'admin.rooms.view.type.practiceTest': 'Practice Test',
968
- 'admin.rooms.view.classCode': 'Code:',
969
- 'admin.rooms.view.classGrade': 'Grade:',
970
- 'admin.rooms.view.classStudents': '{count} students',
971
- // Rooms page — LockRoomDialog
972
- 'admin.rooms.lock.titleLock': 'Lock exam room?',
973
- 'admin.rooms.lock.titleUnlock': 'Unlock exam room?',
974
- 'admin.rooms.lock.statusLocked': 'Locked',
975
- 'admin.rooms.lock.statusUnlocked': 'Unlocked',
976
- 'admin.rooms.lock.confirmUnlock': 'Are you sure you want to',
977
- 'admin.rooms.lock.unlock': 'unlock',
978
- 'admin.rooms.lock.lock': 'lock',
979
- 'admin.rooms.lock.confirmSuffix': 'this exam room?',
980
- 'admin.rooms.lock.unlockEffect': 'Students will be able to access and take the exam in this room.',
981
- 'admin.rooms.lock.lockEffect': 'Students will not be able to access or take the exam in this room until it is unlocked.',
982
- 'admin.rooms.lock.cancel': 'Cancel',
983
- 'admin.rooms.lock.processing': 'Processing...',
984
- 'admin.rooms.lock.submitLock': 'Lock Room',
985
- 'admin.rooms.lock.submitUnlock': 'Unlock',
986
- 'admin.rooms.lock.successLock': 'Room locked successfully',
987
- 'admin.rooms.lock.successUnlock': 'Room unlocked successfully',
988
- 'admin.rooms.lock.successDesc': 'Exam room {code} has been {action}',
989
- 'admin.rooms.lock.locked': 'locked',
990
- 'admin.rooms.lock.unlocked': 'unlocked',
991
- 'admin.rooms.lock.error': 'Failed to change lock status',
992
- 'admin.rooms.lock.errorDesc': 'Unable to change the lock status of the exam room. Please try again later.',
993
- // Rooms page — RemoveExamDialog
994
- 'admin.rooms.removeExam.title': 'Remove Exam from Room',
995
- 'admin.rooms.removeExam.description': 'Are you sure you want to remove exam',
996
- 'admin.rooms.removeExam.fromRoom': 'from room',
997
- 'admin.rooms.removeExam.cannotRemove': 'Cannot remove exam from a room that has started or completed!',
998
- 'admin.rooms.removeExam.effect': 'The room will no longer have an assigned exam. You can select a new exam later.',
999
- 'admin.rooms.removeExam.cancel': 'Cancel',
1000
- 'admin.rooms.removeExam.submit': 'Remove Exam',
1001
- // Rooms page — ScheduleRoomDialog
1002
- 'admin.rooms.schedule.title': 'Edit Schedule: {name}',
1003
- 'admin.rooms.schedule.description': 'Update the exam schedule for this room',
1004
- 'admin.rooms.schedule.contestInfo': 'Contest info: {name}',
1005
- 'admin.rooms.schedule.unlimitedContest': 'This contest has no time limit.',
1006
- 'admin.rooms.schedule.contestRange': 'From {start} to {end}',
1007
- 'admin.rooms.schedule.contestConstraint': 'Room schedule must fall within the contest time range',
1008
- 'admin.rooms.schedule.unlimitedBadge': 'Unlimited',
1009
- 'admin.rooms.schedule.unlimitedNote': 'This contest has no time limit. You do not need to set a schedule for this room.',
1010
- 'admin.rooms.schedule.startTime': 'Start time *',
1011
- 'admin.rooms.schedule.endTime': 'End time *',
1012
- 'admin.rooms.schedule.cancel': 'Cancel',
1013
- 'admin.rooms.schedule.save': 'Save Schedule',
1014
- 'admin.rooms.schedule.validation.startRequired': 'Please select a start time',
1015
- 'admin.rooms.schedule.validation.endRequired': 'Please select an end time',
1016
- 'admin.rooms.schedule.validation.endAfterStart': 'End time must be after start time',
1017
- // Rooms page — SelectExamDialog
1018
- 'admin.rooms.selectExam.title': 'Select Exam for Room: {name}',
1019
- 'admin.rooms.selectExam.description': 'Select 1 parent exam and child exams (variants) to assign to this room',
1020
- 'admin.rooms.selectExam.parentCount': 'Parent Exam',
1021
- 'admin.rooms.selectExam.childCount': 'Child Exams',
1022
- 'admin.rooms.selectExam.noParentSelected': 'No parent exam selected',
1023
- 'admin.rooms.selectExam.noParentSelectedDesc': 'Please select a parent exam first',
1024
- 'admin.rooms.selectExam.childCode': 'Code: {code} • Variant #{variant}',
1025
- 'admin.rooms.selectExam.selectAll': 'Select all',
1026
- 'admin.rooms.selectExam.deselectAll': 'Deselect all',
1027
- 'admin.rooms.selectExam.noParentExams': 'No parent exams available',
1028
- 'admin.rooms.selectExam.selectedParent': 'Selected Parent Exam',
1029
- 'admin.rooms.selectExam.selectedChildren': 'Selected Child Exams ({count})',
1030
- 'admin.rooms.selectExam.cancel': 'Cancel',
1031
- 'admin.rooms.selectExam.confirm': 'Confirm',
1032
- 'admin.rooms.selectExam.childExams': '{count} variants',
1033
- 'admin.rooms.selectExam.warning.title': 'Insufficient data',
1034
- 'admin.rooms.selectExam.warning.desc': 'Please select a parent exam and at least one child exam',
1035
- 'admin.rooms.selectExam.clearTitle': 'Clear Selection?',
1036
- 'admin.rooms.selectExam.clearDesc': 'Are you sure you want to clear the parent exam and {count} child exams?',
1037
- 'admin.rooms.selectExam.clearCancel': 'Cancel',
1038
- 'admin.rooms.selectExam.clearConfirm': 'Clear',
1039
- 'admin.rooms.selectExam.dialogTitle': 'Select Exam',
1040
- 'admin.rooms.selectExam.dialogDescription': 'Select a parent exam and the corresponding child exams for your exam room',
1041
- 'admin.rooms.selectExam.searchPlaceholder': 'Search exams by name, code, subject...',
1042
- 'admin.rooms.selectExam.noParentSelectedInfo': 'Please select a parent exam before selecting child exams',
1043
- 'admin.rooms.selectExam.examCode': 'Code: {name}',
1044
- 'admin.rooms.selectExam.original': 'Original',
1045
- 'admin.rooms.selectExam.questions': '{count} questions',
1046
- 'admin.rooms.selectExam.minutes': '{count} min',
1047
- 'admin.rooms.selectExam.difficulty.easy': 'Easy',
1048
- 'admin.rooms.selectExam.difficulty.medium': 'Medium',
1049
- 'admin.rooms.selectExam.difficulty.hard': 'Hard',
1050
- 'admin.rooms.selectExam.emptySearch': 'No matching exams found',
1051
- 'admin.rooms.selectExam.emptyAll': 'No exams available',
1052
- 'admin.rooms.selectExam.emptySearchHint': 'Try searching with different keywords',
1053
- 'admin.rooms.selectExam.emptyAllHint': 'Create a new exam to get started',
1054
- 'admin.rooms.selectExam.clearSearch': 'Clear search',
1055
- 'admin.rooms.selectExam.selected': 'Selected',
1056
- 'admin.rooms.selectExam.selectedParentLabel': 'Parent Exam',
1057
- // Rooms page — ChangeExamDialog
1058
- 'admin.rooms.changeExam.title': 'Change Exam for Room: {name}',
1059
- 'admin.rooms.changeExam.description': 'Select a new exam to replace the current one',
1060
- 'admin.rooms.changeExam.currentExam': 'Current exam',
1061
- 'admin.rooms.changeExam.currentExamHint': 'Select a new exam from the list below to replace it',
1062
- 'admin.rooms.changeExam.childCount': '({count} variants)',
1063
- 'admin.rooms.changeExam.newParent': 'New Parent Exam',
1064
- 'admin.rooms.changeExam.newParentSelected': 'Selected New Parent Exam',
1065
- 'admin.rooms.changeExam.currentBadge': 'Current',
1066
- 'admin.rooms.changeExam.cancel': 'Cancel',
1067
- 'admin.rooms.changeExam.submit': 'Change Exam',
1068
- 'admin.rooms.changeExam.confirmTitle': 'Confirm exam change?',
1069
- 'admin.rooms.changeExam.confirmDesc': 'Are you sure you want to change the exam for room {name}?',
1070
- 'admin.rooms.changeExam.confirmEffect': 'The new exam will replace the current one with {count} child exams.',
1071
- 'admin.rooms.changeExam.confirmCancel': 'Cancel',
1072
- 'admin.rooms.changeExam.confirmSubmit': 'Confirm Change',
1073
- // Rooms page — EditWarningDialog
1074
- 'admin.rooms.editWarning.title': 'Edit Room Warning',
1075
- 'admin.rooms.editWarning.description': 'is currently',
1076
- 'admin.rooms.editWarning.status': 'In Progress',
1077
- 'admin.rooms.editWarning.effect': 'Editing may affect students currently taking the exam.',
1078
- 'admin.rooms.editWarning.confirm': 'Are you sure you want to continue editing?',
1079
- 'admin.rooms.editWarning.cancel': 'Cancel',
1080
- 'admin.rooms.editWarning.submit': 'Continue Editing',
1081
- // Rooms page — ExamChangeWarningDialog
1082
- 'admin.rooms.examChangeWarning.title': 'Change Exam?',
1083
- 'admin.rooms.examChangeWarning.description': 'The exam was automatically selected from the chosen contest. Are you sure you want to change to a different exam?',
1084
- 'admin.rooms.examChangeWarning.cancel': 'Cancel',
1085
- 'admin.rooms.examChangeWarning.submit': 'Continue Changing',
1086
- // Rooms page — ExamSettingsDialog
1087
- 'admin.rooms.settings.title': 'Exam Room Settings',
1088
- 'admin.rooms.settings.description': 'Default parameters for exams',
1089
- 'admin.rooms.settings.maxStudents': 'Max students per room',
1090
- 'admin.rooms.settings.defaultDuration': 'Default exam duration (minutes)',
1091
- 'admin.rooms.settings.edit': 'Edit',
1092
- 'admin.rooms.settings.cancel': 'Cancel',
1093
- 'admin.rooms.settings.save': 'Save Changes',
1094
- // Rooms page — RoomFormFields
1095
- 'admin.rooms.form.branch': 'Branch',
1096
- 'admin.rooms.form.branchPlaceholder': 'Select branch...',
1097
- 'admin.rooms.form.branchReload': 'Reload',
1098
- 'admin.rooms.form.branchCreate': 'Create branch',
1099
- 'admin.rooms.form.branchEmpty': 'No branches available. Please create a branch first.',
1100
- 'admin.rooms.form.contest': 'Select contest',
1101
- 'admin.rooms.form.contestPlaceholder': 'Select contest...',
1102
- 'admin.rooms.form.contestReload': 'Reload',
1103
- 'admin.rooms.form.contestCreate': 'Create contest',
1104
- 'admin.rooms.form.contestEmpty': 'No contests available. Please create a contest first.',
1105
- 'admin.rooms.form.contestUnlimitedInfo': 'Contest has no time limit',
1106
- 'admin.rooms.form.contestUnlimitedStart': 'Starts from: {time}',
1107
- 'admin.rooms.form.contestUnlimitedHint': 'Start time is required, end time is optional',
1108
- 'admin.rooms.form.contestLimitedInfo': 'Contest time range',
1109
- 'admin.rooms.form.contestLimitedRange': 'From {start} to {end}',
1110
- 'admin.rooms.form.contestLimitedHint': 'Room schedule must fall within the contest time range',
1111
- 'admin.rooms.form.startTime': 'Start time',
1112
- 'admin.rooms.form.endTime': 'End time',
1113
- 'admin.rooms.form.endTimeOptional': '(optional)',
1114
- 'admin.rooms.form.endTimeUnlimitedHint': 'If not set, the room will have no time limit.',
1115
- 'admin.rooms.form.roomName': 'Room name',
1116
- 'admin.rooms.form.roomNamePlaceholder': 'Room A101',
1117
- 'admin.rooms.form.roomCode': 'Room code',
1118
- 'admin.rooms.form.roomCodePlaceholder': 'ROOM-A101',
1119
- 'admin.rooms.form.examSelection': 'Select exam',
1120
- 'admin.rooms.form.examPlaceholder': 'Select exam...',
1121
- 'admin.rooms.form.examDisabledHint': 'Please select a contest first to show matching exams',
1122
- 'admin.rooms.form.examSelectContestFirst': 'Please select a contest first',
1123
- 'admin.rooms.form.examNoMatchClassification': 'No exams match the classification of the selected contest',
1124
- 'admin.rooms.form.examSummaryParent': 'Parent Exam ({count})',
1125
- 'admin.rooms.form.examSummaryChild': 'Child Exams ({count})',
1126
- 'admin.rooms.form.examChildCode': 'Code: {name}',
1127
- 'admin.rooms.form.location': 'Location',
1128
- 'admin.rooms.form.locationPlaceholder': 'Floor 1, Building A',
1129
- 'admin.rooms.form.lockRoom': 'Lock room',
1130
- 'admin.rooms.form.lockHint': 'Students cannot enter the room when locked',
1131
- 'admin.rooms.form.supervisors': 'Select supervisors',
1132
- 'admin.rooms.form.supervisorPlaceholder': 'Select supervisors...',
1133
- 'admin.rooms.form.roomType': 'Room type',
1134
- 'admin.rooms.form.roomTypeContest': 'Contest',
1135
- 'admin.rooms.form.roomTypePractice': 'Practice Test',
1136
- 'admin.rooms.form.description': 'Description',
1137
- 'admin.rooms.form.descriptionPlaceholder': 'Detailed description of the exam room...',
1138
- 'admin.rooms.form.validation.branchRequired': 'Please select a branch',
1139
- 'admin.rooms.form.validation.contestRequired': 'Please select a contest',
1140
- 'admin.rooms.form.validation.examRequired': 'Please select an exam',
1141
- 'admin.rooms.form.validation.startRequired': 'Please select a start time',
1142
- 'admin.rooms.form.validation.startFuture': 'Start time must be greater than or equal to the current time',
1143
- 'admin.rooms.form.validation.endRequired': 'Please select an end time',
1144
- 'admin.rooms.form.validation.endAfterStart': 'End time must be after start time',
1145
- 'admin.rooms.form.validation.classRequired': 'Please select at least 1 class',
1146
- 'admin.rooms.form.validation.studentRequired': 'Please select at least 1 student',
1147
- // Rooms page — StudentSelectionSection
1148
- 'admin.rooms.studentSelection.label': 'Participants',
1149
- 'admin.rooms.studentSelection.all': 'All participants',
1150
- 'admin.rooms.studentSelection.byClass': 'By class',
1151
- 'admin.rooms.studentSelection.byStudent': 'Specific students',
1152
- 'admin.rooms.studentSelection.selectClass': 'Select classes',
1153
- 'admin.rooms.studentSelection.classSearchPlaceholder': 'Search classes (name, code)...',
1154
- 'admin.rooms.studentSelection.gradeFilterPlaceholder': 'Filter by grade',
1155
- 'admin.rooms.studentSelection.allGrades': 'All grades',
1156
- 'admin.rooms.studentSelection.gradeItem': 'Grade {grade}',
1157
- 'admin.rooms.studentSelection.colClassName': 'Class name',
1158
- 'admin.rooms.studentSelection.colClassCode': 'Class code',
1159
- 'admin.rooms.studentSelection.colGrade': 'Grade',
1160
- 'admin.rooms.studentSelection.colStudentCount': 'Students',
1161
- 'admin.rooms.studentSelection.noClasses': 'No classes found',
1162
- 'admin.rooms.studentSelection.selectedClasses': 'Selected classes: {count}',
1163
- 'admin.rooms.studentSelection.clearAll': 'Clear all',
1164
- 'admin.rooms.studentSelection.selectStudent': 'Select students',
1165
- 'admin.rooms.studentSelection.studentSearchPlaceholder': 'Search students (name, username, email)...',
1166
- 'admin.rooms.studentSelection.classFilterPlaceholder': 'Filter by class',
1167
- 'admin.rooms.studentSelection.allClasses': 'All classes',
1168
- 'admin.rooms.studentSelection.colStudentId': 'Student ID',
1169
- 'admin.rooms.studentSelection.colName': 'Full name',
1170
- 'admin.rooms.studentSelection.colEmail': 'Email',
1171
- 'admin.rooms.studentSelection.colClass': 'Class',
1172
- 'admin.rooms.studentSelection.noStudents': 'No students found',
1173
- 'admin.rooms.studentSelection.selectedStudents': 'Selected students: {count}',
1174
- 'admin.rooms.studentSelection.noClass': 'No class',
1175
- 'admin.rooms.studentSelection.allParticipate': 'All students will be able to participate in this exam room.',
1176
- 'admin.rooms.studentSelection.summaryClasses': 'Selected classes:',
1177
- 'admin.rooms.studentSelection.noClassSelected': 'No class selected',
1178
- 'admin.rooms.studentSelection.summaryStudents': 'Selected students:',
1179
- 'admin.rooms.studentSelection.noStudentSelected': 'No students selected',
1180
- 'admin.rooms.studentSelection.classUnit': '{count} students',
1181
- 'admin.rooms.studentSelection.studentUnit': '{count} students',
1182
- 'admin.rooms.studentSelection.zeroClass': '0 classes',
1183
- 'admin.rooms.studentSelection.zeroStudent': '0 students',
1184
- // Contests page — page header
1185
- 'admin.contests.title': 'Contest Management',
1186
- 'admin.contests.subtitle': 'Create and manage contests, view reports and rankings',
1187
- 'admin.contests.teacher.subtitle': 'View and manage contests, track student rankings',
1188
- // Contests page — tabs
1189
- 'admin.contests.tab.rankings': 'Rankings & Statistics',
1190
- 'admin.contests.tab.management': 'Contest Management',
1191
- // Contests page — stats cards
1192
- 'admin.contests.stats.total': 'Total Contests',
1193
- 'admin.contests.stats.totalCompleted': '{count} completed',
1194
- 'admin.contests.stats.upcoming': 'Upcoming Contest',
1195
- 'admin.contests.stats.upcomingDays': 'days left',
1196
- 'admin.contests.stats.totalParticipants': 'Total Participants',
1197
- 'admin.contests.stats.participated': 'participated',
1198
- 'admin.contests.stats.avgScore': 'System Avg Score',
1199
- 'admin.contests.stats.overContests': 'across {count} contests',
1200
- // Contests page — contest list (rankings tab)
1201
- 'admin.contests.list.title': 'Contest List',
1202
- 'admin.contests.list.desc': 'View detailed statistics per contest',
1203
- 'admin.contests.list.loading': 'Loading...',
1204
- 'admin.contests.list.empty': 'No contests yet',
1205
- 'admin.contests.list.participants': 'Participants:',
1206
- 'admin.contests.list.avgScore': 'Avg Score:',
1207
- 'admin.contests.list.highest': 'Highest:',
1208
- 'admin.contests.list.lowest': 'Lowest:',
1209
- 'admin.contests.list.completionRate': 'Completion Rate:',
1210
- 'admin.contests.list.viewDetail': 'View details',
1211
- // Contests page — leaderboards
1212
- 'admin.contests.ranking.latestTitle': 'Top students in latest contest',
1213
- 'admin.contests.ranking.latestNoContest': 'No contest yet',
1214
- 'admin.contests.ranking.allTimeTitle': 'Top students by total score',
1215
- 'admin.contests.ranking.allTimeDesc': 'Top 3 all-time outstanding students',
1216
- 'admin.contests.ranking.loading': 'Loading...',
1217
- 'admin.contests.ranking.noData': 'No data yet',
1218
- 'admin.contests.ranking.scoreLabel': 'pts',
1219
- 'admin.contests.ranking.totalScoreLabel': 'total pts',
1220
- 'admin.contests.ranking.contestsAvg': '{count} contests • Avg: {avg}',
1221
- // Contests page — management tab
1222
- 'admin.contests.management.title': 'Contest List',
1223
- 'admin.contests.management.showing': 'Showing {count} / {total} contests',
1224
- 'admin.contests.management.addNew': 'Add New Contest',
1225
- 'admin.contests.management.loading': 'Loading data...',
1226
- 'admin.contests.management.emptyTitle': 'No contests yet',
1227
- 'admin.contests.management.emptyDesc': 'Click "Add New Contest" to create the first contest',
1228
- // Contests page — filters
1229
- 'admin.contests.filter.title': 'Search Filters',
1230
- 'admin.contests.filter.desc': 'Filter and search contests by criteria',
1231
- 'admin.contests.filter.activeCount': '{count} filters applied',
1232
- 'admin.contests.filter.clearAll': 'Clear all',
1233
- 'admin.contests.filter.activeLabel': 'Filtering:',
1234
- 'admin.contests.filter.searchLabel': 'Search',
1235
- 'admin.contests.filter.searchPlaceholder': 'Enter contest name',
1236
- 'admin.contests.filter.statusLabel': 'Status',
1237
- 'admin.contests.filter.statusPlaceholder': 'Select status',
1238
- 'admin.contests.filter.timeTypeLabel': 'Contest Model',
1239
- 'admin.contests.filter.timeTypePlaceholder': 'Select contest model type',
1240
- 'admin.contests.filter.allStatuses': 'All statuses',
1241
- 'admin.contests.filter.allTimeTypes': 'All contest model types',
1242
- 'admin.contests.filter.visibilityLabel': 'Visibility',
1243
- 'admin.contests.filter.visibilityPlaceholder': 'Select visibility',
1244
- 'admin.contests.filter.allVisibilities': 'All visibilities',
1245
- 'admin.contests.filter.noEndDate': 'No end date',
1246
- // Contests page — table headers
1247
- 'admin.contests.table.name': 'Contest Name',
1248
- 'admin.contests.table.classification': 'Classification',
1249
- 'admin.contests.table.timeType': 'Contest Model',
1250
- 'admin.contests.table.time': 'Time',
1251
- 'admin.contests.table.status': 'Status',
1252
- 'admin.contests.table.active': 'Active',
1253
- 'admin.contests.table.actions': 'Actions',
1254
- 'admin.contests.table.timeTo': 'to',
1255
- // Contests page — status badges
1256
- 'admin.contests.status.upcoming': 'Upcoming',
1257
- 'admin.contests.status.inProgress': 'In Progress',
1258
- 'admin.contests.status.completed': 'Completed',
1259
- // Contests page — time type badges
1260
- 'admin.contests.timeType.unlimited': 'Unlimited',
1261
- 'admin.contests.timeType.limited': 'Time Limited',
1262
- // Contests page — active status badges
1263
- 'admin.contests.active.active': 'Active',
1264
- 'admin.contests.active.paused': 'Paused',
1265
- // Contests page — visibility badges
1266
- 'admin.contests.visibility.public': 'Public',
1267
- 'admin.contests.visibility.internal': 'Internal',
1268
- 'admin.contests.visibility.private': 'Private',
1269
- // Contests page — action buttons (title attributes)
1270
- 'admin.contests.action.viewDetail': 'View details',
1271
- 'admin.contests.action.edit': 'Edit',
1272
- 'admin.contests.action.delete': 'Delete',
1273
- // Contests page — add dialog
1274
- 'admin.contests.add.title': 'Add New Contest',
1275
- 'admin.contests.add.desc': 'Enter information to create a new contest in the system',
1276
- 'admin.contests.add.submitting': 'Adding...',
1277
- 'admin.contests.add.submit': 'Add Contest',
1278
- 'admin.contests.add.cancel': 'Cancel',
1279
- // Contests page — edit dialog
1280
- 'admin.contests.edit.title': 'Edit Contest',
1281
- 'admin.contests.edit.desc': 'Update contest information: {name}',
1282
- 'admin.contests.edit.submitting': 'Updating...',
1283
- 'admin.contests.edit.submit': 'Update',
1284
- 'admin.contests.edit.cancel': 'Cancel',
1285
- // Contests page — delete dialog
1286
- 'admin.contests.delete.title': 'Delete Contest',
1287
- 'admin.contests.delete.cannotUndo': 'This action cannot be undone',
1288
- 'admin.contests.delete.participants': '{count} participants',
1289
- 'admin.contests.delete.rooms': '{count} rooms',
1290
- 'admin.contests.delete.warningTitle': 'Important Warning',
1291
- 'admin.contests.delete.warningRooms': 'All exam rooms will be deleted',
1292
- 'admin.contests.delete.warningData': 'Participant data will be deleted',
1293
- 'admin.contests.delete.warningResults': 'Exam results cannot be recovered',
1294
- 'admin.contests.delete.cancel': 'Cancel',
1295
- 'admin.contests.delete.submitting': 'Deleting...',
1296
- 'admin.contests.delete.confirm': 'Confirm Delete',
1297
- // Contests page — class room selection dialog
1298
- // Contests page — detail dialog
1299
- 'admin.contests.detail.title': 'Contest Details',
1300
- 'admin.contests.detail.desc': 'Detailed statistics and analysis of exam results',
1301
- 'admin.contests.detail.loading': 'Loading data...',
1302
- 'admin.contests.detail.statAvgScore': 'Avg Score',
1303
- 'admin.contests.detail.statParticipants': 'Participants',
1304
- 'admin.contests.detail.statCompletion': 'Completion',
1305
- 'admin.contests.detail.statAvgTime': 'Avg Min',
1306
- 'admin.contests.detail.top3Title': 'Top 3 Outstanding Students',
1307
- 'admin.contests.detail.noStudents': 'No student data yet',
1308
- 'admin.contests.detail.scoreDistTitle': 'Score Distribution',
1309
- 'admin.contests.detail.noScoreDist': 'No score distribution data yet',
1310
- 'admin.contests.detail.classAvgTitle': 'Avg Score by Class',
1311
- 'admin.contests.detail.noClassData': 'No class data yet',
1312
- 'admin.contests.detail.classStudentCount': '{count} students',
1313
- 'admin.contests.detail.avgTimeLabel': 'Avg Completion Time',
1314
- 'admin.contests.detail.fastestLabel': 'Fastest',
1315
- 'admin.contests.detail.slowestLabel': 'Slowest',
1316
- 'admin.contests.detail.minuteUnit': 'min',
1317
- 'admin.contests.detail.contestLabel': 'Contest',
1318
- 'admin.contests.detail.timeLabel': 'Time',
1319
- 'admin.contests.detail.unlimited': 'Unlimited',
1320
- 'admin.contests.detail.loadError': 'Unable to load statistics data. Please try again later.',
1321
- // Contests page — student detail dialog
1322
- 'admin.contests.student.title': 'Student Profile: {name}',
1323
- 'admin.contests.student.desc': 'Participation history and detailed statistics',
1324
- 'admin.contests.student.loading': 'Loading data...',
1325
- 'admin.contests.student.noClass': 'No class assigned',
1326
- 'admin.contests.student.codeLabel': 'Code: {code}',
1327
- 'admin.contests.student.avgScoreLabel': 'Avg Score',
1328
- 'admin.contests.student.statTotalScore': 'Total Score',
1329
- 'admin.contests.student.statContests': 'Contests Joined',
1330
- 'admin.contests.student.statBestRank': 'Best Rank',
1331
- 'admin.contests.student.statHighest': 'Highest Score',
1332
- 'admin.contests.student.scoreRangeTitle': 'Score Range',
1333
- 'admin.contests.student.scoreHighest': 'Highest Score',
1334
- 'admin.contests.student.scoreAvg': 'Average Score',
1335
- 'admin.contests.student.scoreLowest': 'Lowest Score',
1336
- 'admin.contests.student.trendTitle': 'Score Trend',
1337
- 'admin.contests.student.noTrendData': 'No score data yet',
1338
- 'admin.contests.student.skillsTitle': 'Competency Analysis',
1339
- 'admin.contests.student.historyTitle': 'Contest Participation History',
1340
- 'admin.contests.student.historyScore': 'Score:',
1341
- 'admin.contests.student.historyRank': 'Rank:',
1342
- 'admin.contests.student.historyEmpty': 'No contest participation history',
1343
- 'admin.contests.student.awardsTitle': 'Awards & Achievements',
1344
- 'admin.contests.student.rank1': '🥇 1st',
1345
- 'admin.contests.student.rank2': '🥈 2nd',
1346
- 'admin.contests.student.rank3': '🥉 3rd',
1347
- 'admin.contests.student.rankN': '#{rank}',
1348
- 'admin.contests.student.loadError': 'Unable to load student data. Please try again later.',
1349
- 'admin.contests.student.scoreRadarName': 'Score',
1350
- // Contests page — toast messages
1351
- 'admin.contests.toast.addSuccess': 'Success',
1352
- 'admin.contests.toast.addSuccessDesc': 'New contest added!',
1353
- 'admin.contests.toast.editSuccess': 'Success',
1354
- 'admin.contests.toast.editSuccessDesc': 'Contest updated!',
1355
- 'admin.contests.toast.deleteSuccess': 'Success',
1356
- 'admin.contests.toast.deleteSuccessDesc': 'Contest "{name}" deleted',
1357
- // Contests page — shared form fields
1358
- 'admin.contests.form.nameLabel': 'Contest Name',
1359
- 'admin.contests.form.namePlaceholder': 'E.g.: English Talent 2025',
1360
- 'admin.contests.form.charCount': '{current}/{max} characters',
1361
- 'admin.contests.form.classificationLabel': 'Classification',
1362
- 'admin.contests.form.classificationPlaceholder': 'Select classification',
1363
- 'admin.contests.form.roomCreationLabel': 'Rooms by Class',
1364
- 'admin.contests.form.roomCreationAll': 'Create all classes',
1365
- 'admin.contests.form.roomCreationAllDesc': 'Automatically create exam rooms for all classes',
1366
- 'admin.contests.form.roomCreationSelected': 'Specify classes',
1367
- 'admin.contests.form.roomCreationSelectedDesc': 'Select classes to create exam rooms',
1368
- 'admin.contests.form.examLabel': 'Exam',
1369
- 'admin.contests.form.examSelected': '{parentCount} parent exam, {childCount} child exams',
1370
- 'admin.contests.form.examNone': 'No exam selected',
1371
- 'admin.contests.form.examSelectBtn': 'Select Exam',
1372
- 'admin.contests.form.examHint': 'Select the exam for this contest',
1373
- 'admin.contests.form.examError': 'Please select an exam for this contest',
1374
- 'admin.contests.form.examSelectClassificationFirst': 'Please select contest classification first',
1375
- 'admin.contests.form.examParentLabel': 'Parent Exam ({count})',
1376
- 'admin.contests.form.examChildLabel': 'Child Exams ({count})',
1377
- 'admin.contests.form.examChildCode': 'Code: {name}',
1378
- 'admin.contests.form.descriptionLabel': 'Description',
1379
- 'admin.contests.form.descriptionPlaceholder': 'Detailed description about the contest...',
1380
- 'admin.contests.form.timeTypeLabel': 'Contest Model',
1381
- 'admin.contests.form.timeTypeLimited': 'Time Limited',
1382
- 'admin.contests.form.timeTypeLimitedDesc': 'Has start and end time',
1383
- 'admin.contests.form.timeTypeUnlimited': 'Unlimited',
1384
- 'admin.contests.form.timeTypeUnlimitedDesc': 'Has start time only, no end time',
1385
- 'admin.contests.form.unlimitedInfo': 'Unlimited time contest',
1386
- 'admin.contests.form.unlimitedInfoDesc': 'Students can join the contest anytime after the start time. There is no end time.',
1387
- 'admin.contests.form.contestDuration': 'Contest duration',
1388
- 'admin.contests.form.startTime': 'Contest start time',
1389
- 'admin.contests.form.startDate': 'Start Date',
1390
- 'admin.contests.form.startHour': 'Start Time',
1391
- 'admin.contests.form.endDate': 'End Date',
1392
- 'admin.contests.form.endHour': 'End Time',
1393
- 'admin.contests.form.activeStatusLabel': 'Active Status',
1394
- 'admin.contests.form.activeStatusHintActive': 'Contest will be active immediately after creation',
1395
- 'admin.contests.form.activeStatusHintPaused': 'Contest will be paused, can be activated later',
1396
- 'admin.contests.form.activeStatusDescActive': 'Contest is currently active',
1397
- 'admin.contests.form.activeStatusDescPaused': 'Contest is currently paused',
1398
- // Exams page (admin.exams.*)
1399
- 'admin.exams.title': 'Exam Management',
1400
- 'admin.exams.subtitle': 'Manage exams and create new questions from templates',
1401
- 'admin.exams.examFallbackName': 'Exam {id}',
1402
- 'admin.exams.uncategorized': 'Uncategorized',
1403
- // Toast messages
1404
- 'admin.exams.toast.deleteSuccess': 'Exam deleted successfully!',
1405
- 'admin.exams.toast.deleteSuccessDesc': 'Deleted exam "{name}"',
1406
- 'admin.exams.toast.deleteFailed': 'Deletion failed',
1407
- 'admin.exams.toast.deleteError': 'An error occurred while deleting the exam. Please try again.',
1408
- 'admin.exams.toast.success': 'Success',
1409
- 'admin.exams.toast.copySuccess': 'Copied exam {id}',
1410
- 'admin.exams.toast.shuffleSuccess': 'Created {count} shuffled variants from exam {id}! Question order has been randomized.',
1411
- // Error state
1412
- 'admin.exams.error.loadTitle': 'Unable to load exam list',
1413
- 'admin.exams.error.loadMessage': 'An error occurred while loading data. Please try again.',
1414
- // Statistics
1415
- 'admin.exams.stats.totalExams': 'Total Exams',
1416
- 'admin.exams.stats.activeExams': '{count} exams active',
1417
- 'admin.exams.stats.rooms': 'Rooms',
1418
- 'admin.exams.stats.totalAssigned': 'Total assigned rooms',
1419
- 'admin.exams.stats.completed': 'Completed',
1420
- 'admin.exams.stats.studentsSubmitted': 'Students submitted',
1421
- 'admin.exams.stats.statusDistribution': 'Status Distribution',
1422
- 'admin.exams.stats.ready': 'Ready',
1423
- 'admin.exams.stats.notReady': 'Not Ready',
1424
- 'admin.exams.stats.activated': 'Activated',
1425
- 'admin.exams.stats.deactivated': 'Deactivated',
1426
- 'admin.exams.stats.examUnit': '{count} exams',
1427
- // Table
1428
- 'admin.exams.table.title': 'Exam List',
1429
- 'admin.exams.table.showing': 'Showing {count} / {total} exams',
1430
- 'admin.exams.table.createExam': 'Create Exam',
1431
- 'admin.exams.table.loading': 'Loading data...',
1432
- 'admin.exams.table.empty': 'No exams found',
1433
- 'admin.exams.table.createdPrefix': 'Created:',
1434
- 'admin.exams.table.minutes': '{count} min',
1435
- 'admin.exams.table.questionCount': '{count}/{total} questions',
1436
- 'admin.exams.table.completed': 'Completed',
1437
- 'admin.exams.table.ready': 'Completed',
1438
- 'admin.exams.table.notReady': 'Incomplete',
1439
- 'admin.exams.table.activated': 'Activated',
1440
- 'admin.exams.table.deactivated': 'Deactivated',
1441
- 'admin.exams.table.cannotActivate': 'Exam is not ready, cannot activate',
1442
- 'admin.exams.table.editContent': 'Edit exam content',
1443
- // Filters
1444
- 'admin.exams.filter.searchPlaceholder': 'Search by name, exam code...',
1445
- 'admin.exams.filter.level': 'Level',
1446
- 'admin.exams.filter.allLevels': 'All Levels',
1447
- 'admin.exams.filter.ready': 'Completed',
1448
- 'admin.exams.filter.allReady': 'All Completion',
1449
- 'admin.exams.filter.isReady': 'Completed',
1450
- 'admin.exams.filter.notReady': 'Incomplete',
1451
- 'admin.exams.filter.status': 'Status',
1452
- 'admin.exams.filter.allStatuses': 'All Statuses',
1453
- 'admin.exams.filter.activated': 'Activated',
1454
- 'admin.exams.filter.deactivated': 'Deactivated',
1455
- 'admin.exams.filter.clearFilters': 'Clear Filters',
1456
- 'admin.exams.filter.searchLabel': 'Search:',
1457
- 'admin.exams.filter.levelLabel': 'Level:',
1458
- 'admin.exams.filter.readyLabel': 'Completed:',
1459
- 'admin.exams.filter.statusLabel': 'Status:',
1460
- // Table columns
1461
- 'admin.exams.col.code': 'Code',
1462
- 'admin.exams.col.name': 'Title',
1463
- 'admin.exams.col.level': 'Level',
1464
- 'admin.exams.col.difficulty': 'Difficulty',
1465
- 'admin.exams.col.duration': 'Duration',
1466
- 'admin.exams.col.questions': 'Questions',
1467
- 'admin.exams.col.assigned': 'Assigned',
1468
- 'admin.exams.col.ready': 'Completed',
1469
- 'admin.exams.col.status': 'Status',
1470
- 'admin.exams.col.actions': 'Actions',
1471
- 'admin.exams.col.classification': 'Classification',
1472
- 'admin.exams.col.creator': 'Creator',
1473
- 'admin.exams.col.createdAt': 'Created date',
1474
- // Actions
1475
- 'admin.exams.action.view': 'View Details',
1476
- 'admin.exams.action.preview': 'Preview Exam',
1477
- 'admin.exams.action.edit': 'Edit',
1478
- 'admin.exams.action.copy': 'Copy',
1479
- 'admin.exams.action.shuffle': 'Create Shuffled Exam',
1480
- 'admin.exams.action.delete': 'Delete',
1481
- // Difficulty labels
1482
- 'admin.exams.difficulty.easy': 'Easy',
1483
- 'admin.exams.difficulty.medium': 'Medium',
1484
- 'admin.exams.difficulty.hard': 'Hard',
1485
- // Delete dialog
1486
- 'admin.exams.delete.title': 'Confirm Delete Exam',
1487
- 'admin.exams.delete.confirm': 'Are you sure you want to delete exam',
1488
- 'admin.exams.delete.warning': 'This action cannot be undone and will delete all related data.',
1489
- 'admin.exams.delete.cancel': 'Cancel',
1490
- 'admin.exams.delete.submit': 'Delete',
1491
- // Duplicate dialog
1492
- 'admin.exams.duplicate.title': 'Copy Exam',
1493
- 'admin.exams.duplicate.subtitle': 'Create a complete copy',
1494
- 'admin.exams.duplicate.originalExam': 'Original Exam',
1495
- 'admin.exams.duplicate.copyIncludes': 'Copy will include',
1496
- 'admin.exams.duplicate.examInfo': 'Exam information',
1497
- 'admin.exams.duplicate.allSettings': 'All configurations and settings',
1498
- 'admin.exams.duplicate.questions': 'Questions',
1499
- 'admin.exams.duplicate.questionCount': '{count} questions',
1500
- 'admin.exams.duplicate.newName': 'New Name',
1501
- 'admin.exams.duplicate.newCode': 'New Code',
1502
- 'admin.exams.duplicate.draftNote': 'The copy will be created with status',
1503
- 'admin.exams.duplicate.draft': 'Draft',
1504
- 'admin.exams.duplicate.editableNote': 'and can be edited right after creation.',
1505
- 'admin.exams.duplicate.cancel': 'Cancel',
1506
- 'admin.exams.duplicate.copying': 'Copying...',
1507
- 'admin.exams.duplicate.submit': 'Create Copy',
1508
- // View dialog
1509
- 'admin.exams.view.subject': 'Subject',
1510
- 'admin.exams.view.level': 'Level',
1511
- 'admin.exams.view.duration': 'Duration',
1512
- 'admin.exams.view.minutes': '{count} min',
1513
- 'admin.exams.view.questionCount': 'Question Count',
1514
- 'admin.exams.view.questions': '{count} questions',
1515
- 'admin.exams.view.totalPoints': 'Total Points',
1516
- 'admin.exams.view.points': '{count} pts',
1517
- 'admin.exams.view.difficulty': 'Difficulty',
1518
- 'admin.exams.view.description': 'Description',
1519
- 'admin.exams.view.close': 'Close',
1520
- // Shuffle dialog
1521
- 'admin.exams.shuffle.title': 'Create Shuffled Exam Set',
1522
- 'admin.exams.shuffle.desc': 'Create multiple exam versions from {code} with randomly shuffled question order',
1523
- 'admin.exams.shuffle.questionCount': '{count} questions',
1524
- 'admin.exams.shuffle.minutes': '{count} min',
1525
- 'admin.exams.shuffle.points': '{count} pts',
1526
- 'admin.exams.shuffle.howItWorks': 'How it works',
1527
- 'admin.exams.shuffle.info1': 'Each variant contains the exact same set of questions as the original',
1528
- 'admin.exams.shuffle.info2': 'The order of Parts is preserved',
1529
- 'admin.exams.shuffle.info3': 'Questions within the same Part are randomly shuffled',
1530
- 'admin.exams.shuffle.info4': 'Variants are linked to the parent exam for management',
1531
- 'admin.exams.shuffle.countLabel': 'Number of variants to create',
1532
- 'admin.exams.shuffle.strategyLabel': 'Existing exam handling option',
1533
- 'admin.exams.shuffle.keepOld': 'Keep existing exams and add new ones',
1534
- 'admin.exams.shuffle.replaceAll': 'Create a completely new set',
1535
- 'admin.exams.shuffle.existingVariants': 'Existing exams ({count})',
1536
- 'admin.exams.shuffle.deleteAll': 'Delete all ({count})',
1537
- 'admin.exams.shuffle.loading': 'Loading...',
1538
- 'admin.exams.shuffle.noVariants': 'No shuffled exams yet',
1539
- 'admin.exams.shuffle.variantCode': 'Code: {name}',
1540
- 'admin.exams.shuffle.originalBadge': '📌 Original',
1541
- 'admin.exams.shuffle.originalNote': 'Original question order, cannot be deleted',
1542
- 'admin.exams.shuffle.preview': 'Preview',
1543
- 'admin.exams.shuffle.close': 'Close',
1544
- 'admin.exams.shuffle.creating': 'Creating...',
1545
- 'admin.exams.shuffle.createButton': 'Create {count} shuffled exams',
1546
- 'admin.exams.shuffle.confirmDeleteAllTitle': 'Delete all shuffled exams?',
1547
- 'admin.exams.shuffle.confirmDeleteAllDesc': 'Are you sure you want to delete all {count} shuffled exams? The original exam (Code: 000) will be kept. This action cannot be undone.',
1548
- 'admin.exams.shuffle.cancel': 'Cancel',
1549
- 'admin.exams.shuffle.deleteAllBtn': 'Delete All',
1550
- 'admin.exams.shuffle.confirmDeleteOneTitle': 'Delete this exam?',
1551
- 'admin.exams.shuffle.confirmDeleteOneDesc': 'Are you sure you want to delete this exam? This action cannot be undone.',
1552
- 'admin.exams.shuffle.deleteBtn': 'Delete',
1553
- // Create exam page
1554
- 'admin.exams.create.title': 'Create New Exam',
1555
- 'admin.exams.create.step1': 'Step 1: Enter basic exam information',
1556
- 'admin.exams.create.success': 'Success',
1557
- 'admin.exams.create.successDesc': 'Saved exam "{name}". Redirecting to Template selection...',
1558
- 'admin.exams.create.incompleteInfo': 'Incomplete Information',
1559
- 'admin.exams.create.incompleteInfoDesc': 'Please fill in all required fields and check the information entered',
1560
- 'admin.exams.create.cancel': 'Cancel',
1561
- 'admin.exams.create.saving': 'Saving...',
1562
- 'admin.exams.create.saveAndContinue': 'Create exam and start editing content',
1563
- 'admin.exams.create.loading': 'Loading...',
1564
- // Shared form labels
1565
- 'admin.exams.form.basicInfo': 'Basic Information',
1566
- 'admin.exams.form.requiredHint': 'Required fields are marked with (*)',
1567
- 'admin.exams.form.codeLabel': 'Exam Code',
1568
- 'admin.exams.form.codePlaceholder': 'Enter exam code...',
1569
- 'admin.exams.form.charCount': '{count}/{max} characters',
1570
- 'admin.exams.form.nameLabel': 'Exam Name',
1571
- 'admin.exams.form.namePlaceholder': 'Enter exam name...',
1572
- 'admin.exams.form.subject': 'Subject',
1573
- 'admin.exams.form.subjectPlaceholder': 'Select subject',
1574
- 'admin.exams.form.loading': 'Loading...',
1575
- 'admin.exams.form.level': 'Level',
1576
- 'admin.exams.form.levelPlaceholder': 'Select level',
1577
- 'admin.exams.form.difficulty': 'Difficulty',
1578
- 'admin.exams.form.difficultyPlaceholder': 'Select difficulty',
1579
- 'admin.exams.form.easy': 'Easy',
1580
- 'admin.exams.form.medium': 'Medium',
1581
- 'admin.exams.form.hard': 'Hard',
1582
- 'admin.exams.form.duration': 'Exam Duration (minutes)',
1583
- 'admin.exams.form.totalPoints': 'Total Points',
1584
- 'admin.exams.form.description': 'Description',
1585
- 'admin.exams.form.descriptionPlaceholder': 'Detailed description about the exam, objectives, target audience...',
1586
- 'admin.exams.form.classification': 'Exam Classification',
1587
- 'admin.exams.form.classificationPlaceholder': 'Select exam classification',
1588
- // Edit exam page
1589
- 'admin.exams.edit.title': 'Edit Exam',
1590
- 'admin.exams.edit.subtitle': 'Update your exam information',
1591
- 'admin.exams.edit.loading': 'Loading exam information...',
1592
- 'admin.exams.edit.loadError': 'Unable to load exam information',
1593
- 'admin.exams.edit.loadErrorDesc': 'An error occurred while loading data. Please try again.',
1594
- 'admin.exams.edit.backToList': 'Back to list',
1595
- 'admin.exams.edit.success': 'Updated exam {name} successfully!',
1596
- 'admin.exams.edit.invalidInfo': 'Invalid Information',
1597
- 'admin.exams.edit.invalidInfoDesc': 'Please check the information fields',
1598
- 'admin.exams.edit.templateInfoTitle': 'Template Information (Cannot be changed)',
1599
- 'admin.exams.edit.templateInfoDesc': 'The exam template was selected when creating the exam and cannot be changed',
1600
- 'admin.exams.edit.templateName': 'Template Name:',
1601
- 'admin.exams.edit.templateParts': 'Parts:',
1602
- 'admin.exams.edit.templateQuestions': 'Questions:',
1603
- 'admin.exams.edit.noTemplate': 'No Template Selected',
1604
- 'admin.exams.edit.noTemplateDesc': 'You need to select a Template to complete the exam structure.',
1605
- 'admin.exams.edit.editQuestions': 'Edit Questions',
1606
- 'admin.exams.edit.back': 'Back',
1607
- 'admin.exams.edit.saving': 'Saving...',
1608
- 'admin.exams.edit.saveChanges': 'Save Changes',
1609
- 'admin.exams.edit.saveAndSelectTemplate': 'Save exam and continue to Template selection',
1610
- 'admin.exams.edit.saved': 'Exam saved',
1611
- 'admin.exams.edit.redirectToTemplate': 'Redirecting to Template selection...',
1612
- 'admin.exams.edit.loadingFallback': 'Loading...',
1613
- // Select template page
1614
- 'admin.exams.template.exam': 'Exam',
1615
- 'admin.exams.template.examCode': 'Exam Code:',
1616
- 'admin.exams.template.step2': 'Step 2: Select Exam Template',
1617
- 'admin.exams.template.selectTemplate': 'Select Exam Template',
1618
- 'admin.exams.template.error': 'Error',
1619
- 'admin.exams.template.loadError': 'Unable to load exam information. Please try again.',
1620
- 'admin.exams.template.loading': 'Loading exam information...',
1621
- 'admin.exams.template.loadingFallback': 'Loading...',
1622
- // Preview dialog
1623
- 'admin.exams.preview.title': 'Preview Exam: {name}',
1624
- 'admin.exams.preview.examInfo': 'Exam Information',
1625
- 'admin.exams.preview.duration': 'Duration:',
1626
- 'admin.exams.preview.questionCount': 'Questions:',
1627
- 'admin.exams.preview.totalPoints': 'Total Points:',
1628
- 'admin.exams.preview.progress': 'Progress',
1629
- 'admin.exams.preview.loading': 'Loading...',
1630
- 'admin.exams.preview.questionNavigation': 'Question Navigation',
1631
- 'admin.exams.preview.all': 'All',
1632
- 'admin.exams.preview.allQuestions': 'All {count} questions',
1633
- 'admin.exams.preview.partQuestions': 'Part {part}: {count} questions',
1634
- 'admin.exams.preview.collapse': 'Collapse',
1635
- 'admin.exams.preview.detail': 'Details',
1636
- 'admin.exams.preview.questionIndex': 'Question {index} / {total}',
1637
- 'admin.exams.preview.noQuestions': 'No questions yet',
1638
- 'admin.exams.preview.loadingQuestions': 'Loading questions...',
1639
- 'admin.exams.preview.retry': 'Retry',
1640
- 'admin.exams.preview.examNoQuestions': 'This exam has no questions yet.',
1641
- 'admin.exams.preview.prevQuestion': 'Previous Question',
1642
- 'admin.exams.preview.prev': 'Prev',
1643
- 'admin.exams.preview.nextQuestion': 'Next Question',
1644
- 'admin.exams.preview.next': 'Next',
1645
- 'admin.exams.preview.footerNote': 'This is a preview mode to check the layout and content of the exam.',
1646
- 'admin.exams.preview.close': 'Close',
1647
- 'admin.exams.preview.loadError': 'Unable to load questions. Please try again.',
1648
- 'admin.exams.preview.points': '{count} pts',
1649
- 'admin.exams.preview.questions': '{count} questions',
1650
- 'admin.exams.preview.unsupportedType': 'Question type not yet supported for preview:',
1651
- 'admin.exams.preview.lookAndChoose': 'Look at the picture and choose the correct answer',
1652
- // Configure exam page
1653
- 'admin.exams.configure.error': 'Error',
1654
- 'admin.exams.configure.loadError': 'Unable to load exam information. Please try again.',
1655
- 'admin.exams.configure.missingInfo': 'Missing information',
1656
- 'admin.exams.configure.selectTemplateFirst': 'Please select a template first.',
1657
- 'admin.exams.configure.templateNotFound': 'Template information not found.',
1658
- 'admin.exams.configure.success': 'Success',
1659
- 'admin.exams.configure.successDesc': 'Template configuration saved. Redirecting to question creation page...',
1660
- 'admin.exams.configure.loading': 'Loading information...',
1661
- 'admin.exams.configure.noTemplate': 'Template information not found',
1662
- 'admin.exams.configure.backToTemplate': 'Back to template selection',
1663
- 'admin.exams.configure.saving': 'Saving configuration...',
1664
- 'admin.exams.configure.loadingFallback': 'Loading...',
1665
- // Questions page
1666
- 'admin.exams.questions.missingTemplate': 'Missing template',
1667
- 'admin.exams.questions.missingTemplateDesc': 'Exam has no template assigned. Please select a template first.',
1668
- 'admin.exams.questions.error': 'Error',
1669
- 'admin.exams.questions.loadError': 'Unable to load exam information. Please try again.',
1670
- 'admin.exams.questions.loading': 'Loading exam information...',
1671
- 'admin.exams.questions.noTemplate': 'No template found for this exam',
1672
- 'admin.exams.questions.noTemplateDesc': 'Please select a template before creating questions',
1673
- 'admin.exams.questions.back': 'Back',
1674
- 'admin.exams.questions.createQuestions': 'Create Questions',
1675
- 'admin.exams.questions.step4': 'Step 4: Create and edit exam questions',
1676
- 'admin.exams.questions.createAndEditQuestions': 'Create and edit exam questions',
1677
- 'admin.exams.questions.loadingFallback': 'Loading...',
1678
- 'admin.exams.questions.guide.title': 'Question Creation Guide',
1679
- 'admin.exams.questions.guide.subtitle': '4 simple steps • Helpful tips • Save time',
1680
- 'admin.exams.questions.guide.step1Title': 'Follow the order',
1681
- 'admin.exams.questions.guide.step1Desc': 'Complete each question in order within each Part',
1682
- 'admin.exams.questions.guide.step1Tip': 'Move to the next Part after completing all questions in the current Part',
1683
- 'admin.exams.questions.guide.step2Title': 'Standardized template',
1684
- 'admin.exams.questions.guide.step2Desc': 'Each Part has a predefined question type based on the template standard',
1685
- 'admin.exams.questions.guide.step2Tip': 'No need to worry about format - the system will automatically format according to the standard',
1686
- 'admin.exams.questions.guide.step3Title': 'Safe storage',
1687
- 'admin.exams.questions.guide.step3Desc': 'Use "Save Question" to save each question',
1688
- 'admin.exams.questions.guide.step3Tip': 'Press "Save Exam" when done to save everything and publish',
1689
- 'admin.exams.questions.guide.step4Title': 'Question bank',
1690
- 'admin.exams.questions.guide.step4Desc': 'Check "Add to bank" to reuse',
1691
- 'admin.exams.questions.guide.step4Tip': 'Questions will be saved to the shared pool and can be used in other exams',
1692
- 'admin.exams.questions.guide.quickTips': 'Quick tips:',
1693
- 'admin.exams.questions.guide.tip1': 'Ctrl+S to quickly save the current question',
1694
- 'admin.exams.questions.guide.tip2': 'Data is auto-saved locally on change',
1695
- 'admin.exams.questions.guide.tip3': 'Preview questions with the "Preview" button',
1696
- // Part question count editor
1697
- 'admin.exams.partEditor.skillListening': 'Listening',
1698
- 'admin.exams.partEditor.skillSpeaking': 'Speaking',
1699
- 'admin.exams.partEditor.skillReading': 'Reading',
1700
- 'admin.exams.partEditor.skillWriting': 'Writing',
1701
- 'admin.exams.partEditor.qtFillMissingWordsInGrid': 'Fill in missing letters',
1702
- 'admin.exams.partEditor.qtLookPictureFillBlankChooseAnswer': 'Look at picture, fill in the blank',
1703
- 'admin.exams.partEditor.qtLookPictureChooseCorrectAnswer': 'Look at picture, choose correct answer',
1704
- 'admin.exams.partEditor.qtLookPictureFillWordHint': 'Look at picture, fill word (with hint)',
1705
- 'admin.exams.partEditor.qtLabelThePicture': 'Label the picture',
1706
- 'admin.exams.partEditor.qtReadAndColorObjects': 'Read and color',
1707
- 'admin.exams.partEditor.qtMultipleChoice': 'Multiple choice',
1708
- 'admin.exams.partEditor.qtListening': 'Listening comprehension',
1709
- 'admin.exams.partEditor.qtReading': 'Reading comprehension',
1710
- 'admin.exams.partEditor.defaultBack': 'Back',
1711
- 'admin.exams.partEditor.defaultContinue': 'Save configuration and continue',
1712
- 'admin.exams.partEditor.defaultExamName': 'Configure Exam',
1713
- 'admin.exams.partEditor.step3': 'Step 3: Configure question count',
1714
- 'admin.exams.partEditor.templateLabel': 'Template:',
1715
- 'admin.exams.partEditor.totalQuestions': 'Total questions',
1716
- 'admin.exams.partEditor.changedFrom': 'Changed from {from} questions',
1717
- 'admin.exams.partEditor.keepDefault': 'Keeping default template settings',
1718
- 'admin.exams.partEditor.questionsUnit': 'questions',
1719
- 'admin.exams.partEditor.reset': 'Reset',
1720
- 'admin.exams.partEditor.defaultCount': 'Default: {count}',
1721
- 'admin.exams.partEditor.currentCount': 'Current: {count}',
1722
- 'admin.exams.partEditor.configParts': 'Configure Each Part',
1723
- 'admin.exams.partEditor.configPartsDesc': 'Customize the number of questions for each part. Grouped questions can adjust the number of groups and questions per group.',
1724
- 'admin.exams.partEditor.groupBadge': 'Question group',
1725
- 'admin.exams.partEditor.totalPartQuestions': 'Total questions',
1726
- 'admin.exams.partEditor.skillLabel': 'Skill',
1727
- 'admin.exams.partEditor.selectSkill': 'Select skill',
1728
- 'admin.exams.partEditor.defaultSkill': '(default: {skill})',
1729
- 'admin.exams.partEditor.audioFile': 'Audio file',
1730
- 'admin.exams.partEditor.audioPlaceholder': 'Select audio file for this part...',
1731
- 'admin.exams.partEditor.questionCount': 'Question count',
1732
- 'admin.exams.partEditor.groupCount': 'Number of groups',
1733
- 'admin.exams.partEditor.addOrRemoveGroup': 'Add or remove question groups',
1734
- 'admin.exams.partEditor.questionsPerGroup': 'Questions per group',
1735
- 'admin.exams.partEditor.group': 'Group {index}',
1736
- 'admin.exams.partEditor.defaultValue': '(default: {value})',
1737
- 'admin.exams.partEditor.unsavedChanges': '• Unsaved changes',
1738
- 'admin.exams.partEditor.readyToContinue': '✓ Ready to continue',
1739
- 'admin.exams.partEditor.saving': 'Saving...',
1740
- // Settings
1741
- 'admin.settings.title': 'System Settings',
1742
- 'admin.settings.subtitle': 'Manage system configuration and parameters',
1743
- 'admin.settings.save.success': 'Saved',
1744
- 'admin.settings.save.successDesc': 'Settings have been saved!',
1745
- // Settings — System Information
1746
- 'admin.settings.systemInfo.title': 'System Information',
1747
- 'admin.settings.systemInfo.desc': 'General system configuration',
1748
- 'admin.settings.systemInfo.edit': 'Edit',
1749
- 'admin.settings.systemInfo.cancel': 'Cancel',
1750
- 'admin.settings.systemInfo.save': 'Save Changes',
1751
- 'admin.settings.systemInfo.systemName': 'System Name',
1752
- 'admin.settings.systemInfo.systemEmail': 'System Email',
1753
- 'admin.settings.systemInfo.supportEmail': 'Support Email',
1754
- // Settings — Notification
1755
- 'admin.settings.notification.title': 'Notification Settings',
1756
- 'admin.settings.notification.desc': 'Manage notification channels',
1757
- 'admin.settings.notification.email': 'Email Notifications',
1758
- 'admin.settings.notification.emailDesc': 'Send email notifications to students and teachers',
1759
- 'admin.settings.notification.sms': 'SMS Notifications',
1760
- 'admin.settings.notification.smsDesc': 'Send important SMS notifications',
1761
- // Settings — EBM Integration
1762
- 'admin.settings.ebm.title': 'EBM Integration',
1763
- 'admin.settings.ebm.desc': 'Configure connection to EBM system',
1764
- 'admin.settings.ebm.testConnection': 'Test Connection',
1765
- 'admin.settings.ebm.syncNow': 'Sync Now',
1766
- // Settings — System Status
1767
- 'admin.settings.status.title': 'System Status',
1768
- 'admin.settings.status.desc': 'System operation information',
1769
- 'admin.settings.status.operational': 'Operational',
1770
- 'admin.settings.status.connected': 'Connected',
1771
- 'admin.settings.status.active': 'Active',
1772
- 'admin.settings.status.paused': 'Paused',
1773
- 'admin.settings.status.lastBackup': 'Yesterday 23:00',
1774
- // Test Participants (students/test-participants)
1775
- 'admin.testParticipants.title': 'Test Participants',
1776
- 'admin.testParticipants.subtitle': 'Track information and exam results of participants in the system',
1777
- 'admin.testParticipants.cardTitle': 'Test Participants List',
1778
- 'admin.testParticipants.cardDescription': 'Total {totalItems} participants found',
1779
- 'admin.testParticipants.clearFilters': 'Clear filters',
1780
- 'admin.testParticipants.filterHeader': 'Search filters',
1781
- 'admin.testParticipants.searchPlaceholder': 'Search by name, email or phone number...',
1782
- 'admin.testParticipants.branchLabel': 'Branch',
1783
- 'admin.testParticipants.allBranches': 'All branches',
1784
- 'admin.testParticipants.contestLabel': 'Contest',
1785
- 'admin.testParticipants.allContests': 'All contests',
1786
- 'admin.testParticipants.fromDate': 'From date',
1787
- 'admin.testParticipants.toDate': 'To date',
1788
- 'admin.testParticipants.col.participant': 'Participant',
1789
- 'admin.testParticipants.col.phone': 'Phone',
1790
- 'admin.testParticipants.col.dob': 'Date of Birth',
1791
- 'admin.testParticipants.col.branch': 'Branch',
1792
- 'admin.testParticipants.col.contest': 'Contest',
1793
- 'admin.testParticipants.col.exam': 'Exam',
1794
- 'admin.testParticipants.col.bestScore': 'Best Score',
1795
- 'admin.testParticipants.col.maxScore': 'Max Score',
1796
- 'admin.testParticipants.col.attemptCount': 'Attempts',
1797
- 'admin.testParticipants.col.lastAttempt': 'Last Attempt',
1798
- 'admin.testParticipants.col.actions': 'Actions',
1799
- 'admin.testParticipants.loading': 'Loading data...',
1800
- 'admin.testParticipants.empty.title': 'No data found',
1801
- 'admin.testParticipants.empty.withFilters': 'No results match the current filters. Please adjust your search criteria.',
1802
- 'admin.testParticipants.empty.noData': 'No participants have taken any exams yet.',
1803
- 'admin.testParticipants.viewDetail': 'View exam history details',
1804
- 'admin.testParticipants.detail': 'Details',
1805
- // Test Participants - Dialog
1806
- 'admin.testParticipants.dialog.title': 'Exam History Details',
1807
- 'admin.testParticipants.dialog.description': 'Detailed information about exam results and attempt history of the participant',
1808
- 'admin.testParticipants.dialog.studentInfo': 'Participant Information',
1809
- 'admin.testParticipants.dialog.fullName': 'Full Name',
1810
- 'admin.testParticipants.dialog.email': 'Email Address',
1811
- 'admin.testParticipants.dialog.phone': 'Phone Number',
1812
- 'admin.testParticipants.dialog.dob': 'Date of Birth',
1813
- 'admin.testParticipants.dialog.branch': 'Branch',
1814
- 'admin.testParticipants.dialog.examInfo': 'Exam Information',
1815
- 'admin.testParticipants.dialog.contest': 'Contest',
1816
- 'admin.testParticipants.dialog.exam': 'Exam',
1817
- 'admin.testParticipants.dialog.lastAttempt': 'Last Attempt',
1818
- 'admin.testParticipants.dialog.bestScore': 'Best Score',
1819
- 'admin.testParticipants.dialog.passRate': 'Pass Rate',
1820
- 'admin.testParticipants.dialog.totalAttempts': 'Total Attempts',
1821
- 'admin.testParticipants.dialog.historyTitle': 'Attempt History',
1822
- 'admin.testParticipants.dialog.col.attempt': 'Attempt',
1823
- 'admin.testParticipants.dialog.col.score': 'Score',
1824
- 'admin.testParticipants.dialog.col.rate': 'Rate',
1825
- 'admin.testParticipants.dialog.col.status': 'Status',
1826
- 'admin.testParticipants.dialog.col.startTime': 'Start Time',
1827
- 'admin.testParticipants.dialog.col.submitTime': 'Submit Time',
1828
- 'admin.testParticipants.dialog.noAttempts': 'No attempt data available.',
1829
- // Test Participants - Status badges
1830
- 'admin.testParticipants.status.inProgress': 'In Progress',
1831
- 'admin.testParticipants.status.submitted': 'Submitted',
1832
- 'admin.testParticipants.status.graded': 'Graded',
1833
- 'admin.testParticipants.status.published': 'Published',
1834
- // Roles list page
1835
- 'admin.roles.title': 'Role Management',
1836
- 'admin.roles.subtitle': 'Manage roles and permissions in the system',
1837
- 'admin.roles.table.title': 'Role List',
1838
- 'admin.roles.table.showing': 'Showing {count} roles',
1839
- 'admin.roles.table.empty': 'No roles found',
1840
- 'admin.roles.table.loading': 'Loading...',
1841
- 'admin.roles.table.addRole': 'Create new role',
1842
- 'admin.roles.col.name': 'Role name',
1843
- 'admin.roles.col.slug': 'Slug',
1844
- 'admin.roles.col.level': 'Level',
1845
- 'admin.roles.col.permCount': 'Permissions',
1846
- 'admin.roles.col.type': 'Type',
1847
- 'admin.roles.col.actions': 'Actions',
1848
- 'admin.roles.filter.searchPlaceholder': 'Search by name or slug...',
1849
- 'admin.roles.filter.allLevels': 'All levels',
1850
- 'admin.roles.level.system': 'System',
1851
- 'admin.roles.level.branch': 'Branch',
1852
- 'admin.roles.type.system': 'System',
1853
- 'admin.roles.type.custom': 'Custom',
1854
- // Create role
1855
- 'admin.role.create.title': 'Create new role',
1856
- 'admin.role.create.subtitle': 'Create a custom role for the system',
1857
- 'admin.role.create.success': 'Role created successfully',
1858
- 'admin.role.create.submit': 'Create role',
1859
- 'admin.role.create.submitting': 'Creating...',
1860
- 'admin.role.field.name': 'Role name',
1861
- 'admin.role.field.slug': 'Slug',
1862
- 'admin.role.field.slugHint': 'Lowercase letters, numbers, underscores and hyphens only',
1863
- 'admin.role.field.level': 'Level',
1864
- 'admin.role.field.description': 'Description',
1865
- 'admin.role.field.portalType': 'Belongs to portal',
1866
- 'admin.role.field.portalTypeHint': 'Select the portal this role will have access to',
1867
- 'admin.role.field.portal.admin': 'Admin Portal',
1868
- 'admin.role.field.portal.adminDesc': 'System, exam & user management',
1869
- 'admin.role.field.portal.teacher': 'Teacher Portal',
1870
- 'admin.role.field.portal.teacherDesc': 'Class management & grading',
1871
- 'admin.role.field.portal.student': 'Student Portal',
1872
- 'admin.role.field.portal.studentDesc': 'Online exams & results',
1873
- // Delete role
1874
- 'admin.role.delete.title': 'Delete role',
1875
- 'admin.role.delete.desc': 'Are you sure you want to delete the role "{name}"? This action cannot be undone.',
1876
- 'admin.role.delete.confirm': 'Delete role',
1877
- 'admin.role.delete.success': 'Role "{name}" deleted',
1878
- 'admin.role.delete.cannotSystem': 'Cannot delete a system role',
1879
- // Role detail
1880
- 'admin.role.backToList': 'Back to list',
1881
- 'admin.role.info.title': 'Role information',
1882
- 'admin.role.info.edit': 'Edit',
1883
- 'admin.role.info.save': 'Save',
1884
- 'admin.role.info.cancel': 'Cancel',
1885
- 'admin.role.update.success': 'Role updated successfully',
1886
- // Permission editor
1887
- 'admin.role.permissions.title': 'Permissions',
1888
- 'admin.role.permissions.showing': '{selected}/{total} permissions selected',
1889
- 'admin.role.permissions.save': 'Save changes',
1890
- 'admin.role.permissions.saving': 'Saving...',
1891
- 'admin.role.permissions.saveSuccess': 'Permissions updated successfully',
1892
- 'admin.role.permissions.systemWarning': 'This is a system role. Permissions cannot be edited.',
1893
- 'admin.role.permissions.selectAll': 'Select all',
1894
- 'admin.role.permissions.unsavedChanges': '{count} unsaved changes',
1895
- // User role assignment
1896
- 'admin.user.roles.title': 'Assigned roles',
1897
- 'admin.user.roles.assign': 'Assign role',
1898
- 'admin.user.roles.empty': 'No roles assigned yet',
1899
- 'admin.user.roles.col.role': 'Role',
1900
- 'admin.user.roles.col.branch': 'Branch',
1901
- 'admin.user.roles.col.assignedAt': 'Assigned date',
1902
- 'admin.user.roles.col.assignedBy': 'Assigned by',
1903
- 'admin.user.roles.col.actions': 'Actions',
1904
- 'admin.user.roles.sessionCacheInfo': 'Role changes will take effect after the user logs in again.',
1905
- 'admin.user.role.assign.title': 'Assign role',
1906
- 'admin.user.role.assign.desc': 'Select a role and branch to assign to the user',
1907
- 'admin.user.role.assign.roleLabel': 'Role',
1908
- 'admin.user.role.assign.rolePlaceholder': 'Select a role',
1909
- 'admin.user.role.assign.branchLabel': 'Branch',
1910
- 'admin.user.role.assign.branchPlaceholder': 'Select a branch',
1911
- 'admin.user.role.assign.submit': 'Assign role',
1912
- 'admin.user.role.assign.success': 'Role "{role}" assigned successfully',
1913
- 'admin.user.role.remove.title': 'Remove role',
1914
- 'admin.user.role.remove.desc': 'Are you sure you want to remove the role "{role}" from this user?',
1915
- 'admin.user.role.remove.confirm': 'Remove role',
1916
- 'admin.user.role.remove.success': 'Role "{role}" removed successfully',
1917
- // Template management
1918
- 'admin.templates.title': 'Exam Template Management',
1919
- 'admin.templates.subtitle': 'View, import, export, and delete exam templates',
1920
- 'admin.templates.table.title': 'Template List',
1921
- 'admin.templates.searchPlaceholder': 'Search templates',
1922
- 'admin.templates.table.empty': 'No templates found',
1923
- 'admin.templates.table.loading': 'Loading templates...',
1924
- 'admin.templates.table.showing': 'Showing {count} templates',
1925
- 'admin.templates.col.title': 'Title',
1926
- 'admin.templates.col.subTitle': 'Subtitle',
1927
- 'admin.templates.col.examLevel': 'Level',
1928
- 'admin.templates.col.theme': 'Theme',
1929
- 'admin.templates.col.totalParts': 'Parts',
1930
- 'admin.templates.col.totalQuestions': 'Questions',
1931
- 'admin.templates.col.createdBy': 'Created By',
1932
- 'admin.templates.col.createdAt': 'Created',
1933
- 'admin.templates.col.updatedAt': 'Updated',
1934
- 'admin.templates.col.examCount': 'Exams',
1935
- 'admin.templates.col.actions': 'Actions',
1936
- 'admin.templates.filter.searchPlaceholder': 'Search by title...',
1937
- 'admin.templates.action.view': 'View details',
1938
- 'admin.templates.action.export': 'Export',
1939
- 'admin.templates.action.delete': 'Delete',
1940
- 'admin.templates.action.import': 'Import Template',
1941
- 'admin.templates.action.exporting': 'Exporting...',
1942
- 'admin.templates.export.success': 'Template exported successfully',
1943
- 'admin.templates.export.error': 'Failed to export template',
1944
- 'admin.templates.import.success': 'Template imported successfully',
1945
- 'admin.templates.import.error': 'Failed to import template',
1946
- 'admin.templates.import.invalidJson': 'Invalid JSON file. Please check the file format.',
1947
- 'admin.templates.import.invalidFile': 'Please select a valid .json file.',
1948
- 'admin.templates.import.invalidFormat': 'Invalid template format. The file must contain title and parts fields.',
1949
- 'admin.templates.import.parseError': 'Failed to parse JSON file. Please check the file content.',
1950
- 'admin.templates.import.readError': 'Failed to read file. Please try again.',
1951
- 'admin.templates.import.title': 'Import Template',
1952
- 'admin.templates.import.desc': 'Select a JSON file previously exported from the system. If a template with the same ID already exists, it will be replaced.',
1953
- 'admin.templates.import.selectFile': 'Select JSON file',
1954
- 'admin.templates.import.submit': 'Import',
1955
- 'admin.templates.import.submitting': 'Importing...',
1956
- 'admin.templates.delete.title': 'Delete Template',
1957
- 'admin.templates.delete.desc': 'Are you sure you want to delete the template "{title}"? This action cannot be undone.',
1958
- 'admin.templates.delete.confirm': 'Delete template',
1959
- 'admin.templates.delete.success': 'Template "{title}" deleted successfully',
1960
- 'admin.templates.detail.title': 'Template Details',
1961
- 'admin.templates.detail.back': 'Back to list',
1962
- 'admin.templates.detail.jsonView': 'JSON Content',
1963
- 'admin.templates.detail.info': 'General Information',
1964
- 'admin.templates.detail.parts': 'Parts ({count})',
1965
- 'admin.templates.detail.copyJson': 'Copy JSON',
1966
- 'admin.templates.detail.jsonCopied': 'JSON copied to clipboard',
1967
- 'admin.templates.create.title': 'Create Template',
1968
- 'admin.templates.create.desc': 'Fill in the template details below. Only the Parts field requires JSON input.',
1969
- 'admin.templates.create.placeholder': 'Paste JSON content here...\n\n{\n "title": "...",\n "examLevel": "...",\n "parts": [...]\n}',
1970
- 'admin.templates.create.submit': 'Create Template',
1971
- 'admin.templates.create.creating': 'Creating...',
1972
- 'admin.templates.create.success': 'Template created successfully',
1973
- 'admin.templates.create.emptyJson': 'Please paste JSON content.',
1974
- 'admin.templates.create.invalidFormat': 'Invalid template format. The JSON must contain title, examLevel and parts fields.',
1975
- 'admin.templates.create.parseError': 'Invalid JSON. Please check the content and try again.',
1976
- 'admin.templates.create.validJson': 'Valid JSON — ready to create',
1977
- 'admin.templates.action.create': 'Create Template',
1978
- 'admin.templates.action.edit': 'Edit',
1979
- // Template form fields
1980
- 'admin.templates.form.titleLabel': 'Title',
1981
- 'admin.templates.form.titlePlaceholder': 'Enter template title...',
1982
- 'admin.templates.form.titleRequired': 'Title is required.',
1983
- 'admin.templates.form.subTitleLabel': 'Subtitle',
1984
- 'admin.templates.form.subTitlePlaceholder': 'Enter subtitle (optional)...',
1985
- 'admin.templates.form.descriptionLabel': 'Description',
1986
- 'admin.templates.form.descriptionPlaceholder': 'Enter description (optional)...',
1987
- 'admin.templates.form.examLevelLabel': 'Exam Level (CEFR)',
1988
- 'admin.templates.form.examLevelPlaceholder': 'Select exam level...',
1989
- 'admin.templates.form.totalQuestionsLabel': 'Total Questions',
1990
- 'admin.templates.form.totalPartsLabel': 'Total Parts',
1991
- 'admin.templates.form.partsLabel': 'Parts (JSON)',
1992
- 'admin.templates.form.partsPlaceholder': '[\n {\n "partNumber": 1,\n "title": "Part 1",\n "questionCount": 5,\n ...\n }\n]',
1993
- 'admin.templates.form.partsRequired': 'Parts JSON is required and must be a non-empty array.',
1994
- 'admin.templates.form.partsNotArray': 'Parts must be a JSON array.',
1995
- 'admin.templates.form.partsParseError': 'Invalid JSON. Please check the content.',
1996
- 'admin.templates.form.validJson': 'Valid JSON',
1997
- 'admin.templates.form.themeLabel': 'Theme',
1998
- 'admin.templates.form.themePlaceholder': 'Select theme...',
1999
- 'admin.templates.form.themeNone': 'None',
2000
- // Template edit
2001
- 'admin.templates.edit.title': 'Edit Template',
2002
- 'admin.templates.edit.desc': 'Modify the template details below. Only the Parts field requires JSON input.',
2003
- 'admin.templates.edit.submit': 'Save Changes',
2004
- 'admin.templates.edit.saving': 'Saving...',
2005
- 'admin.templates.edit.success': 'Template updated successfully',
2006
- 'admin.templates.edit.loadError': 'Failed to load template data for editing',
2007
- // ===== Bulk Exam Room Provisioning (System Admin) =====
2008
- 'bulkRooms.sidebar.label': 'Bulk Exam Rooms',
2009
- 'bulkRooms.page.title': 'Bulk Exam Room Provisioning',
2010
- 'bulkRooms.page.description': 'Create many exam rooms for a contest across multiple branches in a single operation.',
2011
- 'bulkRooms.actions.next': 'Next',
2012
- 'bulkRooms.actions.back': 'Back',
2013
- 'bulkRooms.actions.preview': 'Preview',
2014
- 'bulkRooms.actions.commit': 'Create rooms',
2015
- 'bulkRooms.actions.confirm': 'Confirm',
2016
- 'bulkRooms.actions.cancel': 'Cancel',
2017
- 'bulkRooms.actions.reset': 'Start over',
2018
- 'bulkRooms.actions.close': 'Close',
2019
- 'bulkRooms.steps.contest': 'Pick contest',
2020
- 'bulkRooms.steps.branches': 'Pick branches',
2021
- 'bulkRooms.steps.config': 'Configure',
2022
- 'bulkRooms.steps.preview': 'Preview',
2023
- 'bulkRooms.steps.commit': 'Create rooms',
2024
- 'bulkRooms.steps.indicator': 'Step {current} of {total}',
2025
- 'bulkRooms.contest.title': 'Pick a contest',
2026
- 'bulkRooms.contest.description': 'Choose the contest the new rooms will belong to.',
2027
- 'bulkRooms.contest.placeholder': 'Search contests by name...',
2028
- 'bulkRooms.contest.empty': 'No contests found.',
2029
- 'bulkRooms.contest.selected': 'Selected: {name}',
2030
- 'bulkRooms.branches.title': 'Pick branches',
2031
- 'bulkRooms.branches.description': 'Select one or more branches to provision rooms for.',
2032
- 'bulkRooms.branches.placeholder': 'Choose branches...',
2033
- 'bulkRooms.branches.empty': 'No branches available.',
2034
- 'bulkRooms.branches.selectedCount': '{count} branches selected',
2035
- 'bulkRooms.branches.sourceEbm': 'Branch list is loaded from the EBM system.',
2036
- 'bulkRooms.branches.selectAll': 'Select all branches',
2037
- 'bulkRooms.branches.selectedSummary': '{selected}/{total} branches selected',
2038
- 'bulkRooms.config.title': 'Per-branch configuration',
2039
- 'bulkRooms.config.description': 'Configure how rooms are generated for each selected branch.',
2040
- 'bulkRooms.config.mode.label': 'Provisioning mode',
2041
- 'bulkRooms.config.mode.AUTO_CLASS': 'Auto from classes',
2042
- 'bulkRooms.config.mode.MANUAL': 'Manual',
2043
- 'bulkRooms.config.mode.AUTO_CLASS.help': 'Generate one room per active class room of the branch.',
2044
- 'bulkRooms.config.mode.MANUAL.help': 'Define rooms and student codes manually.',
2045
- 'bulkRooms.config.onlyTeacher.label': 'Add branch teachers to the rooms',
2046
- 'bulkRooms.config.onlyTeacher.help': 'If checked, all teachers of the branch will be added. If unchecked, no teachers will be added.',
2047
- 'bulkRooms.config.nameFormat.label': 'Room name format',
2048
- 'bulkRooms.config.nameFormat.placeholder': '{branchCode} - {className}',
2049
- 'bulkRooms.config.codeFormat.label': 'Room code format (optional)',
2050
- 'bulkRooms.config.codeFormat.placeholder': '{branchCode}_ROOM_{index}',
2051
- 'bulkRooms.config.tokens.help': 'Supported tokens: {tokens}',
2052
- 'bulkRooms.config.classEbmIds.label': 'Class room ids (optional)',
2053
- 'bulkRooms.config.classEbmIds.placeholder': 'Comma-separated class room ids',
2054
- 'bulkRooms.config.classEbmIds.help': 'Leave empty to use all active class rooms of the branch.',
2055
- 'bulkRooms.config.rooms.title': 'Rooms (manual mode)',
2056
- 'bulkRooms.config.rooms.add': 'Add room',
2057
- 'bulkRooms.config.rooms.remove': 'Remove',
2058
- 'bulkRooms.config.rooms.empty': 'No rooms yet. Click "Add room" to start.',
2059
- 'bulkRooms.config.studentCodes.label': 'Student codes (optional, one per line)',
2060
- 'bulkRooms.config.studentCodes.placeholder': 'HS001\nHS002\n...',
2061
- 'bulkRooms.config.studentCodes.help': 'Missing users will be created on commit (default password = student code).',
2062
- 'bulkRooms.preview.title': 'Preview',
2063
- 'bulkRooms.preview.description': 'Review the planned rooms before confirming.',
2064
- 'bulkRooms.preview.loading': 'Building plan...',
2065
- 'bulkRooms.preview.error': 'Failed to build preview.',
2066
- 'bulkRooms.preview.requiresForm': 'Select contest, branches and complete config to enable preview.',
2067
- 'bulkRooms.preview.summary.totalRooms': 'Total rooms',
2068
- 'bulkRooms.preview.summary.totalStaff': 'Total staff',
2069
- 'bulkRooms.preview.summary.totalStudents': 'Total students',
2070
- 'bulkRooms.preview.summary.totalNewUsers': 'New users to create',
2071
- 'bulkRooms.preview.summary.totalNewStudents': 'New student accounts',
2072
- 'bulkRooms.preview.summary.totalNewTeachers': 'New teacher accounts',
2073
- 'bulkRooms.preview.table.branch': 'Branch',
2074
- 'bulkRooms.preview.table.room': 'Room name',
2075
- 'bulkRooms.preview.table.code': 'Room code',
2076
- 'bulkRooms.preview.table.staff': 'Staff',
2077
- 'bulkRooms.preview.table.students': 'Students',
2078
- 'bulkRooms.preview.table.newUsers': 'New users',
2079
- 'bulkRooms.preview.table.roomName': 'Room name',
2080
- 'bulkRooms.preview.table.roomCode': 'Room code',
2081
- 'bulkRooms.preview.table.staffCount': 'Staff',
2082
- 'bulkRooms.preview.table.studentCount': 'Students',
2083
- 'bulkRooms.preview.table.roomCount': '{count} rooms',
2084
- 'bulkRooms.preview.table.noRooms': 'No rooms for this branch.',
2085
- 'bulkRooms.preview.table.showMore': 'Show {count} more rooms',
2086
- 'bulkRooms.preview.table.collapse': 'Collapse',
2087
- 'bulkRooms.preview.empty': 'No rooms in the plan.',
2088
- 'bulkRooms.commit.dialog.title': 'Confirm bulk provisioning',
2089
- 'bulkRooms.commit.dialog.description': 'You are about to create {rooms} rooms and {users} new users. This action cannot be undone.',
2090
- 'bulkRooms.commit.dialog.warning': 'This will create rooms and users in the database and cannot be undone.',
2091
- 'bulkRooms.commit.dialog.confirmCheckbox': 'I have reviewed the preview and confirm creating these rooms.',
2092
- 'bulkRooms.commit.dialog.committing': 'Creating...',
2093
- 'bulkRooms.commit.success.title': 'Provisioning succeeded',
2094
- 'bulkRooms.commit.success.description': 'Created {rooms} rooms, {participants} participants and {users} new users.',
2095
- 'bulkRooms.commit.success.rooms': 'Rooms created',
2096
- 'bulkRooms.commit.success.participants': 'Participants',
2097
- 'bulkRooms.commit.success.users': 'New users',
2098
- 'bulkRooms.commit.error.title': 'Provisioning failed',
2099
- 'bulkRooms.commit.error.description': 'Some branches failed to provision. See error details below.',
2100
- 'bulkRooms.commit.error.list': 'Error list',
2101
- 'bulkRooms.commit.error.partial': '{count} branch(es) reported errors.',
2102
- 'bulkRooms.commit.error.branch': 'Branch {branchId} (EBM #{ebmBranchId}): {reason}',
2103
- };
2104
- export default admin;
1
+ export default{"admin.user.create.success":"User created successfully!","admin.user.update.success":"User updated successfully!","admin.user.update.error":"An error occurred while updating the user!","admin.user.delete.success":"User deleted successfully!","admin.user.delete.error":"An error occurred while deleting the user!","admin.exam.create.error":"Unable to create exam. Please try again!","admin.exam.update.error":"Unable to update exam. Please try again!","admin.exam.delete.error":"Unable to delete exam. Please try again!","admin.exam.template.update.error":"Unable to update template. Please try again!","admin.exam.copy.success":"Exam copied successfully: {name} ({count} questions)","admin.exam.copy.error":"Unable to copy exam. Please try again!","admin.exam.toggle.activated":'Exam "{name}" activated!',"admin.exam.toggle.deactivated":'Exam "{name}" deactivated!',"admin.exam.toggle.error":"Unable to change exam status. Please try again!","admin.exam.variants.delete.success":"Successfully deleted {count} shuffled variants!","admin.exam.variants.delete.empty":"No shuffled variants to delete.","admin.exam.variants.delete.error":"Unable to delete shuffled variants. Please try again!","admin.question.batchCreate.partial":"Created {successCount}/{total} questions successfully. {errorCount} failed.","admin.question.batchCreate.itemError":"Question {index}: {error}","admin.question.batchCreate.error":"Error creating questions: {message}","admin.questionBank.update.success":"Question updated successfully!","admin.questionBank.update.error":"Unable to update question. Please try again!","admin.questionBank.delete.success":"Question deleted successfully!","admin.questionBank.delete.error":"Unable to delete question. Please try again!","admin.questionBank.create.missingInfo":"Missing information","admin.questionBank.create.success":"Success!","admin.questionBank.create.error":"Error","admin.questionBank.create.preview":"Preview","admin.questionBank.page.title":"Question Bank","admin.questionBank.page.subtitle":"Manage and organize questions for exams","admin.questionBank.btn.add":"Add question","admin.questionBank.fetch.error":"Error","admin.questionBank.fetch.errorDesc":"Unable to load question list","admin.questionBank.delete.successMsg":"Question deleted","admin.questionBank.delete.successDesc":"Deleted question {code}","admin.questionBank.delete.errorMsg":"Error","admin.questionBank.delete.errorDesc":"Unable to delete question","admin.questionBank.update.successMsg":"Updated","admin.questionBank.update.successDesc":"Updated question {code}!","admin.questionBank.update.errorMsg":"Error","admin.questionBank.update.errorDesc":"Unable to update question","admin.questionBank.create.successMsg":"Question created","admin.questionBank.create.successDesc":"Successfully created question {code}!","admin.questionBank.stats.totalQuestions":"Total Questions","admin.questionBank.stats.inBank":"In question bank","admin.questionBank.stats.totalUsage":"Usage Count","admin.questionBank.stats.inExams":"In exams","admin.questionBank.stats.avgPoints":"Avg Points","admin.questionBank.stats.avgScore":"Average score","admin.questionBank.stats.difficultyDistribution":"Difficulty Distribution","admin.questionBank.stats.questions":"questions","admin.questionBank.difficulty.easy":"Easy","admin.questionBank.difficulty.medium":"Medium","admin.questionBank.difficulty.hard":"Hard","admin.questionBank.table.title":"Question List","admin.questionBank.table.loading":"Loading...","admin.questionBank.table.showing":"Showing {count} / {total} questions","admin.questionBank.table.empty":"No questions found","admin.questionBank.table.loadingData":"Loading data...","admin.questionBank.table.created":"Created: {date}","admin.questionBank.table.pointsUnit":"pts","admin.questionBank.table.usageUnit":"times","admin.questionBank.filter.searchPlaceholder":"Search by content...","admin.questionBank.filter.typePlaceholder":"Question type","admin.questionBank.filter.typeAll":"All types","admin.questionBank.filter.difficultyPlaceholder":"Difficulty","admin.questionBank.filter.difficultyAll":"All difficulties","admin.questionBank.filter.skillPlaceholder":"Skill","admin.questionBank.filter.skillAll":"All skills","admin.questionBank.filter.clear":"Clear filters","admin.questionBank.col.code":"CODE","admin.questionBank.col.title":"Title","admin.questionBank.col.type":"TYPE","admin.questionBank.col.difficulty":"DIFFICULTY","admin.questionBank.col.skill":"SKILL","admin.questionBank.col.points":"POINTS","admin.questionBank.col.usage":"USAGE","admin.questionBank.col.actions":"ACTIONS","admin.questionBank.action.view":"View details","admin.questionBank.action.edit":"Edit","admin.questionBank.action.delete":"Delete","admin.questionBank.dialog.add.title":"Add New Question","admin.questionBank.dialog.add.section1":"Basic Information","admin.questionBank.dialog.add.section2":"Question Type","admin.questionBank.dialog.add.section3":"Question Content","admin.questionBank.dialog.add.code":"Question Code","admin.questionBank.dialog.add.codePlaceholder":"E.g.: QB001","admin.questionBank.dialog.add.titleLabel":"Title","admin.questionBank.dialog.add.titlePlaceholder":"Brief description of the question","admin.questionBank.dialog.add.difficulty":"Difficulty Level","admin.questionBank.dialog.add.skill":"Skill","admin.questionBank.dialog.add.typePlaceholder":"Select question type...","admin.questionBank.dialog.add.typeNoOptions":"No question types for {skill}","admin.questionBank.dialog.add.noTypeSelected":"No question type selected","admin.questionBank.dialog.add.selectTypeHint":"Please select a question type in step 2","admin.questionBank.dialog.add.required":"Required","admin.questionBank.dialog.add.cancel":"Cancel","admin.questionBank.dialog.add.saving":"Saving...","admin.questionBank.dialog.add.save":"Add question","admin.questionBank.dialog.add.codeError":"Please enter question code","admin.questionBank.dialog.add.titleError":"Please enter title","admin.questionBank.dialog.add.typeError":"Please select question type","admin.questionBank.dialog.edit.title":"Edit Question","admin.questionBank.dialog.edit.section1":"Basic Information","admin.questionBank.dialog.edit.section2":"Question Type","admin.questionBank.dialog.edit.section3":"Question Content","admin.questionBank.dialog.edit.code":"Question Code","admin.questionBank.dialog.edit.codePlaceholder":"Enter question code","admin.questionBank.dialog.edit.titleLabel":"Title","admin.questionBank.dialog.edit.titlePlaceholder":"Brief description of the question","admin.questionBank.dialog.edit.difficulty":"Difficulty Level","admin.questionBank.dialog.edit.skill":"Skill","admin.questionBank.dialog.edit.unchangeable":"(Cannot be changed)","admin.questionBank.dialog.edit.required":"Required","admin.questionBank.dialog.edit.cancel":"Cancel","admin.questionBank.dialog.edit.saving":"Saving...","admin.questionBank.dialog.edit.save":"Save changes","admin.questionBank.dialog.edit.codeError":"Please enter question code","admin.questionBank.dialog.edit.titleError":"Please enter title","admin.questionBank.dialog.delete.title":"Confirm Delete Question","admin.questionBank.dialog.delete.message":"Are you sure you want to delete question","admin.questionBank.dialog.delete.warning":"This action cannot be undone.","admin.questionBank.dialog.delete.cancel":"Cancel","admin.questionBank.dialog.delete.deleting":"Deleting...","admin.questionBank.dialog.delete.confirm":"Delete question","admin.questionBank.dialog.view.title":"Question Details","admin.questionBank.dialog.view.points":"points","admin.questionBank.dialog.view.usage":"Used {count} times","admin.questionBank.dialog.view.preview":"Question Preview","admin.questionBank.dialog.view.explanation":"Answer Explanation","admin.questionBank.createPage.title":"Create New Question","admin.questionBank.createPage.subtitle":"Add question to the Bank for reuse in exam sets","admin.questionBank.createPage.breadcrumb.list":"Question Bank","admin.questionBank.createPage.breadcrumb.create":"Create New","admin.questionBank.createPage.infoTitle":"Creating question type: {type}","admin.questionBank.createPage.infoDesc":"Fill in the complete question information below. You can preview the question before saving.","admin.questionBank.createPage.loading":"Loading...","admin.questionBank.createPage.back":"Go back","admin.questionBank.createPage.preview":"Preview","admin.questionBank.createPage.saving":"Saving...","admin.questionBank.createPage.save":"Save question","admin.questionBank.createPage.cancelTitle":"Cancel question creation?","admin.questionBank.createPage.cancelMessage":"You have unsaved changes. If you cancel, all information will be lost. Are you sure you want to cancel?","admin.questionBank.createPage.continueEditing":"Continue editing","admin.questionBank.createPage.cancelAndExit":"Cancel and exit","admin.questionBank.createPage.missingInfoDesc":"Please fill in all question information","admin.questionBank.createPage.savedDesc":'Saved question "{title}" to the bank',"admin.questionBank.createPage.saveErrorDesc":"Unable to save question. Please try again.","admin.questionBank.createPage.previewDesc":"Preview feature is under development","admin.schedule.update.success":"Schedule updated successfully!","admin.schedule.delete.success":"Deleted schedule {id}","admin.schedules.title":"Schedule Management","admin.schedules.subtitle":"Schedule and manage exam times for contests","admin.schedules.viewCalendar":"Calendar","admin.schedules.viewList":"List","admin.schedules.stats.totalSchedules":"Total Schedules","admin.schedules.stats.totalSchedulesDesc":"All exam schedules","admin.schedules.stats.confirmed":"Confirmed","admin.schedules.stats.confirmedDesc":"Schedules ready","admin.schedules.stats.totalStudents":"Total Students","admin.schedules.stats.totalStudentsDesc":"Assigned to schedules","admin.schedules.filters.searchPlaceholder":"Search schedules...","admin.schedules.filters.skill":"Skill","admin.schedules.filters.allSkills":"All skills","admin.schedules.filters.status":"Status","admin.schedules.filters.allStatuses":"All statuses","admin.schedules.filters.statusOpen":"Open","admin.schedules.filters.statusLocked":"Locked","admin.schedules.filters.clear":"Clear filters","admin.schedules.calendar.today":"Today","admin.schedules.calendar.daySun":"Sun","admin.schedules.calendar.dayMon":"Mon","admin.schedules.calendar.dayTue":"Tue","admin.schedules.calendar.dayWed":"Wed","admin.schedules.calendar.dayThu":"Thu","admin.schedules.calendar.dayFri":"Fri","admin.schedules.calendar.daySat":"Sat","admin.schedules.calendar.loading":"Loading schedules...","admin.schedules.calendar.noLimit":"No limit","admin.schedules.list.title":"Schedule List","admin.schedules.list.loading":"Loading...","admin.schedules.list.loadingList":"Loading schedule list...","admin.schedules.list.showing":"Showing {current} / {total} schedules","admin.schedules.list.empty":"No schedules found","admin.schedules.list.locked":"Locked","admin.schedules.list.open":"Open","admin.schedules.list.contest":"Contest:","admin.schedules.list.exam":"Exam:","admin.schedules.list.startTime":"Start:","admin.schedules.list.endTime":"End:","admin.schedules.list.noLimit":"No limit","admin.schedules.list.locationUnknown":"Not specified","admin.schedules.list.noSupervisor":"Not assigned","admin.schedules.list.participants":"{count} participants","admin.schedules.list.page":"Page {current} / {total}","admin.schedules.list.prev":"Previous","admin.schedules.list.next":"Next","admin.schedules.dialog.detailTitle":"Schedule Details","admin.schedules.dialog.room":"Exam Room","admin.schedules.dialog.contest":"Contest","admin.schedules.dialog.exam":"Exam","admin.schedules.dialog.startTime":"Start Time","admin.schedules.dialog.endTime":"End Time","admin.schedules.dialog.duration":"Duration","admin.schedules.dialog.status":"Status","admin.schedules.dialog.participantCount":"Participants","admin.schedules.dialog.participants":"{count} participants","admin.schedules.dialog.notAssigned":"Not assigned","admin.schedules.dialog.notSet":"Not specified","admin.schedules.dialog.noLimit":"No limit","admin.schedules.dialog.locked":"Locked","admin.schedules.dialog.open":"Open","admin.schedules.dialog.durationMinutes":"{duration} minutes","admin.schedules.dialog.location":"Location","admin.schedules.dialog.supervisor":"Supervisor","admin.schedules.dialog.noSupervisor":"Not assigned","admin.schedules.view.title":"Schedule Details","admin.schedules.view.contest":"Contest","admin.schedules.view.skill":"Skill","admin.schedules.view.status":"Status","admin.schedules.view.examDate":"Exam Date","admin.schedules.view.startTime":"Start Time","admin.schedules.view.endTime":"End Time","admin.schedules.view.location":"Location","admin.schedules.view.supervisor":"Supervisor","admin.schedules.view.studentCount":"Student Count","admin.schedules.view.duration":"Duration","admin.schedules.view.durationMinutes":"{duration} minutes","admin.schedules.edit.title":"Edit Schedule","admin.schedules.edit.contest":"Contest","admin.schedules.edit.skill":"Skill","admin.schedules.edit.skillPlaceholder":"Select skill","admin.schedules.edit.examDate":"Exam Date","admin.schedules.edit.startTime":"Start Time","admin.schedules.edit.endTime":"End Time","admin.schedules.edit.room":"Exam Room","admin.schedules.edit.roomPlaceholder":"Select room","admin.schedules.edit.invigilator":"Invigilator","admin.schedules.edit.invigilatorPlaceholder":"Select invigilator","admin.schedules.edit.capacity":"Capacity","admin.schedules.edit.status":"Status","admin.schedules.edit.statusPlaceholder":"Select status","admin.schedules.edit.location":"Location","admin.schedules.edit.locationPlaceholder":"Enter location (e.g., Floor 1, Building A)","admin.schedules.edit.notes":"Notes","admin.schedules.edit.notesPlaceholder":"Enter notes about the schedule (optional)","admin.schedules.edit.cancel":"Cancel","admin.schedules.edit.save":"Save Changes","admin.schedules.delete.title":"Confirm Delete Schedule","admin.schedules.delete.message":"Are you sure you want to delete schedule","admin.schedules.delete.warning":"This action cannot be undone.","admin.schedules.delete.cancel":"Cancel","admin.schedules.delete.confirm":"Delete Schedule","admin.schedules.utils.notSet":"Not set","admin.schedules.utils.noLimit":"No limit","admin.schedules.utils.statusDraft":"Draft","admin.schedules.utils.statusConfirmed":"Confirmed","admin.schedules.utils.statusInProgress":"In Progress","admin.schedules.utils.statusCompleted":"Completed","admin.schedules.utils.statusCancelled":"Cancelled","admin.report.exam.loadError":"Unable to load exam report data","admin.report.exam.exportError":"Unable to export report","admin.report.room.loadError":"Unable to load room report data","admin.report.room.exportSuccess":"Exported {format} report successfully","admin.report.room.exportError":"Unable to export report","admin.report.branch.loadError":"Unable to load branch report data","admin.report.branch.exportError":"Unable to export report","admin.user.resetPassword.success":"Password reset for {name}!","admin.user.resetPassword.error":"An error occurred while resetting the password!","admin.user.lock.success":"Account {name} has been locked","admin.user.unlock.success":"Account {name} has been unlocked","admin.user.toggleStatus.error":"An error occurred while changing account status!","admin.user.export.success":"Excel file exported successfully!","admin.user.export.error":"An error occurred while exporting the Excel file!","admin.user.syncEBM.success":"EBM sync successful!","admin.user.syncEBM.error":"An error occurred while syncing EBM!","admin.users.title":"User Management","admin.users.subtitle":"Manage Admin, Teacher and Student accounts","admin.users.table.title":"User List","admin.users.table.loading":"Loading data...","admin.users.table.showing":"Showing {count} / {total} users","admin.users.table.empty":"No users found","admin.users.table.neverLoggedIn":"Never logged in","admin.users.table.exportExcel":"Export Excel","admin.users.table.syncEBM":"Sync EBM","admin.users.table.addUser":"Add User","admin.users.col.userInfo":"USER INFO","admin.users.col.branch":"BRANCH","admin.users.col.contact":"CONTACT","admin.users.col.role":"ROLE","admin.users.col.source":"SOURCE","admin.users.col.status":"STATUS","admin.users.col.lastLogin":"LAST LOGIN","admin.users.col.actions":"ACTIONS","admin.users.filter.searchPlaceholder":"Search by email, username, phone...","admin.users.filter.allRoles":"All roles","admin.users.filter.allStatuses":"All statuses","admin.users.filter.active":"Active","admin.users.filter.inactive":"Inactive","admin.users.filter.clearFilters":"Clear filters","admin.users.filter.searchLabel":"Search:","admin.users.filter.roleLabel":"Role:","admin.users.filter.statusLabel":"Status:","admin.users.role.systemAdmin":"System Admin","admin.users.role.admin":"Admin","admin.users.role.teacher":"Teacher","admin.users.role.student":"Student","admin.users.action.view":"View details","admin.users.action.viewDetail":"View user detail page","admin.users.action.edit":"Edit","admin.users.action.resetPassword":"Reset password","admin.users.action.lock":"Lock account","admin.users.action.unlock":"Unlock account","admin.users.action.delete":"Delete user","admin.users.field.branch":"Branch","admin.users.field.branchPlaceholder":"Search and select branch...","admin.users.field.fullName":"Full name","admin.users.field.fullNamePlaceholder":"Enter full name...","admin.users.field.email":"Email","admin.users.field.emailPlaceholder":"Enter email...","admin.users.field.phone":"Phone number","admin.users.field.phonePlaceholder":"Enter phone number...","admin.users.field.address":"Address","admin.users.field.addressPlaceholder":"Enter address...","admin.users.field.usernamePlaceholder":"Enter username...","admin.users.field.usernameHint":"Start with a letter, only letters, numbers and _ allowed","admin.users.field.password":"Password","admin.users.field.passwordPlaceholder":"Enter password...","admin.users.field.passwordHint":"At least 8 characters including uppercase, lowercase, number and special character","admin.users.field.role":"Role","admin.users.field.rolePlaceholder":"Select role...","admin.users.field.activeStatus":"Account status","admin.users.field.activeHint":"Account will be active immediately after creation","admin.users.field.inactiveHint":"Account will be locked, can be activated later","admin.users.field.activeStatusDesc":"Account is active","admin.users.field.inactiveStatusDesc":"Account is locked","admin.users.field.registrationSource":"Registration source","admin.users.field.createdAt":"Created at","admin.users.field.updatedAt":"Last updated","admin.users.field.status":"Status","admin.users.field.dateOfBirth":"Date of birth","admin.users.field.dateOfBirthPlaceholder":"Select date of birth...","admin.users.add.title":"Add New User","admin.users.add.desc":"Fill in the information to create a new user account","admin.users.add.submitting":"Creating...","admin.users.add.submit":"Add User","admin.users.edit.title":"Edit User","admin.users.edit.desc":"Update user information: {name}","admin.users.edit.submitting":"Updating...","admin.users.edit.submit":"Update","admin.users.delete.title":"Confirm Delete User","admin.users.delete.desc":"Are you sure you want to delete user {name}?","admin.users.delete.warning":"This action cannot be undone.","admin.users.delete.confirm":"Delete User","admin.users.view.title":"User Information","admin.users.view.subtitle":"Account details","admin.users.view.close":"Close","admin.users.resetPassword.title":"Reset Password","admin.users.resetPassword.desc":"Enter a new password for user {name}","admin.users.resetPassword.label":"New password","admin.users.resetPassword.placeholder":"Enter new password...","admin.users.resetPassword.hint":"Password should be at least 8 characters including uppercase, lowercase and numbers","admin.users.resetPassword.submit":"Reset Password","admin.users.lock.title":"Lock Account","admin.users.lock.desc":"Are you sure you want to lock the account {name}? The user will not be able to log in.","admin.users.lock.confirm":"Lock Account","admin.users.unlock.title":"Unlock Account","admin.users.unlock.desc":"Are you sure you want to unlock the account {name}? The user will be able to log in.","admin.users.unlock.confirm":"Unlock Account","admin.reports.title":"Reports","admin.reports.subtitle":"View overview and analyze exam results","admin.reports.viewDetail":"View details →","admin.reports.overview.title":"Overview Report","admin.reports.overview.desc":"System-wide statistics","admin.reports.overview.content":"View exam results overview, student numbers, average scores over time","admin.reports.class.title":"Class Report","admin.reports.class.desc":"Details by class","admin.reports.class.content":"Analyze exam results, rankings and learning progress by class","admin.reports.branch.title":"Branch Report","admin.reports.branch.desc":"Compare between branches","admin.reports.branch.content":"Compare performance and learning results between branches","admin.reports.exam.title":"Exam Report","admin.reports.exam.desc":"Statistics by exam","admin.reports.exam.content":"Statistics on results, scores and pass rates by exam","admin.reports.room.title":"Room Report","admin.reports.room.desc":"Details by room","admin.reports.room.content":"Statistics on exam results, scores, pass rates by room","admin.reports.competency.title":"Student Competency Report","admin.reports.competency.desc":"Skill analysis by student","admin.reports.competency.content":"Analyze scores by 4 skills: Reading, Listening, Writing, Speaking per student","admin.reports.room.pageTitle":"Room Report","admin.reports.room.pageSubtitle":"Detailed statistics about exam rooms","admin.reports.room.export":"Export report","admin.reports.room.exporting":"Exporting...","admin.reports.room.exportExcel":"Export Excel (.xlsx)","admin.reports.room.exportCsv":"Export CSV (.csv)","admin.reports.room.viewFull":"View full report","admin.reports.room.totalRooms":"Total Rooms","admin.reports.room.totalStudents":"Total Students","admin.reports.room.totalSubmitted":"Submitted","admin.reports.room.avgScore":"Avg Score","admin.reports.room.passRate":"Pass Rate","admin.reports.room.avgDuration":"Avg Duration","admin.reports.room.scoreDistribution":"Score Distribution","admin.reports.room.topRooms":"Top Scoring Rooms","admin.reports.room.noData":"No data yet","admin.reports.room.excellent":"Excellent (9-10)","admin.reports.room.good":"Good (7-8.9)","admin.reports.room.average":"Average (5-6.9)","admin.reports.room.poor":"Poor (<5)","admin.reports.room.searchPlaceholder":"Search rooms...","admin.reports.room.statusPlaceholder":"Status","admin.reports.room.statusAll":"All statuses","admin.reports.room.statusScheduled":"Scheduled","admin.reports.room.statusInProgress":"In Progress","admin.reports.room.statusCompleted":"Completed","admin.reports.room.clearFilters":"Clear filters","admin.reports.room.roomList":"Room List","admin.reports.room.colRoom":"Room","admin.reports.room.colContest":"Contest","admin.reports.room.colStatus":"Status","admin.reports.room.colStudents":"Students","admin.reports.room.colAvgScore":"Avg Score","admin.reports.room.colHighLow":"High/Low","admin.reports.room.colPassRate":"Pass Rate","admin.reports.room.colTeachers":"Proctors","admin.reports.room.empty":"No rooms found","admin.reports.room.loading":"Loading data...","admin.reports.room.dialogTitle":"Room Report","admin.reports.room.dialogDesc":"Detailed exam results statistics by room","admin.reports.exporting":"Exporting...","admin.reports.exportExcel":"Export Excel","admin.reports.loading":"Loading data...","admin.reports.close":"Close","admin.reports.common.avgScore":"Avg Score","admin.reports.common.passRate":"Pass Rate","admin.reports.common.totalStudents":"Total Students","admin.reports.common.students":"Students","admin.reports.common.teachers":"Teachers","admin.reports.common.classes":"Classes","admin.reports.stats.totalExams":"Total Exams","admin.reports.stats.totalStudents":"Participants","admin.reports.stats.avgScore":"Average Score","admin.reports.stats.passRate":"Pass Rate","admin.reports.stats.vsLastMonth":"vs last month","admin.reports.overview.dialogTitle":"Overview Report","admin.reports.overview.dialogDesc":"System-wide statistics for Ocean Edu","admin.reports.overview.totalExams":"Total Exams","admin.reports.overview.totalStudents":"Students","admin.reports.overview.avgScore":"System Avg Score","admin.reports.overview.passRate":"Pass Rate","admin.reports.overview.vsPrevPeriod":"vs previous period","admin.reports.overview.questions":"Questions","admin.reports.overview.classes":"Classes","admin.reports.overview.examRooms":"Exam Rooms","admin.reports.overview.activeContests":"Active Contests","admin.reports.overview.examsByLevel":"Statistics by Exam Level","admin.reports.overview.examsUnit":"exams","admin.reports.overview.questionsByType":"Question Type Distribution","admin.reports.overview.questionsUnit":"questions","admin.reports.overview.recentActivity":"Recent Activity","admin.reports.overview.minutesAgo":"{count} minutes ago","admin.reports.overview.hoursAgo":"{count} hours ago","admin.reports.overview.daysAgo":"{count} days ago","admin.reports.class.dialogTitle":"Class Report","admin.reports.class.dialogDesc":"Learning performance statistics by class","admin.reports.class.gradeAll":"All","admin.reports.class.totalClasses":"Total Classes","admin.reports.class.totalStudents":"Total Students","admin.reports.class.avgPassRate":"Avg Pass Rate","admin.reports.class.classList":"Class List","admin.reports.class.colClass":"Class","admin.reports.class.colLevel":"Level","admin.reports.class.colSize":"Size","admin.reports.class.colAvgScore":"Avg Score","admin.reports.class.colPassRate":"Pass Rate","admin.reports.class.colTeacher":"Teacher","admin.reports.class.topStudents":"Top 5 Outstanding Students","admin.reports.class.totalExams":"Exams","admin.reports.class.searchPlaceholder":"Search by class name or code...","admin.reports.branch.dialogTitle":"Branch Report","admin.reports.branch.dialogDesc":"Compare performance between branches","admin.reports.branch.totalBranches":"Total Branches","admin.reports.branch.totalStudents":"Total Students","admin.reports.branch.totalClasses":"Total Classes","admin.reports.branch.avgScore":"Overall Avg Score","admin.reports.branch.comparison":"Branch Comparison","admin.reports.exam.dialogTitle":"Exam Report","admin.reports.exam.dialogDesc":"Results statistics by contest","admin.reports.exam.statusDraft":"Draft","admin.reports.exam.statusPublished":"Published","admin.reports.exam.statusActive":"In Progress","admin.reports.exam.statusCompleted":"Completed","admin.reports.exam.totalContests":"Total Contests","admin.reports.exam.totalStudents":"Total Students","admin.reports.exam.avgScore":"Avg Score","admin.reports.exam.passRate":"Pass Rate","admin.reports.exam.contestList":"Contest List","admin.reports.exam.code":"Code: {code}","admin.reports.exam.noData":"No data yet","admin.reports.competency.dialogTitle":"Student Competency Report","admin.reports.competency.dialogDesc":"Skill-based score analysis","admin.reports.competency.searchPlaceholder":"Search by name or email...","admin.reports.competency.totalStudents":"Total Students","admin.reports.competency.avgScore":"Avg Score","admin.reports.competency.passRate":"Pass Rate","admin.reports.competency.bestSkill":"Best Skill","admin.reports.competency.skillDistribution":"Score Distribution by Skill","admin.reports.competency.avgScoreTooltip":"Avg Score","admin.reports.competency.studentList":"Student List ({count})","admin.reports.competency.colName":"Name","admin.reports.competency.colClass":"Class","admin.reports.competency.colReading":"Reading","admin.reports.competency.colListening":"Listening","admin.reports.competency.colWriting":"Writing","admin.reports.competency.colSpeaking":"Speaking","admin.reports.competency.colTotal":"Total","admin.reports.competency.colExams":"Exams","admin.reports.competency.noData":"No data","admin.reports.competency.page":"Page {page} / {totalPages}","admin.reports.competency.prev":"Previous","admin.reports.competency.next":"Next","admin.reports.competency.reading":"Reading","admin.reports.competency.listening":"Listening","admin.reports.competency.writing":"Writing","admin.reports.competency.speaking":"Speaking","admin.reports.competency.pageTitle":"Student Competency Report","admin.reports.competency.pageSubtitle":"Score analysis by skill","admin.reports.competency.backToReports":"Back to Reports","admin.reports.competency.export":"Export Excel","admin.reports.competency.exporting":"Exporting...","admin.reports.competency.atRisk":"At-Risk Students","admin.reports.competency.atRiskDesc":"Below 5.0","admin.reports.competency.radarTitle":"Competency by Skill","admin.reports.competency.radarClassAvg":"This Class","admin.reports.competency.radarSysAvg":"System Average","admin.reports.competency.trendTitle":"Score Trend Over Time","admin.reports.competency.trend3m":"3 Months","admin.reports.competency.trend6m":"6 Months","admin.reports.competency.trend12m":"12 Months","admin.reports.competency.skillBreakdownTitle":"Skill Analysis","admin.reports.competency.strengthsTitle":"Strengths","admin.reports.competency.weaknessesTitle":"Weaknesses","admin.reports.competency.noStrengths":"No data","admin.reports.competency.noWeaknesses":"No data","admin.reports.competency.bandExcellent":"Excellent","admin.reports.competency.bandGood":"Good","admin.reports.competency.bandAverage":"Average","admin.reports.competency.bandWeak":"Weak","admin.reports.competency.colTrend":"Trend","admin.reports.competency.colBand":"Band","admin.reports.competency.filterAll":"All","admin.reports.competency.filterWeak":"Needs Support","admin.reports.competency.filterGood":"Good - Excellent","admin.reports.competency.searchPlaceholder2":"Find student...","admin.reports.competency.examRoomFilter.placeholder":"All exam rooms","admin.reports.competency.examRoomFilter.searchPlaceholder":"Search exam rooms...","admin.reports.competency.examRoomFilter.noRooms":"No exam rooms found","admin.reports.competency.examRoomFilter.allRooms":"All exam rooms","admin.reports.period.week":"This week","admin.reports.period.month":"This month","admin.reports.period.quarter":"This quarter","admin.reports.period.year":"This year","admin.reports.period.custom":"Custom","admin.reports.period.fromDate":"From date","admin.reports.period.toDate":"To date","admin.dashboard.title":"Admin Dashboard","admin.dashboard.subtitle":"Manage Ocean Edu online exam system","admin.dashboard.totalStudents":"Total Students","admin.dashboard.totalStudents.monthly":"+{count} new students this month","admin.dashboard.totalStudents.growth":"M{lastMonth} {action} {percent}% vs M{prevMonth}","admin.dashboard.totalExams":"Exams","admin.dashboard.totalExams.weekly":"+{count} new exams this week","admin.dashboard.examRooms":"Exam Rooms","admin.dashboard.examRooms.active":"{count} rooms active","admin.dashboard.teachers":"Teachers","admin.dashboard.teachers.yearly":"+{count} new teachers this year","admin.dashboard.contests":"Contests","admin.dashboard.contests.ongoing":"{count} ongoing","admin.dashboard.inProgressRooms":"Rooms In Progress","admin.dashboard.inProgressRooms.status":"In progress","admin.dashboard.studentsInExam":"Students In Exam","admin.dashboard.studentsInExam.rooms":"In {count} rooms","admin.dashboard.pendingGrading":"Pending Grading","admin.dashboard.pendingGrading.action":"Needs attention","admin.dashboard.userGrowth.title":"User Growth","admin.dashboard.userGrowth.desc":"Student and teacher count over the last 6 months","admin.dashboard.userGrowth.students":"Students","admin.dashboard.userGrowth.teachers":"Teachers","admin.dashboard.examStats.title":"Exam Statistics","admin.dashboard.examStats.desc":"Completed and pending exams by subject","admin.dashboard.examStats.completed":"Completed","admin.dashboard.examStats.pending":"Pending","admin.dashboard.recentActivity.title":"Recent Activity","admin.dashboard.recentActivity.desc":"Latest activities in the system","admin.dashboard.recentActivity.colActivity":"Activity","admin.dashboard.recentActivity.colUser":"User","admin.dashboard.recentActivity.colStatus":"Status","admin.dashboard.recentActivity.colTime":"Time","admin.dashboard.recentActivity.empty":"No activities yet","admin.dashboard.growth.increase":"increased","admin.dashboard.growth.decrease":"decreased","admin.dashboard.growth.unchanged":"unchanged","admin.dashboard.time.justNow":"just now","admin.dashboard.time.minutesAgo":"{count} minutes ago","admin.dashboard.time.hoursAgo":"{count} hours ago","admin.dashboard.time.daysAgo":"{count} days ago","admin.dashboard.time.weeksAgo":"{count} weeks ago","admin.dashboard.time.monthsAgo":"{count} months ago","admin.branch.create.success":"Branch created successfully","admin.branch.create.successDesc":"New branch created with {count} teachers. PLACEMENT TEST room has been automatically created.","admin.branch.create.successDescNoTeacher":"New branch created. PLACEMENT TEST room has been automatically created.","admin.branch.update.success":"Branch updated successfully","admin.branch.update.successDesc":"Branch information updated ({count} teacher changes)","admin.branch.update.successDescNoChange":"Branch information updated","admin.branch.delete.success":"Branch deleted successfully","admin.branch.delete.successDesc":"Branch {code} - {name} has been deleted","admin.branch.activate.success":"Branch activated successfully","admin.branch.deactivate.success":"Branch deactivated successfully","admin.branch.toggleStatus.successDesc":"Branch {code} - {name} has been {status}","admin.branch.toggleStatus.activated":"activated","admin.branch.toggleStatus.deactivated":"deactivated","admin.branches.title":"Branch Management","admin.branches.subtitle":"Manage branch information in the system","admin.branches.loading":"Loading data...","admin.branches.stats.total":"Total Branches","admin.branches.stats.active":"Active","admin.branches.stats.inactive":"Inactive","admin.branches.stats.distribution":"Manager Distribution","admin.branches.stats.activeBranches":"Active","admin.branches.stats.inactiveBranches":"Inactive","admin.branches.stats.withManager":"Has Manager","admin.branches.stats.withoutManager":"No Manager","admin.branches.stats.branchUnit":"branches","admin.branches.table.title":"Branch List","admin.branches.table.showing":"Showing {count} / {total} branches","admin.branches.table.addBranch":"Add Branch","admin.branches.table.loading":"Loading...","admin.branches.table.empty":"No branches found","admin.branches.table.notUpdated":"Not updated","admin.branches.table.notAssigned":"Not assigned","admin.branches.col.code":"BRANCH CODE","admin.branches.col.name":"BRANCH NAME","admin.branches.col.address":"ADDRESS","admin.branches.col.contact":"CONTACT","admin.branches.col.manager":"MANAGER","admin.branches.col.status":"STATUS","admin.branches.col.actions":"ACTIONS","admin.branches.filter.searchPlaceholder":"Search by name or branch code","admin.branches.filter.statusPlaceholder":"Status","admin.branches.filter.allStatuses":"All statuses","admin.branches.filter.active":"Active","admin.branches.filter.inactive":"Inactive","admin.branches.filter.clearFilters":"Clear filters","admin.branches.filter.searchLabel":"Search:","admin.branches.filter.statusLabel":"Status:","admin.branches.status.active":"Active","admin.branches.status.activeDetail":"Active","admin.branches.status.inactive":"Inactive","admin.branches.action.view":"View details","admin.branches.action.edit":"Edit","admin.branches.action.delete":"Delete","admin.branches.field.basicInfo":"Basic Information","admin.branches.field.code":"Branch code","admin.branches.field.codePlaceholder":"E.g.: CN-HN-01","admin.branches.field.name":"Branch name","admin.branches.field.namePlaceholder":"E.g.: Hanoi Branch","admin.branches.field.address":"Address","admin.branches.field.addressPlaceholder":"Enter branch address...","admin.branches.field.contactInfo":"Contact Information","admin.branches.field.phone":"Phone number","admin.branches.field.phonePlaceholder":"E.g.: 0912345678","admin.branches.field.email":"Email","admin.branches.field.emailPlaceholder":"E.g.: branch@ocean.edu.vn","admin.branches.field.managerSection":"Manager","admin.branches.field.selectManager":"Select manager","admin.branches.field.selectManagerPlaceholder":"Select manager...","admin.branches.field.managerHint":"The manager will have administrative rights for this branch","admin.branches.field.statusSection":"Status","admin.branches.teacher.title":"Select Teachers","admin.branches.teacher.searchPlaceholder":"Search teachers by name, email or phone number","admin.branches.teacher.colName":"Full name","admin.branches.teacher.colEmail":"Email","admin.branches.teacher.colPhone":"Phone","admin.branches.teacher.notFound":"No teachers found","admin.branches.teacher.empty":"No teachers in the system","admin.branches.teacher.selected":"Selected: {count} teachers","admin.branches.teacher.clearAll":"Clear all","admin.branches.add.title":"Add New Branch","admin.branches.add.desc":"Enter information for the new branch","admin.branches.add.activateLabel":"Activate branch","admin.branches.add.activateDescActive":"Branch will be active immediately after creation","admin.branches.add.activateDescInactive":"Branch will be inactive after creation","admin.branches.add.submitting":"Processing...","admin.branches.add.submit":"Add Branch","admin.branches.edit.title":"Edit Branch","admin.branches.edit.desc":"Update information for branch: {name}","admin.branches.edit.statusLabel":"Active status","admin.branches.edit.statusDescActive":"Branch is currently active","admin.branches.edit.statusDescInactive":"Branch is currently inactive","admin.branches.edit.submitting":"Processing...","admin.branches.edit.submit":"Update","admin.branches.delete.title":"Confirm Delete Branch","admin.branches.delete.desc":"Are you sure you want to delete this branch?","admin.branches.delete.warning":"This action cannot be undone and will delete all data related to this branch.","admin.branches.delete.submitting":"Processing...","admin.branches.delete.confirm":"Delete Branch","admin.branches.toggleStatus.activateTitle":"Activate Branch","admin.branches.toggleStatus.deactivateTitle":"Deactivate Branch","admin.branches.toggleStatus.activateDesc":"Are you sure you want to activate this branch?","admin.branches.toggleStatus.deactivateDesc":"Are you sure you want to deactivate this branch?","admin.branches.toggleStatus.activateInfo":"The branch will be activated and operate normally.","admin.branches.toggleStatus.deactivateInfo":"The branch will be deactivated but data will be preserved.","admin.branches.toggleStatus.submitting":"Processing...","admin.branches.toggleStatus.activate":"Activate","admin.branches.toggleStatus.deactivate":"Deactivate","admin.branches.view.title":"Branch Details: {name}","admin.branches.view.desc":"View detailed branch information","admin.branches.view.basicInfo":"Basic Information","admin.branches.view.codeLabel":"Branch Code","admin.branches.view.nameLabel":"Branch Name","admin.branches.view.statusLabel":"Status","admin.branches.view.contactInfo":"Contact Information","admin.branches.view.addressLabel":"Address","admin.branches.view.phoneLabel":"Phone Number","admin.branches.view.emailLabel":"Email","admin.branches.view.notUpdated":"Not updated","admin.branches.view.managerSection":"Manager","admin.branches.view.noManager":"No manager assigned","admin.branches.view.teacherSection":"Teachers","admin.branches.view.noTeachers":"No teachers assigned","admin.branches.view.moreTeachers":"and {count} more teachers...","admin.branches.view.changeHistory":"Change History","admin.branches.view.createdAt":"Created","admin.branches.view.createdBy":"by","admin.branches.view.noCreator":"No creator information","admin.branches.view.updatedAt":"Last Updated","admin.branches.view.noUpdater":"No updater information","admin.branches.view.branchId":"Branch ID","admin.rooms.title":"Exam Room Management","admin.rooms.subtitle":"Create and manage exam rooms","admin.rooms.loading":"Loading data...","admin.rooms.stats.totalRooms":"Total Rooms","admin.rooms.stats.activeRooms":"{count} active rooms","admin.rooms.stats.students":"Students","admin.rooms.stats.totalStudents":"Total enrolled students","admin.rooms.stats.completed":"Completed","admin.rooms.stats.completedRooms":"Rooms completed","admin.rooms.stats.statusDistribution":"Status distribution","admin.rooms.stats.ongoing":"In progress","admin.rooms.stats.scheduled":"Scheduled","admin.rooms.stats.roomUnit":"rooms","admin.rooms.table.title":"Exam Room List","admin.rooms.table.showing":"Showing {count} / {total} rooms","admin.rooms.table.addRoom":"Create Room","admin.rooms.table.loading":"Loading...","admin.rooms.table.empty":"No exam rooms found","admin.rooms.table.notAssigned":"Not assigned","admin.rooms.table.unlimited":"Unlimited","admin.rooms.col.name":"ROOM NAME","admin.rooms.col.code":"ROOM CODE","admin.rooms.col.branch":"BRANCH","admin.rooms.col.exam":"EXAM & QUESTIONS","admin.rooms.col.time":"TIME","admin.rooms.col.progress":"PROGRESS","admin.rooms.col.lock":"LOCK","admin.rooms.col.actions":"ACTIONS","admin.rooms.filter.searchPlaceholder":"Search by room name or room code","admin.rooms.filter.statusPlaceholder":"Status","admin.rooms.filter.allStatuses":"All statuses","admin.rooms.filter.branchPlaceholder":"Branch","admin.rooms.filter.allBranches":"All branches","admin.rooms.filter.clearFilters":"Clear filters","admin.rooms.status.completed":"Completed","admin.rooms.status.inProgress":"In Progress","admin.rooms.status.scheduled":"Scheduled","admin.rooms.exam.viewContent":"View content","admin.rooms.exam.changeExam":"Change exam","admin.rooms.exam.selectExam":"+ Select exam","admin.rooms.action.view":"View details","admin.rooms.action.edit":"Edit","admin.rooms.action.schedule":"Edit schedule","admin.rooms.action.delete":"Delete","admin.rooms.toast.loadError":"Failed to load data","admin.rooms.toast.loadRoomsError":"Unable to load exam rooms. Please try again later.","admin.rooms.toast.loadTeachersError":"Unable to load supervisors. Please try again later.","admin.rooms.toast.loadStudentsError":"Unable to load students. Please try again later.","admin.rooms.toast.loadExamsError":"Unable to load exams. Please try again later.","admin.rooms.toast.loadContestsError":"Unable to load contests. Please try again later.","admin.rooms.toast.loadClassesError":"Unable to load classes. Please try again later.","admin.rooms.toast.loadBranchesError":"Unable to load branches. Please try again later.","admin.rooms.toast.cannotChangeExam":"Cannot change exam","admin.rooms.toast.cannotChangeExamDesc":"Rooms that have started or completed cannot have their exam changed","admin.rooms.toast.assignExamSuccess":"Exam assigned successfully","admin.rooms.toast.assignExamSuccessDesc":'Exam "{examName}" with {childCount} variants has been assigned to room {roomCode}',"admin.rooms.toast.cannotRemoveExam":"Cannot remove exam","admin.rooms.toast.cannotRemoveExamDesc":"Rooms that have started or completed cannot have their exam removed","admin.rooms.toast.removeExamSuccess":"Exam removed successfully","admin.rooms.toast.removeExamSuccessDesc":"Exam has been removed from room {roomCode}","admin.rooms.toast.saveSettingsSuccess":"Settings saved successfully","admin.rooms.toast.saveSettingsSuccessDesc":"Your exam settings have been saved","admin.rooms.toast.updateScheduleSuccess":"Schedule updated successfully","admin.rooms.toast.updateScheduleSuccessDesc":"Schedule for room {roomCode} has been updated","admin.rooms.toast.updateScheduleError":"Failed to update schedule","admin.rooms.toast.updateScheduleErrorDesc":"Error updating schedule for room {roomCode}","admin.rooms.add.title":"Add New Exam Room","admin.rooms.add.description":"Enter information for the new exam room","admin.rooms.add.cancel":"Cancel","admin.rooms.add.submit":"Add Room","admin.rooms.add.success":"Room created successfully","admin.rooms.add.successDesc":"Exam room {code} has been created","admin.rooms.add.error":"Failed to create room","admin.rooms.add.errorDesc":"An error occurred while creating the exam room","admin.rooms.edit.title":"Edit Room: {name}","admin.rooms.edit.description":"Update exam room information","admin.rooms.edit.cancel":"Cancel","admin.rooms.edit.saving":"Saving...","admin.rooms.edit.submit":"Save Changes","admin.rooms.edit.success":"Room updated successfully","admin.rooms.edit.successDesc":"Exam room {code} has been updated","admin.rooms.edit.error":"Failed to update room","admin.rooms.edit.errorDesc":"An error occurred while updating the exam room","admin.rooms.delete.title":"Confirm Delete Room","admin.rooms.delete.description":"Are you sure you want to delete room","admin.rooms.delete.warning":"This action cannot be undone and will delete all related data.","admin.rooms.delete.cancel":"Cancel","admin.rooms.delete.processing":"Processing...","admin.rooms.delete.submit":"Delete Room","admin.rooms.delete.success":"Room deleted successfully","admin.rooms.delete.successDesc":"Exam room {code} has been deleted","admin.rooms.delete.error":"Failed to delete room","admin.rooms.delete.errorDesc":"Unable to delete exam room. Please try again later.","admin.rooms.view.title":"Room Details: {name}","admin.rooms.view.close":"Close","admin.rooms.view.locked":"Locked","admin.rooms.view.unlocked":"Unlocked","admin.rooms.view.undetermined":"Not set","admin.rooms.unlimitedTime":"Unlimited time","admin.rooms.view.stats.candidates":"Candidates","admin.rooms.view.stats.supervisors":"Supervisors","admin.rooms.view.stats.submitted":"Submitted","admin.rooms.view.stats.submissionRate":"Submission rate","admin.rooms.view.section.basicInfo":"Basic Information","admin.rooms.view.section.time":"Schedule","admin.rooms.view.section.exams":"Exams","admin.rooms.view.section.supervisors":"Supervisors","admin.rooms.view.section.classes":"Classes","admin.rooms.view.section.assignedStudents":"Assigned Students","admin.rooms.view.field.contest":"Contest","admin.rooms.view.field.location":"Location","admin.rooms.view.field.branch":"Branch","admin.rooms.view.field.candidateSelection":"Candidate selection","admin.rooms.view.field.description":"Description","admin.rooms.view.field.start":"Start","admin.rooms.view.field.end":"End","admin.rooms.view.field.createdAt":"Created at:","admin.rooms.view.field.updatedAt":"Updated at:","admin.rooms.view.selectionType.all":"All students","admin.rooms.view.selectionType.specific":"Specific students","admin.rooms.view.locationNotSet":"Not set","admin.rooms.view.noSupervisors":"No supervisors assigned","admin.rooms.view.examOriginal":"Original exam","admin.rooms.view.examVariants":"Exam variants ({count})","admin.rooms.view.status.scheduled":"Scheduled","admin.rooms.view.status.inProgress":"In Progress","admin.rooms.view.status.completed":"Completed","admin.rooms.view.type.contest":"Contest","admin.rooms.view.type.practiceTest":"Practice Test","admin.rooms.view.classCode":"Code:","admin.rooms.view.classGrade":"Grade:","admin.rooms.view.classStudents":"{count} students","admin.rooms.lock.titleLock":"Lock exam room?","admin.rooms.lock.titleUnlock":"Unlock exam room?","admin.rooms.lock.statusLocked":"Locked","admin.rooms.lock.statusUnlocked":"Unlocked","admin.rooms.lock.confirmUnlock":"Are you sure you want to","admin.rooms.lock.unlock":"unlock","admin.rooms.lock.lock":"lock","admin.rooms.lock.confirmSuffix":"this exam room?","admin.rooms.lock.unlockEffect":"Students will be able to access and take the exam in this room.","admin.rooms.lock.lockEffect":"Students will not be able to access or take the exam in this room until it is unlocked.","admin.rooms.lock.cancel":"Cancel","admin.rooms.lock.processing":"Processing...","admin.rooms.lock.submitLock":"Lock Room","admin.rooms.lock.submitUnlock":"Unlock","admin.rooms.lock.successLock":"Room locked successfully","admin.rooms.lock.successUnlock":"Room unlocked successfully","admin.rooms.lock.successDesc":"Exam room {code} has been {action}","admin.rooms.lock.locked":"locked","admin.rooms.lock.unlocked":"unlocked","admin.rooms.lock.error":"Failed to change lock status","admin.rooms.lock.errorDesc":"Unable to change the lock status of the exam room. Please try again later.","admin.rooms.removeExam.title":"Remove Exam from Room","admin.rooms.removeExam.description":"Are you sure you want to remove exam","admin.rooms.removeExam.fromRoom":"from room","admin.rooms.removeExam.cannotRemove":"Cannot remove exam from a room that has started or completed!","admin.rooms.removeExam.effect":"The room will no longer have an assigned exam. You can select a new exam later.","admin.rooms.removeExam.cancel":"Cancel","admin.rooms.removeExam.submit":"Remove Exam","admin.rooms.schedule.title":"Edit Schedule: {name}","admin.rooms.schedule.description":"Update the exam schedule for this room","admin.rooms.schedule.contestInfo":"Contest info: {name}","admin.rooms.schedule.unlimitedContest":"This contest has no time limit.","admin.rooms.schedule.contestRange":"From {start} to {end}","admin.rooms.schedule.contestConstraint":"Room schedule must fall within the contest time range","admin.rooms.schedule.unlimitedBadge":"Unlimited","admin.rooms.schedule.unlimitedNote":"This contest has no time limit. You do not need to set a schedule for this room.","admin.rooms.schedule.startTime":"Start time *","admin.rooms.schedule.endTime":"End time *","admin.rooms.schedule.cancel":"Cancel","admin.rooms.schedule.save":"Save Schedule","admin.rooms.schedule.validation.startRequired":"Please select a start time","admin.rooms.schedule.validation.endRequired":"Please select an end time","admin.rooms.schedule.validation.endAfterStart":"End time must be after start time","admin.rooms.selectExam.title":"Select Exam for Room: {name}","admin.rooms.selectExam.description":"Select 1 parent exam and child exams (variants) to assign to this room","admin.rooms.selectExam.parentCount":"Parent Exam","admin.rooms.selectExam.childCount":"Child Exams","admin.rooms.selectExam.noParentSelected":"No parent exam selected","admin.rooms.selectExam.noParentSelectedDesc":"Please select a parent exam first","admin.rooms.selectExam.childCode":"Code: {code} • Variant #{variant}","admin.rooms.selectExam.selectAll":"Select all","admin.rooms.selectExam.deselectAll":"Deselect all","admin.rooms.selectExam.noParentExams":"No parent exams available","admin.rooms.selectExam.selectedParent":"Selected Parent Exam","admin.rooms.selectExam.selectedChildren":"Selected Child Exams ({count})","admin.rooms.selectExam.cancel":"Cancel","admin.rooms.selectExam.confirm":"Confirm","admin.rooms.selectExam.childExams":"{count} variants","admin.rooms.selectExam.warning.title":"Insufficient data","admin.rooms.selectExam.warning.desc":"Please select a parent exam and at least one child exam","admin.rooms.selectExam.clearTitle":"Clear Selection?","admin.rooms.selectExam.clearDesc":"Are you sure you want to clear the parent exam and {count} child exams?","admin.rooms.selectExam.clearCancel":"Cancel","admin.rooms.selectExam.clearConfirm":"Clear","admin.rooms.selectExam.dialogTitle":"Select Exam","admin.rooms.selectExam.dialogDescription":"Select a parent exam and the corresponding child exams for your exam room","admin.rooms.selectExam.searchPlaceholder":"Search exams by name, code, subject...","admin.rooms.selectExam.noParentSelectedInfo":"Please select a parent exam before selecting child exams","admin.rooms.selectExam.examCode":"Code: {name}","admin.rooms.selectExam.original":"Original","admin.rooms.selectExam.questions":"{count} questions","admin.rooms.selectExam.minutes":"{count} min","admin.rooms.selectExam.difficulty.easy":"Easy","admin.rooms.selectExam.difficulty.medium":"Medium","admin.rooms.selectExam.difficulty.hard":"Hard","admin.rooms.selectExam.emptySearch":"No matching exams found","admin.rooms.selectExam.emptyAll":"No exams available","admin.rooms.selectExam.emptySearchHint":"Try searching with different keywords","admin.rooms.selectExam.emptyAllHint":"Create a new exam to get started","admin.rooms.selectExam.clearSearch":"Clear search","admin.rooms.selectExam.selected":"Selected","admin.rooms.selectExam.selectedParentLabel":"Parent Exam","admin.rooms.changeExam.title":"Change Exam for Room: {name}","admin.rooms.changeExam.description":"Select a new exam to replace the current one","admin.rooms.changeExam.currentExam":"Current exam","admin.rooms.changeExam.currentExamHint":"Select a new exam from the list below to replace it","admin.rooms.changeExam.childCount":"({count} variants)","admin.rooms.changeExam.newParent":"New Parent Exam","admin.rooms.changeExam.newParentSelected":"Selected New Parent Exam","admin.rooms.changeExam.currentBadge":"Current","admin.rooms.changeExam.cancel":"Cancel","admin.rooms.changeExam.submit":"Change Exam","admin.rooms.changeExam.confirmTitle":"Confirm exam change?","admin.rooms.changeExam.confirmDesc":"Are you sure you want to change the exam for room {name}?","admin.rooms.changeExam.confirmEffect":"The new exam will replace the current one with {count} child exams.","admin.rooms.changeExam.confirmCancel":"Cancel","admin.rooms.changeExam.confirmSubmit":"Confirm Change","admin.rooms.editWarning.title":"Edit Room Warning","admin.rooms.editWarning.description":"is currently","admin.rooms.editWarning.status":"In Progress","admin.rooms.editWarning.effect":"Editing may affect students currently taking the exam.","admin.rooms.editWarning.confirm":"Are you sure you want to continue editing?","admin.rooms.editWarning.cancel":"Cancel","admin.rooms.editWarning.submit":"Continue Editing","admin.rooms.examChangeWarning.title":"Change Exam?","admin.rooms.examChangeWarning.description":"The exam was automatically selected from the chosen contest. Are you sure you want to change to a different exam?","admin.rooms.examChangeWarning.cancel":"Cancel","admin.rooms.examChangeWarning.submit":"Continue Changing","admin.rooms.settings.title":"Exam Room Settings","admin.rooms.settings.description":"Default parameters for exams","admin.rooms.settings.maxStudents":"Max students per room","admin.rooms.settings.defaultDuration":"Default exam duration (minutes)","admin.rooms.settings.edit":"Edit","admin.rooms.settings.cancel":"Cancel","admin.rooms.settings.save":"Save Changes","admin.rooms.form.branch":"Branch","admin.rooms.form.branchPlaceholder":"Select branch...","admin.rooms.form.branchReload":"Reload","admin.rooms.form.branchCreate":"Create branch","admin.rooms.form.branchEmpty":"No branches available. Please create a branch first.","admin.rooms.form.contest":"Select contest","admin.rooms.form.contestPlaceholder":"Select contest...","admin.rooms.form.contestReload":"Reload","admin.rooms.form.contestCreate":"Create contest","admin.rooms.form.contestEmpty":"No contests available. Please create a contest first.","admin.rooms.form.contestUnlimitedInfo":"Contest has no time limit","admin.rooms.form.contestUnlimitedStart":"Starts from: {time}","admin.rooms.form.contestUnlimitedHint":"Start time is required, end time is optional","admin.rooms.form.contestLimitedInfo":"Contest time range","admin.rooms.form.contestLimitedRange":"From {start} to {end}","admin.rooms.form.contestLimitedHint":"Room schedule must fall within the contest time range","admin.rooms.form.startTime":"Start time","admin.rooms.form.endTime":"End time","admin.rooms.form.endTimeOptional":"(optional)","admin.rooms.form.endTimeUnlimitedHint":"If not set, the room will have no time limit.","admin.rooms.form.roomName":"Room name","admin.rooms.form.roomNamePlaceholder":"Room A101","admin.rooms.form.roomCode":"Room code","admin.rooms.form.roomCodePlaceholder":"ROOM-A101","admin.rooms.form.examSelection":"Select exam","admin.rooms.form.examPlaceholder":"Select exam...","admin.rooms.form.examDisabledHint":"Please select a contest first to show matching exams","admin.rooms.form.examSelectContestFirst":"Please select a contest first","admin.rooms.form.examNoMatchClassification":"No exams match the classification of the selected contest","admin.rooms.form.examSummaryParent":"Parent Exam ({count})","admin.rooms.form.examSummaryChild":"Child Exams ({count})","admin.rooms.form.examChildCode":"Code: {name}","admin.rooms.form.location":"Location","admin.rooms.form.locationPlaceholder":"Floor 1, Building A","admin.rooms.form.lockRoom":"Lock room","admin.rooms.form.lockHint":"Students cannot enter the room when locked","admin.rooms.form.supervisors":"Select supervisors","admin.rooms.form.supervisorPlaceholder":"Select supervisors...","admin.rooms.form.roomType":"Room type","admin.rooms.form.roomTypeContest":"Contest","admin.rooms.form.roomTypePractice":"Practice Test","admin.rooms.form.description":"Description","admin.rooms.form.descriptionPlaceholder":"Detailed description of the exam room...","admin.rooms.form.validation.branchRequired":"Please select a branch","admin.rooms.form.validation.contestRequired":"Please select a contest","admin.rooms.form.validation.examRequired":"Please select an exam","admin.rooms.form.validation.startRequired":"Please select a start time","admin.rooms.form.validation.startFuture":"Start time must be greater than or equal to the current time","admin.rooms.form.validation.endRequired":"Please select an end time","admin.rooms.form.validation.endAfterStart":"End time must be after start time","admin.rooms.form.validation.classRequired":"Please select at least 1 class","admin.rooms.form.validation.studentRequired":"Please select at least 1 student","admin.rooms.studentSelection.label":"Participants","admin.rooms.studentSelection.all":"All participants","admin.rooms.studentSelection.byClass":"By class","admin.rooms.studentSelection.byStudent":"Specific students","admin.rooms.studentSelection.selectClass":"Select classes","admin.rooms.studentSelection.classSearchPlaceholder":"Search classes (name, code)...","admin.rooms.studentSelection.gradeFilterPlaceholder":"Filter by grade","admin.rooms.studentSelection.allGrades":"All grades","admin.rooms.studentSelection.gradeItem":"Grade {grade}","admin.rooms.studentSelection.colClassName":"Class name","admin.rooms.studentSelection.colClassCode":"Class code","admin.rooms.studentSelection.colGrade":"Grade","admin.rooms.studentSelection.colStudentCount":"Students","admin.rooms.studentSelection.noClasses":"No classes found","admin.rooms.studentSelection.selectedClasses":"Selected classes: {count}","admin.rooms.studentSelection.clearAll":"Clear all","admin.rooms.studentSelection.selectStudent":"Select students","admin.rooms.studentSelection.studentSearchPlaceholder":"Search students (name, username, email)...","admin.rooms.studentSelection.classFilterPlaceholder":"Filter by class","admin.rooms.studentSelection.allClasses":"All classes","admin.rooms.studentSelection.colStudentId":"Student ID","admin.rooms.studentSelection.colName":"Full name","admin.rooms.studentSelection.colEmail":"Email","admin.rooms.studentSelection.colClass":"Class","admin.rooms.studentSelection.noStudents":"No students found","admin.rooms.studentSelection.selectedStudents":"Selected students: {count}","admin.rooms.studentSelection.noClass":"No class","admin.rooms.studentSelection.allParticipate":"All students will be able to participate in this exam room.","admin.rooms.studentSelection.summaryClasses":"Selected classes:","admin.rooms.studentSelection.noClassSelected":"No class selected","admin.rooms.studentSelection.summaryStudents":"Selected students:","admin.rooms.studentSelection.noStudentSelected":"No students selected","admin.rooms.studentSelection.classUnit":"{count} students","admin.rooms.studentSelection.studentUnit":"{count} students","admin.rooms.studentSelection.zeroClass":"0 classes","admin.rooms.studentSelection.zeroStudent":"0 students","admin.contests.title":"Contest Management","admin.contests.subtitle":"Create and manage contests, view reports and rankings","admin.contests.teacher.subtitle":"View and manage contests, track student rankings","admin.contests.tab.rankings":"Rankings & Statistics","admin.contests.tab.management":"Contest Management","admin.contests.stats.total":"Total Contests","admin.contests.stats.totalCompleted":"{count} completed","admin.contests.stats.upcoming":"Upcoming Contest","admin.contests.stats.upcomingDays":"days left","admin.contests.stats.totalParticipants":"Total Participants","admin.contests.stats.participated":"participated","admin.contests.stats.avgScore":"System Avg Score","admin.contests.stats.overContests":"across {count} contests","admin.contests.list.title":"Contest List","admin.contests.list.desc":"View detailed statistics per contest","admin.contests.list.loading":"Loading...","admin.contests.list.empty":"No contests yet","admin.contests.list.participants":"Participants:","admin.contests.list.avgScore":"Avg Score:","admin.contests.list.highest":"Highest:","admin.contests.list.lowest":"Lowest:","admin.contests.list.completionRate":"Completion Rate:","admin.contests.list.viewDetail":"View details","admin.contests.ranking.latestTitle":"Top students in latest contest","admin.contests.ranking.latestNoContest":"No contest yet","admin.contests.ranking.allTimeTitle":"Top students by total score","admin.contests.ranking.allTimeDesc":"Top 3 all-time outstanding students","admin.contests.ranking.loading":"Loading...","admin.contests.ranking.noData":"No data yet","admin.contests.ranking.scoreLabel":"pts","admin.contests.ranking.totalScoreLabel":"total pts","admin.contests.ranking.contestsAvg":"{count} contests • Avg: {avg}","admin.contests.management.title":"Contest List","admin.contests.management.showing":"Showing {count} / {total} contests","admin.contests.management.addNew":"Add New Contest","admin.contests.management.loading":"Loading data...","admin.contests.management.emptyTitle":"No contests yet","admin.contests.management.emptyDesc":'Click "Add New Contest" to create the first contest',"admin.contests.filter.title":"Search Filters","admin.contests.filter.desc":"Filter and search contests by criteria","admin.contests.filter.activeCount":"{count} filters applied","admin.contests.filter.clearAll":"Clear all","admin.contests.filter.activeLabel":"Filtering:","admin.contests.filter.searchLabel":"Search","admin.contests.filter.searchPlaceholder":"Enter contest name","admin.contests.filter.statusLabel":"Status","admin.contests.filter.statusPlaceholder":"Select status","admin.contests.filter.timeTypeLabel":"Contest Model","admin.contests.filter.timeTypePlaceholder":"Select contest model type","admin.contests.filter.allStatuses":"All statuses","admin.contests.filter.allTimeTypes":"All contest model types","admin.contests.filter.visibilityLabel":"Visibility","admin.contests.filter.visibilityPlaceholder":"Select visibility","admin.contests.filter.allVisibilities":"All visibilities","admin.contests.filter.noEndDate":"No end date","admin.contests.table.name":"Contest Name","admin.contests.table.classification":"Classification","admin.contests.table.timeType":"Contest Model","admin.contests.table.time":"Time","admin.contests.table.status":"Status","admin.contests.table.active":"Active","admin.contests.table.actions":"Actions","admin.contests.table.timeTo":"to","admin.contests.status.upcoming":"Upcoming","admin.contests.status.inProgress":"In Progress","admin.contests.status.completed":"Completed","admin.contests.timeType.unlimited":"Unlimited","admin.contests.timeType.limited":"Time Limited","admin.contests.active.active":"Active","admin.contests.active.paused":"Paused","admin.contests.visibility.public":"Public","admin.contests.visibility.internal":"Internal","admin.contests.visibility.private":"Private","admin.contests.action.viewDetail":"View details","admin.contests.action.edit":"Edit","admin.contests.action.delete":"Delete","admin.contests.add.title":"Add New Contest","admin.contests.add.desc":"Enter information to create a new contest in the system","admin.contests.add.submitting":"Adding...","admin.contests.add.submit":"Add Contest","admin.contests.add.cancel":"Cancel","admin.contests.edit.title":"Edit Contest","admin.contests.edit.desc":"Update contest information: {name}","admin.contests.edit.submitting":"Updating...","admin.contests.edit.submit":"Update","admin.contests.edit.cancel":"Cancel","admin.contests.delete.title":"Delete Contest","admin.contests.delete.cannotUndo":"This action cannot be undone","admin.contests.delete.participants":"{count} participants","admin.contests.delete.rooms":"{count} rooms","admin.contests.delete.warningTitle":"Important Warning","admin.contests.delete.warningRooms":"All exam rooms will be deleted","admin.contests.delete.warningData":"Participant data will be deleted","admin.contests.delete.warningResults":"Exam results cannot be recovered","admin.contests.delete.cancel":"Cancel","admin.contests.delete.submitting":"Deleting...","admin.contests.delete.confirm":"Confirm Delete","admin.contests.detail.title":"Contest Details","admin.contests.detail.desc":"Detailed statistics and analysis of exam results","admin.contests.detail.loading":"Loading data...","admin.contests.detail.statAvgScore":"Avg Score","admin.contests.detail.statParticipants":"Participants","admin.contests.detail.statCompletion":"Completion","admin.contests.detail.statAvgTime":"Avg Min","admin.contests.detail.top3Title":"Top 3 Outstanding Students","admin.contests.detail.noStudents":"No student data yet","admin.contests.detail.scoreDistTitle":"Score Distribution","admin.contests.detail.noScoreDist":"No score distribution data yet","admin.contests.detail.classAvgTitle":"Avg Score by Class","admin.contests.detail.noClassData":"No class data yet","admin.contests.detail.classStudentCount":"{count} students","admin.contests.detail.avgTimeLabel":"Avg Completion Time","admin.contests.detail.fastestLabel":"Fastest","admin.contests.detail.slowestLabel":"Slowest","admin.contests.detail.minuteUnit":"min","admin.contests.detail.contestLabel":"Contest","admin.contests.detail.timeLabel":"Time","admin.contests.detail.unlimited":"Unlimited","admin.contests.detail.loadError":"Unable to load statistics data. Please try again later.","admin.contests.student.title":"Student Profile: {name}","admin.contests.student.desc":"Participation history and detailed statistics","admin.contests.student.loading":"Loading data...","admin.contests.student.noClass":"No class assigned","admin.contests.student.codeLabel":"Code: {code}","admin.contests.student.avgScoreLabel":"Avg Score","admin.contests.student.statTotalScore":"Total Score","admin.contests.student.statContests":"Contests Joined","admin.contests.student.statBestRank":"Best Rank","admin.contests.student.statHighest":"Highest Score","admin.contests.student.scoreRangeTitle":"Score Range","admin.contests.student.scoreHighest":"Highest Score","admin.contests.student.scoreAvg":"Average Score","admin.contests.student.scoreLowest":"Lowest Score","admin.contests.student.trendTitle":"Score Trend","admin.contests.student.noTrendData":"No score data yet","admin.contests.student.skillsTitle":"Competency Analysis","admin.contests.student.historyTitle":"Contest Participation History","admin.contests.student.historyScore":"Score:","admin.contests.student.historyRank":"Rank:","admin.contests.student.historyEmpty":"No contest participation history","admin.contests.student.awardsTitle":"Awards & Achievements","admin.contests.student.rank1":"🥇 1st","admin.contests.student.rank2":"🥈 2nd","admin.contests.student.rank3":"🥉 3rd","admin.contests.student.rankN":"#{rank}","admin.contests.student.loadError":"Unable to load student data. Please try again later.","admin.contests.student.scoreRadarName":"Score","admin.contests.toast.addSuccess":"Success","admin.contests.toast.addSuccessDesc":"New contest added!","admin.contests.toast.editSuccess":"Success","admin.contests.toast.editSuccessDesc":"Contest updated!","admin.contests.toast.deleteSuccess":"Success","admin.contests.toast.deleteSuccessDesc":'Contest "{name}" deleted',"admin.contests.form.nameLabel":"Contest Name","admin.contests.form.namePlaceholder":"E.g.: English Talent 2025","admin.contests.form.charCount":"{current}/{max} characters","admin.contests.form.classificationLabel":"Classification","admin.contests.form.classificationPlaceholder":"Select classification","admin.contests.form.roomCreationLabel":"Rooms by Class","admin.contests.form.roomCreationAll":"Create all classes","admin.contests.form.roomCreationAllDesc":"Automatically create exam rooms for all classes","admin.contests.form.roomCreationSelected":"Specify classes","admin.contests.form.roomCreationSelectedDesc":"Select classes to create exam rooms","admin.contests.form.examLabel":"Exam","admin.contests.form.examSelected":"{parentCount} parent exam, {childCount} child exams","admin.contests.form.examNone":"No exam selected","admin.contests.form.examSelectBtn":"Select Exam","admin.contests.form.examHint":"Select the exam for this contest","admin.contests.form.examError":"Please select an exam for this contest","admin.contests.form.examSelectClassificationFirst":"Please select contest classification first","admin.contests.form.examParentLabel":"Parent Exam ({count})","admin.contests.form.examChildLabel":"Child Exams ({count})","admin.contests.form.examChildCode":"Code: {name}","admin.contests.form.descriptionLabel":"Description","admin.contests.form.descriptionPlaceholder":"Detailed description about the contest...","admin.contests.form.timeTypeLabel":"Contest Model","admin.contests.form.timeTypeLimited":"Time Limited","admin.contests.form.timeTypeLimitedDesc":"Has start and end time","admin.contests.form.timeTypeUnlimited":"Unlimited","admin.contests.form.timeTypeUnlimitedDesc":"Has start time only, no end time","admin.contests.form.unlimitedInfo":"Unlimited time contest","admin.contests.form.unlimitedInfoDesc":"Students can join the contest anytime after the start time. There is no end time.","admin.contests.form.contestDuration":"Contest duration","admin.contests.form.startTime":"Contest start time","admin.contests.form.startDate":"Start Date","admin.contests.form.startHour":"Start Time","admin.contests.form.endDate":"End Date","admin.contests.form.endHour":"End Time","admin.contests.form.activeStatusLabel":"Active Status","admin.contests.form.activeStatusHintActive":"Contest will be active immediately after creation","admin.contests.form.activeStatusHintPaused":"Contest will be paused, can be activated later","admin.contests.form.activeStatusDescActive":"Contest is currently active","admin.contests.form.activeStatusDescPaused":"Contest is currently paused","admin.exams.title":"Exam Management","admin.exams.subtitle":"Manage exams and create new questions from templates","admin.exams.examFallbackName":"Exam {id}","admin.exams.uncategorized":"Uncategorized","admin.exams.toast.deleteSuccess":"Exam deleted successfully!","admin.exams.toast.deleteSuccessDesc":'Deleted exam "{name}"',"admin.exams.toast.deleteFailed":"Deletion failed","admin.exams.toast.deleteError":"An error occurred while deleting the exam. Please try again.","admin.exams.toast.success":"Success","admin.exams.toast.copySuccess":"Copied exam {id}","admin.exams.toast.shuffleSuccess":"Created {count} shuffled variants from exam {id}! Question order has been randomized.","admin.exams.error.loadTitle":"Unable to load exam list","admin.exams.error.loadMessage":"An error occurred while loading data. Please try again.","admin.exams.stats.totalExams":"Total Exams","admin.exams.stats.activeExams":"{count} exams active","admin.exams.stats.rooms":"Rooms","admin.exams.stats.totalAssigned":"Total assigned rooms","admin.exams.stats.completed":"Completed","admin.exams.stats.studentsSubmitted":"Students submitted","admin.exams.stats.statusDistribution":"Status Distribution","admin.exams.stats.ready":"Ready","admin.exams.stats.notReady":"Not Ready","admin.exams.stats.activated":"Activated","admin.exams.stats.deactivated":"Deactivated","admin.exams.stats.examUnit":"{count} exams","admin.exams.table.title":"Exam List","admin.exams.table.showing":"Showing {count} / {total} exams","admin.exams.table.createExam":"Create Exam","admin.exams.table.loading":"Loading data...","admin.exams.table.empty":"No exams found","admin.exams.table.createdPrefix":"Created:","admin.exams.table.minutes":"{count} min","admin.exams.table.questionCount":"{count}/{total} questions","admin.exams.table.completed":"Completed","admin.exams.table.ready":"Completed","admin.exams.table.notReady":"Incomplete","admin.exams.table.activated":"Activated","admin.exams.table.deactivated":"Deactivated","admin.exams.table.cannotActivate":"Exam is not ready, cannot activate","admin.exams.table.editContent":"Edit exam content","admin.exams.filter.searchPlaceholder":"Search by name, exam code...","admin.exams.filter.level":"Level","admin.exams.filter.allLevels":"All Levels","admin.exams.filter.ready":"Completed","admin.exams.filter.allReady":"All Completion","admin.exams.filter.isReady":"Completed","admin.exams.filter.notReady":"Incomplete","admin.exams.filter.status":"Status","admin.exams.filter.allStatuses":"All Statuses","admin.exams.filter.activated":"Activated","admin.exams.filter.deactivated":"Deactivated","admin.exams.filter.clearFilters":"Clear Filters","admin.exams.filter.searchLabel":"Search:","admin.exams.filter.levelLabel":"Level:","admin.exams.filter.readyLabel":"Completed:","admin.exams.filter.statusLabel":"Status:","admin.exams.col.code":"Code","admin.exams.col.name":"Title","admin.exams.col.level":"Level","admin.exams.col.difficulty":"Difficulty","admin.exams.col.duration":"Duration","admin.exams.col.questions":"Questions","admin.exams.col.assigned":"Assigned","admin.exams.col.ready":"Completed","admin.exams.col.status":"Status","admin.exams.col.actions":"Actions","admin.exams.col.classification":"Classification","admin.exams.col.creator":"Creator","admin.exams.col.createdAt":"Created date","admin.exams.action.view":"View Details","admin.exams.action.preview":"Preview Exam","admin.exams.action.edit":"Edit","admin.exams.action.copy":"Copy","admin.exams.action.shuffle":"Create Shuffled Exam","admin.exams.action.delete":"Delete","admin.exams.difficulty.easy":"Easy","admin.exams.difficulty.medium":"Medium","admin.exams.difficulty.hard":"Hard","admin.exams.delete.title":"Confirm Delete Exam","admin.exams.delete.confirm":"Are you sure you want to delete exam","admin.exams.delete.warning":"This action cannot be undone and will delete all related data.","admin.exams.delete.cancel":"Cancel","admin.exams.delete.submit":"Delete","admin.exams.duplicate.title":"Copy Exam","admin.exams.duplicate.subtitle":"Create a complete copy","admin.exams.duplicate.originalExam":"Original Exam","admin.exams.duplicate.copyIncludes":"Copy will include","admin.exams.duplicate.examInfo":"Exam information","admin.exams.duplicate.allSettings":"All configurations and settings","admin.exams.duplicate.questions":"Questions","admin.exams.duplicate.questionCount":"{count} questions","admin.exams.duplicate.newName":"New Name","admin.exams.duplicate.newCode":"New Code","admin.exams.duplicate.draftNote":"The copy will be created with status","admin.exams.duplicate.draft":"Draft","admin.exams.duplicate.editableNote":"and can be edited right after creation.","admin.exams.duplicate.cancel":"Cancel","admin.exams.duplicate.copying":"Copying...","admin.exams.duplicate.submit":"Create Copy","admin.exams.view.subject":"Subject","admin.exams.view.level":"Level","admin.exams.view.duration":"Duration","admin.exams.view.minutes":"{count} min","admin.exams.view.questionCount":"Question Count","admin.exams.view.questions":"{count} questions","admin.exams.view.totalPoints":"Total Points","admin.exams.view.points":"{count} pts","admin.exams.view.difficulty":"Difficulty","admin.exams.view.description":"Description","admin.exams.view.close":"Close","admin.exams.shuffle.title":"Create Shuffled Exam Set","admin.exams.shuffle.desc":"Create multiple exam versions from {code} with randomly shuffled question order","admin.exams.shuffle.questionCount":"{count} questions","admin.exams.shuffle.minutes":"{count} min","admin.exams.shuffle.points":"{count} pts","admin.exams.shuffle.howItWorks":"How it works","admin.exams.shuffle.info1":"Each variant contains the exact same set of questions as the original","admin.exams.shuffle.info2":"The order of Parts is preserved","admin.exams.shuffle.info3":"Questions within the same Part are randomly shuffled","admin.exams.shuffle.info4":"Variants are linked to the parent exam for management","admin.exams.shuffle.countLabel":"Number of variants to create","admin.exams.shuffle.strategyLabel":"Existing exam handling option","admin.exams.shuffle.keepOld":"Keep existing exams and add new ones","admin.exams.shuffle.replaceAll":"Create a completely new set","admin.exams.shuffle.existingVariants":"Existing exams ({count})","admin.exams.shuffle.deleteAll":"Delete all ({count})","admin.exams.shuffle.loading":"Loading...","admin.exams.shuffle.noVariants":"No shuffled exams yet","admin.exams.shuffle.variantCode":"Code: {name}","admin.exams.shuffle.originalBadge":"📌 Original","admin.exams.shuffle.originalNote":"Original question order, cannot be deleted","admin.exams.shuffle.preview":"Preview","admin.exams.shuffle.close":"Close","admin.exams.shuffle.creating":"Creating...","admin.exams.shuffle.createButton":"Create {count} shuffled exams","admin.exams.shuffle.confirmDeleteAllTitle":"Delete all shuffled exams?","admin.exams.shuffle.confirmDeleteAllDesc":"Are you sure you want to delete all {count} shuffled exams? The original exam (Code: 000) will be kept. This action cannot be undone.","admin.exams.shuffle.cancel":"Cancel","admin.exams.shuffle.deleteAllBtn":"Delete All","admin.exams.shuffle.confirmDeleteOneTitle":"Delete this exam?","admin.exams.shuffle.confirmDeleteOneDesc":"Are you sure you want to delete this exam? This action cannot be undone.","admin.exams.shuffle.deleteBtn":"Delete","admin.exams.create.title":"Create New Exam","admin.exams.create.step1":"Step 1: Enter basic exam information","admin.exams.create.success":"Success","admin.exams.create.successDesc":'Saved exam "{name}". Redirecting to Template selection...',"admin.exams.create.incompleteInfo":"Incomplete Information","admin.exams.create.incompleteInfoDesc":"Please fill in all required fields and check the information entered","admin.exams.create.cancel":"Cancel","admin.exams.create.saving":"Saving...","admin.exams.create.saveAndContinue":"Create exam and start editing content","admin.exams.create.loading":"Loading...","admin.exams.form.basicInfo":"Basic Information","admin.exams.form.requiredHint":"Required fields are marked with (*)","admin.exams.form.codeLabel":"Exam Code","admin.exams.form.codePlaceholder":"Enter exam code...","admin.exams.form.charCount":"{count}/{max} characters","admin.exams.form.nameLabel":"Exam Name","admin.exams.form.namePlaceholder":"Enter exam name...","admin.exams.form.subject":"Subject","admin.exams.form.subjectPlaceholder":"Select subject","admin.exams.form.loading":"Loading...","admin.exams.form.level":"Level","admin.exams.form.levelPlaceholder":"Select level","admin.exams.form.difficulty":"Difficulty","admin.exams.form.difficultyPlaceholder":"Select difficulty","admin.exams.form.easy":"Easy","admin.exams.form.medium":"Medium","admin.exams.form.hard":"Hard","admin.exams.form.duration":"Exam Duration (minutes)","admin.exams.form.totalPoints":"Total Points","admin.exams.form.description":"Description","admin.exams.form.descriptionPlaceholder":"Detailed description about the exam, objectives, target audience...","admin.exams.form.classification":"Exam Classification","admin.exams.form.classificationPlaceholder":"Select exam classification","admin.exams.edit.title":"Edit Exam","admin.exams.edit.subtitle":"Update your exam information","admin.exams.edit.loading":"Loading exam information...","admin.exams.edit.loadError":"Unable to load exam information","admin.exams.edit.loadErrorDesc":"An error occurred while loading data. Please try again.","admin.exams.edit.backToList":"Back to list","admin.exams.edit.success":"Updated exam {name} successfully!","admin.exams.edit.invalidInfo":"Invalid Information","admin.exams.edit.invalidInfoDesc":"Please check the information fields","admin.exams.edit.templateInfoTitle":"Template Information (Cannot be changed)","admin.exams.edit.templateInfoDesc":"The exam template was selected when creating the exam and cannot be changed","admin.exams.edit.templateName":"Template Name:","admin.exams.edit.templateParts":"Parts:","admin.exams.edit.templateQuestions":"Questions:","admin.exams.edit.noTemplate":"No Template Selected","admin.exams.edit.noTemplateDesc":"You need to select a Template to complete the exam structure.","admin.exams.edit.editQuestions":"Edit Questions","admin.exams.edit.back":"Back","admin.exams.edit.saving":"Saving...","admin.exams.edit.saveChanges":"Save Changes","admin.exams.edit.saveAndSelectTemplate":"Save exam and continue to Template selection","admin.exams.edit.saved":"Exam saved","admin.exams.edit.redirectToTemplate":"Redirecting to Template selection...","admin.exams.edit.loadingFallback":"Loading...","admin.exams.template.exam":"Exam","admin.exams.template.examCode":"Exam Code:","admin.exams.template.step2":"Step 2: Select Exam Template","admin.exams.template.selectTemplate":"Select Exam Template","admin.exams.template.error":"Error","admin.exams.template.loadError":"Unable to load exam information. Please try again.","admin.exams.template.loading":"Loading exam information...","admin.exams.template.loadingFallback":"Loading...","admin.exams.preview.title":"Preview Exam: {name}","admin.exams.preview.examInfo":"Exam Information","admin.exams.preview.duration":"Duration:","admin.exams.preview.questionCount":"Questions:","admin.exams.preview.totalPoints":"Total Points:","admin.exams.preview.progress":"Progress","admin.exams.preview.loading":"Loading...","admin.exams.preview.questionNavigation":"Question Navigation","admin.exams.preview.all":"All","admin.exams.preview.allQuestions":"All {count} questions","admin.exams.preview.partQuestions":"Part {part}: {count} questions","admin.exams.preview.collapse":"Collapse","admin.exams.preview.detail":"Details","admin.exams.preview.questionIndex":"Question {index} / {total}","admin.exams.preview.noQuestions":"No questions yet","admin.exams.preview.loadingQuestions":"Loading questions...","admin.exams.preview.retry":"Retry","admin.exams.preview.examNoQuestions":"This exam has no questions yet.","admin.exams.preview.prevQuestion":"Previous Question","admin.exams.preview.prev":"Prev","admin.exams.preview.nextQuestion":"Next Question","admin.exams.preview.next":"Next","admin.exams.preview.footerNote":"This is a preview mode to check the layout and content of the exam.","admin.exams.preview.close":"Close","admin.exams.preview.loadError":"Unable to load questions. Please try again.","admin.exams.preview.points":"{count} pts","admin.exams.preview.questions":"{count} questions","admin.exams.preview.unsupportedType":"Question type not yet supported for preview:","admin.exams.preview.lookAndChoose":"Look at the picture and choose the correct answer","admin.exams.configure.error":"Error","admin.exams.configure.loadError":"Unable to load exam information. Please try again.","admin.exams.configure.missingInfo":"Missing information","admin.exams.configure.selectTemplateFirst":"Please select a template first.","admin.exams.configure.templateNotFound":"Template information not found.","admin.exams.configure.success":"Success","admin.exams.configure.successDesc":"Template configuration saved. Redirecting to question creation page...","admin.exams.configure.loading":"Loading information...","admin.exams.configure.noTemplate":"Template information not found","admin.exams.configure.backToTemplate":"Back to template selection","admin.exams.configure.saving":"Saving configuration...","admin.exams.configure.loadingFallback":"Loading...","admin.exams.questions.missingTemplate":"Missing template","admin.exams.questions.missingTemplateDesc":"Exam has no template assigned. Please select a template first.","admin.exams.questions.error":"Error","admin.exams.questions.loadError":"Unable to load exam information. Please try again.","admin.exams.questions.loading":"Loading exam information...","admin.exams.questions.noTemplate":"No template found for this exam","admin.exams.questions.noTemplateDesc":"Please select a template before creating questions","admin.exams.questions.back":"Back","admin.exams.questions.createQuestions":"Create Questions","admin.exams.questions.step4":"Step 4: Create and edit exam questions","admin.exams.questions.createAndEditQuestions":"Create and edit exam questions","admin.exams.questions.loadingFallback":"Loading...","admin.exams.questions.guide.title":"Question Creation Guide","admin.exams.questions.guide.subtitle":"4 simple steps • Helpful tips • Save time","admin.exams.questions.guide.step1Title":"Follow the order","admin.exams.questions.guide.step1Desc":"Complete each question in order within each Part","admin.exams.questions.guide.step1Tip":"Move to the next Part after completing all questions in the current Part","admin.exams.questions.guide.step2Title":"Standardized template","admin.exams.questions.guide.step2Desc":"Each Part has a predefined question type based on the template standard","admin.exams.questions.guide.step2Tip":"No need to worry about format - the system will automatically format according to the standard","admin.exams.questions.guide.step3Title":"Safe storage","admin.exams.questions.guide.step3Desc":'Use "Save Question" to save each question',"admin.exams.questions.guide.step3Tip":'Press "Save Exam" when done to save everything and publish',"admin.exams.questions.guide.step4Title":"Question bank","admin.exams.questions.guide.step4Desc":'Check "Add to bank" to reuse',"admin.exams.questions.guide.step4Tip":"Questions will be saved to the shared pool and can be used in other exams","admin.exams.questions.guide.quickTips":"Quick tips:","admin.exams.questions.guide.tip1":"Ctrl+S to quickly save the current question","admin.exams.questions.guide.tip2":"Data is auto-saved locally on change","admin.exams.questions.guide.tip3":'Preview questions with the "Preview" button',"admin.exams.partEditor.skillListening":"Listening","admin.exams.partEditor.skillSpeaking":"Speaking","admin.exams.partEditor.skillReading":"Reading","admin.exams.partEditor.skillWriting":"Writing","admin.exams.partEditor.qtFillMissingWordsInGrid":"Fill in missing letters","admin.exams.partEditor.qtLookPictureFillBlankChooseAnswer":"Look at picture, fill in the blank","admin.exams.partEditor.qtLookPictureChooseCorrectAnswer":"Look at picture, choose correct answer","admin.exams.partEditor.qtLookPictureFillWordHint":"Look at picture, fill word (with hint)","admin.exams.partEditor.qtLabelThePicture":"Label the picture","admin.exams.partEditor.qtReadAndColorObjects":"Read and color","admin.exams.partEditor.qtMultipleChoice":"Multiple choice","admin.exams.partEditor.qtListening":"Listening comprehension","admin.exams.partEditor.qtReading":"Reading comprehension","admin.exams.partEditor.defaultBack":"Back","admin.exams.partEditor.defaultContinue":"Save configuration and continue","admin.exams.partEditor.defaultExamName":"Configure Exam","admin.exams.partEditor.step3":"Step 3: Configure question count","admin.exams.partEditor.templateLabel":"Template:","admin.exams.partEditor.totalQuestions":"Total questions","admin.exams.partEditor.changedFrom":"Changed from {from} questions","admin.exams.partEditor.keepDefault":"Keeping default template settings","admin.exams.partEditor.questionsUnit":"questions","admin.exams.partEditor.reset":"Reset","admin.exams.partEditor.defaultCount":"Default: {count}","admin.exams.partEditor.currentCount":"Current: {count}","admin.exams.partEditor.configParts":"Configure Each Part","admin.exams.partEditor.configPartsDesc":"Customize the number of questions for each part. Grouped questions can adjust the number of groups and questions per group.","admin.exams.partEditor.groupBadge":"Question group","admin.exams.partEditor.totalPartQuestions":"Total questions","admin.exams.partEditor.skillLabel":"Skill","admin.exams.partEditor.selectSkill":"Select skill","admin.exams.partEditor.defaultSkill":"(default: {skill})","admin.exams.partEditor.audioFile":"Audio file","admin.exams.partEditor.audioPlaceholder":"Select audio file for this part...","admin.exams.partEditor.questionCount":"Question count","admin.exams.partEditor.groupCount":"Number of groups","admin.exams.partEditor.addOrRemoveGroup":"Add or remove question groups","admin.exams.partEditor.questionsPerGroup":"Questions per group","admin.exams.partEditor.group":"Group {index}","admin.exams.partEditor.defaultValue":"(default: {value})","admin.exams.partEditor.unsavedChanges":"• Unsaved changes","admin.exams.partEditor.readyToContinue":"✓ Ready to continue","admin.exams.partEditor.saving":"Saving...","admin.settings.title":"System Settings","admin.settings.subtitle":"Manage system configuration and parameters","admin.settings.save.success":"Saved","admin.settings.save.successDesc":"Settings have been saved!","admin.settings.systemInfo.title":"System Information","admin.settings.systemInfo.desc":"General system configuration","admin.settings.systemInfo.edit":"Edit","admin.settings.systemInfo.cancel":"Cancel","admin.settings.systemInfo.save":"Save Changes","admin.settings.systemInfo.systemName":"System Name","admin.settings.systemInfo.systemEmail":"System Email","admin.settings.systemInfo.supportEmail":"Support Email","admin.settings.notification.title":"Notification Settings","admin.settings.notification.desc":"Manage notification channels","admin.settings.notification.email":"Email Notifications","admin.settings.notification.emailDesc":"Send email notifications to students and teachers","admin.settings.notification.sms":"SMS Notifications","admin.settings.notification.smsDesc":"Send important SMS notifications","admin.settings.ebm.title":"EBM Integration","admin.settings.ebm.desc":"Configure connection to EBM system","admin.settings.ebm.testConnection":"Test Connection","admin.settings.ebm.syncNow":"Sync Now","admin.settings.status.title":"System Status","admin.settings.status.desc":"System operation information","admin.settings.status.operational":"Operational","admin.settings.status.connected":"Connected","admin.settings.status.active":"Active","admin.settings.status.paused":"Paused","admin.settings.status.lastBackup":"Yesterday 23:00","admin.testParticipants.title":"Test Participants","admin.testParticipants.subtitle":"Track information and exam results of participants in the system","admin.testParticipants.cardTitle":"Test Participants List","admin.testParticipants.cardDescription":"Total {totalItems} participants found","admin.testParticipants.clearFilters":"Clear filters","admin.testParticipants.filterHeader":"Search filters","admin.testParticipants.searchPlaceholder":"Search by name, email or phone number...","admin.testParticipants.branchLabel":"Branch","admin.testParticipants.allBranches":"All branches","admin.testParticipants.contestLabel":"Contest","admin.testParticipants.allContests":"All contests","admin.testParticipants.fromDate":"From date","admin.testParticipants.toDate":"To date","admin.testParticipants.col.participant":"Participant","admin.testParticipants.col.phone":"Phone","admin.testParticipants.col.dob":"Date of Birth","admin.testParticipants.col.branch":"Branch","admin.testParticipants.col.contest":"Contest","admin.testParticipants.col.exam":"Exam","admin.testParticipants.col.bestScore":"Best Score","admin.testParticipants.col.maxScore":"Max Score","admin.testParticipants.col.attemptCount":"Attempts","admin.testParticipants.col.lastAttempt":"Last Attempt","admin.testParticipants.col.actions":"Actions","admin.testParticipants.loading":"Loading data...","admin.testParticipants.empty.title":"No data found","admin.testParticipants.empty.withFilters":"No results match the current filters. Please adjust your search criteria.","admin.testParticipants.empty.noData":"No participants have taken any exams yet.","admin.testParticipants.viewDetail":"View exam history details","admin.testParticipants.detail":"Details","admin.testParticipants.dialog.title":"Exam History Details","admin.testParticipants.dialog.description":"Detailed information about exam results and attempt history of the participant","admin.testParticipants.dialog.studentInfo":"Participant Information","admin.testParticipants.dialog.fullName":"Full Name","admin.testParticipants.dialog.email":"Email Address","admin.testParticipants.dialog.phone":"Phone Number","admin.testParticipants.dialog.dob":"Date of Birth","admin.testParticipants.dialog.branch":"Branch","admin.testParticipants.dialog.examInfo":"Exam Information","admin.testParticipants.dialog.contest":"Contest","admin.testParticipants.dialog.exam":"Exam","admin.testParticipants.dialog.lastAttempt":"Last Attempt","admin.testParticipants.dialog.bestScore":"Best Score","admin.testParticipants.dialog.passRate":"Pass Rate","admin.testParticipants.dialog.totalAttempts":"Total Attempts","admin.testParticipants.dialog.historyTitle":"Attempt History","admin.testParticipants.dialog.col.attempt":"Attempt","admin.testParticipants.dialog.col.score":"Score","admin.testParticipants.dialog.col.rate":"Rate","admin.testParticipants.dialog.col.status":"Status","admin.testParticipants.dialog.col.startTime":"Start Time","admin.testParticipants.dialog.col.submitTime":"Submit Time","admin.testParticipants.dialog.noAttempts":"No attempt data available.","admin.testParticipants.status.inProgress":"In Progress","admin.testParticipants.status.submitted":"Submitted","admin.testParticipants.status.graded":"Graded","admin.testParticipants.status.published":"Published","admin.roles.title":"Role Management","admin.roles.subtitle":"Manage roles and permissions in the system","admin.roles.table.title":"Role List","admin.roles.table.showing":"Showing {count} roles","admin.roles.table.empty":"No roles found","admin.roles.table.loading":"Loading...","admin.roles.table.addRole":"Create new role","admin.roles.col.name":"Role name","admin.roles.col.slug":"Slug","admin.roles.col.level":"Level","admin.roles.col.permCount":"Permissions","admin.roles.col.type":"Type","admin.roles.col.actions":"Actions","admin.roles.filter.searchPlaceholder":"Search by name or slug...","admin.roles.filter.allLevels":"All levels","admin.roles.level.system":"System","admin.roles.level.branch":"Branch","admin.roles.type.system":"System","admin.roles.type.custom":"Custom","admin.role.create.title":"Create new role","admin.role.create.subtitle":"Create a custom role for the system","admin.role.create.success":"Role created successfully","admin.role.create.submit":"Create role","admin.role.create.submitting":"Creating...","admin.role.field.name":"Role name","admin.role.field.slug":"Slug","admin.role.field.slugHint":"Lowercase letters, numbers, underscores and hyphens only","admin.role.field.level":"Level","admin.role.field.description":"Description","admin.role.field.portalType":"Belongs to portal","admin.role.field.portalTypeHint":"Select the portal this role will have access to","admin.role.field.portal.admin":"Admin Portal","admin.role.field.portal.adminDesc":"System, exam & user management","admin.role.field.portal.teacher":"Teacher Portal","admin.role.field.portal.teacherDesc":"Class management & grading","admin.role.field.portal.student":"Student Portal","admin.role.field.portal.studentDesc":"Online exams & results","admin.role.delete.title":"Delete role","admin.role.delete.desc":'Are you sure you want to delete the role "{name}"? This action cannot be undone.',"admin.role.delete.confirm":"Delete role","admin.role.delete.success":'Role "{name}" deleted',"admin.role.delete.cannotSystem":"Cannot delete a system role","admin.role.backToList":"Back to list","admin.role.info.title":"Role information","admin.role.info.edit":"Edit","admin.role.info.save":"Save","admin.role.info.cancel":"Cancel","admin.role.update.success":"Role updated successfully","admin.role.permissions.title":"Permissions","admin.role.permissions.showing":"{selected}/{total} permissions selected","admin.role.permissions.save":"Save changes","admin.role.permissions.saving":"Saving...","admin.role.permissions.saveSuccess":"Permissions updated successfully","admin.role.permissions.systemWarning":"This is a system role. Permissions cannot be edited.","admin.role.permissions.selectAll":"Select all","admin.role.permissions.unsavedChanges":"{count} unsaved changes","admin.user.roles.title":"Assigned roles","admin.user.roles.assign":"Assign role","admin.user.roles.empty":"No roles assigned yet","admin.user.roles.col.role":"Role","admin.user.roles.col.branch":"Branch","admin.user.roles.col.assignedAt":"Assigned date","admin.user.roles.col.assignedBy":"Assigned by","admin.user.roles.col.actions":"Actions","admin.user.roles.sessionCacheInfo":"Role changes will take effect after the user logs in again.","admin.user.role.assign.title":"Assign role","admin.user.role.assign.desc":"Select a role and branch to assign to the user","admin.user.role.assign.roleLabel":"Role","admin.user.role.assign.rolePlaceholder":"Select a role","admin.user.role.assign.branchLabel":"Branch","admin.user.role.assign.branchPlaceholder":"Select a branch","admin.user.role.assign.submit":"Assign role","admin.user.role.assign.success":'Role "{role}" assigned successfully',"admin.user.role.remove.title":"Remove role","admin.user.role.remove.desc":'Are you sure you want to remove the role "{role}" from this user?',"admin.user.role.remove.confirm":"Remove role","admin.user.role.remove.success":'Role "{role}" removed successfully',"admin.templates.title":"Exam Template Management","admin.templates.subtitle":"View, import, export, and delete exam templates","admin.templates.table.title":"Template List","admin.templates.searchPlaceholder":"Search templates","admin.templates.table.empty":"No templates found","admin.templates.table.loading":"Loading templates...","admin.templates.table.showing":"Showing {count} templates","admin.templates.col.title":"Title","admin.templates.col.subTitle":"Subtitle","admin.templates.col.examLevel":"Level","admin.templates.col.theme":"Theme","admin.templates.col.totalParts":"Parts","admin.templates.col.totalQuestions":"Questions","admin.templates.col.createdBy":"Created By","admin.templates.col.createdAt":"Created","admin.templates.col.updatedAt":"Updated","admin.templates.col.examCount":"Exams","admin.templates.col.actions":"Actions","admin.templates.filter.searchPlaceholder":"Search by title...","admin.templates.action.view":"View details","admin.templates.action.export":"Export","admin.templates.action.delete":"Delete","admin.templates.action.import":"Import Template","admin.templates.action.exporting":"Exporting...","admin.templates.export.success":"Template exported successfully","admin.templates.export.error":"Failed to export template","admin.templates.import.success":"Template imported successfully","admin.templates.import.error":"Failed to import template","admin.templates.import.invalidJson":"Invalid JSON file. Please check the file format.","admin.templates.import.invalidFile":"Please select a valid .json file.","admin.templates.import.invalidFormat":"Invalid template format. The file must contain title and parts fields.","admin.templates.import.parseError":"Failed to parse JSON file. Please check the file content.","admin.templates.import.readError":"Failed to read file. Please try again.","admin.templates.import.title":"Import Template","admin.templates.import.desc":"Select a JSON file previously exported from the system. If a template with the same ID already exists, it will be replaced.","admin.templates.import.selectFile":"Select JSON file","admin.templates.import.submit":"Import","admin.templates.import.submitting":"Importing...","admin.templates.delete.title":"Delete Template","admin.templates.delete.desc":'Are you sure you want to delete the template "{title}"? This action cannot be undone.',"admin.templates.delete.confirm":"Delete template","admin.templates.delete.success":'Template "{title}" deleted successfully',"admin.templates.detail.title":"Template Details","admin.templates.detail.back":"Back to list","admin.templates.detail.jsonView":"JSON Content","admin.templates.detail.info":"General Information","admin.templates.detail.parts":"Parts ({count})","admin.templates.detail.copyJson":"Copy JSON","admin.templates.detail.jsonCopied":"JSON copied to clipboard","admin.templates.create.title":"Create Template","admin.templates.create.desc":"Fill in the template details below. Only the Parts field requires JSON input.","admin.templates.create.placeholder":'Paste JSON content here...\n\n{\n "title": "...",\n "examLevel": "...",\n "parts": [...]\n}',"admin.templates.create.submit":"Create Template","admin.templates.create.creating":"Creating...","admin.templates.create.success":"Template created successfully","admin.templates.create.emptyJson":"Please paste JSON content.","admin.templates.create.invalidFormat":"Invalid template format. The JSON must contain title, examLevel and parts fields.","admin.templates.create.parseError":"Invalid JSON. Please check the content and try again.","admin.templates.create.validJson":"Valid JSON — ready to create","admin.templates.action.create":"Create Template","admin.templates.action.edit":"Edit","admin.templates.form.titleLabel":"Title","admin.templates.form.titlePlaceholder":"Enter template title...","admin.templates.form.titleRequired":"Title is required.","admin.templates.form.subTitleLabel":"Subtitle","admin.templates.form.subTitlePlaceholder":"Enter subtitle (optional)...","admin.templates.form.descriptionLabel":"Description","admin.templates.form.descriptionPlaceholder":"Enter description (optional)...","admin.templates.form.examLevelLabel":"Exam Level (CEFR)","admin.templates.form.examLevelPlaceholder":"Select exam level...","admin.templates.form.totalQuestionsLabel":"Total Questions","admin.templates.form.totalPartsLabel":"Total Parts","admin.templates.form.partsLabel":"Parts (JSON)","admin.templates.form.partsPlaceholder":'[\n {\n "partNumber": 1,\n "title": "Part 1",\n "questionCount": 5,\n ...\n }\n]',"admin.templates.form.partsRequired":"Parts JSON is required and must be a non-empty array.","admin.templates.form.partsNotArray":"Parts must be a JSON array.","admin.templates.form.partsParseError":"Invalid JSON. Please check the content.","admin.templates.form.validJson":"Valid JSON","admin.templates.form.themeLabel":"Theme","admin.templates.form.themePlaceholder":"Select theme...","admin.templates.form.themeNone":"None","admin.templates.edit.title":"Edit Template","admin.templates.edit.desc":"Modify the template details below. Only the Parts field requires JSON input.","admin.templates.edit.submit":"Save Changes","admin.templates.edit.saving":"Saving...","admin.templates.edit.success":"Template updated successfully","admin.templates.edit.loadError":"Failed to load template data for editing","bulkRooms.sidebar.label":"Bulk Exam Rooms","bulkRooms.page.title":"Bulk Exam Room Provisioning","bulkRooms.page.description":"Create many exam rooms for a contest across multiple branches in a single operation.","bulkRooms.actions.next":"Next","bulkRooms.actions.back":"Back","bulkRooms.actions.preview":"Preview","bulkRooms.actions.commit":"Create rooms","bulkRooms.actions.confirm":"Confirm","bulkRooms.actions.cancel":"Cancel","bulkRooms.actions.reset":"Start over","bulkRooms.actions.close":"Close","bulkRooms.steps.contest":"Pick contest","bulkRooms.steps.branches":"Pick branches","bulkRooms.steps.config":"Configure","bulkRooms.steps.preview":"Preview","bulkRooms.steps.commit":"Create rooms","bulkRooms.steps.indicator":"Step {current} of {total}","bulkRooms.contest.title":"Pick a contest","bulkRooms.contest.description":"Choose the contest the new rooms will belong to.","bulkRooms.contest.placeholder":"Search contests by name...","bulkRooms.contest.empty":"No contests found.","bulkRooms.contest.selected":"Selected: {name}","bulkRooms.branches.title":"Pick branches","bulkRooms.branches.description":"Select one or more branches to provision rooms for.","bulkRooms.branches.placeholder":"Choose branches...","bulkRooms.branches.empty":"No branches available.","bulkRooms.branches.selectedCount":"{count} branches selected","bulkRooms.branches.sourceEbm":"Branch list is loaded from the EBM system.","bulkRooms.branches.selectAll":"Select all branches","bulkRooms.branches.selectedSummary":"{selected}/{total} branches selected","bulkRooms.config.title":"Per-branch configuration","bulkRooms.config.description":"Configure how rooms are generated for each selected branch.","bulkRooms.config.mode.label":"Provisioning mode","bulkRooms.config.mode.AUTO_CLASS":"Auto from classes","bulkRooms.config.mode.MANUAL":"Manual","bulkRooms.config.mode.AUTO_CLASS.help":"Generate one room per active class room of the branch.","bulkRooms.config.mode.MANUAL.help":"Define rooms and student codes manually.","bulkRooms.config.onlyTeacher.label":"Add branch teachers to the rooms","bulkRooms.config.onlyTeacher.help":"If checked, all teachers of the branch will be added. If unchecked, no teachers will be added.","bulkRooms.config.nameFormat.label":"Room name format","bulkRooms.config.nameFormat.placeholder":"{branchCode} - {className}","bulkRooms.config.codeFormat.label":"Room code format (optional)","bulkRooms.config.codeFormat.placeholder":"{branchCode}_ROOM_{index}","bulkRooms.config.tokens.help":"Supported tokens: {tokens}","bulkRooms.config.classEbmIds.label":"Class room ids (optional)","bulkRooms.config.classEbmIds.placeholder":"Comma-separated class room ids","bulkRooms.config.classEbmIds.help":"Leave empty to use all active class rooms of the branch.","bulkRooms.config.rooms.title":"Rooms (manual mode)","bulkRooms.config.rooms.add":"Add room","bulkRooms.config.rooms.remove":"Remove","bulkRooms.config.rooms.empty":'No rooms yet. Click "Add room" to start.',"bulkRooms.config.studentCodes.label":"Student codes (optional, one per line)","bulkRooms.config.studentCodes.placeholder":"HS001\nHS002\n...","bulkRooms.config.studentCodes.help":"Missing users will be created on commit (default password = student code).","bulkRooms.preview.title":"Preview","bulkRooms.preview.description":"Review the planned rooms before confirming.","bulkRooms.preview.loading":"Building plan...","bulkRooms.preview.error":"Failed to build preview.","bulkRooms.preview.requiresForm":"Select contest, branches and complete config to enable preview.","bulkRooms.preview.summary.totalRooms":"Total rooms","bulkRooms.preview.summary.totalStaff":"Total staff","bulkRooms.preview.summary.totalStudents":"Total students","bulkRooms.preview.summary.totalNewUsers":"New users to create","bulkRooms.preview.summary.totalNewStudents":"New student accounts","bulkRooms.preview.summary.totalNewTeachers":"New teacher accounts","bulkRooms.preview.table.branch":"Branch","bulkRooms.preview.table.room":"Room name","bulkRooms.preview.table.code":"Room code","bulkRooms.preview.table.staff":"Staff","bulkRooms.preview.table.students":"Students","bulkRooms.preview.table.newUsers":"New users","bulkRooms.preview.table.roomName":"Room name","bulkRooms.preview.table.roomCode":"Room code","bulkRooms.preview.table.staffCount":"Staff","bulkRooms.preview.table.studentCount":"Students","bulkRooms.preview.table.roomCount":"{count} rooms","bulkRooms.preview.table.noRooms":"No rooms for this branch.","bulkRooms.preview.table.showMore":"Show {count} more rooms","bulkRooms.preview.table.collapse":"Collapse","bulkRooms.preview.empty":"No rooms in the plan.","bulkRooms.commit.dialog.title":"Confirm bulk provisioning","bulkRooms.commit.dialog.description":"You are about to create {rooms} rooms and {users} new users. This action cannot be undone.","bulkRooms.commit.dialog.warning":"This will create rooms and users in the database and cannot be undone.","bulkRooms.commit.dialog.confirmCheckbox":"I have reviewed the preview and confirm creating these rooms.","bulkRooms.commit.dialog.committing":"Creating...","bulkRooms.commit.success.title":"Provisioning succeeded","bulkRooms.commit.success.description":"Created {rooms} rooms, {participants} participants and {users} new users.","bulkRooms.commit.success.rooms":"Rooms created","bulkRooms.commit.success.participants":"Participants","bulkRooms.commit.success.users":"New users","bulkRooms.commit.error.title":"Provisioning failed","bulkRooms.commit.error.description":"Some branches failed to provision. See error details below.","bulkRooms.commit.error.list":"Error list","bulkRooms.commit.error.partial":"{count} branch(es) reported errors.","bulkRooms.commit.error.branch":"Branch {branchId} (EBM #{ebmBranchId}): {reason}"};