@windward/core 0.20.0 → 0.21.1

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 (29) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/components/Content/Blocks/ClickableIcons.vue +113 -116
  3. package/components/Content/Blocks/OpenResponseCollate.vue +30 -15
  4. package/components/Content/Blocks/Video.vue +67 -40
  5. package/components/Settings/OpenResponseCollateSettings.vue +48 -16
  6. package/components/Settings/UserUploadSettings.vue +77 -17
  7. package/components/utils/FillInBlank/FillInBlankInput.vue +24 -1
  8. package/components/utils/FillInBlank/FillInTheBlanksManager.vue +5 -0
  9. package/components/utils/GenerateAIQuestionButton.vue +152 -12
  10. package/components/utils/TinyMCEWrapper.vue +22 -2
  11. package/i18n/en-US/components/content/blocks/generate_questions.ts +10 -0
  12. package/i18n/en-US/components/settings/open_response_collate.ts +2 -2
  13. package/i18n/en-US/components/settings/user_upload.ts +6 -4
  14. package/i18n/en-US/components/utils/FillInBlank/FillInBlankInput.ts +1 -0
  15. package/i18n/en-US/components/utils/FillInBlank/FillInTheBlanksManager.ts +1 -0
  16. package/i18n/en-US/shared/settings.ts +2 -0
  17. package/i18n/es-ES/components/content/blocks/generate_questions.ts +10 -0
  18. package/i18n/es-ES/components/settings/open_response_collate.ts +1 -0
  19. package/i18n/es-ES/components/settings/user_upload.ts +6 -4
  20. package/i18n/es-ES/components/utils/FillInBlank/FillInBlankInput.ts +4 -3
  21. package/i18n/es-ES/components/utils/FillInBlank/FillInTheBlanksManager.ts +2 -1
  22. package/i18n/es-ES/shared/settings.ts +2 -0
  23. package/i18n/sv-SE/components/content/blocks/generate_questions.ts +10 -0
  24. package/i18n/sv-SE/components/settings/open_response_collate.ts +2 -0
  25. package/i18n/sv-SE/components/settings/user_upload.ts +7 -5
  26. package/i18n/sv-SE/components/utils/FillInBlank/FillInBlankInput.ts +6 -5
  27. package/i18n/sv-SE/components/utils/FillInBlank/FillInTheBlanksManager.ts +5 -4
  28. package/i18n/sv-SE/shared/settings.ts +2 -0
  29. package/package.json +1 -1
@@ -1,10 +1,17 @@
1
1
  <template>
2
2
  <div>
3
- <v-container>
3
+ <v-container class="pa-0">
4
4
  <BaseContentBlockSettings
5
5
  v-model="block.metadata.config"
6
6
  :disabled="render"
7
7
  ></BaseContentBlockSettings>
8
+ <p>
9
+ {{
10
+ $t(
11
+ 'windward.core.components.settings.user_upload.max_file_size'
12
+ )
13
+ }}
14
+ </p>
8
15
  </v-container>
9
16
  <v-switch
10
17
  v-model="block.metadata.config.uploadSettings.multiple"
@@ -23,6 +30,7 @@
23
30
  item-value="value"
24
31
  outlined
25
32
  dense
33
+ style="z-index: 20"
26
34
  :label="
27
35
  $t('windward.core.components.settings.user_upload.accept_types')
28
36
  "
@@ -31,8 +39,8 @@
31
39
  </div>
32
40
  </template>
33
41
  <script>
34
- import BaseContentSettings from '~/components/Content/Settings/BaseContentSettings.js'
35
42
  import _ from 'lodash'
43
+ import BaseContentSettings from '~/components/Content/Settings/BaseContentSettings.js'
36
44
  import Uuid from '~/helpers/Uuid'
37
45
  import BaseContentBlockSettings from '~/components/Content/Settings/BaseContentBlockSettings.vue'
38
46
 
@@ -45,44 +53,96 @@ export default {
45
53
  valid: true,
46
54
  debounce: null,
47
55
  loading: false,
48
- acceptOptions: [
56
+ attrs: {
57
+ class: 'mb-6',
58
+ boilerplate: true,
59
+ elevation: 0,
60
+ },
61
+ }
62
+ },
63
+ computed: {
64
+ acceptOptions() {
65
+ const documents = [
66
+ { name: 'doc', value: 'application/msword' },
67
+ {
68
+ name: 'docx',
69
+ value: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
70
+ },
71
+ {
72
+ name: 'odt',
73
+ value: 'application/vnd.oasis.opendocument.text',
74
+ },
75
+ { name: 'pdf', value: 'application/pdf' },
76
+ { name: 'xls', value: 'application/vnd.ms-excel' },
77
+ {
78
+ name: 'xlsx',
79
+ value: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
80
+ },
81
+ { name: 'rtf', value: 'application/rtf' },
82
+ { name: 'pages', value: 'application/x-iwork-pages-sffpages' },
83
+ {
84
+ name: 'numbers',
85
+ value: 'application/x-iwork-numbers-sffnumbers',
86
+ },
87
+ { name: 'txt', value: 'text/plain' },
88
+ {
89
+ name: 'ods',
90
+ value: 'application/vnd.oasis.opendocument.spreadsheet',
91
+ },
92
+ {
93
+ name: 'csv',
94
+ value: 'text/csv',
95
+ },
96
+ {
97
+ name: 'pptx',
98
+ value: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
99
+ },
100
+ {
101
+ name: 'ppt',
102
+ value: 'application/vnd.ms-powerpoint',
103
+ },
104
+ {
105
+ name: 'odp',
106
+ value: 'application/vnd.oasis.opendocument.presentation',
107
+ },
108
+ {
109
+ name: 'keynote',
110
+ value: 'application/zip',
111
+ },
112
+ ]
113
+ return [
49
114
  {
50
115
  name: this.$t(
51
116
  'windward.core.components.settings.user_upload.types.all'
52
117
  ),
53
- value: 'image/jpeg,image/gif,image/png,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/zip',
118
+ value: '*',
54
119
  },
55
120
  {
56
121
  name: this.$t(
57
122
  'windward.core.components.settings.user_upload.types.all_image'
58
123
  ),
59
- value: 'image/jpeg,image/gif,image/png',
124
+ value: 'image/*',
60
125
  },
61
126
  {
62
127
  name: this.$t(
63
- 'windward.core.components.settings.user_upload.types.all_word'
128
+ 'windward.core.components.settings.user_upload.types.all_video_audio'
64
129
  ),
65
- value: 'application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document',
130
+ value: 'video/*,audio/*',
66
131
  },
67
132
  {
68
133
  name: this.$t(
69
- 'windward.core.components.settings.user_upload.types.all_excel'
134
+ 'windward.core.components.settings.user_upload.types.all_word'
70
135
  ),
71
- value: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
136
+ value: documents.map((type) => type.value).join(','),
72
137
  },
73
138
  {
74
139
  name: this.$t(
75
140
  'windward.core.components.settings.user_upload.types.all_zip'
76
141
  ),
77
- value: 'application/zip',
142
+ value: 'application/zip,application/gzip,application/x-gzip,application/x-tar,application/rar,application/x-rar-compressed,application/x-7z-compressed,application/x-bzip2,application/x-xz',
78
143
  },
79
- ],
80
- attrs: {
81
- class: 'mb-6',
82
- boilerplate: true,
83
- elevation: 0,
84
- },
85
- }
144
+ ]
145
+ },
86
146
  },
87
147
  beforeMount() {
88
148
  if (_.isEmpty(this.block)) {
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <span class="fib">
3
- <v-dialog v-model="show" max-width="300">
3
+ <v-dialog v-model="show" max-width="500" width="90%">
4
4
  <v-card>
5
5
  <v-card-text class="pt-6">
6
6
  <div>
@@ -20,6 +20,16 @@
20
20
  )
21
21
  }}
22
22
  </p>
23
+ <div v-if="hasExplanation" class="mt-3">
24
+ <p class="font-weight-bold mb-1">
25
+ {{
26
+ $t(
27
+ 'windward.core.components.utils.fill_in_the_blank.fill_in_blank_input.explanation'
28
+ )
29
+ }}:
30
+ </p>
31
+ <div v-html="decodedDescription"></div>
32
+ </div>
23
33
  </div>
24
34
  </v-card-text>
25
35
  <v-card-actions>
@@ -141,6 +151,19 @@ export default {
141
151
  }
142
152
  return ''
143
153
  },
154
+ hasExplanation() {
155
+ return this.description && this.description.trim() !== '' && this.description !== 'empty'
156
+ },
157
+ decodedDescription() {
158
+ if (!this.hasExplanation) {
159
+ return ''
160
+ }
161
+ try {
162
+ return atob(this.description)
163
+ } catch (e) {
164
+ return this.description
165
+ }
166
+ },
144
167
  },
145
168
  watch: {
146
169
  // set focus on the action button when dialog loaded for accessibility
@@ -19,6 +19,11 @@
19
19
  <TextEditor
20
20
  :key="key"
21
21
  v-model="feedback"
22
+ :label="
23
+ $t(
24
+ 'windward.core.components.utils.fill_in_the_blank.fill_in_the_blank_manager.explanation'
25
+ )
26
+ "
22
27
  @input="submit"
23
28
  ></TextEditor>
24
29
  </v-col>
@@ -44,7 +44,7 @@
44
44
  </div>
45
45
  </v-col>
46
46
  <v-col
47
- v-if="isFlashcardType"
47
+ v-if="isFlashcardType || isMatchingGameType || isSortingGameType"
48
48
  cols="auto"
49
49
  class="d-flex align-center"
50
50
  >
@@ -124,14 +124,32 @@ export default {
124
124
  isBucketGameType() {
125
125
  return this.questionType === 'bucket_game'
126
126
  },
127
+ isMatchingGameType() {
128
+ return this.questionType === 'matching_game'
129
+ },
130
+ isSortingGameType() {
131
+ return this.questionType === 'sorting_game'
132
+ },
127
133
  replaceExistingLabel() {
128
134
  if (this.isBucketGameType) {
129
135
  return this.$t(
130
136
  'windward.games.components.settings.bucket_game.form.replace_existing'
131
137
  )
138
+ return this.$t(
139
+ 'windward.games.components.settings.bucket_game.form.replace_existing'
140
+ )
141
+ }
142
+ if (this.isMatchingGameType) {
143
+ return this.$t(
144
+ 'windward.games.components.settings.matching_game.form.replace_existing')
145
+ }
146
+ if (this.isSortingGameType) {
147
+ return this.$t(
148
+ 'windward.games.components.settings.sorting_game.form.replace_existing')
132
149
  }
133
150
  return this.$t(
134
151
  'windward.games.components.settings.flashcard.form.replace_existing'
152
+
135
153
  )
136
154
  },
137
155
  flattenedContent() {
@@ -192,14 +210,18 @@ export default {
192
210
  ]
193
211
 
194
212
  // Only add higher-level Bloom's taxonomy for supported question types
195
- // Flashcards and bucket games use only basic levels
196
- if (
213
+ const supportsAdvancedTaxonomy =
214
+ this.isSortingGameType ||
215
+ ([
216
+ 'multi_choice_single_answer',
217
+ 'multi_choice_multi_answer',
218
+ 'ordering'
219
+ ].includes(this.questionType) &&
197
220
  !this.isFlashcardType &&
198
221
  !this.isBucketGameType &&
199
- (this.questionType === 'multi_choice_single_answer' ||
200
- this.questionType === 'ordering' ||
201
- this.questionType === 'multi_choice_multi_answer')
202
- ) {
222
+ !this.isMatchingGameType)
223
+
224
+ if (supportsAdvancedTaxonomy) {
203
225
  const multiBlooms = [
204
226
  {
205
227
  value: 'Analyze',
@@ -227,6 +249,14 @@ export default {
227
249
  return this.$t(
228
250
  'windward.core.components.content.blocks.generate_questions.button_label_bucket_game'
229
251
  )
252
+ } else if (this.questionType === 'matching_game') {
253
+ return this.$t(
254
+ 'windward.core.components.content.blocks.generate_questions.button_label_matching_game'
255
+ )
256
+ } else if (this.questionType === 'sorting_game') {
257
+ return this.$t(
258
+ 'windward.core.components.content.blocks.generate_questions.button_label_sorting_game'
259
+ )
230
260
  } else {
231
261
  return this.$t(
232
262
  'windward.core.components.content.blocks.generate_questions.button_label'
@@ -249,9 +279,8 @@ export default {
249
279
  }
250
280
 
251
281
  const course = new Course(this.course)
252
- const content = new Content(
253
- this.selectedContent || this.content
254
- )
282
+ const contentData = this.selectedContent || this.content
283
+ const content = new Content(contentData)
255
284
 
256
285
  let response
257
286
  if (this.questionType === 'flashcard') {
@@ -347,6 +376,96 @@ export default {
347
376
  'Invalid response from bucket game generation'
348
377
  )
349
378
  }
379
+ } else if (this.questionType === 'matching_game') {
380
+ // MATCHING GAME GENERATION
381
+ const activity = new Activity()
382
+
383
+ const endpoint = `suggest/matching_game${bloomsRequest}`;
384
+
385
+ response = await Activity.custom(
386
+ course,
387
+ content,
388
+ activity,
389
+ endpoint
390
+ ).get()
391
+
392
+ let activityData = null
393
+
394
+ if (response && response.activity) {
395
+ activityData = response.activity
396
+ } else if (
397
+ response &&
398
+ response.length > 0 &&
399
+ response[0] &&
400
+ response[0].activity
401
+ ) {
402
+ activityData = response[0].activity
403
+ } else if (Array.isArray(response) && response.length > 0) {
404
+ activityData = response[0]
405
+ }
406
+
407
+ if (activityData && activityData.metadata &&
408
+ activityData.metadata.config &&
409
+ activityData.metadata.config.answerObjects &&
410
+ activityData.metadata.config.prompts
411
+ ) {
412
+ // We pass the activity data and the replace flag to the parent component
413
+ this.$emit(
414
+ 'click:generate',
415
+ activityData,
416
+ this.replaceExisting
417
+ )
418
+ } else {
419
+ throw new Error(
420
+ 'Invalid response from matching game generation'
421
+ )
422
+ }
423
+ } else if (this.questionType === 'sorting_game') {
424
+ // SORTING GAME GENERATION
425
+ const activity = new Activity()
426
+
427
+ const endpoint = `suggest/sorting_game${bloomsRequest}`;
428
+
429
+ response = await Activity.custom(
430
+ course,
431
+ content,
432
+ activity,
433
+ endpoint
434
+ ).get()
435
+
436
+ let activityData = null
437
+
438
+ if (response && response.activity) {
439
+ activityData = response.activity
440
+ } else if (
441
+ response &&
442
+ response.length > 0 &&
443
+ response[0] &&
444
+ response[0].activity
445
+ ) {
446
+ activityData = response[0].activity
447
+ } else if (Array.isArray(response) && response.length > 0) {
448
+ activityData = response[0]
449
+ } else if (response) {
450
+ activityData = response
451
+ }
452
+
453
+ if (activityData && activityData.metadata &&
454
+ activityData.metadata.config &&
455
+ activityData.metadata.config.answer &&
456
+ Array.isArray(activityData.metadata.config.answer)
457
+ ) {
458
+ // We pass the activity data and the replace flag to the parent component
459
+ this.$emit(
460
+ 'click:generate',
461
+ activityData,
462
+ this.replaceExisting
463
+ )
464
+ } else {
465
+ throw new Error(
466
+ 'Invalid response from sorting game generation'
467
+ )
468
+ }
350
469
  } else {
351
470
  // ASSESSMENT QUESTION GENERATION
352
471
  const assessment = new Assessment({ id: this.block.id })
@@ -392,6 +511,28 @@ export default {
392
511
  this.$t(
393
512
  `${basePath}.content_mismatch_bucket_game_support`
394
513
  )
514
+ } else if (
515
+ (errorMessage === 'activity.error.content_mismatch' ||
516
+ errorType === 'content_mismatch') &&
517
+ this.questionType === 'matching_game'
518
+ ) {
519
+ errorText =
520
+ this.$t(`${basePath}.content_mismatch_matching_game`) +
521
+ '\n\n' +
522
+ this.$t(
523
+ `${basePath}.content_mismatch_matching_game_support`
524
+ )
525
+ } else if (
526
+ (errorMessage === 'activity.error.content_mismatch' ||
527
+ errorType === 'content_mismatch') &&
528
+ this.questionType === 'sorting_game'
529
+ ) {
530
+ errorText =
531
+ this.$t(`${basePath}.content_mismatch_sorting_game`) +
532
+ '\n\n' +
533
+ this.$t(
534
+ `${basePath}.content_mismatch_sorting_game_support`
535
+ )
395
536
  } else {
396
537
  errorText =
397
538
  this.$t(`${basePath}.${errorType}`) +
@@ -429,5 +570,4 @@ export default {
429
570
  border-radius: 15px;
430
571
  }
431
572
  </style>
432
- }
433
- </style>
573
+
@@ -36,7 +36,12 @@
36
36
  <label v-if="hint" class="editor-hint">{{ hint }}</label>
37
37
  </slot>
38
38
  </div>
39
- <v-btn-toggle dense multiple class="pt-1 d-flex justify-end">
39
+ <v-btn-toggle
40
+ v-if="hasActions"
41
+ dense
42
+ multiple
43
+ class="pt-1 d-flex justify-end"
44
+ >
40
45
  <slot name="actions-prepend" :render="render"></slot>
41
46
  <slot name="actions" :render="render">
42
47
  <v-btn-toggle v-if="allowRead && !render" dense>
@@ -61,7 +66,6 @@ import _ from 'lodash'
61
66
  import 'tinymce'
62
67
  import Editor from '@tinymce/tinymce-vue'
63
68
  import { getTinymce } from '@tinymce/tinymce-vue/lib/cjs/main/ts/TinyMCE'
64
- import GlossaryVerification from '../Glossary/GlossaryVerification.vue'
65
69
  /* Required TinyMCE components */
66
70
  import 'tinymce/icons/default/icons.min.js'
67
71
  import 'tinymce/themes/silver/theme.min.js'
@@ -112,6 +116,7 @@ import 'tinymce/skins/content/dark/content.js'
112
116
 
113
117
  import { Synthesizer } from 'speechreader'
114
118
  import Crypto from '~/helpers/Crypto'
119
+ import GlossaryVerification from '../Glossary/GlossaryVerification.vue'
115
120
  import MathHelper from '../../helpers/MathHelper'
116
121
  import { WindwardPlugins } from '../../helpers/tinymce/WindwardPlugins'
117
122
 
@@ -159,6 +164,21 @@ export default {
159
164
  },
160
165
 
161
166
  computed: {
167
+ hasActions() {
168
+ if (this.allowRead && !render) {
169
+ return true
170
+ }
171
+ // reach into parent text editor to see if a slot has been used.
172
+ // Cant access this.$slots when daisy chained like we're doing with texteditor
173
+ if (_.isEmpty(this.$parent) || _.isEmpty(this.$parent.$slots)) {
174
+ return false
175
+ }
176
+ return (
177
+ typeof this.$parent.$slots['actions-prepend'] !== 'undefined' ||
178
+ typeof this.$parent.$slots['actions'] !== 'undefined' ||
179
+ typeof this.$parent.$slots['actions-append'] !== 'undefined'
180
+ )
181
+ },
162
182
  dataCy() {
163
183
  return (
164
184
  this.dataKey ||
@@ -16,6 +16,14 @@ export default {
16
16
  content_mismatch_bucket_game_support:
17
17
  "Consider adding content with clear categories and multiple sortable items that can be grouped into 2-4 distinct buckets.",
18
18
 
19
+ content_mismatch_matching_game: "Content not suitable for matching games.",
20
+ content_mismatch_matching_game_support:
21
+ "Consider adding content that explicitly defines relationships between terms, concepts, or categories that students can match.",
22
+
23
+ content_mismatch_sorting_game: "Content not suitable for sorting games.",
24
+ content_mismatch_sorting_game_support:
25
+ "Consider adding content with sequential steps, chronological events, or items that have a clear logical order for students to arrange.",
26
+
19
27
  llm_unavailable: 'Question generation temporarily unavailable.',
20
28
  llm_unavailable_support:
21
29
  "We're unable to connect to our AI service at the moment. Please try again in a few minutes or contact support if the issue persists.",
@@ -27,6 +35,8 @@ export default {
27
35
  button_label: 'Generate Question',
28
36
  button_label_flashcard: 'Generate Flashcards',
29
37
  button_label_bucket_game: 'Generate Buckets',
38
+ button_label_matching_game: 'Generate Matches',
39
+ button_label_sorting_game: 'Generate Items',
30
40
  selected_pages: 'Selected Page',
31
41
  ai_assistance: 'AI Assistance',
32
42
  blooms: {
@@ -1,6 +1,6 @@
1
1
  export default {
2
- instructions:
3
- 'Check off open response items to collate into a document.',
2
+ instructions: 'Check off open response items to collate into a document.',
4
3
  include_prompts: 'Include Prompts',
5
4
  filename: 'Filename (Blank for current page name)',
5
+ additional_text: 'Additional text to display in downloaded document',
6
6
  }
@@ -3,10 +3,12 @@ export default {
3
3
  accept_types: 'Allowed File Types',
4
4
  types: {
5
5
  all: 'All File Types',
6
- all_image: 'Images - .jpg, .png, .gif',
7
- all_word: 'Documents - .doc and .docx',
8
- all_excel: 'Spreadsheets - .xls and .xlsx',
9
- all_zip: 'Compressed - .zip',
6
+ all_image: 'Images',
7
+ all_word: 'Documents (Text, Spreadsheets, Presentations)',
8
+ all_zip: 'Compressed',
9
+ all_video_audio: 'Video/Audio',
10
+ file: 'file',
10
11
  },
12
+ max_file_size: 'Maximum file size: 100MB',
11
13
  instructions: 'Drag or click here to upload files.',
12
14
  }
@@ -12,4 +12,5 @@ export default {
12
12
  try_again: 'Try Again',
13
13
  user_input: 'Your answer: {0}',
14
14
  correct_answer: 'Correct answer: {0}',
15
+ explanation: 'Explanation',
15
16
  }
@@ -8,4 +8,5 @@ export default {
8
8
  add_answer: 'Add Answer',
9
9
  default_description: 'default description',
10
10
  answer: 'Answer',
11
+ explanation: 'Explanation',
11
12
  }
@@ -26,4 +26,6 @@ export default {
26
26
  upload_file: 'Upload File',
27
27
  alt_image: 'Alternate text for image',
28
28
  aria_described: 'Aria described by',
29
+ top: 'top',
30
+ bottom: 'bottom',
29
31
  }
@@ -18,6 +18,14 @@ export default {
18
18
  content_mismatch_bucket_game_support:
19
19
  'Considera agregar contenido con categorías claras y múltiples elementos clasificables que se puedan agrupar en 2-4 categorías distintas.',
20
20
 
21
+ content_mismatch_matching_game: 'El contenido no es adecuado para juegos de emparejamiento.',
22
+ content_mismatch_matching_game_support:
23
+ 'Considera agregar contenido que defina explícitamente relaciones entre términos, conceptos o categorías que los estudiantes puedan emparejar.',
24
+
25
+ content_mismatch_sorting_game: 'El contenido no es adecuado para juegos de ordenamiento.',
26
+ content_mismatch_sorting_game_support:
27
+ 'Considera agregar contenido con pasos secuenciales, eventos cronológicos o elementos que tengan un orden lógico claro para que los estudiantes los organicen.',
28
+
21
29
  llm_unavailable:
22
30
  'La generación de preguntas no está disponible temporalmente.',
23
31
  llm_unavailable_support:
@@ -30,6 +38,8 @@ export default {
30
38
  button_label: 'Generar pregunta',
31
39
  button_label_flashcard: 'Generar tarjetas',
32
40
  button_label_bucket_game: 'Generar categorías',
41
+ button_label_matching_game: 'Generar coincidencias',
42
+ button_label_sorting_game: 'Generar elementos',
33
43
  selected_pages: 'Página seleccionada',
34
44
  ai_assistance: 'Asistencia de IA',
35
45
  blooms: {
@@ -4,4 +4,5 @@ export default {
4
4
  include_prompts: 'Incluir mensajes',
5
5
  filename:
6
6
  'Nombre de archivo (en blanco para el nombre de la página actual)',
7
+ additional_text: 'Texto adicional para mostrar en el documento descargado',
7
8
  }
@@ -3,10 +3,12 @@ export default {
3
3
  accept_types: 'Tipos de archivos permitidos ',
4
4
  types: {
5
5
  all: 'Todos los tipos de archivos',
6
- all_image: 'Imágenes - .jpg, .png, .gif',
7
- all_word: 'Documentos - .doc y .docx',
8
- all_excel: 'Hojas de cálculo - .xls y .xlsx',
9
- all_zip: 'Comprimido - .zip',
6
+ all_image: 'Imágenes',
7
+ all_word: 'Documentos (Texto, Hojas de cálculo, Presentaciones)',
8
+ all_zip: 'Comprimido',
9
+ all_video_audio: 'Video/Audio',
10
+ file: 'Archivo',
10
11
  },
12
+ max_file_size: 'Tamaño máximo de archivo: 100 MB',
11
13
  instructions: 'Arrastre o haga clic aquí para cargar archivos.',
12
14
  }
@@ -2,14 +2,15 @@ export default {
2
2
  add_answer: 'Agregar respuesta',
3
3
  answer: 'Respuesta',
4
4
  check: 'Verificar',
5
- check_answer: 'Haga clic para comprobar respuesta',
5
+ check_answer: 'Haga clic para verificar la respuesta',
6
6
  close: 'Cerrar',
7
7
  correct: 'Correcto',
8
8
  default_description: 'Su entrada es correcta',
9
9
  incorrect: 'Incorrecto',
10
10
  input_incorrect: "'{0}' es incorrecto",
11
- reset: 'restablecer',
11
+ reset: 'reiniciar',
12
12
  try_again: 'Intentar de nuevo',
13
- user_input: 'Tu respuesta: {0}',
13
+ user_input: 'Su respuesta: {0}',
14
14
  correct_answer: 'Respuesta correcta: {0}',
15
+ explanation: 'Explicación',
15
16
  }
@@ -3,9 +3,10 @@ export default {
3
3
  try_again: 'Intentar de nuevo',
4
4
  correct: 'Correcto',
5
5
  incorrect: 'Incorrecto',
6
- reset: 'restablecer',
6
+ reset: 'reiniciar',
7
7
  check: 'Verificar',
8
8
  add_answer: 'Agregar respuesta',
9
9
  default_description: 'descripción predeterminada',
10
10
  answer: 'Respuesta',
11
+ explanation: 'Explicación',
11
12
  }
@@ -27,4 +27,6 @@ export default {
27
27
  upload_file: 'Subir Archivo',
28
28
  alt_image: 'Texto alternativo para imagen',
29
29
  aria_described: 'Aria descrita por',
30
+ top: 'Arriba',
31
+ bottom: 'Abajo',
30
32
  }