@things-factory/learning 10.1.260 → 10.1.261

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 (94) 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 -1
  11. package/dist-client/pages/learning-course-list.js +6 -2
  12. package/dist-client/pages/learning-course-list.js.map +1 -1
  13. package/dist-client/pages/learning-enrollment-status.d.ts +28 -16
  14. package/dist-client/pages/learning-enrollment-status.js +95 -112
  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 +1 -0
  32. package/dist-server/service/course/course-query.js +14 -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-query.d.ts +5 -4
  62. package/dist-server/service/enrollment/enrollment-query.js +26 -35
  63. package/dist-server/service/enrollment/enrollment-query.js.map +1 -1
  64. package/dist-server/service/enrollment/enrollment-service.js +13 -3
  65. package/dist-server/service/enrollment/enrollment-service.js.map +1 -1
  66. package/dist-server/service/enrollment/enrollment-status.d.ts +31 -18
  67. package/dist-server/service/enrollment/enrollment-status.js +101 -42
  68. package/dist-server/service/enrollment/enrollment-status.js.map +1 -1
  69. package/dist-server/service/enrollment/enrollment-type.d.ts +1 -14
  70. package/dist-server/service/enrollment/enrollment-type.js +6 -54
  71. package/dist-server/service/enrollment/enrollment-type.js.map +1 -1
  72. package/dist-server/service/enrollment/enrollment.d.ts +1 -0
  73. package/dist-server/service/enrollment/enrollment.js +5 -0
  74. package/dist-server/service/enrollment/enrollment.js.map +1 -1
  75. package/dist-server/service/enrollment/learning-ai.d.ts +9 -2
  76. package/dist-server/service/enrollment/learning-ai.js +25 -28
  77. package/dist-server/service/enrollment/learning-ai.js.map +1 -1
  78. package/dist-server/service/enrollment/learning-documents.js +3 -4
  79. package/dist-server/service/enrollment/learning-documents.js.map +1 -1
  80. package/dist-server/service/enrollment/progress-rules.d.ts +36 -11
  81. package/dist-server/service/enrollment/progress-rules.js +47 -12
  82. package/dist-server/service/enrollment/progress-rules.js.map +1 -1
  83. package/dist-server/service/enrollment/unit-progress.d.ts +4 -0
  84. package/dist-server/service/enrollment/unit-progress.js +20 -0
  85. package/dist-server/service/enrollment/unit-progress.js.map +1 -1
  86. package/dist-server/service/index.d.ts +1 -1
  87. package/dist-server/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +14 -13
  89. package/translations/en.json +30 -7
  90. package/translations/es.json +30 -7
  91. package/translations/ja.json +30 -7
  92. package/translations/ko.json +30 -7
  93. package/translations/ms.json +30 -7
  94. package/translations/zh.json +30 -7
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.261",
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.261",
43
+ "@things-factory/ai-client-base": "^10.1.261",
44
+ "@things-factory/announcement": "^10.1.261",
45
+ "@things-factory/attachment-base": "^10.1.261",
46
+ "@things-factory/auth-base": "^10.1.261",
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.261",
49
+ "@things-factory/notification": "^10.1.261",
50
+ "@things-factory/organization": "^10.1.261",
51
+ "@things-factory/pdf": "^10.1.261",
52
+ "@things-factory/shell": "^10.1.261",
53
+ "@things-factory/worklist": "^10.1.261",
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": "06537757f8708e6a511c6232e8792f18fdd6a986"
58
59
  }
@@ -52,6 +52,7 @@
52
52
  "error.learning-not-a-department-head": "Only a department head can view where their people stand.",
53
53
  "error.learning-not-completed": "A certificate is issued only for a completed course.",
54
54
  "error.learning-not-found": "The record was not found. Reload and try again.",
55
+ "error.learning-page-ahead": "You can turn only to the page after the last one read (page {allowed}). Turn the pages in order.",
55
56
  "error.learning-pass-score-invalid": "The pass score is a whole number from 1 to 100.",
56
57
  "error.learning-position-ahead": "You cannot skip beyond the watched position ({allowed} seconds). Continue playing from that position.",
57
58
  "error.learning-question-answer-required": "Mark at least one correct choice.",
@@ -74,6 +75,8 @@
74
75
  "error.learning-unit-kind-invalid": "Select the unit type.",
75
76
  "error.learning-unit-min-time-invalid": "Enter a whole-number minimum learning time of at least 1 second.",
76
77
  "error.learning-unit-name-required": "Enter the unit name.",
78
+ "error.learning-unit-pages-invalid": "The PDF's page count is not valid.",
79
+ "error.learning-unit-pages-required": "A PDF's page count is unknown. Attach its file again.",
77
80
  "error.learning-unit-url-invalid": "Enter a link starting with http:// or https://.",
78
81
  "error.learning-units-required": "Add at least one unit before publishing.",
79
82
  "error.learning-version-not-draft": "A published or closed version cannot be changed. Start a new version to change it.",
@@ -143,11 +146,6 @@
143
146
  "text.learning-choice-count": "{count} choices",
144
147
  "text.learning-completed-detail": "Completed on {day}. Certificate no. {number}.",
145
148
  "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
149
  "text.learning-course-all": "All courses",
152
150
  "text.learning-due-on": "Due {day}",
153
151
  "text.learning-due-on-hint": "Leave empty to assign without a due date.",
@@ -192,6 +190,7 @@
192
190
  "text.learning-remind-note": "Sent by the course manager.",
193
191
  "text.learning-remind-subject": "[Course] {course}",
194
192
  "text.learning-reminded": "{count} learners were reminded.",
193
+ "text.learning-saved-at": "Last saved {time}",
195
194
  "text.learning-source-note-hint": "Record the material provider and usage terms, such as attribution or restrictions on modification.",
196
195
  "text.learning-source-own": "Produced in-house",
197
196
  "text.learning-source-public": "Public body",
@@ -216,8 +215,9 @@
216
215
  "text.learning-unit-markdown-hint": "Keep the text open and visible for the minimum learning time to complete this unit.",
217
216
  "text.learning-unit-min-seconds": "Minimum reading time: {seconds} s",
218
217
  "text.learning-unit-min-seconds-hint": "Leave blank to use a minimum reading time of 60 seconds.",
218
+ "text.learning-unit-pages": "{pages} pages",
219
219
  "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.",
220
+ "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
221
  "text.learning-unit-video": "Video",
222
222
  "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
223
  "text.learning-version-close-confirm": "Closing this version prevents new learners from starting it. Learners who have already started can continue.",
@@ -251,5 +251,28 @@
251
251
  "title.learning-unit-new": "New unit",
252
252
  "title.learning-units": "Units",
253
253
  "title.learning-version-settings": "Completion and source",
254
- "title.learning-versions": "Versions"
254
+ "title.learning-versions": "Versions",
255
+ "button.learning-ai-material": "Draft with AI from material",
256
+ "button.learning-ai-generate": "Generate draft",
257
+ "button.learning-ai-apply": "Add reviewed draft",
258
+ "button.learning-ai-revise": "Revise request",
259
+ "field.learning-ai-source": "Source material",
260
+ "field.learning-ai-captions": "Video captions or transcript",
261
+ "field.learning-ai-instruction": "Audience, learning goals and requests",
262
+ "title.learning-ai-material": "Prepare a course draft from material",
263
+ "title.learning-ai-preview": "Review AI draft",
264
+ "title.learning-ai-missing": "Items to verify or complete",
265
+ "text.learning-ai-upload-first": "First add a PDF or video unit and upload its file.",
266
+ "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.",
267
+ "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.",
268
+ "text.learning-ai-working": "Reading the material and preparing a draft.",
269
+ "text.learning-ai-apply-help": "Adding appends the introduction, supporting units and AI question drafts. Review sources, content, study times and questions before publishing.",
270
+ "error.learning-ai-material-invalid": "The complete source could not be read. Check the file, pages, captions and limits.",
271
+ "error.learning-ai-draft-invalid": "The AI draft has incomplete content, answers or references. The course was not changed. Revise the request and retry.",
272
+ "error.learning-ai-draft-stale": "The course or source changed. Review it and generate a fresh draft.",
273
+ "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.",
274
+ "error.learning-ai-source-read": "Could not read the source. Check access and the file, then retry.",
275
+ "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.",
276
+ "error.learning-ai-transcription-unavailable": "The current AI agent cannot transcribe speech. Configure an OpenAI default agent or supply captions/transcript.",
277
+ "error.learning-ai-audio-unreadable": "Could not read speech. Check server ffmpeg, MP4/WebM format and audio track, or supply captions/transcript."
255
278
  }
@@ -52,6 +52,7 @@
52
52
  "error.learning-not-a-department-head": "Solo un jefe de departamento puede ver la situación de su equipo.",
53
53
  "error.learning-not-completed": "El certificado solo se emite para un curso finalizado.",
54
54
  "error.learning-not-found": "No se encontró el registro. Recargue e inténtelo de nuevo.",
55
+ "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
56
  "error.learning-pass-score-invalid": "La puntuación mínima es un entero de 1 a 100.",
56
57
  "error.learning-position-ahead": "No puede avanzar más allá de lo visto ({allowed} s). Siga reproduciendo el vídeo.",
57
58
  "error.learning-question-answer-required": "Marque al menos una opción correcta.",
@@ -74,6 +75,8 @@
74
75
  "error.learning-unit-kind-invalid": "Seleccione el tipo de unidad.",
75
76
  "error.learning-unit-min-time-invalid": "El tiempo mínimo es un entero de 1 segundo o más.",
76
77
  "error.learning-unit-name-required": "Indique el nombre de la unidad.",
78
+ "error.learning-unit-pages-invalid": "El número de páginas del PDF no es válido.",
79
+ "error.learning-unit-pages-required": "Hay un PDF sin número de páginas conocido. Adjunte de nuevo el archivo.",
77
80
  "error.learning-unit-url-invalid": "El enlace debe empezar por http:// o https://.",
78
81
  "error.learning-units-required": "Añada al menos una unidad antes de publicar.",
79
82
  "error.learning-version-not-draft": "Una versión publicada o cerrada no se puede modificar. Cree una versión nueva.",
@@ -143,11 +146,6 @@
143
146
  "text.learning-choice-count": "{count} opciones",
144
147
  "text.learning-completed-detail": "Finalizado el {day}. Certificado n.º {number}.",
145
148
  "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
149
  "text.learning-course-all": "Todos los cursos",
152
150
  "text.learning-due-on": "Vence el {day}",
153
151
  "text.learning-due-on-hint": "Déjelo vacío para asignar sin fecha límite.",
@@ -192,6 +190,7 @@
192
190
  "text.learning-remind-note": "Enviado por el responsable del curso.",
193
191
  "text.learning-remind-subject": "[Curso] {course}",
194
192
  "text.learning-reminded": "Se recordó a {count} participantes.",
193
+ "text.learning-saved-at": "Último guardado {time}",
195
194
  "text.learning-source-note-hint": "Registre quién proporcionó el material y sus condiciones (atribución, sin cambios...).",
196
195
  "text.learning-source-own": "Elaboración propia",
197
196
  "text.learning-source-public": "Organismo público",
@@ -216,8 +215,9 @@
216
215
  "text.learning-unit-markdown-hint": "La unidad se completa cuando el texto ha estado abierto el tiempo mínimo.",
217
216
  "text.learning-unit-min-seconds": "abierto {seconds} s",
218
217
  "text.learning-unit-min-seconds-hint": "60 segundos si está vacío.",
218
+ "text.learning-unit-pages": "{pages} páginas",
219
219
  "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.",
220
+ "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
221
  "text.learning-unit-video": "Vídeo",
222
222
  "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
223
  "text.learning-version-close-confirm": "Una vez cerrada, ningún participante nuevo empieza esta versión. Quien la empezó puede terminarla.",
@@ -251,5 +251,28 @@
251
251
  "title.learning-unit-new": "Nueva unidad",
252
252
  "title.learning-units": "Unidades",
253
253
  "title.learning-version-settings": "Finalización y origen",
254
- "title.learning-versions": "Versiones"
254
+ "title.learning-versions": "Versiones",
255
+ "button.learning-ai-material": "Crear borrador con IA",
256
+ "button.learning-ai-generate": "Generar borrador",
257
+ "button.learning-ai-apply": "Añadir borrador revisado",
258
+ "button.learning-ai-revise": "Modificar solicitud",
259
+ "field.learning-ai-source": "Material original",
260
+ "field.learning-ai-captions": "Subtítulos o transcripción",
261
+ "field.learning-ai-instruction": "Público, objetivos y peticiones",
262
+ "title.learning-ai-material": "Preparar curso desde material",
263
+ "title.learning-ai-preview": "Revisar borrador de IA",
264
+ "title.learning-ai-missing": "Datos por verificar o completar",
265
+ "text.learning-ai-upload-first": "Primero añada una unidad PDF o vídeo y suba el archivo.",
266
+ "text.learning-ai-material-help": "Prepara introducción, objetivos, unidades y evaluación. Conserva el original; generar no guarda ni publica.",
267
+ "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.",
268
+ "text.learning-ai-working": "Leyendo el material y preparando el borrador.",
269
+ "text.learning-ai-apply-help": "Se añaden introducción, unidades y preguntas de IA. Revise fuentes, contenido, tiempos y preguntas antes de publicar.",
270
+ "error.learning-ai-material-invalid": "No se pudo leer la fuente completa. Revise archivo, páginas, subtítulos y límites.",
271
+ "error.learning-ai-draft-invalid": "El borrador tiene contenido, respuestas o referencias incompletas. El curso no cambió. Modifique la solicitud.",
272
+ "error.learning-ai-draft-stale": "El curso o la fuente cambió. Revise y genere otro borrador.",
273
+ "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.",
274
+ "error.learning-ai-source-read": "No se pudo leer la fuente. Revise acceso y archivo e inténtelo de nuevo.",
275
+ "error.learning-ai-video-limit": "Transcripción: MP4/WebM de hasta 60 minutos/250 MB y texto de 120.000 caracteres. Divida el material.",
276
+ "error.learning-ai-transcription-unavailable": "El agente actual no transcribe audio. Configure OpenAI como predeterminado o aporte subtítulos.",
277
+ "error.learning-ai-audio-unreadable": "No se pudo leer el audio. Revise ffmpeg, formato MP4/WebM y pista de audio, o aporte subtítulos."
255
278
  }
@@ -52,6 +52,7 @@
52
52
  "error.learning-not-a-department-head": "部署長のみ所属社員の受講状況を閲覧できます。",
53
53
  "error.learning-not-completed": "修了証は修了したコースにのみ発行できます。",
54
54
  "error.learning-not-found": "記録が見つかりません。画面を更新してから再度お試しください。",
55
+ "error.learning-page-ahead": "読んだページ({allowed}ページ)の次のページまでしか進めません。順番にページをめくってください。",
55
56
  "error.learning-pass-score-invalid": "合格点は1から100の整数で入力してください。",
56
57
  "error.learning-position-ahead": "視聴した位置({allowed}秒)より先には進めません。動画を続けて再生してください。",
57
58
  "error.learning-question-answer-required": "正解を1つ以上指定してください。",
@@ -74,6 +75,8 @@
74
75
  "error.learning-unit-kind-invalid": "単元の種類を選択してください。",
75
76
  "error.learning-unit-min-time-invalid": "最低学習時間は1秒以上の整数で入力してください。",
76
77
  "error.learning-unit-name-required": "単元名を入力してください。",
78
+ "error.learning-unit-pages-invalid": "PDFのページ数が正しくありません。",
79
+ "error.learning-unit-pages-required": "ページ数を確認できないPDFがあります。PDFファイルを再度添付してください。",
77
80
  "error.learning-unit-url-invalid": "リンク先はhttp://またはhttps://で始まる必要があります。",
78
81
  "error.learning-units-required": "単元を1つ以上登録すると公開できます。",
79
82
  "error.learning-version-not-draft": "公開済みまたは終了した改訂版は変更できません。変更するには新しい改訂版を作成してください。",
@@ -143,11 +146,6 @@
143
146
  "text.learning-choice-count": "選択肢{count}個",
144
147
  "text.learning-completed-detail": "{day}に修了しました。修了番号は{number}です。",
145
148
  "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
149
  "text.learning-course-all": "すべてのコース",
152
150
  "text.learning-due-on": "{day}まで",
153
151
  "text.learning-due-on-hint": "空欄の場合、期限なしで割り当てられます。",
@@ -192,6 +190,7 @@
192
190
  "text.learning-remind-note": "受講担当者からの通知です。",
193
191
  "text.learning-remind-subject": "[受講案内] {course}",
194
192
  "text.learning-reminded": "{count}名に通知しました。",
193
+ "text.learning-saved-at": "最終保存 {time}",
195
194
  "text.learning-source-note-hint": "資料の提供機関と利用条件(出典表示、改変禁止など)を記録してください。",
196
195
  "text.learning-source-own": "自社制作",
197
196
  "text.learning-source-public": "公共機関の資料",
@@ -216,8 +215,9 @@
216
215
  "text.learning-unit-markdown-hint": "本文を最低学習時間だけ閲覧すると単元が完了します。",
217
216
  "text.learning-unit-min-seconds": "最低{seconds}秒閲覧",
218
217
  "text.learning-unit-min-seconds-hint": "空欄の場合は60秒です。",
218
+ "text.learning-unit-pages": "{pages}ページ",
219
219
  "text.learning-unit-pdf": "文書(PDF)",
220
- "text.learning-unit-pdf-hint": "PDFを最低学習時間だけ閲覧すると単元が完了します。",
220
+ "text.learning-unit-pdf-hint": "PDFのすべてのページを順番に読み、設定した時間学習すると単元が完了します。ページ数はファイルから自動的に読み取ります。",
221
221
  "text.learning-unit-video": "動画",
222
222
  "text.learning-unit-video-hint": "動画を最後まで再生し、再生時間分の学習時間が記録されると単元が完了します。視聴した位置より先には進めません。",
223
223
  "text.learning-version-close-confirm": "改訂版を終了すると、新しい受講者はこの改訂版で学習を開始できません。開始済みの受講者は継続できます。",
@@ -251,5 +251,28 @@
251
251
  "title.learning-unit-new": "単元の追加",
252
252
  "title.learning-units": "単元",
253
253
  "title.learning-version-settings": "修了条件と出典",
254
- "title.learning-versions": "改訂版"
254
+ "title.learning-versions": "改訂版",
255
+ "button.learning-ai-material": "資料からAI草案を作成",
256
+ "button.learning-ai-generate": "草案を生成",
257
+ "button.learning-ai-apply": "確認した草案を追加",
258
+ "button.learning-ai-revise": "依頼を修正",
259
+ "field.learning-ai-source": "元の教材",
260
+ "field.learning-ai-captions": "動画の字幕・台本",
261
+ "field.learning-ai-instruction": "対象・学習目標・追加依頼",
262
+ "title.learning-ai-material": "教材から講座の草案を作成",
263
+ "title.learning-ai-preview": "AI草案を確認",
264
+ "title.learning-ai-missing": "追加確認・補完事項",
265
+ "text.learning-ai-upload-first": "先にPDFまたは動画の単元を追加し、ファイルをアップロードしてください。",
266
+ "text.learning-ai-material-help": "資料から紹介・目標・補足単元・評価と解説を作成します。原本は保持され、生成だけでは保存・公開されません。",
267
+ "text.learning-ai-captions-help": "字幕・台本を入力するか、空欄にすると音声を自動で文字起こしします。自動文字起こしでは音声を外部AIサービスに送信し、教材生成とは別に料金が発生する場合があります。映像画面は分析しません。生成後に文字起こしを確認・修正できます。",
268
+ "text.learning-ai-working": "資料を読み込み、草案を作成しています。",
269
+ "text.learning-ai-apply-help": "追加すると既存単元の後に紹介・補足単元とAI設問草案を保存します。出典・内容・学習時間・設問を確認してから公開してください。",
270
+ "error.learning-ai-material-invalid": "資料全体を読めません。ファイル・ページ数・字幕・上限を確認してください。",
271
+ "error.learning-ai-draft-invalid": "AI草案の内容・正解・出典が不完全です。講座は未変更です。依頼を修正して再生成してください。",
272
+ "error.learning-ai-draft-stale": "講座または元の資料が変更されました。確認して草案を再生成してください。",
273
+ "error.learning-ai-source-limit": "上限超過です。PDF 50MB・80ページ・スキャン12ページ、テキスト12万文字以内に分割してください。内容を黙って切り捨てません。",
274
+ "error.learning-ai-source-read": "元の資料を読めません。アクセス権とファイルを確認して再試行してください。",
275
+ "error.learning-ai-video-limit": "自動文字起こしは60分・250MB以下のMP4/WebM、12万文字以内の台本に対応します。資料を分割してください。",
276
+ "error.learning-ai-transcription-unavailable": "現在のAIは音声文字起こしに対応していません。OpenAIを既定にするか字幕・台本を提供してください。",
277
+ "error.learning-ai-audio-unreadable": "音声を読めません。ffmpeg・MP4/WebM形式・音声トラックを確認するか字幕を提供してください。"
255
278
  }
@@ -52,6 +52,7 @@
52
52
  "error.learning-not-a-department-head": "부서장만 소속 직원의 수강 현황을 열람할 수 있습니다.",
53
53
  "error.learning-not-completed": "수료증은 이수한 과정에만 발급할 수 있습니다.",
54
54
  "error.learning-not-found": "기록을 찾을 수 없습니다. 화면을 새로 고친 뒤 다시 시도하세요.",
55
+ "error.learning-page-ahead": "읽은 페이지({allowed}쪽) 다음 페이지까지만 넘길 수 있습니다. 페이지를 차례대로 넘기세요.",
55
56
  "error.learning-pass-score-invalid": "합격 점수는 1부터 100 사이의 정수로 입력하세요.",
56
57
  "error.learning-position-ahead": "시청한 구간({allowed}초)보다 앞으로 이동할 수 없습니다. 해당 위치부터 영상을 재생하세요.",
57
58
  "error.learning-question-answer-required": "정답을 하나 이상 지정하세요.",
@@ -74,6 +75,8 @@
74
75
  "error.learning-unit-kind-invalid": "단원 유형을 선택하세요.",
75
76
  "error.learning-unit-min-time-invalid": "최소 학습 시간은 1초 이상의 정수로 입력하세요.",
76
77
  "error.learning-unit-name-required": "단원 이름을 입력하세요.",
78
+ "error.learning-unit-pages-invalid": "PDF 페이지 수가 올바르지 않습니다.",
79
+ "error.learning-unit-pages-required": "페이지 수를 확인할 수 없는 PDF가 있습니다. PDF 파일을 다시 첨부하세요.",
77
80
  "error.learning-unit-url-invalid": "링크 주소는 http:// 또는 https://로 시작해야 합니다.",
78
81
  "error.learning-units-required": "단원을 하나 이상 등록해야 공개할 수 있습니다.",
79
82
  "error.learning-version-not-draft": "공개되었거나 종료된 개정본은 수정할 수 없습니다. 변경하려면 새 개정본을 작성하세요.",
@@ -143,11 +146,6 @@
143
146
  "text.learning-choice-count": "보기 {count}개",
144
147
  "text.learning-completed-detail": "{day}에 이수했습니다. 수료 번호는 {number}입니다.",
145
148
  "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
149
  "text.learning-course-all": "모든 과정",
152
150
  "text.learning-due-on": "{day}까지",
153
151
  "text.learning-due-on-hint": "비워 두면 기한 없이 배정됩니다.",
@@ -192,6 +190,7 @@
192
190
  "text.learning-remind-note": "수강 담당자가 보낸 알림입니다.",
193
191
  "text.learning-remind-subject": "[수강 안내] {course}",
194
192
  "text.learning-reminded": "{count}명에게 알림을 보냈습니다.",
193
+ "text.learning-saved-at": "마지막 저장 {time}",
195
194
  "text.learning-source-note-hint": "자료를 제공한 기관과 이용 조건(출처 표시, 변경 금지 등)을 기록하세요.",
196
195
  "text.learning-source-own": "자체 제작",
197
196
  "text.learning-source-public": "공공기관 자료",
@@ -216,8 +215,9 @@
216
215
  "text.learning-unit-markdown-hint": "화면이 표시된 상태에서 본문을 최소 학습 시간 동안 열람하면 단원이 완료됩니다.",
217
216
  "text.learning-unit-min-seconds": "최소 {seconds}초 열람",
218
217
  "text.learning-unit-min-seconds-hint": "입력하지 않으면 최소 열람 시간은 60초입니다.",
218
+ "text.learning-unit-pages": "{pages}쪽",
219
219
  "text.learning-unit-pdf": "문서(PDF)",
220
- "text.learning-unit-pdf-hint": "화면이 표시된 상태에서 PDF를 최소 학습 시간 동안 열람하면 단원이 완료됩니다.",
220
+ "text.learning-unit-pdf-hint": "PDF의 모든 페이지를 차례대로 읽고, 정한 시간만큼 학습해야 단원이 완료됩니다. 페이지 수는 파일에서 자동으로 읽습니다.",
221
221
  "text.learning-unit-video": "동영상",
222
222
  "text.learning-unit-video-hint": "동영상을 끝까지 시청하고, 재생 시간에 해당하는 학습 시간을 충족하면 단원이 완료됩니다. 아직 시청하지 않은 구간으로는 이동할 수 없습니다.",
223
223
  "text.learning-version-close-confirm": "개정본을 종료하면 새 수강자는 이 개정본으로 학습을 시작할 수 없습니다. 이미 시작한 수강자는 계속 학습할 수 있습니다.",
@@ -251,5 +251,28 @@
251
251
  "title.learning-unit-new": "단원 추가",
252
252
  "title.learning-units": "단원",
253
253
  "title.learning-version-settings": "이수 조건과 출처",
254
- "title.learning-versions": "개정본"
254
+ "title.learning-versions": "개정본",
255
+ "button.learning-ai-material": "자료로 AI 초안 만들기",
256
+ "button.learning-ai-generate": "초안 생성",
257
+ "button.learning-ai-apply": "검토한 초안 추가",
258
+ "button.learning-ai-revise": "요청 수정 후 다시 생성",
259
+ "field.learning-ai-source": "교육 원본 자료",
260
+ "field.learning-ai-captions": "동영상 자막·대본 파일",
261
+ "field.learning-ai-instruction": "대상·학습 목표·추가 요청",
262
+ "title.learning-ai-material": "자료에서 교육 초안 준비",
263
+ "title.learning-ai-preview": "AI 초안 검토",
264
+ "title.learning-ai-missing": "추가 확인·보완 사항",
265
+ "text.learning-ai-upload-first": "먼저 PDF 또는 동영상 단원을 추가하고 파일을 올려 주세요.",
266
+ "text.learning-ai-material-help": "자료를 바탕으로 소개·학습 목표·보충 단원·평가와 해설을 준비합니다. 원본은 유지하며, 생성만으로 저장되거나 공개되지 않습니다.",
267
+ "text.learning-ai-captions-help": "자막·대본을 넣거나 비워 두면 음성을 자동 전사합니다. 자동 전사는 음성을 외부 AI 서비스로 보내며, 교안 생성과 별도로 이용 비용이 발생할 수 있습니다. 영상 화면은 분석하지 않습니다. 생성 후 전사문을 확인하고 수정할 수 있습니다.",
268
+ "text.learning-ai-working": "자료를 읽고 초안을 준비하고 있습니다.",
269
+ "text.learning-ai-apply-help": "추가하면 기존 단원 뒤에 소개와 보충 단원, AI 평가 초안이 저장됩니다. 출처·내용·학습시간을 검토하고 평가 문항을 확인해 저장한 뒤 공개하세요.",
270
+ "error.learning-ai-material-invalid": "자료 전체를 읽지 못했습니다. 파일·페이지 수·자막과 허용 범위를 확인하세요.",
271
+ "error.learning-ai-draft-invalid": "AI 응답의 내용·정답·출처가 불완전합니다. 과정은 변경되지 않았습니다. 요청을 조정해 다시 생성하세요.",
272
+ "error.learning-ai-draft-stale": "과정이나 원본 자료가 변경됐습니다. 최신 내용을 확인하고 초안을 다시 생성하세요.",
273
+ "error.learning-ai-source-limit": "자료 한도를 넘었습니다. PDF 50MB·80쪽·스캔 12쪽, 텍스트 12만 자 이내 자료로 나눠 주세요. 일부 내용만 잘라 생성하지 않습니다.",
274
+ "error.learning-ai-source-read": "원본 자료를 읽지 못했습니다. 접근 권한과 파일 상태를 확인하고 다시 시도하세요.",
275
+ "error.learning-ai-video-limit": "자동 전사는 60분·250MB 이하 MP4/WebM과 12만 자 이내 대본을 지원합니다. 자료를 나눠 주세요.",
276
+ "error.learning-ai-transcription-unavailable": "현재 AI 설정은 음성 전사를 지원하지 않습니다. OpenAI 에이전트를 기본 AI로 설정하거나 자막·대본을 첨부해 주세요.",
277
+ "error.learning-ai-audio-unreadable": "음성을 읽지 못했습니다. 서버 ffmpeg 설치, MP4/WebM 형식과 음성 트랙을 확인하거나 자막·대본을 첨부해 주세요."
255
278
  }
@@ -52,6 +52,7 @@
52
52
  "error.learning-not-a-department-head": "Hanya ketua jabatan boleh melihat status kakitangannya.",
53
53
  "error.learning-not-completed": "Sijil hanya dikeluarkan untuk kursus yang tamat.",
54
54
  "error.learning-not-found": "Rekod tidak ditemui. Muat semula dan cuba lagi.",
55
+ "error.learning-page-ahead": "Anda hanya boleh ke halaman selepas halaman terakhir dibaca (halaman {allowed}). Selak halaman mengikut urutan.",
55
56
  "error.learning-pass-score-invalid": "Markah lulus ialah nombor bulat 1 hingga 100.",
56
57
  "error.learning-position-ahead": "Anda tidak boleh melompat melepasi bahagian yang ditonton ({allowed} s). Teruskan memainkan video.",
57
58
  "error.learning-question-answer-required": "Tandakan sekurang-kurangnya satu pilihan betul.",
@@ -74,6 +75,8 @@
74
75
  "error.learning-unit-kind-invalid": "Pilih jenis unit.",
75
76
  "error.learning-unit-min-time-invalid": "Masa minimum mesti nombor bulat 1 saat atau lebih.",
76
77
  "error.learning-unit-name-required": "Masukkan nama unit.",
78
+ "error.learning-unit-pages-invalid": "Bilangan halaman PDF tidak sah.",
79
+ "error.learning-unit-pages-required": "Bilangan halaman sebuah PDF tidak diketahui. Lampirkan failnya semula.",
77
80
  "error.learning-unit-url-invalid": "Pautan mesti bermula dengan http:// atau https://.",
78
81
  "error.learning-units-required": "Tambah sekurang-kurangnya satu unit sebelum menerbitkan.",
79
82
  "error.learning-version-not-draft": "Versi yang diterbitkan atau ditutup tidak boleh diubah. Mulakan versi baharu.",
@@ -143,11 +146,6 @@
143
146
  "text.learning-choice-count": "{count} pilihan",
144
147
  "text.learning-completed-detail": "Tamat pada {day}. No. sijil {number}.",
145
148
  "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
149
  "text.learning-course-all": "Semua kursus",
152
150
  "text.learning-due-on": "Tamat tempoh {day}",
153
151
  "text.learning-due-on-hint": "Biarkan kosong untuk tugasan tanpa tarikh akhir.",
@@ -192,6 +190,7 @@
192
190
  "text.learning-remind-note": "Dihantar oleh pengurus kursus.",
193
191
  "text.learning-remind-subject": "[Kursus] {course}",
194
192
  "text.learning-reminded": "{count} peserta telah diingatkan.",
193
+ "text.learning-saved-at": "Terakhir disimpan {time}",
195
194
  "text.learning-source-note-hint": "Rekodkan pembekal bahan dan syaratnya (atribusi, tiada pengubahan ...).",
196
195
  "text.learning-source-own": "Buatan dalaman",
197
196
  "text.learning-source-public": "Badan awam",
@@ -216,8 +215,9 @@
216
215
  "text.learning-unit-markdown-hint": "Unit selesai apabila teks dibuka selama masa minimum.",
217
216
  "text.learning-unit-min-seconds": "dibuka {seconds} s",
218
217
  "text.learning-unit-min-seconds-hint": "60 saat jika kosong.",
218
+ "text.learning-unit-pages": "{pages} halaman",
219
219
  "text.learning-unit-pdf": "Dokumen (PDF)",
220
- "text.learning-unit-pdf-hint": "Unit selesai apabila PDF dibuka selama masa minimum.",
220
+ "text.learning-unit-pdf-hint": "Unit selesai apabila semua halaman dibaca mengikut urutan dan masa minimum dicapai. Bilangan halaman dibaca daripada fail.",
221
221
  "text.learning-unit-video": "Video",
222
222
  "text.learning-unit-video-hint": "Unit selesai apabila video dimainkan hingga habis dengan tempohnya dikira. Tidak boleh melompat melepasi bahagian yang belum ditonton.",
223
223
  "text.learning-version-close-confirm": "Setelah ditutup, tiada peserta baharu boleh memulakan versi ini. Yang telah bermula boleh menamatkannya.",
@@ -251,5 +251,28 @@
251
251
  "title.learning-unit-new": "Unit baharu",
252
252
  "title.learning-units": "Unit",
253
253
  "title.learning-version-settings": "Syarat tamat dan sumber",
254
- "title.learning-versions": "Versi"
254
+ "title.learning-versions": "Versi",
255
+ "button.learning-ai-material": "Draf AI daripada bahan",
256
+ "button.learning-ai-generate": "Jana draf",
257
+ "button.learning-ai-apply": "Tambah draf disemak",
258
+ "button.learning-ai-revise": "Ubah permintaan",
259
+ "field.learning-ai-source": "Bahan asal",
260
+ "field.learning-ai-captions": "Sari kata atau transkrip",
261
+ "field.learning-ai-instruction": "Sasaran, matlamat dan permintaan",
262
+ "title.learning-ai-material": "Sediakan draf kursus daripada bahan",
263
+ "title.learning-ai-preview": "Semak draf AI",
264
+ "title.learning-ai-missing": "Perkara untuk disahkan atau dilengkapkan",
265
+ "text.learning-ai-upload-first": "Tambah unit PDF atau video dan muat naik fail dahulu.",
266
+ "text.learning-ai-material-help": "Sediakan pengenalan, objektif, unit tambahan dan kuiz. Bahan asal dikekalkan; penjanaan tidak menyimpan atau menerbitkan.",
267
+ "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.",
268
+ "text.learning-ai-working": "Membaca bahan dan menyediakan draf.",
269
+ "text.learning-ai-apply-help": "Pengenalan, unit tambahan dan draf soalan AI akan ditambah. Semak sumber, kandungan, masa dan soalan sebelum menerbitkan.",
270
+ "error.learning-ai-material-invalid": "Sumber lengkap tidak dapat dibaca. Semak fail, halaman, sari kata dan had.",
271
+ "error.learning-ai-draft-invalid": "Kandungan, jawapan atau rujukan draf tidak lengkap. Kursus tidak diubah. Ubah permintaan dan cuba lagi.",
272
+ "error.learning-ai-draft-stale": "Kursus atau sumber telah berubah. Semak dan jana draf baharu.",
273
+ "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.",
274
+ "error.learning-ai-source-read": "Sumber tidak dapat dibaca. Semak akses dan fail, kemudian cuba lagi.",
275
+ "error.learning-ai-video-limit": "Transkripsi menyokong MP4/WebM sehingga 60 minit/250 MB dan 120,000 aksara. Bahagikan bahan.",
276
+ "error.learning-ai-transcription-unavailable": "Ejen semasa tidak menyokong transkripsi. Tetapkan OpenAI sebagai lalai atau berikan sari kata.",
277
+ "error.learning-ai-audio-unreadable": "Audio tidak dapat dibaca. Semak ffmpeg, format MP4/WebM dan trek audio, atau berikan sari kata."
255
278
  }
@@ -52,6 +52,7 @@
52
52
  "error.learning-not-a-department-head": "只有部门负责人可查看所属员工的学习情况。",
53
53
  "error.learning-not-completed": "结业证书仅限已结业课程签发。",
54
54
  "error.learning-not-found": "未找到记录。请刷新后重试。",
55
+ "error.learning-page-ahead": "只能翻到已读页({allowed}页)的下一页。请按顺序翻页。",
55
56
  "error.learning-pass-score-invalid": "及格分数须为 1 至 100 的整数。",
56
57
  "error.learning-position-ahead": "不能跳过已观看位置({allowed} 秒)。请继续播放视频。",
57
58
  "error.learning-question-answer-required": "请至少指定一个正确选项。",
@@ -74,6 +75,8 @@
74
75
  "error.learning-unit-kind-invalid": "请选择单元类型。",
75
76
  "error.learning-unit-min-time-invalid": "最短学习时间须为 1 秒以上的整数。",
76
77
  "error.learning-unit-name-required": "请输入单元名称。",
78
+ "error.learning-unit-pages-invalid": "PDF 页数无效。",
79
+ "error.learning-unit-pages-required": "有 PDF 无法确认页数,请重新上传 PDF 文件。",
77
80
  "error.learning-unit-url-invalid": "链接须以 http:// 或 https:// 开头。",
78
81
  "error.learning-units-required": "须至少登记一个单元才能发布。",
79
82
  "error.learning-version-not-draft": "已发布或已关闭的版本不可修改。如需修改,请新建版本。",
@@ -143,11 +146,6 @@
143
146
  "text.learning-choice-count": "{count} 个选项",
144
147
  "text.learning-completed-detail": "已于 {day} 结业,结业编号 {number}。",
145
148
  "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
149
  "text.learning-course-all": "全部课程",
152
150
  "text.learning-due-on": "截止 {day}",
153
151
  "text.learning-due-on-hint": "留空则不设期限。",
@@ -192,6 +190,7 @@
192
190
  "text.learning-remind-note": "由课程负责人发送。",
193
191
  "text.learning-remind-subject": "[课程提醒] {course}",
194
192
  "text.learning-reminded": "已提醒 {count} 人。",
193
+ "text.learning-saved-at": "最后保存 {time}",
195
194
  "text.learning-source-note-hint": "请记录资料提供机构及使用条件(署名、禁止修改等)。",
196
195
  "text.learning-source-own": "自制",
197
196
  "text.learning-source-public": "公共机构资料",
@@ -216,8 +215,9 @@
216
215
  "text.learning-unit-markdown-hint": "正文浏览达到最短学习时间后,单元即完成。",
217
216
  "text.learning-unit-min-seconds": "至少浏览 {seconds} 秒",
218
217
  "text.learning-unit-min-seconds-hint": "留空则为 60 秒。",
218
+ "text.learning-unit-pages": "{pages} 页",
219
219
  "text.learning-unit-pdf": "文档(PDF)",
220
- "text.learning-unit-pdf-hint": "PDF 浏览达到最短学习时间后,单元即完成。",
220
+ "text.learning-unit-pdf-hint": "按顺序阅读 PDF 的所有页面并达到设定时间后,单元即完成。页数从文件自动读取。",
221
221
  "text.learning-unit-video": "视频",
222
222
  "text.learning-unit-video-hint": "视频播放至结尾且学习时间达到视频时长后,单元即完成。不能跳过尚未观看的部分。",
223
223
  "text.learning-version-close-confirm": "关闭后,新学员无法开始学习此版本,已开始的学员可继续完成。",
@@ -251,5 +251,28 @@
251
251
  "title.learning-unit-new": "添加单元",
252
252
  "title.learning-units": "单元",
253
253
  "title.learning-version-settings": "结业条件与来源",
254
- "title.learning-versions": "版本"
254
+ "title.learning-versions": "版本",
255
+ "button.learning-ai-material": "根据资料生成AI草稿",
256
+ "button.learning-ai-generate": "生成草稿",
257
+ "button.learning-ai-apply": "添加已审阅草稿",
258
+ "button.learning-ai-revise": "修改要求",
259
+ "field.learning-ai-source": "原始教材",
260
+ "field.learning-ai-captions": "视频字幕或文稿",
261
+ "field.learning-ai-instruction": "对象、学习目标和要求",
262
+ "title.learning-ai-material": "根据教材准备课程草稿",
263
+ "title.learning-ai-preview": "审阅AI草稿",
264
+ "title.learning-ai-missing": "待核实或补充事项",
265
+ "text.learning-ai-upload-first": "请先添加PDF或视频单元并上传文件。",
266
+ "text.learning-ai-material-help": "根据资料准备简介、目标、补充单元和测验解析。保留原件,生成不会自动保存或发布。",
267
+ "text.learning-ai-captions-help": "提供字幕或讲稿,或留空以自动转写语音。自动转写会将音频发送至外部 AI 服务,除教案生成费用外,可能另行收费。不分析视频画面。生成后可检查并修改转写文本。",
268
+ "text.learning-ai-working": "正在读取资料并准备草稿。",
269
+ "text.learning-ai-apply-help": "添加后保存简介、补充单元及AI试题草稿。发布前请核实来源、内容、学习时间并审阅保存试题。",
270
+ "error.learning-ai-material-invalid": "无法读取完整资料,请检查文件、页数、字幕和限制。",
271
+ "error.learning-ai-draft-invalid": "AI草稿内容、答案或来源不完整。课程未更改,请修改要求后重试。",
272
+ "error.learning-ai-draft-stale": "课程或原始资料已更改,请核实后重新生成草稿。",
273
+ "error.learning-ai-source-limit": "资料超限:PDF 50MB、80页、扫描页12页;文本12万字符。请拆分资料,不会静默截断。",
274
+ "error.learning-ai-source-read": "无法读取原始资料,请检查权限和文件后重试。",
275
+ "error.learning-ai-video-limit": "自动转录支持60分钟、250MB以内的MP4/WebM及12万字符以内文稿,请拆分资料。",
276
+ "error.learning-ai-transcription-unavailable": "当前AI不支持语音转录,请设置OpenAI默认代理或提供字幕文稿。",
277
+ "error.learning-ai-audio-unreadable": "无法读取语音,请检查服务器ffmpeg、MP4/WebM格式和音轨,或提供字幕文稿。"
255
278
  }