@things-factory/learning 10.1.262 → 10.1.264

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 (40) hide show
  1. package/dist-client/pages/learning-course-list.js +27 -5
  2. package/dist-client/pages/learning-course-list.js.map +1 -1
  3. package/dist-client/pages/learning-enrollment-status.js +12 -2
  4. package/dist-client/pages/learning-enrollment-status.js.map +1 -1
  5. package/dist-client/pages/learning-view.d.ts +10 -0
  6. package/dist-client/pages/learning-view.js +59 -3
  7. package/dist-client/pages/learning-view.js.map +1 -1
  8. package/dist-client/tsconfig.tsbuildinfo +1 -1
  9. package/dist-server/ai-reads.d.ts +1 -0
  10. package/dist-server/ai-reads.js +26 -2
  11. package/dist-server/ai-reads.js.map +1 -1
  12. package/dist-server/service/enrollment/enrollment-mutation.d.ts +2 -0
  13. package/dist-server/service/enrollment/enrollment-mutation.js +18 -0
  14. package/dist-server/service/enrollment/enrollment-mutation.js.map +1 -1
  15. package/dist-server/service/enrollment/enrollment-query.d.ts +2 -0
  16. package/dist-server/service/enrollment/enrollment-query.js +15 -0
  17. package/dist-server/service/enrollment/enrollment-query.js.map +1 -1
  18. package/dist-server/service/enrollment/enrollment-service.d.ts +4 -0
  19. package/dist-server/service/enrollment/enrollment-service.js +1 -0
  20. package/dist-server/service/enrollment/enrollment-service.js.map +1 -1
  21. package/dist-server/service/enrollment/index.d.ts +3 -1
  22. package/dist-server/service/enrollment/index.js +3 -1
  23. package/dist-server/service/enrollment/index.js.map +1 -1
  24. package/dist-server/service/enrollment/lesson-note-service.d.ts +15 -0
  25. package/dist-server/service/enrollment/lesson-note-service.js +86 -0
  26. package/dist-server/service/enrollment/lesson-note-service.js.map +1 -0
  27. package/dist-server/service/enrollment/lesson-note.d.ts +35 -0
  28. package/dist-server/service/enrollment/lesson-note.js +107 -0
  29. package/dist-server/service/enrollment/lesson-note.js.map +1 -0
  30. package/dist-server/service/index.d.ts +2 -1
  31. package/dist-server/service/index.js +1 -0
  32. package/dist-server/service/index.js.map +1 -1
  33. package/dist-server/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +14 -14
  35. package/translations/en.json +22 -16
  36. package/translations/es.json +7 -1
  37. package/translations/ja.json +7 -1
  38. package/translations/ko.json +23 -17
  39. package/translations/ms.json +7 -1
  40. package/translations/zh.json +7 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/learning",
3
- "version": "10.1.262",
3
+ "version": "10.1.264",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -33,27 +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.72",
36
+ "@operato/learning": "^10.29.73",
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.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",
42
+ "@things-factory/ai-assistant": "^10.1.263",
43
+ "@things-factory/ai-client-base": "^10.1.263",
44
+ "@things-factory/announcement": "^10.1.263",
45
+ "@things-factory/attachment-base": "^10.1.263",
46
+ "@things-factory/auth-base": "^10.1.263",
47
47
  "@things-factory/env": "^10.1.149",
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",
48
+ "@things-factory/i18n-base": "^10.1.263",
49
+ "@things-factory/notification": "^10.1.263",
50
+ "@things-factory/organization": "^10.1.263",
51
+ "@things-factory/pdf": "^10.1.263",
52
+ "@things-factory/shell": "^10.1.263",
53
+ "@things-factory/worklist": "^10.1.264",
54
54
  "graphql-tag": "^2.12.6",
55
55
  "graphql-upload": "^15.0.2",
56
56
  "lit": "^3.1.2"
57
57
  },
58
- "gitHead": "2d5babff1e0f83bb0dfdf2ec91e4e7c00f9ac5bd"
58
+ "gitHead": "9e45746bb7dbfc51f04ad22eececefa6d0d2ea02"
59
59
  }
@@ -53,7 +53,7 @@
53
53
  "error.learning-not-a-department-head": "Only a department head can view where their people stand.",
54
54
  "error.learning-not-completed": "A certificate is issued only for a completed course.",
55
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.",
56
+ "error.learning-page-ahead": "You can advance only to the page immediately after the last completed page (page {allowed}). View the pages in order.",
57
57
  "error.learning-pass-score-invalid": "The pass score is a whole number from 1 to 100.",
58
58
  "error.learning-position-ahead": "You cannot skip beyond the watched position ({allowed} seconds). Continue playing from that position.",
59
59
  "error.learning-question-answer-required": "Mark at least one correct choice.",
@@ -77,7 +77,7 @@
77
77
  "error.learning-unit-min-time-invalid": "Enter a whole-number minimum learning time of at least 1 second.",
78
78
  "error.learning-unit-name-required": "Enter the unit name.",
79
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.",
80
+ "error.learning-unit-pages-required": "The PDF page count could not be determined. Attach the file again.",
81
81
  "error.learning-unit-url-invalid": "Enter a link starting with http:// or https://.",
82
82
  "error.learning-units-required": "Add at least one unit before publishing.",
83
83
  "error.learning-version-not-draft": "A published or closed version cannot be changed. Start a new version to change it.",
@@ -218,7 +218,7 @@
218
218
  "text.learning-unit-min-seconds-hint": "Leave blank to use a minimum reading time of 60 seconds.",
219
219
  "text.learning-unit-pages": "{pages} pages",
220
220
  "text.learning-unit-pdf": "Document (PDF)",
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
+ "text.learning-unit-pdf-hint": "View all PDF pages in order and meet the minimum learning time to complete this unit. The page count is determined from the attached file.",
222
222
  "text.learning-unit-video": "Video",
223
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.",
224
224
  "text.learning-version-close-confirm": "Closing this version prevents new learners from starting it. Learners who have already started can continue.",
@@ -253,36 +253,42 @@
253
253
  "title.learning-units": "Units",
254
254
  "title.learning-version-settings": "Completion and source",
255
255
  "title.learning-versions": "Versions",
256
- "button.learning-ai-material": "Draft with AI from material",
256
+ "button.learning-ai-material": "Create AI draft from material",
257
257
  "button.learning-ai-generate": "Generate draft",
258
- "button.learning-ai-apply": "Add reviewed draft",
258
+ "button.learning-ai-apply": "Apply reviewed draft",
259
259
  "button.learning-ai-revise": "Revise request",
260
260
  "field.learning-ai-source": "Source material",
261
261
  "field.learning-ai-captions": "Video captions or transcript",
262
262
  "field.learning-ai-instruction": "Audience, learning goals and requests",
263
- "title.learning-ai-material": "Prepare a course draft from material",
263
+ "title.learning-ai-material": "Create a course draft from source material",
264
264
  "title.learning-ai-preview": "Review AI draft",
265
265
  "title.learning-ai-missing": "Items to verify or complete",
266
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.",
267
+ "text.learning-ai-material-help": "Generate a draft course introduction, learning objectives, supporting units, quiz questions and explanations from the source material. The original is retained. Generating a draft does not save or publish the course.",
268
+ "text.learning-ai-captions-help": "Attach captions or a transcript to use that text. If neither is provided, the video's audio is transcribed automatically. Transcription sends audio to an external AI service and may incur charges separate from draft generation. Video visuals are not analyzed. Review and edit the generated transcript before applying the draft.",
269
+ "text.learning-ai-working": "Analyzing the source material and generating a draft.",
270
+ "text.learning-ai-apply-help": "Applying the draft appends the introduction and supporting units to the existing units and saves quiz questions as AI drafts. Review the sources, content, learning times and questions, then save the reviewed questions before publishing.",
271
271
  "error.learning-ai-material-invalid": "The complete source could not be read. Check the file, pages, captions and limits.",
272
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
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.",
274
+ "error.learning-ai-source-limit": "The source exceeds the supported limits: PDF files up to 50 MB and 80 pages, including up to 12 scanned pages; text up to 120,000 characters. Split the material into smaller files. Requests exceeding these limits are rejected in full.",
275
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.",
276
+ "error.learning-ai-video-limit": "Automatic transcription supports MP4/WebM videos up to 60 minutes and 250 MB. Transcripts must not exceed 120,000 characters. Split material that exceeds these limits.",
277
+ "error.learning-ai-transcription-unavailable": "The default AI agent does not support transcription. Set an OpenAI agent as the default or attach captions or a transcript.",
278
+ "error.learning-ai-audio-unreadable": "The video audio could not be extracted or transcribed. Check that the file is MP4/WebM with an audio track, or attach captions or a transcript. Contact your administrator if the problem persists.",
279
279
  "title.learning-cancel-enrollments": "Cancel {count} enrolments",
280
280
  "field.learning-format": "Format",
281
281
  "field.learning-unit-count": "Units",
282
- "field.learning-expected-time": "Time to complete",
282
+ "field.learning-expected-time": "Estimated learning time",
283
283
  "field.learning-enrolled": "Enrolled",
284
284
  "field.learning-completion-rate": "Completion rate",
285
285
  "text.learning-minutes-value": "{minutes} min",
286
286
  "text.learning-score-value": "{score} points",
287
- "text.learning-quiz-none": "No quiz"
287
+ "text.learning-quiz-none": "No quiz",
288
+ "text.learning-course-standing": "{enrolled} enrolled · {completed} completed ({rate})",
289
+ "error.learning-note-invalid": "The annotations could not be saved. Reload the page and recreate them.",
290
+ "error.learning-note-too-large": "The page exceeds the annotation limit ({strokes} strokes, {points} points). Erase some annotations before adding more.",
291
+ "error.learning-note-not-started": "Start the course before adding annotations.",
292
+ "error.learning-note-pdf-only": "Annotations are available only in PDF units.",
293
+ "error.learning-note-page": "The requested page is not in this document. The document contains {pages} pages."
288
294
  }
@@ -284,5 +284,11 @@
284
284
  "field.learning-completion-rate": "Tasa de finalización",
285
285
  "text.learning-minutes-value": "{minutes} min",
286
286
  "text.learning-score-value": "{score} puntos",
287
- "text.learning-quiz-none": "Sin evaluación"
287
+ "text.learning-quiz-none": "Sin evaluación",
288
+ "text.learning-course-standing": "{enrolled} inscritos · {completed} completados ({rate})",
289
+ "error.learning-note-invalid": "No se pudo guardar la nota. Vuelva a cargar la página y escríbala de nuevo.",
290
+ "error.learning-note-too-large": "La página no admite más notas ({strokes} trazos, {points} puntos). Borre algunas y vuelva a escribir.",
291
+ "error.learning-note-not-started": "Inicie el curso antes de escribir notas.",
292
+ "error.learning-note-pdf-only": "Las notas solo se escriben sobre las páginas de una unidad PDF.",
293
+ "error.learning-note-page": "El documento no tiene esa página ({pages} páginas)."
288
294
  }
@@ -284,5 +284,11 @@
284
284
  "field.learning-completion-rate": "修了率",
285
285
  "text.learning-minutes-value": "{minutes}分",
286
286
  "text.learning-score-value": "{score}点",
287
- "text.learning-quiz-none": "評価なし"
287
+ "text.learning-quiz-none": "評価なし",
288
+ "text.learning-course-standing": "受講 {enrolled}名・修了 {completed}名({rate})",
289
+ "error.learning-note-invalid": "ノートを保存できません。ページを再読み込みしてからもう一度書いてください。",
290
+ "error.learning-note-too-large": "1ページに書けるノートの上限を超えました(ストローク{strokes}本・点{points}個)。消しゴムで一部を消してから書いてください。",
291
+ "error.learning-note-not-started": "学習を開始してからノートを書けます。",
292
+ "error.learning-note-pdf-only": "ノートはPDF単元のページにのみ書けます。",
293
+ "error.learning-note-page": "文書にないページです(全{pages}ページ)。"
288
294
  }
@@ -53,7 +53,7 @@
53
53
  "error.learning-not-a-department-head": "부서장만 소속 직원의 수강 현황을 열람할 수 있습니다.",
54
54
  "error.learning-not-completed": "수료증은 이수한 과정에만 발급할 수 있습니다.",
55
55
  "error.learning-not-found": "기록을 찾을 수 없습니다. 화면을 새로 고친 뒤 다시 시도하세요.",
56
- "error.learning-page-ahead": "읽은 페이지({allowed}쪽) 다음 페이지까지만 넘길 수 있습니다. 페이지를 차례대로 넘기세요.",
56
+ "error.learning-page-ahead": "열람을 완료한 페이지의 다음 페이지({allowed}쪽)까지만 이동할 수 있습니다. 페이지를 순서대로 열람하세요.",
57
57
  "error.learning-pass-score-invalid": "합격 점수는 1부터 100 사이의 정수로 입력하세요.",
58
58
  "error.learning-position-ahead": "시청한 구간({allowed}초)보다 앞으로 이동할 수 없습니다. 해당 위치부터 영상을 재생하세요.",
59
59
  "error.learning-question-answer-required": "정답을 하나 이상 지정하세요.",
@@ -218,7 +218,7 @@
218
218
  "text.learning-unit-min-seconds-hint": "입력하지 않으면 최소 열람 시간은 60초입니다.",
219
219
  "text.learning-unit-pages": "{pages}쪽",
220
220
  "text.learning-unit-pdf": "문서(PDF)",
221
- "text.learning-unit-pdf-hint": "PDF의 모든 페이지를 차례대로 읽고, 정한 시간만큼 학습해야 단원이 완료됩니다. 페이지 수는 파일에서 자동으로 읽습니다.",
221
+ "text.learning-unit-pdf-hint": "PDF의 모든 페이지를 순서대로 열람하고 최소 학습 시간을 충족하면 단원이 완료됩니다. 페이지 수는 첨부한 파일에서 자동으로 확인합니다.",
222
222
  "text.learning-unit-video": "동영상",
223
223
  "text.learning-unit-video-hint": "동영상을 끝까지 시청하고, 재생 시간에 해당하는 학습 시간을 충족하면 단원이 완료됩니다. 아직 시청하지 않은 구간으로는 이동할 수 없습니다.",
224
224
  "text.learning-version-close-confirm": "개정본을 종료하면 새 수강자는 이 개정본으로 학습을 시작할 수 없습니다. 이미 시작한 수강자는 계속 학습할 수 있습니다.",
@@ -253,36 +253,42 @@
253
253
  "title.learning-units": "단원",
254
254
  "title.learning-version-settings": "이수 조건과 출처",
255
255
  "title.learning-versions": "개정본",
256
- "button.learning-ai-material": "자료로 AI 초안 만들기",
256
+ "button.learning-ai-material": "자료 기반 AI 초안 작성",
257
257
  "button.learning-ai-generate": "초안 생성",
258
- "button.learning-ai-apply": "검토한 초안 추가",
258
+ "button.learning-ai-apply": "검토한 초안 반영",
259
259
  "button.learning-ai-revise": "요청 수정 후 다시 생성",
260
- "field.learning-ai-source": "교육 원본 자료",
260
+ "field.learning-ai-source": "원본 교육 자료",
261
261
  "field.learning-ai-captions": "동영상 자막·대본 파일",
262
262
  "field.learning-ai-instruction": "대상·학습 목표·추가 요청",
263
- "title.learning-ai-material": "자료에서 교육 초안 준비",
263
+ "title.learning-ai-material": "자료 기반 교육 초안 작성",
264
264
  "title.learning-ai-preview": "AI 초안 검토",
265
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 평가 초안이 저장됩니다. 출처·내용·학습시간을 검토하고 평가 문항을 확인해 저장한 뒤 공개하세요.",
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
271
  "error.learning-ai-material-invalid": "자료 전체를 읽지 못했습니다. 파일·페이지 수·자막과 허용 범위를 확인하세요.",
272
272
  "error.learning-ai-draft-invalid": "AI 응답의 내용·정답·출처가 불완전합니다. 과정은 변경되지 않았습니다. 요청을 조정해 다시 생성하세요.",
273
273
  "error.learning-ai-draft-stale": "과정이나 원본 자료가 변경됐습니다. 최신 내용을 확인하고 초안을 다시 생성하세요.",
274
- "error.learning-ai-source-limit": "자료 한도를 넘었습니다. PDF 50MB·80쪽·스캔 12쪽, 텍스트 12만 자 이내 자료로 나눠 주세요. 일부 내용만 잘라 생성하지 않습니다.",
274
+ "error.learning-ai-source-limit": "자료가 허용 범위를 초과했습니다. PDF는 50MB·80쪽 이하이며, 스캔 페이지는 12쪽까지 지원합니다. 텍스트는 12만 자 이내로 나누어 주세요. 한도를 초과하면 일부만 처리하지 않고 요청 전체를 중단합니다.",
275
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 형식과 음성 트랙을 확인하거나 자막·대본을 첨부해 주세요.",
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": "동영상의 음성을 추출하거나 변환하지 못했습니다. 음성이 포함된 MP4/WebM 파일인지 확인하거나 자막·대본을 첨부하세요. 문제가 계속되면 관리자에게 문의하세요.",
279
279
  "title.learning-cancel-enrollments": "수강 {count}건 취소",
280
280
  "field.learning-format": "교육 형태",
281
281
  "field.learning-unit-count": "단원 수",
282
- "field.learning-expected-time": "소요 시간",
282
+ "field.learning-expected-time": "예상 학습 시간",
283
283
  "field.learning-enrolled": "수강 대상",
284
284
  "field.learning-completion-rate": "이수율",
285
285
  "text.learning-minutes-value": "{minutes}분",
286
286
  "text.learning-score-value": "{score}점",
287
- "text.learning-quiz-none": "평가 없음"
287
+ "text.learning-quiz-none": "평가 없음",
288
+ "text.learning-course-standing": "수강 {enrolled}명 · 이수 {completed}명({rate})",
289
+ "error.learning-note-invalid": "필기 데이터를 저장할 수 없습니다. 페이지를 새로 고친 후 다시 작성하세요.",
290
+ "error.learning-note-too-large": "페이지당 필기 한도(획 {strokes}개·점 {points}개)를 초과했습니다. 일부 필기를 지운 후 다시 작성하세요.",
291
+ "error.learning-note-not-started": "학습을 시작한 후 필기를 작성할 수 있습니다.",
292
+ "error.learning-note-pdf-only": "필기는 PDF 단원에서만 작성할 수 있습니다.",
293
+ "error.learning-note-page": "지정한 페이지가 문서에 없습니다. 전체 페이지 수는 {pages}쪽입니다."
288
294
  }
@@ -284,5 +284,11 @@
284
284
  "field.learning-completion-rate": "Kadar tamat",
285
285
  "text.learning-minutes-value": "{minutes} min",
286
286
  "text.learning-score-value": "{score} mata",
287
- "text.learning-quiz-none": "Tiada kuiz"
287
+ "text.learning-quiz-none": "Tiada kuiz",
288
+ "text.learning-course-standing": "{enrolled} didaftar · {completed} selesai ({rate})",
289
+ "error.learning-note-invalid": "Nota tidak dapat disimpan. Muat semula halaman dan tulis semula.",
290
+ "error.learning-note-too-large": "Halaman ini tidak dapat menyimpan nota lagi ({strokes} lakaran, {points} titik). Padam sebahagian dan tulis semula.",
291
+ "error.learning-note-not-started": "Mulakan kursus sebelum menulis nota.",
292
+ "error.learning-note-pdf-only": "Nota hanya boleh ditulis pada halaman unit PDF.",
293
+ "error.learning-note-page": "Tiada halaman sedemikian dalam dokumen ({pages} halaman)."
288
294
  }
@@ -284,5 +284,11 @@
284
284
  "field.learning-completion-rate": "完成率",
285
285
  "text.learning-minutes-value": "{minutes} 分钟",
286
286
  "text.learning-score-value": "{score} 分",
287
- "text.learning-quiz-none": "无测验"
287
+ "text.learning-quiz-none": "无测验",
288
+ "text.learning-course-standing": "学员 {enrolled} 人 · 完成 {completed} 人({rate})",
289
+ "error.learning-note-invalid": "无法保存笔记。请刷新页面后重新书写。",
290
+ "error.learning-note-too-large": "已超过单页笔记上限({strokes}笔 · {points}点)。请用橡皮擦擦除部分后再写。",
291
+ "error.learning-note-not-started": "开始学习后才能写笔记。",
292
+ "error.learning-note-pdf-only": "笔记只能写在PDF单元的页面上。",
293
+ "error.learning-note-page": "文档中没有该页(共{pages}页)。"
288
294
  }