@things-factory/learning 10.1.260 → 10.1.262

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 (103) hide show
  1. package/dist-client/components/learning-material-form.d.ts +41 -0
  2. package/dist-client/components/learning-material-form.js +202 -0
  3. package/dist-client/components/learning-material-form.js.map +1 -0
  4. package/dist-client/components/learning-unit-form.d.ts +3 -0
  5. package/dist-client/components/learning-unit-form.js +10 -2
  6. package/dist-client/components/learning-unit-form.js.map +1 -1
  7. package/dist-client/pages/learning-course-editor.d.ts +1 -0
  8. package/dist-client/pages/learning-course-editor.js +19 -6
  9. package/dist-client/pages/learning-course-editor.js.map +1 -1
  10. package/dist-client/pages/learning-course-list.d.ts +1 -5
  11. package/dist-client/pages/learning-course-list.js +54 -16
  12. package/dist-client/pages/learning-course-list.js.map +1 -1
  13. package/dist-client/pages/learning-enrollment-status.d.ts +31 -16
  14. package/dist-client/pages/learning-enrollment-status.js +104 -117
  15. package/dist-client/pages/learning-enrollment-status.js.map +1 -1
  16. package/dist-client/pages/learning-view.d.ts +11 -0
  17. package/dist-client/pages/learning-view.js +94 -19
  18. package/dist-client/pages/learning-view.js.map +1 -1
  19. package/dist-client/tsconfig.tsbuildinfo +1 -1
  20. package/dist-client/utils/learning-api.d.ts +48 -3
  21. package/dist-client/utils/learning-api.js +51 -2
  22. package/dist-client/utils/learning-api.js.map +1 -1
  23. package/dist-client/utils/material-source.d.ts +12 -0
  24. package/dist-client/utils/material-source.js +77 -0
  25. package/dist-client/utils/material-source.js.map +1 -0
  26. package/dist-server/ai-reads.js +1 -1
  27. package/dist-server/ai-reads.js.map +1 -1
  28. package/dist-server/service/course/course-mutation.d.ts +1 -1
  29. package/dist-server/service/course/course-mutation.js +7 -6
  30. package/dist-server/service/course/course-mutation.js.map +1 -1
  31. package/dist-server/service/course/course-query.d.ts +2 -0
  32. package/dist-server/service/course/course-query.js +27 -3
  33. package/dist-server/service/course/course-query.js.map +1 -1
  34. package/dist-server/service/course/course-rules.d.ts +3 -1
  35. package/dist-server/service/course/course-rules.js +5 -1
  36. package/dist-server/service/course/course-rules.js.map +1 -1
  37. package/dist-server/service/course/course-service.d.ts +5 -4
  38. package/dist-server/service/course/course-service.js +10 -14
  39. package/dist-server/service/course/course-service.js.map +1 -1
  40. package/dist-server/service/course/course-type.d.ts +1 -0
  41. package/dist-server/service/course/course-type.js +4 -0
  42. package/dist-server/service/course/course-type.js.map +1 -1
  43. package/dist-server/service/course/course-unit.d.ts +3 -2
  44. package/dist-server/service/course/course-unit.js +7 -2
  45. package/dist-server/service/course/course-unit.js.map +1 -1
  46. package/dist-server/service/course/index.d.ts +2 -1
  47. package/dist-server/service/course/index.js +2 -1
  48. package/dist-server/service/course/index.js.map +1 -1
  49. package/dist-server/service/course/material-audio.d.ts +1 -0
  50. package/dist-server/service/course/material-audio.js +43 -0
  51. package/dist-server/service/course/material-audio.js.map +1 -0
  52. package/dist-server/service/course/material-draft-mutation.d.ts +13 -0
  53. package/dist-server/service/course/material-draft-mutation.js +55 -0
  54. package/dist-server/service/course/material-draft-mutation.js.map +1 -0
  55. package/dist-server/service/course/material-draft-rules.d.ts +38 -0
  56. package/dist-server/service/course/material-draft-rules.js +83 -0
  57. package/dist-server/service/course/material-draft-rules.js.map +1 -0
  58. package/dist-server/service/course/material-draft-service.d.ts +15 -0
  59. package/dist-server/service/course/material-draft-service.js +162 -0
  60. package/dist-server/service/course/material-draft-service.js.map +1 -0
  61. package/dist-server/service/enrollment/enrollment-mutation.d.ts +1 -1
  62. package/dist-server/service/enrollment/enrollment-mutation.js +6 -6
  63. package/dist-server/service/enrollment/enrollment-mutation.js.map +1 -1
  64. package/dist-server/service/enrollment/enrollment-query.d.ts +8 -4
  65. package/dist-server/service/enrollment/enrollment-query.js +47 -36
  66. package/dist-server/service/enrollment/enrollment-query.js.map +1 -1
  67. package/dist-server/service/enrollment/enrollment-service.d.ts +4 -3
  68. package/dist-server/service/enrollment/enrollment-service.js +41 -18
  69. package/dist-server/service/enrollment/enrollment-service.js.map +1 -1
  70. package/dist-server/service/enrollment/enrollment-status.d.ts +42 -18
  71. package/dist-server/service/enrollment/enrollment-status.js +143 -42
  72. package/dist-server/service/enrollment/enrollment-status.js.map +1 -1
  73. package/dist-server/service/enrollment/enrollment-type.d.ts +2 -8
  74. package/dist-server/service/enrollment/enrollment-type.js +20 -42
  75. package/dist-server/service/enrollment/enrollment-type.js.map +1 -1
  76. package/dist-server/service/enrollment/enrollment.d.ts +1 -0
  77. package/dist-server/service/enrollment/enrollment.js +5 -0
  78. package/dist-server/service/enrollment/enrollment.js.map +1 -1
  79. package/dist-server/service/enrollment/index.d.ts +3 -3
  80. package/dist-server/service/enrollment/index.js +3 -3
  81. package/dist-server/service/enrollment/index.js.map +1 -1
  82. package/dist-server/service/enrollment/learning-ai.d.ts +9 -2
  83. package/dist-server/service/enrollment/learning-ai.js +25 -28
  84. package/dist-server/service/enrollment/learning-ai.js.map +1 -1
  85. package/dist-server/service/enrollment/learning-documents.js +3 -4
  86. package/dist-server/service/enrollment/learning-documents.js.map +1 -1
  87. package/dist-server/service/enrollment/progress-rules.d.ts +40 -11
  88. package/dist-server/service/enrollment/progress-rules.js +54 -13
  89. package/dist-server/service/enrollment/progress-rules.js.map +1 -1
  90. package/dist-server/service/enrollment/unit-progress.d.ts +4 -0
  91. package/dist-server/service/enrollment/unit-progress.js +20 -0
  92. package/dist-server/service/enrollment/unit-progress.js.map +1 -1
  93. package/dist-server/service/index.d.ts +2 -2
  94. package/dist-server/service/index.js +2 -2
  95. package/dist-server/service/index.js.map +1 -1
  96. package/dist-server/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +14 -13
  98. package/translations/en.json +42 -9
  99. package/translations/es.json +42 -9
  100. package/translations/ja.json +42 -9
  101. package/translations/ko.json +42 -9
  102. package/translations/ms.json +42 -9
  103. package/translations/zh.json +42 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/learning",
3
- "version": "10.1.260",
3
+ "version": "10.1.262",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -33,26 +33,27 @@
33
33
  "@operato/i18n": "^10.0.0",
34
34
  "@operato/input": "^10.29.52",
35
35
  "@operato/layout": "^10.29.49",
36
- "@operato/learning": "^10.29.71",
36
+ "@operato/learning": "^10.29.72",
37
37
  "@operato/list-state": "^10.29.39",
38
38
  "@operato/popup": "^10.29.39",
39
39
  "@operato/shell": "^10.29.69",
40
40
  "@operato/styles": "^10.29.1",
41
41
  "@operato/utils": "^10.0.0",
42
- "@things-factory/ai-assistant": "^10.1.260",
43
- "@things-factory/announcement": "^10.1.260",
44
- "@things-factory/attachment-base": "^10.1.260",
45
- "@things-factory/auth-base": "^10.1.260",
42
+ "@things-factory/ai-assistant": "^10.1.262",
43
+ "@things-factory/ai-client-base": "^10.1.262",
44
+ "@things-factory/announcement": "^10.1.262",
45
+ "@things-factory/attachment-base": "^10.1.262",
46
+ "@things-factory/auth-base": "^10.1.262",
46
47
  "@things-factory/env": "^10.1.149",
47
- "@things-factory/i18n-base": "^10.1.260",
48
- "@things-factory/notification": "^10.1.260",
49
- "@things-factory/organization": "^10.1.260",
50
- "@things-factory/pdf": "^10.1.260",
51
- "@things-factory/shell": "^10.1.260",
52
- "@things-factory/worklist": "^10.1.260",
48
+ "@things-factory/i18n-base": "^10.1.262",
49
+ "@things-factory/notification": "^10.1.262",
50
+ "@things-factory/organization": "^10.1.262",
51
+ "@things-factory/pdf": "^10.1.262",
52
+ "@things-factory/shell": "^10.1.262",
53
+ "@things-factory/worklist": "^10.1.262",
53
54
  "graphql-tag": "^2.12.6",
54
55
  "graphql-upload": "^15.0.2",
55
56
  "lit": "^3.1.2"
56
57
  },
57
- "gitHead": "72de583ba0394dcf8195ef723b0ee4217507e0e5"
58
+ "gitHead": "2d5babff1e0f83bb0dfdf2ec91e4e7c00f9ac5bd"
58
59
  }
@@ -34,6 +34,7 @@
34
34
  "error.learning-audience-invalid": "{target} is not of this domain.",
35
35
  "error.learning-audience-required": "Select who takes the course.",
36
36
  "error.learning-cancel-reason-required": "Enter the reason for cancelling.",
37
+ "error.learning-cancel-none": "Select the enrolments to cancel.",
37
38
  "error.learning-content-what": "Specify an enrollment or course version.",
38
39
  "error.learning-course-name-required": "Enter the course name.",
39
40
  "error.learning-course-name-taken": "A course named “{name}” exists.",
@@ -52,6 +53,7 @@
52
53
  "error.learning-not-a-department-head": "Only a department head can view where their people stand.",
53
54
  "error.learning-not-completed": "A certificate is issued only for a completed course.",
54
55
  "error.learning-not-found": "The record was not found. Reload and try again.",
56
+ "error.learning-page-ahead": "You can turn only to the page after the last one read (page {allowed}). Turn the pages in order.",
55
57
  "error.learning-pass-score-invalid": "The pass score is a whole number from 1 to 100.",
56
58
  "error.learning-position-ahead": "You cannot skip beyond the watched position ({allowed} seconds). Continue playing from that position.",
57
59
  "error.learning-question-answer-required": "Mark at least one correct choice.",
@@ -74,6 +76,8 @@
74
76
  "error.learning-unit-kind-invalid": "Select the unit type.",
75
77
  "error.learning-unit-min-time-invalid": "Enter a whole-number minimum learning time of at least 1 second.",
76
78
  "error.learning-unit-name-required": "Enter the unit name.",
79
+ "error.learning-unit-pages-invalid": "The PDF's page count is not valid.",
80
+ "error.learning-unit-pages-required": "A PDF's page count is unknown. Attach its file again.",
77
81
  "error.learning-unit-url-invalid": "Enter a link starting with http:// or https://.",
78
82
  "error.learning-units-required": "Add at least one unit before publishing.",
79
83
  "error.learning-version-not-draft": "A published or closed version cannot be changed. Start a new version to change it.",
@@ -133,7 +137,7 @@
133
137
  "text.learning-attempt-limit-hint": "Leave empty for no limit.",
134
138
  "text.learning-attempts-left": "{count} attempts left.",
135
139
  "text.learning-best-score": "Best score: {score}.",
136
- "text.learning-cancelled": "The enrolment is cancelled.",
140
+ "text.learning-cancelled": "{count} enrolments were cancelled.",
137
141
  "text.learning-category-job": "Job training",
138
142
  "text.learning-category-mandatory": "Mandatory training",
139
143
  "text.learning-category-onboarding": "Onboarding",
@@ -143,11 +147,6 @@
143
147
  "text.learning-choice-count": "{count} choices",
144
148
  "text.learning-completed-detail": "Completed on {day}. Certificate no. {number}.",
145
149
  "text.learning-completed-on": "Completed {day}",
146
- "text.learning-count-assigned": "Not started",
147
- "text.learning-count-completed": "Completed",
148
- "text.learning-count-in-progress": "In progress",
149
- "text.learning-count-overdue": "Overdue",
150
- "text.learning-count-total": "Learners",
151
150
  "text.learning-course-all": "All courses",
152
151
  "text.learning-due-on": "Due {day}",
153
152
  "text.learning-due-on-hint": "Leave empty to assign without a due date.",
@@ -170,7 +169,7 @@
170
169
  "text.learning-not-published": "Not published",
171
170
  "text.learning-nothing-to-take": "No courses are assigned to you.",
172
171
  "text.learning-pass-score-hint": "Out of 100. Leave empty for no quiz.",
173
- "text.learning-pick-one": "Select one enrolment.",
172
+ "text.learning-pick-cancellable": "Select the enrolments to cancel.",
174
173
  "text.learning-pick-open": "Select enrollments that have not been completed.",
175
174
  "text.learning-question-count-hint": "Each attempt draws this many questions at random. Leave empty to draw them all.",
176
175
  "text.learning-question-delete-confirm": "Delete this question?",
@@ -192,6 +191,7 @@
192
191
  "text.learning-remind-note": "Sent by the course manager.",
193
192
  "text.learning-remind-subject": "[Course] {course}",
194
193
  "text.learning-reminded": "{count} learners were reminded.",
194
+ "text.learning-saved-at": "Last saved {time}",
195
195
  "text.learning-source-note-hint": "Record the material provider and usage terms, such as attribution or restrictions on modification.",
196
196
  "text.learning-source-own": "Produced in-house",
197
197
  "text.learning-source-public": "Public body",
@@ -216,8 +216,9 @@
216
216
  "text.learning-unit-markdown-hint": "Keep the text open and visible for the minimum learning time to complete this unit.",
217
217
  "text.learning-unit-min-seconds": "Minimum reading time: {seconds} s",
218
218
  "text.learning-unit-min-seconds-hint": "Leave blank to use a minimum reading time of 60 seconds.",
219
+ "text.learning-unit-pages": "{pages} pages",
219
220
  "text.learning-unit-pdf": "Document (PDF)",
220
- "text.learning-unit-pdf-hint": "Keep the PDF open and visible for the minimum learning time to complete this unit.",
221
+ "text.learning-unit-pdf-hint": "The unit is done once every page has been read in order and the minimum time is reached. The page count is read from the file.",
221
222
  "text.learning-unit-video": "Video",
222
223
  "text.learning-unit-video-hint": "Watch the video to the end and meet its required learning time to complete the unit. You cannot skip to an unwatched section.",
223
224
  "text.learning-version-close-confirm": "Closing this version prevents new learners from starting it. Learners who have already started can continue.",
@@ -251,5 +252,37 @@
251
252
  "title.learning-unit-new": "New unit",
252
253
  "title.learning-units": "Units",
253
254
  "title.learning-version-settings": "Completion and source",
254
- "title.learning-versions": "Versions"
255
+ "title.learning-versions": "Versions",
256
+ "button.learning-ai-material": "Draft with AI from material",
257
+ "button.learning-ai-generate": "Generate draft",
258
+ "button.learning-ai-apply": "Add reviewed draft",
259
+ "button.learning-ai-revise": "Revise request",
260
+ "field.learning-ai-source": "Source material",
261
+ "field.learning-ai-captions": "Video captions or transcript",
262
+ "field.learning-ai-instruction": "Audience, learning goals and requests",
263
+ "title.learning-ai-material": "Prepare a course draft from material",
264
+ "title.learning-ai-preview": "Review AI draft",
265
+ "title.learning-ai-missing": "Items to verify or complete",
266
+ "text.learning-ai-upload-first": "First add a PDF or video unit and upload its file.",
267
+ "text.learning-ai-material-help": "Prepare an introduction, objectives, supporting units and a quiz from the source. The original stays; generation does not save or publish.",
268
+ "text.learning-ai-captions-help": "Provide captions or a transcript, or leave blank to transcribe speech automatically. Automatic transcription sends audio to an external AI service and may incur charges in addition to draft generation. Video visuals are not analyzed. Review and edit the transcript after generation.",
269
+ "text.learning-ai-working": "Reading the material and preparing a draft.",
270
+ "text.learning-ai-apply-help": "Adding appends the introduction, supporting units and AI question drafts. Review sources, content, study times and questions before publishing.",
271
+ "error.learning-ai-material-invalid": "The complete source could not be read. Check the file, pages, captions and limits.",
272
+ "error.learning-ai-draft-invalid": "The AI draft has incomplete content, answers or references. The course was not changed. Revise the request and retry.",
273
+ "error.learning-ai-draft-stale": "The course or source changed. Review it and generate a fresh draft.",
274
+ "error.learning-ai-source-limit": "Source limit exceeded: PDF 50 MB, 80 pages, 12 scanned pages; text 120,000 characters. Split the material; it is never silently truncated.",
275
+ "error.learning-ai-source-read": "Could not read the source. Check access and the file, then retry.",
276
+ "error.learning-ai-video-limit": "Automatic transcription supports MP4/WebM up to 60 minutes/250 MB and transcripts up to 120,000 characters. Split the material.",
277
+ "error.learning-ai-transcription-unavailable": "The current AI agent cannot transcribe speech. Configure an OpenAI default agent or supply captions/transcript.",
278
+ "error.learning-ai-audio-unreadable": "Could not read speech. Check server ffmpeg, MP4/WebM format and audio track, or supply captions/transcript.",
279
+ "title.learning-cancel-enrollments": "Cancel {count} enrolments",
280
+ "field.learning-format": "Format",
281
+ "field.learning-unit-count": "Units",
282
+ "field.learning-expected-time": "Time to complete",
283
+ "field.learning-enrolled": "Enrolled",
284
+ "field.learning-completion-rate": "Completion rate",
285
+ "text.learning-minutes-value": "{minutes} min",
286
+ "text.learning-score-value": "{score} points",
287
+ "text.learning-quiz-none": "No quiz"
255
288
  }
@@ -34,6 +34,7 @@
34
34
  "error.learning-audience-invalid": "{target} no pertenece a este dominio.",
35
35
  "error.learning-audience-required": "Seleccione los destinatarios.",
36
36
  "error.learning-cancel-reason-required": "Indique el motivo de la cancelación.",
37
+ "error.learning-cancel-none": "Seleccione las inscripciones que desea cancelar.",
37
38
  "error.learning-content-what": "Indique la inscripción o la versión.",
38
39
  "error.learning-course-name-required": "Indique el nombre del curso.",
39
40
  "error.learning-course-name-taken": "Ya existe un curso llamado «{name}».",
@@ -52,6 +53,7 @@
52
53
  "error.learning-not-a-department-head": "Solo un jefe de departamento puede ver la situación de su equipo.",
53
54
  "error.learning-not-completed": "El certificado solo se emite para un curso finalizado.",
54
55
  "error.learning-not-found": "No se encontró el registro. Recargue e inténtelo de nuevo.",
56
+ "error.learning-page-ahead": "Solo puede pasar a la página siguiente a la última leída (página {allowed}). Pase las páginas en orden.",
55
57
  "error.learning-pass-score-invalid": "La puntuación mínima es un entero de 1 a 100.",
56
58
  "error.learning-position-ahead": "No puede avanzar más allá de lo visto ({allowed} s). Siga reproduciendo el vídeo.",
57
59
  "error.learning-question-answer-required": "Marque al menos una opción correcta.",
@@ -74,6 +76,8 @@
74
76
  "error.learning-unit-kind-invalid": "Seleccione el tipo de unidad.",
75
77
  "error.learning-unit-min-time-invalid": "El tiempo mínimo es un entero de 1 segundo o más.",
76
78
  "error.learning-unit-name-required": "Indique el nombre de la unidad.",
79
+ "error.learning-unit-pages-invalid": "El número de páginas del PDF no es válido.",
80
+ "error.learning-unit-pages-required": "Hay un PDF sin número de páginas conocido. Adjunte de nuevo el archivo.",
77
81
  "error.learning-unit-url-invalid": "El enlace debe empezar por http:// o https://.",
78
82
  "error.learning-units-required": "Añada al menos una unidad antes de publicar.",
79
83
  "error.learning-version-not-draft": "Una versión publicada o cerrada no se puede modificar. Cree una versión nueva.",
@@ -133,7 +137,7 @@
133
137
  "text.learning-attempt-limit-hint": "Déjelo vacío para no limitar.",
134
138
  "text.learning-attempts-left": "Quedan {count} intentos.",
135
139
  "text.learning-best-score": "Mejor puntuación: {score}.",
136
- "text.learning-cancelled": "Inscripción cancelada.",
140
+ "text.learning-cancelled": "Se cancelaron {count} inscripciones.",
137
141
  "text.learning-category-job": "Formación del puesto",
138
142
  "text.learning-category-mandatory": "Formación obligatoria",
139
143
  "text.learning-category-onboarding": "Incorporación",
@@ -143,11 +147,6 @@
143
147
  "text.learning-choice-count": "{count} opciones",
144
148
  "text.learning-completed-detail": "Finalizado el {day}. Certificado n.º {number}.",
145
149
  "text.learning-completed-on": "Finalizado el {day}",
146
- "text.learning-count-assigned": "Sin empezar",
147
- "text.learning-count-completed": "Finalizados",
148
- "text.learning-count-in-progress": "En curso",
149
- "text.learning-count-overdue": "Vencidos",
150
- "text.learning-count-total": "Participantes",
151
150
  "text.learning-course-all": "Todos los cursos",
152
151
  "text.learning-due-on": "Vence el {day}",
153
152
  "text.learning-due-on-hint": "Déjelo vacío para asignar sin fecha límite.",
@@ -170,7 +169,7 @@
170
169
  "text.learning-not-published": "Sin publicar",
171
170
  "text.learning-nothing-to-take": "No tiene cursos asignados.",
172
171
  "text.learning-pass-score-hint": "Sobre 100. Déjelo vacío para no evaluar.",
173
- "text.learning-pick-one": "Seleccione una inscripción.",
172
+ "text.learning-pick-cancellable": "Seleccione las inscripciones que desea cancelar.",
174
173
  "text.learning-pick-open": "Seleccione inscripciones no finalizadas.",
175
174
  "text.learning-question-count-hint": "Cada intento elige al azar este número de preguntas. Déjelo vacío para usarlas todas.",
176
175
  "text.learning-question-delete-confirm": "¿Eliminar esta pregunta?",
@@ -192,6 +191,7 @@
192
191
  "text.learning-remind-note": "Enviado por el responsable del curso.",
193
192
  "text.learning-remind-subject": "[Curso] {course}",
194
193
  "text.learning-reminded": "Se recordó a {count} participantes.",
194
+ "text.learning-saved-at": "Último guardado {time}",
195
195
  "text.learning-source-note-hint": "Registre quién proporcionó el material y sus condiciones (atribución, sin cambios...).",
196
196
  "text.learning-source-own": "Elaboración propia",
197
197
  "text.learning-source-public": "Organismo público",
@@ -216,8 +216,9 @@
216
216
  "text.learning-unit-markdown-hint": "La unidad se completa cuando el texto ha estado abierto el tiempo mínimo.",
217
217
  "text.learning-unit-min-seconds": "abierto {seconds} s",
218
218
  "text.learning-unit-min-seconds-hint": "60 segundos si está vacío.",
219
+ "text.learning-unit-pages": "{pages} páginas",
219
220
  "text.learning-unit-pdf": "Documento (PDF)",
220
- "text.learning-unit-pdf-hint": "La unidad se completa cuando el PDF ha estado abierto el tiempo mínimo.",
221
+ "text.learning-unit-pdf-hint": "La unidad se completa cuando se han leído todas las páginas en orden y se alcanza el tiempo mínimo. El número de páginas se lee del archivo.",
221
222
  "text.learning-unit-video": "Vídeo",
222
223
  "text.learning-unit-video-hint": "La unidad se completa cuando el vídeo se ha reproducido hasta el final con su duración contada. No se puede adelantar más allá de lo visto.",
223
224
  "text.learning-version-close-confirm": "Una vez cerrada, ningún participante nuevo empieza esta versión. Quien la empezó puede terminarla.",
@@ -251,5 +252,37 @@
251
252
  "title.learning-unit-new": "Nueva unidad",
252
253
  "title.learning-units": "Unidades",
253
254
  "title.learning-version-settings": "Finalización y origen",
254
- "title.learning-versions": "Versiones"
255
+ "title.learning-versions": "Versiones",
256
+ "button.learning-ai-material": "Crear borrador con IA",
257
+ "button.learning-ai-generate": "Generar borrador",
258
+ "button.learning-ai-apply": "Añadir borrador revisado",
259
+ "button.learning-ai-revise": "Modificar solicitud",
260
+ "field.learning-ai-source": "Material original",
261
+ "field.learning-ai-captions": "Subtítulos o transcripción",
262
+ "field.learning-ai-instruction": "Público, objetivos y peticiones",
263
+ "title.learning-ai-material": "Preparar curso desde material",
264
+ "title.learning-ai-preview": "Revisar borrador de IA",
265
+ "title.learning-ai-missing": "Datos por verificar o completar",
266
+ "text.learning-ai-upload-first": "Primero añada una unidad PDF o vídeo y suba el archivo.",
267
+ "text.learning-ai-material-help": "Prepara introducción, objetivos, unidades y evaluación. Conserva el original; generar no guarda ni publica.",
268
+ "text.learning-ai-captions-help": "Adjunte subtítulos o una transcripción, o deje el campo vacío para transcribir el audio automáticamente. La transcripción envía audio a un servicio externo de IA y puede tener un coste adicional a la generación del borrador. No se analizan las imágenes del vídeo. Revise y edite la transcripción después de generar.",
269
+ "text.learning-ai-working": "Leyendo el material y preparando el borrador.",
270
+ "text.learning-ai-apply-help": "Se añaden introducción, unidades y preguntas de IA. Revise fuentes, contenido, tiempos y preguntas antes de publicar.",
271
+ "error.learning-ai-material-invalid": "No se pudo leer la fuente completa. Revise archivo, páginas, subtítulos y límites.",
272
+ "error.learning-ai-draft-invalid": "El borrador tiene contenido, respuestas o referencias incompletas. El curso no cambió. Modifique la solicitud.",
273
+ "error.learning-ai-draft-stale": "El curso o la fuente cambió. Revise y genere otro borrador.",
274
+ "error.learning-ai-source-limit": "Límite: PDF 50 MB, 80 páginas, 12 escaneadas; texto 120.000 caracteres. Divida el material; no se recorta en silencio.",
275
+ "error.learning-ai-source-read": "No se pudo leer la fuente. Revise acceso y archivo e inténtelo de nuevo.",
276
+ "error.learning-ai-video-limit": "Transcripción: MP4/WebM de hasta 60 minutos/250 MB y texto de 120.000 caracteres. Divida el material.",
277
+ "error.learning-ai-transcription-unavailable": "El agente actual no transcribe audio. Configure OpenAI como predeterminado o aporte subtítulos.",
278
+ "error.learning-ai-audio-unreadable": "No se pudo leer el audio. Revise ffmpeg, formato MP4/WebM y pista de audio, o aporte subtítulos.",
279
+ "title.learning-cancel-enrollments": "Cancelar {count} inscripciones",
280
+ "field.learning-format": "Formato",
281
+ "field.learning-unit-count": "Unidades",
282
+ "field.learning-expected-time": "Tiempo necesario",
283
+ "field.learning-enrolled": "Inscritos",
284
+ "field.learning-completion-rate": "Tasa de finalización",
285
+ "text.learning-minutes-value": "{minutes} min",
286
+ "text.learning-score-value": "{score} puntos",
287
+ "text.learning-quiz-none": "Sin evaluación"
255
288
  }
@@ -34,6 +34,7 @@
34
34
  "error.learning-audience-invalid": "{target}はこの事業所の対象ではありません。",
35
35
  "error.learning-audience-required": "受講対象を選択してください。",
36
36
  "error.learning-cancel-reason-required": "取消理由を入力してください。",
37
+ "error.learning-cancel-none": "取り消す受講を選択してください。",
37
38
  "error.learning-content-what": "受講または改訂版を指定してください。",
38
39
  "error.learning-course-name-required": "コース名を入力してください。",
39
40
  "error.learning-course-name-taken": "「{name}」コースはすでにあります。",
@@ -52,6 +53,7 @@
52
53
  "error.learning-not-a-department-head": "部署長のみ所属社員の受講状況を閲覧できます。",
53
54
  "error.learning-not-completed": "修了証は修了したコースにのみ発行できます。",
54
55
  "error.learning-not-found": "記録が見つかりません。画面を更新してから再度お試しください。",
56
+ "error.learning-page-ahead": "読んだページ({allowed}ページ)の次のページまでしか進めません。順番にページをめくってください。",
55
57
  "error.learning-pass-score-invalid": "合格点は1から100の整数で入力してください。",
56
58
  "error.learning-position-ahead": "視聴した位置({allowed}秒)より先には進めません。動画を続けて再生してください。",
57
59
  "error.learning-question-answer-required": "正解を1つ以上指定してください。",
@@ -74,6 +76,8 @@
74
76
  "error.learning-unit-kind-invalid": "単元の種類を選択してください。",
75
77
  "error.learning-unit-min-time-invalid": "最低学習時間は1秒以上の整数で入力してください。",
76
78
  "error.learning-unit-name-required": "単元名を入力してください。",
79
+ "error.learning-unit-pages-invalid": "PDFのページ数が正しくありません。",
80
+ "error.learning-unit-pages-required": "ページ数を確認できないPDFがあります。PDFファイルを再度添付してください。",
77
81
  "error.learning-unit-url-invalid": "リンク先はhttp://またはhttps://で始まる必要があります。",
78
82
  "error.learning-units-required": "単元を1つ以上登録すると公開できます。",
79
83
  "error.learning-version-not-draft": "公開済みまたは終了した改訂版は変更できません。変更するには新しい改訂版を作成してください。",
@@ -133,7 +137,7 @@
133
137
  "text.learning-attempt-limit-hint": "空欄の場合、受験回数を制限しません。",
134
138
  "text.learning-attempts-left": "残りの受験回数は{count}回です。",
135
139
  "text.learning-best-score": "最高点は{score}点です。",
136
- "text.learning-cancelled": "受講を取り消しました。",
140
+ "text.learning-cancelled": "受講{count}件を取り消しました。",
137
141
  "text.learning-category-job": "職務教育",
138
142
  "text.learning-category-mandatory": "法定義務教育",
139
143
  "text.learning-category-onboarding": "入社教育",
@@ -143,11 +147,6 @@
143
147
  "text.learning-choice-count": "選択肢{count}個",
144
148
  "text.learning-completed-detail": "{day}に修了しました。修了番号は{number}です。",
145
149
  "text.learning-completed-on": "{day} 修了",
146
- "text.learning-count-assigned": "未着手",
147
- "text.learning-count-completed": "修了",
148
- "text.learning-count-in-progress": "進行中",
149
- "text.learning-count-overdue": "期限超過",
150
- "text.learning-count-total": "対象",
151
150
  "text.learning-course-all": "すべてのコース",
152
151
  "text.learning-due-on": "{day}まで",
153
152
  "text.learning-due-on-hint": "空欄の場合、期限なしで割り当てられます。",
@@ -170,7 +169,7 @@
170
169
  "text.learning-not-published": "公開中の改訂版なし",
171
170
  "text.learning-nothing-to-take": "割り当てられたコースはありません。",
172
171
  "text.learning-pass-score-hint": "100点満点です。空欄の場合、評価なしで修了できます。",
173
- "text.learning-pick-one": "受講を1件選択してください。",
172
+ "text.learning-pick-cancellable": "取り消す受講を選択してください。",
174
173
  "text.learning-pick-open": "進行中または未着手の受講を選択してください。",
175
174
  "text.learning-question-count-hint": "受験ごとに登録問題からこの数だけ無作為に出題します。空欄の場合はすべて出題します。",
176
175
  "text.learning-question-delete-confirm": "この問題を削除しますか?",
@@ -192,6 +191,7 @@
192
191
  "text.learning-remind-note": "受講担当者からの通知です。",
193
192
  "text.learning-remind-subject": "[受講案内] {course}",
194
193
  "text.learning-reminded": "{count}名に通知しました。",
194
+ "text.learning-saved-at": "最終保存 {time}",
195
195
  "text.learning-source-note-hint": "資料の提供機関と利用条件(出典表示、改変禁止など)を記録してください。",
196
196
  "text.learning-source-own": "自社制作",
197
197
  "text.learning-source-public": "公共機関の資料",
@@ -216,8 +216,9 @@
216
216
  "text.learning-unit-markdown-hint": "本文を最低学習時間だけ閲覧すると単元が完了します。",
217
217
  "text.learning-unit-min-seconds": "最低{seconds}秒閲覧",
218
218
  "text.learning-unit-min-seconds-hint": "空欄の場合は60秒です。",
219
+ "text.learning-unit-pages": "{pages}ページ",
219
220
  "text.learning-unit-pdf": "文書(PDF)",
220
- "text.learning-unit-pdf-hint": "PDFを最低学習時間だけ閲覧すると単元が完了します。",
221
+ "text.learning-unit-pdf-hint": "PDFのすべてのページを順番に読み、設定した時間学習すると単元が完了します。ページ数はファイルから自動的に読み取ります。",
221
222
  "text.learning-unit-video": "動画",
222
223
  "text.learning-unit-video-hint": "動画を最後まで再生し、再生時間分の学習時間が記録されると単元が完了します。視聴した位置より先には進めません。",
223
224
  "text.learning-version-close-confirm": "改訂版を終了すると、新しい受講者はこの改訂版で学習を開始できません。開始済みの受講者は継続できます。",
@@ -251,5 +252,37 @@
251
252
  "title.learning-unit-new": "単元の追加",
252
253
  "title.learning-units": "単元",
253
254
  "title.learning-version-settings": "修了条件と出典",
254
- "title.learning-versions": "改訂版"
255
+ "title.learning-versions": "改訂版",
256
+ "button.learning-ai-material": "資料からAI草案を作成",
257
+ "button.learning-ai-generate": "草案を生成",
258
+ "button.learning-ai-apply": "確認した草案を追加",
259
+ "button.learning-ai-revise": "依頼を修正",
260
+ "field.learning-ai-source": "元の教材",
261
+ "field.learning-ai-captions": "動画の字幕・台本",
262
+ "field.learning-ai-instruction": "対象・学習目標・追加依頼",
263
+ "title.learning-ai-material": "教材から講座の草案を作成",
264
+ "title.learning-ai-preview": "AI草案を確認",
265
+ "title.learning-ai-missing": "追加確認・補完事項",
266
+ "text.learning-ai-upload-first": "先にPDFまたは動画の単元を追加し、ファイルをアップロードしてください。",
267
+ "text.learning-ai-material-help": "資料から紹介・目標・補足単元・評価と解説を作成します。原本は保持され、生成だけでは保存・公開されません。",
268
+ "text.learning-ai-captions-help": "字幕・台本を入力するか、空欄にすると音声を自動で文字起こしします。自動文字起こしでは音声を外部AIサービスに送信し、教材生成とは別に料金が発生する場合があります。映像画面は分析しません。生成後に文字起こしを確認・修正できます。",
269
+ "text.learning-ai-working": "資料を読み込み、草案を作成しています。",
270
+ "text.learning-ai-apply-help": "追加すると既存単元の後に紹介・補足単元とAI設問草案を保存します。出典・内容・学習時間・設問を確認してから公開してください。",
271
+ "error.learning-ai-material-invalid": "資料全体を読めません。ファイル・ページ数・字幕・上限を確認してください。",
272
+ "error.learning-ai-draft-invalid": "AI草案の内容・正解・出典が不完全です。講座は未変更です。依頼を修正して再生成してください。",
273
+ "error.learning-ai-draft-stale": "講座または元の資料が変更されました。確認して草案を再生成してください。",
274
+ "error.learning-ai-source-limit": "上限超過です。PDF 50MB・80ページ・スキャン12ページ、テキスト12万文字以内に分割してください。内容を黙って切り捨てません。",
275
+ "error.learning-ai-source-read": "元の資料を読めません。アクセス権とファイルを確認して再試行してください。",
276
+ "error.learning-ai-video-limit": "自動文字起こしは60分・250MB以下のMP4/WebM、12万文字以内の台本に対応します。資料を分割してください。",
277
+ "error.learning-ai-transcription-unavailable": "現在のAIは音声文字起こしに対応していません。OpenAIを既定にするか字幕・台本を提供してください。",
278
+ "error.learning-ai-audio-unreadable": "音声を読めません。ffmpeg・MP4/WebM形式・音声トラックを確認するか字幕を提供してください。",
279
+ "title.learning-cancel-enrollments": "受講{count}件の取消",
280
+ "field.learning-format": "教育形式",
281
+ "field.learning-unit-count": "単元数",
282
+ "field.learning-expected-time": "所要時間",
283
+ "field.learning-enrolled": "受講対象",
284
+ "field.learning-completion-rate": "修了率",
285
+ "text.learning-minutes-value": "{minutes}分",
286
+ "text.learning-score-value": "{score}点",
287
+ "text.learning-quiz-none": "評価なし"
255
288
  }
@@ -34,6 +34,7 @@
34
34
  "error.learning-audience-invalid": "{target}은(는) 이 사업장의 대상이 아닙니다.",
35
35
  "error.learning-audience-required": "수강 대상을 선택하세요.",
36
36
  "error.learning-cancel-reason-required": "취소 사유를 입력하세요.",
37
+ "error.learning-cancel-none": "취소할 수강을 선택하세요.",
37
38
  "error.learning-content-what": "수강 또는 개정본을 지정하세요.",
38
39
  "error.learning-course-name-required": "과정 이름을 입력하세요.",
39
40
  "error.learning-course-name-taken": "「{name}」 과정이 이미 있습니다.",
@@ -52,6 +53,7 @@
52
53
  "error.learning-not-a-department-head": "부서장만 소속 직원의 수강 현황을 열람할 수 있습니다.",
53
54
  "error.learning-not-completed": "수료증은 이수한 과정에만 발급할 수 있습니다.",
54
55
  "error.learning-not-found": "기록을 찾을 수 없습니다. 화면을 새로 고친 뒤 다시 시도하세요.",
56
+ "error.learning-page-ahead": "읽은 페이지({allowed}쪽) 다음 페이지까지만 넘길 수 있습니다. 페이지를 차례대로 넘기세요.",
55
57
  "error.learning-pass-score-invalid": "합격 점수는 1부터 100 사이의 정수로 입력하세요.",
56
58
  "error.learning-position-ahead": "시청한 구간({allowed}초)보다 앞으로 이동할 수 없습니다. 해당 위치부터 영상을 재생하세요.",
57
59
  "error.learning-question-answer-required": "정답을 하나 이상 지정하세요.",
@@ -74,6 +76,8 @@
74
76
  "error.learning-unit-kind-invalid": "단원 유형을 선택하세요.",
75
77
  "error.learning-unit-min-time-invalid": "최소 학습 시간은 1초 이상의 정수로 입력하세요.",
76
78
  "error.learning-unit-name-required": "단원 이름을 입력하세요.",
79
+ "error.learning-unit-pages-invalid": "PDF 페이지 수가 올바르지 않습니다.",
80
+ "error.learning-unit-pages-required": "페이지 수를 확인할 수 없는 PDF가 있습니다. PDF 파일을 다시 첨부하세요.",
77
81
  "error.learning-unit-url-invalid": "링크 주소는 http:// 또는 https://로 시작해야 합니다.",
78
82
  "error.learning-units-required": "단원을 하나 이상 등록해야 공개할 수 있습니다.",
79
83
  "error.learning-version-not-draft": "공개되었거나 종료된 개정본은 수정할 수 없습니다. 변경하려면 새 개정본을 작성하세요.",
@@ -133,7 +137,7 @@
133
137
  "text.learning-attempt-limit-hint": "비워 두면 응시 횟수를 제한하지 않습니다.",
134
138
  "text.learning-attempts-left": "남은 응시 횟수는 {count}회입니다.",
135
139
  "text.learning-best-score": "최고 점수는 {score}점입니다.",
136
- "text.learning-cancelled": "수강을 취소했습니다.",
140
+ "text.learning-cancelled": "수강 {count}건을 취소했습니다.",
137
141
  "text.learning-category-job": "직무 교육",
138
142
  "text.learning-category-mandatory": "법정 의무교육",
139
143
  "text.learning-category-onboarding": "입사 교육",
@@ -143,11 +147,6 @@
143
147
  "text.learning-choice-count": "보기 {count}개",
144
148
  "text.learning-completed-detail": "{day}에 이수했습니다. 수료 번호는 {number}입니다.",
145
149
  "text.learning-completed-on": "{day} 이수",
146
- "text.learning-count-assigned": "미착수",
147
- "text.learning-count-completed": "이수",
148
- "text.learning-count-in-progress": "진행 중",
149
- "text.learning-count-overdue": "기한 지남",
150
- "text.learning-count-total": "대상",
151
150
  "text.learning-course-all": "모든 과정",
152
151
  "text.learning-due-on": "{day}까지",
153
152
  "text.learning-due-on-hint": "비워 두면 기한 없이 배정됩니다.",
@@ -170,7 +169,7 @@
170
169
  "text.learning-not-published": "공개된 개정본 없음",
171
170
  "text.learning-nothing-to-take": "배정된 과정이 없습니다.",
172
171
  "text.learning-pass-score-hint": "100점 만점 기준입니다. 비워 두면 평가 없이 이수할 수 있습니다.",
173
- "text.learning-pick-one": "수강을 하나 선택하세요.",
172
+ "text.learning-pick-cancellable": "취소할 수강을 선택하세요.",
174
173
  "text.learning-pick-open": "미이수 상태의 수강 내역을 선택하세요.",
175
174
  "text.learning-question-count-hint": "응시할 때마다 등록된 문항 중 이 수만큼 무작위로 출제합니다. 비워 두면 모든 문항을 출제합니다.",
176
175
  "text.learning-question-delete-confirm": "이 문항을 삭제하시겠습니까?",
@@ -192,6 +191,7 @@
192
191
  "text.learning-remind-note": "수강 담당자가 보낸 알림입니다.",
193
192
  "text.learning-remind-subject": "[수강 안내] {course}",
194
193
  "text.learning-reminded": "{count}명에게 알림을 보냈습니다.",
194
+ "text.learning-saved-at": "마지막 저장 {time}",
195
195
  "text.learning-source-note-hint": "자료를 제공한 기관과 이용 조건(출처 표시, 변경 금지 등)을 기록하세요.",
196
196
  "text.learning-source-own": "자체 제작",
197
197
  "text.learning-source-public": "공공기관 자료",
@@ -216,8 +216,9 @@
216
216
  "text.learning-unit-markdown-hint": "화면이 표시된 상태에서 본문을 최소 학습 시간 동안 열람하면 단원이 완료됩니다.",
217
217
  "text.learning-unit-min-seconds": "최소 {seconds}초 열람",
218
218
  "text.learning-unit-min-seconds-hint": "입력하지 않으면 최소 열람 시간은 60초입니다.",
219
+ "text.learning-unit-pages": "{pages}쪽",
219
220
  "text.learning-unit-pdf": "문서(PDF)",
220
- "text.learning-unit-pdf-hint": "화면이 표시된 상태에서 PDF를 최소 학습 시간 동안 열람하면 단원이 완료됩니다.",
221
+ "text.learning-unit-pdf-hint": "PDF의 모든 페이지를 차례대로 읽고, 정한 시간만큼 학습해야 단원이 완료됩니다. 페이지 수는 파일에서 자동으로 읽습니다.",
221
222
  "text.learning-unit-video": "동영상",
222
223
  "text.learning-unit-video-hint": "동영상을 끝까지 시청하고, 재생 시간에 해당하는 학습 시간을 충족하면 단원이 완료됩니다. 아직 시청하지 않은 구간으로는 이동할 수 없습니다.",
223
224
  "text.learning-version-close-confirm": "개정본을 종료하면 새 수강자는 이 개정본으로 학습을 시작할 수 없습니다. 이미 시작한 수강자는 계속 학습할 수 있습니다.",
@@ -251,5 +252,37 @@
251
252
  "title.learning-unit-new": "단원 추가",
252
253
  "title.learning-units": "단원",
253
254
  "title.learning-version-settings": "이수 조건과 출처",
254
- "title.learning-versions": "개정본"
255
+ "title.learning-versions": "개정본",
256
+ "button.learning-ai-material": "자료로 AI 초안 만들기",
257
+ "button.learning-ai-generate": "초안 생성",
258
+ "button.learning-ai-apply": "검토한 초안 추가",
259
+ "button.learning-ai-revise": "요청 수정 후 다시 생성",
260
+ "field.learning-ai-source": "교육 원본 자료",
261
+ "field.learning-ai-captions": "동영상 자막·대본 파일",
262
+ "field.learning-ai-instruction": "대상·학습 목표·추가 요청",
263
+ "title.learning-ai-material": "자료에서 교육 초안 준비",
264
+ "title.learning-ai-preview": "AI 초안 검토",
265
+ "title.learning-ai-missing": "추가 확인·보완 사항",
266
+ "text.learning-ai-upload-first": "먼저 PDF 또는 동영상 단원을 추가하고 파일을 올려 주세요.",
267
+ "text.learning-ai-material-help": "자료를 바탕으로 소개·학습 목표·보충 단원·평가와 해설을 준비합니다. 원본은 유지하며, 생성만으로 저장되거나 공개되지 않습니다.",
268
+ "text.learning-ai-captions-help": "자막·대본을 넣거나 비워 두면 음성을 자동 전사합니다. 자동 전사는 음성을 외부 AI 서비스로 보내며, 교안 생성과 별도로 이용 비용이 발생할 수 있습니다. 영상 화면은 분석하지 않습니다. 생성 후 전사문을 확인하고 수정할 수 있습니다.",
269
+ "text.learning-ai-working": "자료를 읽고 초안을 준비하고 있습니다.",
270
+ "text.learning-ai-apply-help": "추가하면 기존 단원 뒤에 소개와 보충 단원, AI 평가 초안이 저장됩니다. 출처·내용·학습시간을 검토하고 평가 문항을 확인해 저장한 뒤 공개하세요.",
271
+ "error.learning-ai-material-invalid": "자료 전체를 읽지 못했습니다. 파일·페이지 수·자막과 허용 범위를 확인하세요.",
272
+ "error.learning-ai-draft-invalid": "AI 응답의 내용·정답·출처가 불완전합니다. 과정은 변경되지 않았습니다. 요청을 조정해 다시 생성하세요.",
273
+ "error.learning-ai-draft-stale": "과정이나 원본 자료가 변경됐습니다. 최신 내용을 확인하고 초안을 다시 생성하세요.",
274
+ "error.learning-ai-source-limit": "자료 한도를 넘었습니다. PDF 50MB·80쪽·스캔 12쪽, 텍스트 12만 자 이내 자료로 나눠 주세요. 일부 내용만 잘라 생성하지 않습니다.",
275
+ "error.learning-ai-source-read": "원본 자료를 읽지 못했습니다. 접근 권한과 파일 상태를 확인하고 다시 시도하세요.",
276
+ "error.learning-ai-video-limit": "자동 전사는 60분·250MB 이하 MP4/WebM과 12만 자 이내 대본을 지원합니다. 자료를 나눠 주세요.",
277
+ "error.learning-ai-transcription-unavailable": "현재 AI 설정은 음성 전사를 지원하지 않습니다. OpenAI 에이전트를 기본 AI로 설정하거나 자막·대본을 첨부해 주세요.",
278
+ "error.learning-ai-audio-unreadable": "음성을 읽지 못했습니다. 서버 ffmpeg 설치, MP4/WebM 형식과 음성 트랙을 확인하거나 자막·대본을 첨부해 주세요.",
279
+ "title.learning-cancel-enrollments": "수강 {count}건 취소",
280
+ "field.learning-format": "교육 형태",
281
+ "field.learning-unit-count": "단원 수",
282
+ "field.learning-expected-time": "소요 시간",
283
+ "field.learning-enrolled": "수강 대상",
284
+ "field.learning-completion-rate": "이수율",
285
+ "text.learning-minutes-value": "{minutes}분",
286
+ "text.learning-score-value": "{score}점",
287
+ "text.learning-quiz-none": "평가 없음"
255
288
  }
@@ -34,6 +34,7 @@
34
34
  "error.learning-audience-invalid": "{target} bukan dari domain ini.",
35
35
  "error.learning-audience-required": "Pilih peserta.",
36
36
  "error.learning-cancel-reason-required": "Masukkan sebab pembatalan.",
37
+ "error.learning-cancel-none": "Pilih pendaftaran yang hendak dibatalkan.",
37
38
  "error.learning-content-what": "Nyatakan pendaftaran atau versi.",
38
39
  "error.learning-course-name-required": "Masukkan nama kursus.",
39
40
  "error.learning-course-name-taken": "Kursus bernama “{name}” sudah wujud.",
@@ -52,6 +53,7 @@
52
53
  "error.learning-not-a-department-head": "Hanya ketua jabatan boleh melihat status kakitangannya.",
53
54
  "error.learning-not-completed": "Sijil hanya dikeluarkan untuk kursus yang tamat.",
54
55
  "error.learning-not-found": "Rekod tidak ditemui. Muat semula dan cuba lagi.",
56
+ "error.learning-page-ahead": "Anda hanya boleh ke halaman selepas halaman terakhir dibaca (halaman {allowed}). Selak halaman mengikut urutan.",
55
57
  "error.learning-pass-score-invalid": "Markah lulus ialah nombor bulat 1 hingga 100.",
56
58
  "error.learning-position-ahead": "Anda tidak boleh melompat melepasi bahagian yang ditonton ({allowed} s). Teruskan memainkan video.",
57
59
  "error.learning-question-answer-required": "Tandakan sekurang-kurangnya satu pilihan betul.",
@@ -74,6 +76,8 @@
74
76
  "error.learning-unit-kind-invalid": "Pilih jenis unit.",
75
77
  "error.learning-unit-min-time-invalid": "Masa minimum mesti nombor bulat 1 saat atau lebih.",
76
78
  "error.learning-unit-name-required": "Masukkan nama unit.",
79
+ "error.learning-unit-pages-invalid": "Bilangan halaman PDF tidak sah.",
80
+ "error.learning-unit-pages-required": "Bilangan halaman sebuah PDF tidak diketahui. Lampirkan failnya semula.",
77
81
  "error.learning-unit-url-invalid": "Pautan mesti bermula dengan http:// atau https://.",
78
82
  "error.learning-units-required": "Tambah sekurang-kurangnya satu unit sebelum menerbitkan.",
79
83
  "error.learning-version-not-draft": "Versi yang diterbitkan atau ditutup tidak boleh diubah. Mulakan versi baharu.",
@@ -133,7 +137,7 @@
133
137
  "text.learning-attempt-limit-hint": "Biarkan kosong untuk tiada had.",
134
138
  "text.learning-attempts-left": "Baki cubaan: {count}.",
135
139
  "text.learning-best-score": "Markah terbaik: {score}.",
136
- "text.learning-cancelled": "Pendaftaran dibatalkan.",
140
+ "text.learning-cancelled": "{count} pendaftaran telah dibatalkan.",
137
141
  "text.learning-category-job": "Latihan tugas",
138
142
  "text.learning-category-mandatory": "Latihan wajib",
139
143
  "text.learning-category-onboarding": "Orientasi",
@@ -143,11 +147,6 @@
143
147
  "text.learning-choice-count": "{count} pilihan",
144
148
  "text.learning-completed-detail": "Tamat pada {day}. No. sijil {number}.",
145
149
  "text.learning-completed-on": "Tamat {day}",
146
- "text.learning-count-assigned": "Belum mula",
147
- "text.learning-count-completed": "Tamat",
148
- "text.learning-count-in-progress": "Sedang berjalan",
149
- "text.learning-count-overdue": "Lewat",
150
- "text.learning-count-total": "Peserta",
151
150
  "text.learning-course-all": "Semua kursus",
152
151
  "text.learning-due-on": "Tamat tempoh {day}",
153
152
  "text.learning-due-on-hint": "Biarkan kosong untuk tugasan tanpa tarikh akhir.",
@@ -170,7 +169,7 @@
170
169
  "text.learning-not-published": "Belum diterbitkan",
171
170
  "text.learning-nothing-to-take": "Tiada kursus ditugaskan kepada anda.",
172
171
  "text.learning-pass-score-hint": "Daripada 100. Biarkan kosong untuk tiada kuiz.",
173
- "text.learning-pick-one": "Pilih satu pendaftaran.",
172
+ "text.learning-pick-cancellable": "Pilih pendaftaran yang hendak dibatalkan.",
174
173
  "text.learning-pick-open": "Pilih pendaftaran yang belum tamat.",
175
174
  "text.learning-question-count-hint": "Setiap cubaan memilih sebanyak ini soalan secara rawak. Biarkan kosong untuk semua.",
176
175
  "text.learning-question-delete-confirm": "Padam soalan ini?",
@@ -192,6 +191,7 @@
192
191
  "text.learning-remind-note": "Dihantar oleh pengurus kursus.",
193
192
  "text.learning-remind-subject": "[Kursus] {course}",
194
193
  "text.learning-reminded": "{count} peserta telah diingatkan.",
194
+ "text.learning-saved-at": "Terakhir disimpan {time}",
195
195
  "text.learning-source-note-hint": "Rekodkan pembekal bahan dan syaratnya (atribusi, tiada pengubahan ...).",
196
196
  "text.learning-source-own": "Buatan dalaman",
197
197
  "text.learning-source-public": "Badan awam",
@@ -216,8 +216,9 @@
216
216
  "text.learning-unit-markdown-hint": "Unit selesai apabila teks dibuka selama masa minimum.",
217
217
  "text.learning-unit-min-seconds": "dibuka {seconds} s",
218
218
  "text.learning-unit-min-seconds-hint": "60 saat jika kosong.",
219
+ "text.learning-unit-pages": "{pages} halaman",
219
220
  "text.learning-unit-pdf": "Dokumen (PDF)",
220
- "text.learning-unit-pdf-hint": "Unit selesai apabila PDF dibuka selama masa minimum.",
221
+ "text.learning-unit-pdf-hint": "Unit selesai apabila semua halaman dibaca mengikut urutan dan masa minimum dicapai. Bilangan halaman dibaca daripada fail.",
221
222
  "text.learning-unit-video": "Video",
222
223
  "text.learning-unit-video-hint": "Unit selesai apabila video dimainkan hingga habis dengan tempohnya dikira. Tidak boleh melompat melepasi bahagian yang belum ditonton.",
223
224
  "text.learning-version-close-confirm": "Setelah ditutup, tiada peserta baharu boleh memulakan versi ini. Yang telah bermula boleh menamatkannya.",
@@ -251,5 +252,37 @@
251
252
  "title.learning-unit-new": "Unit baharu",
252
253
  "title.learning-units": "Unit",
253
254
  "title.learning-version-settings": "Syarat tamat dan sumber",
254
- "title.learning-versions": "Versi"
255
+ "title.learning-versions": "Versi",
256
+ "button.learning-ai-material": "Draf AI daripada bahan",
257
+ "button.learning-ai-generate": "Jana draf",
258
+ "button.learning-ai-apply": "Tambah draf disemak",
259
+ "button.learning-ai-revise": "Ubah permintaan",
260
+ "field.learning-ai-source": "Bahan asal",
261
+ "field.learning-ai-captions": "Sari kata atau transkrip",
262
+ "field.learning-ai-instruction": "Sasaran, matlamat dan permintaan",
263
+ "title.learning-ai-material": "Sediakan draf kursus daripada bahan",
264
+ "title.learning-ai-preview": "Semak draf AI",
265
+ "title.learning-ai-missing": "Perkara untuk disahkan atau dilengkapkan",
266
+ "text.learning-ai-upload-first": "Tambah unit PDF atau video dan muat naik fail dahulu.",
267
+ "text.learning-ai-material-help": "Sediakan pengenalan, objektif, unit tambahan dan kuiz. Bahan asal dikekalkan; penjanaan tidak menyimpan atau menerbitkan.",
268
+ "text.learning-ai-captions-help": "Sediakan sari kata atau transkrip, atau biarkan kosong untuk transkripsi pertuturan automatik. Transkripsi automatik menghantar audio kepada perkhidmatan AI luaran dan mungkin dikenakan caj selain penjanaan draf. Visual video tidak dianalisis. Semak dan sunting transkrip selepas penjanaan.",
269
+ "text.learning-ai-working": "Membaca bahan dan menyediakan draf.",
270
+ "text.learning-ai-apply-help": "Pengenalan, unit tambahan dan draf soalan AI akan ditambah. Semak sumber, kandungan, masa dan soalan sebelum menerbitkan.",
271
+ "error.learning-ai-material-invalid": "Sumber lengkap tidak dapat dibaca. Semak fail, halaman, sari kata dan had.",
272
+ "error.learning-ai-draft-invalid": "Kandungan, jawapan atau rujukan draf tidak lengkap. Kursus tidak diubah. Ubah permintaan dan cuba lagi.",
273
+ "error.learning-ai-draft-stale": "Kursus atau sumber telah berubah. Semak dan jana draf baharu.",
274
+ "error.learning-ai-source-limit": "Had: PDF 50 MB, 80 halaman, 12 halaman imbasan; teks 120,000 aksara. Bahagikan bahan; kandungan tidak dipotong diam-diam.",
275
+ "error.learning-ai-source-read": "Sumber tidak dapat dibaca. Semak akses dan fail, kemudian cuba lagi.",
276
+ "error.learning-ai-video-limit": "Transkripsi menyokong MP4/WebM sehingga 60 minit/250 MB dan 120,000 aksara. Bahagikan bahan.",
277
+ "error.learning-ai-transcription-unavailable": "Ejen semasa tidak menyokong transkripsi. Tetapkan OpenAI sebagai lalai atau berikan sari kata.",
278
+ "error.learning-ai-audio-unreadable": "Audio tidak dapat dibaca. Semak ffmpeg, format MP4/WebM dan trek audio, atau berikan sari kata.",
279
+ "title.learning-cancel-enrollments": "Batalkan {count} pendaftaran",
280
+ "field.learning-format": "Format",
281
+ "field.learning-unit-count": "Unit",
282
+ "field.learning-expected-time": "Masa diperlukan",
283
+ "field.learning-enrolled": "Peserta",
284
+ "field.learning-completion-rate": "Kadar tamat",
285
+ "text.learning-minutes-value": "{minutes} min",
286
+ "text.learning-score-value": "{score} mata",
287
+ "text.learning-quiz-none": "Tiada kuiz"
255
288
  }