@things-factory/learning 10.1.261 → 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 (42) hide show
  1. package/dist-client/pages/learning-course-list.d.ts +0 -4
  2. package/dist-client/pages/learning-course-list.js +48 -14
  3. package/dist-client/pages/learning-course-list.js.map +1 -1
  4. package/dist-client/pages/learning-enrollment-status.d.ts +3 -0
  5. package/dist-client/pages/learning-enrollment-status.js +13 -9
  6. package/dist-client/pages/learning-enrollment-status.js.map +1 -1
  7. package/dist-client/tsconfig.tsbuildinfo +1 -1
  8. package/dist-server/service/course/course-query.d.ts +1 -0
  9. package/dist-server/service/course/course-query.js +13 -0
  10. package/dist-server/service/course/course-query.js.map +1 -1
  11. package/dist-server/service/enrollment/enrollment-mutation.d.ts +1 -1
  12. package/dist-server/service/enrollment/enrollment-mutation.js +6 -6
  13. package/dist-server/service/enrollment/enrollment-mutation.js.map +1 -1
  14. package/dist-server/service/enrollment/enrollment-query.d.ts +4 -1
  15. package/dist-server/service/enrollment/enrollment-query.js +21 -1
  16. package/dist-server/service/enrollment/enrollment-query.js.map +1 -1
  17. package/dist-server/service/enrollment/enrollment-service.d.ts +4 -3
  18. package/dist-server/service/enrollment/enrollment-service.js +28 -15
  19. package/dist-server/service/enrollment/enrollment-service.js.map +1 -1
  20. package/dist-server/service/enrollment/enrollment-status.d.ts +11 -0
  21. package/dist-server/service/enrollment/enrollment-status.js +42 -0
  22. package/dist-server/service/enrollment/enrollment-status.js.map +1 -1
  23. package/dist-server/service/enrollment/enrollment-type.d.ts +7 -0
  24. package/dist-server/service/enrollment/enrollment-type.js +27 -1
  25. package/dist-server/service/enrollment/enrollment-type.js.map +1 -1
  26. package/dist-server/service/enrollment/index.d.ts +3 -3
  27. package/dist-server/service/enrollment/index.js +3 -3
  28. package/dist-server/service/enrollment/index.js.map +1 -1
  29. package/dist-server/service/enrollment/progress-rules.d.ts +4 -0
  30. package/dist-server/service/enrollment/progress-rules.js +7 -1
  31. package/dist-server/service/enrollment/progress-rules.js.map +1 -1
  32. package/dist-server/service/index.d.ts +2 -2
  33. package/dist-server/service/index.js +2 -2
  34. package/dist-server/service/index.js.map +1 -1
  35. package/dist-server/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +13 -13
  37. package/translations/en.json +13 -3
  38. package/translations/es.json +13 -3
  39. package/translations/ja.json +13 -3
  40. package/translations/ko.json +13 -3
  41. package/translations/ms.json +13 -3
  42. package/translations/zh.json +13 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/learning",
3
- "version": "10.1.261",
3
+ "version": "10.1.262",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -39,21 +39,21 @@
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.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",
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",
47
47
  "@things-factory/env": "^10.1.149",
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",
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",
54
54
  "graphql-tag": "^2.12.6",
55
55
  "graphql-upload": "^15.0.2",
56
56
  "lit": "^3.1.2"
57
57
  },
58
- "gitHead": "06537757f8708e6a511c6232e8792f18fdd6a986"
58
+ "gitHead": "2d5babff1e0f83bb0dfdf2ec91e4e7c00f9ac5bd"
59
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.",
@@ -136,7 +137,7 @@
136
137
  "text.learning-attempt-limit-hint": "Leave empty for no limit.",
137
138
  "text.learning-attempts-left": "{count} attempts left.",
138
139
  "text.learning-best-score": "Best score: {score}.",
139
- "text.learning-cancelled": "The enrolment is cancelled.",
140
+ "text.learning-cancelled": "{count} enrolments were cancelled.",
140
141
  "text.learning-category-job": "Job training",
141
142
  "text.learning-category-mandatory": "Mandatory training",
142
143
  "text.learning-category-onboarding": "Onboarding",
@@ -168,7 +169,7 @@
168
169
  "text.learning-not-published": "Not published",
169
170
  "text.learning-nothing-to-take": "No courses are assigned to you.",
170
171
  "text.learning-pass-score-hint": "Out of 100. Leave empty for no quiz.",
171
- "text.learning-pick-one": "Select one enrolment.",
172
+ "text.learning-pick-cancellable": "Select the enrolments to cancel.",
172
173
  "text.learning-pick-open": "Select enrollments that have not been completed.",
173
174
  "text.learning-question-count-hint": "Each attempt draws this many questions at random. Leave empty to draw them all.",
174
175
  "text.learning-question-delete-confirm": "Delete this question?",
@@ -274,5 +275,14 @@
274
275
  "error.learning-ai-source-read": "Could not read the source. Check access and the file, then retry.",
275
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.",
276
277
  "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."
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"
278
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}».",
@@ -136,7 +137,7 @@
136
137
  "text.learning-attempt-limit-hint": "Déjelo vacío para no limitar.",
137
138
  "text.learning-attempts-left": "Quedan {count} intentos.",
138
139
  "text.learning-best-score": "Mejor puntuación: {score}.",
139
- "text.learning-cancelled": "Inscripción cancelada.",
140
+ "text.learning-cancelled": "Se cancelaron {count} inscripciones.",
140
141
  "text.learning-category-job": "Formación del puesto",
141
142
  "text.learning-category-mandatory": "Formación obligatoria",
142
143
  "text.learning-category-onboarding": "Incorporación",
@@ -168,7 +169,7 @@
168
169
  "text.learning-not-published": "Sin publicar",
169
170
  "text.learning-nothing-to-take": "No tiene cursos asignados.",
170
171
  "text.learning-pass-score-hint": "Sobre 100. Déjelo vacío para no evaluar.",
171
- "text.learning-pick-one": "Seleccione una inscripción.",
172
+ "text.learning-pick-cancellable": "Seleccione las inscripciones que desea cancelar.",
172
173
  "text.learning-pick-open": "Seleccione inscripciones no finalizadas.",
173
174
  "text.learning-question-count-hint": "Cada intento elige al azar este número de preguntas. Déjelo vacío para usarlas todas.",
174
175
  "text.learning-question-delete-confirm": "¿Eliminar esta pregunta?",
@@ -274,5 +275,14 @@
274
275
  "error.learning-ai-source-read": "No se pudo leer la fuente. Revise acceso y archivo e inténtelo de nuevo.",
275
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.",
276
277
  "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."
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"
278
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}」コースはすでにあります。",
@@ -136,7 +137,7 @@
136
137
  "text.learning-attempt-limit-hint": "空欄の場合、受験回数を制限しません。",
137
138
  "text.learning-attempts-left": "残りの受験回数は{count}回です。",
138
139
  "text.learning-best-score": "最高点は{score}点です。",
139
- "text.learning-cancelled": "受講を取り消しました。",
140
+ "text.learning-cancelled": "受講{count}件を取り消しました。",
140
141
  "text.learning-category-job": "職務教育",
141
142
  "text.learning-category-mandatory": "法定義務教育",
142
143
  "text.learning-category-onboarding": "入社教育",
@@ -168,7 +169,7 @@
168
169
  "text.learning-not-published": "公開中の改訂版なし",
169
170
  "text.learning-nothing-to-take": "割り当てられたコースはありません。",
170
171
  "text.learning-pass-score-hint": "100点満点です。空欄の場合、評価なしで修了できます。",
171
- "text.learning-pick-one": "受講を1件選択してください。",
172
+ "text.learning-pick-cancellable": "取り消す受講を選択してください。",
172
173
  "text.learning-pick-open": "進行中または未着手の受講を選択してください。",
173
174
  "text.learning-question-count-hint": "受験ごとに登録問題からこの数だけ無作為に出題します。空欄の場合はすべて出題します。",
174
175
  "text.learning-question-delete-confirm": "この問題を削除しますか?",
@@ -274,5 +275,14 @@
274
275
  "error.learning-ai-source-read": "元の資料を読めません。アクセス権とファイルを確認して再試行してください。",
275
276
  "error.learning-ai-video-limit": "自動文字起こしは60分・250MB以下のMP4/WebM、12万文字以内の台本に対応します。資料を分割してください。",
276
277
  "error.learning-ai-transcription-unavailable": "現在のAIは音声文字起こしに対応していません。OpenAIを既定にするか字幕・台本を提供してください。",
277
- "error.learning-ai-audio-unreadable": "音声を読めません。ffmpeg・MP4/WebM形式・音声トラックを確認するか字幕を提供してください。"
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": "評価なし"
278
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}」 과정이 이미 있습니다.",
@@ -136,7 +137,7 @@
136
137
  "text.learning-attempt-limit-hint": "비워 두면 응시 횟수를 제한하지 않습니다.",
137
138
  "text.learning-attempts-left": "남은 응시 횟수는 {count}회입니다.",
138
139
  "text.learning-best-score": "최고 점수는 {score}점입니다.",
139
- "text.learning-cancelled": "수강을 취소했습니다.",
140
+ "text.learning-cancelled": "수강 {count}건을 취소했습니다.",
140
141
  "text.learning-category-job": "직무 교육",
141
142
  "text.learning-category-mandatory": "법정 의무교육",
142
143
  "text.learning-category-onboarding": "입사 교육",
@@ -168,7 +169,7 @@
168
169
  "text.learning-not-published": "공개된 개정본 없음",
169
170
  "text.learning-nothing-to-take": "배정된 과정이 없습니다.",
170
171
  "text.learning-pass-score-hint": "100점 만점 기준입니다. 비워 두면 평가 없이 이수할 수 있습니다.",
171
- "text.learning-pick-one": "수강을 하나 선택하세요.",
172
+ "text.learning-pick-cancellable": "취소할 수강을 선택하세요.",
172
173
  "text.learning-pick-open": "미이수 상태의 수강 내역을 선택하세요.",
173
174
  "text.learning-question-count-hint": "응시할 때마다 등록된 문항 중 이 수만큼 무작위로 출제합니다. 비워 두면 모든 문항을 출제합니다.",
174
175
  "text.learning-question-delete-confirm": "이 문항을 삭제하시겠습니까?",
@@ -274,5 +275,14 @@
274
275
  "error.learning-ai-source-read": "원본 자료를 읽지 못했습니다. 접근 권한과 파일 상태를 확인하고 다시 시도하세요.",
275
276
  "error.learning-ai-video-limit": "자동 전사는 60분·250MB 이하 MP4/WebM과 12만 자 이내 대본을 지원합니다. 자료를 나눠 주세요.",
276
277
  "error.learning-ai-transcription-unavailable": "현재 AI 설정은 음성 전사를 지원하지 않습니다. OpenAI 에이전트를 기본 AI로 설정하거나 자막·대본을 첨부해 주세요.",
277
- "error.learning-ai-audio-unreadable": "음성을 읽지 못했습니다. 서버 ffmpeg 설치, MP4/WebM 형식과 음성 트랙을 확인하거나 자막·대본을 첨부해 주세요."
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": "평가 없음"
278
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.",
@@ -136,7 +137,7 @@
136
137
  "text.learning-attempt-limit-hint": "Biarkan kosong untuk tiada had.",
137
138
  "text.learning-attempts-left": "Baki cubaan: {count}.",
138
139
  "text.learning-best-score": "Markah terbaik: {score}.",
139
- "text.learning-cancelled": "Pendaftaran dibatalkan.",
140
+ "text.learning-cancelled": "{count} pendaftaran telah dibatalkan.",
140
141
  "text.learning-category-job": "Latihan tugas",
141
142
  "text.learning-category-mandatory": "Latihan wajib",
142
143
  "text.learning-category-onboarding": "Orientasi",
@@ -168,7 +169,7 @@
168
169
  "text.learning-not-published": "Belum diterbitkan",
169
170
  "text.learning-nothing-to-take": "Tiada kursus ditugaskan kepada anda.",
170
171
  "text.learning-pass-score-hint": "Daripada 100. Biarkan kosong untuk tiada kuiz.",
171
- "text.learning-pick-one": "Pilih satu pendaftaran.",
172
+ "text.learning-pick-cancellable": "Pilih pendaftaran yang hendak dibatalkan.",
172
173
  "text.learning-pick-open": "Pilih pendaftaran yang belum tamat.",
173
174
  "text.learning-question-count-hint": "Setiap cubaan memilih sebanyak ini soalan secara rawak. Biarkan kosong untuk semua.",
174
175
  "text.learning-question-delete-confirm": "Padam soalan ini?",
@@ -274,5 +275,14 @@
274
275
  "error.learning-ai-source-read": "Sumber tidak dapat dibaca. Semak akses dan fail, kemudian cuba lagi.",
275
276
  "error.learning-ai-video-limit": "Transkripsi menyokong MP4/WebM sehingga 60 minit/250 MB dan 120,000 aksara. Bahagikan bahan.",
276
277
  "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."
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"
278
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}”的课程。",
@@ -136,7 +137,7 @@
136
137
  "text.learning-attempt-limit-hint": "留空则不限次数。",
137
138
  "text.learning-attempts-left": "剩余作答次数 {count} 次。",
138
139
  "text.learning-best-score": "最高分为 {score} 分。",
139
- "text.learning-cancelled": "已取消选课。",
140
+ "text.learning-cancelled": "已取消 {count} 项选课。",
140
141
  "text.learning-category-job": "岗位培训",
141
142
  "text.learning-category-mandatory": "法定必修培训",
142
143
  "text.learning-category-onboarding": "入职培训",
@@ -168,7 +169,7 @@
168
169
  "text.learning-not-published": "未发布",
169
170
  "text.learning-nothing-to-take": "暂无分配给您的课程。",
170
171
  "text.learning-pass-score-hint": "满分 100 分。留空则无需测验即可结业。",
171
- "text.learning-pick-one": "请选择一项选课。",
172
+ "text.learning-pick-cancellable": "请选择要取消的选课。",
172
173
  "text.learning-pick-open": "请选择进行中或未开始的选课。",
173
174
  "text.learning-question-count-hint": "每次作答从题库随机抽取该数量的题目。留空则全部出题。",
174
175
  "text.learning-question-delete-confirm": "确定删除该题目吗?",
@@ -274,5 +275,14 @@
274
275
  "error.learning-ai-source-read": "无法读取原始资料,请检查权限和文件后重试。",
275
276
  "error.learning-ai-video-limit": "自动转录支持60分钟、250MB以内的MP4/WebM及12万字符以内文稿,请拆分资料。",
276
277
  "error.learning-ai-transcription-unavailable": "当前AI不支持语音转录,请设置OpenAI默认代理或提供字幕文稿。",
277
- "error.learning-ai-audio-unreadable": "无法读取语音,请检查服务器ffmpeg、MP4/WebM格式和音轨,或提供字幕文稿。"
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": "无测验"
278
288
  }