fcad-core-dragon 2.0.0-beta.0

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 (90) hide show
  1. package/.editorconfig +33 -0
  2. package/.eslintignore +29 -0
  3. package/.eslintrc.js +86 -0
  4. package/.prettierrc.js +5 -0
  5. package/CHANGELOG +364 -0
  6. package/README.md +72 -0
  7. package/babel.config.js +3 -0
  8. package/package.json +65 -0
  9. package/src/$locales/en.json +155 -0
  10. package/src/$locales/fr.json +156 -0
  11. package/src/assets/data/onboardingMessages.json +47 -0
  12. package/src/assets/img/BeanEater-1s-200px.svg +25 -0
  13. package/src/components/AppBase.vue +635 -0
  14. package/src/components/AppBaseButton.vue +63 -0
  15. package/src/components/AppBaseDragChoice.vue +91 -0
  16. package/src/components/AppBaseDropZone.vue +112 -0
  17. package/src/components/AppBaseErrorDisplay.vue +391 -0
  18. package/src/components/AppBaseFlipCard.vue +83 -0
  19. package/src/components/AppBaseModule.vue +1589 -0
  20. package/src/components/AppBasePage.vue +338 -0
  21. package/src/components/AppCompBranchButtons.vue +581 -0
  22. package/src/components/AppCompButtonProgress.vue +158 -0
  23. package/src/components/AppCompCarousel.vue +285 -0
  24. package/src/components/AppCompDragAndDrop.vue +339 -0
  25. package/src/components/AppCompInputAssociation.vue +332 -0
  26. package/src/components/AppCompInputCheckBox.vue +227 -0
  27. package/src/components/AppCompInputDropdown.vue +184 -0
  28. package/src/components/AppCompInputRadio.vue +169 -0
  29. package/src/components/AppCompInputTextBox.vue +91 -0
  30. package/src/components/AppCompInputTextTable.vue +155 -0
  31. package/src/components/AppCompInputTextToFillDropdown.vue +255 -0
  32. package/src/components/AppCompInputTextToFillText.vue +164 -0
  33. package/src/components/AppCompJauge.vue +56 -0
  34. package/src/components/AppCompMediaPlayer.vue +365 -0
  35. package/src/components/AppCompMenu.vue +203 -0
  36. package/src/components/AppCompMenuItem.vue +216 -0
  37. package/src/components/AppCompNavigationFull.vue +1791 -0
  38. package/src/components/AppCompPlayBar.vue +1540 -0
  39. package/src/components/AppCompPopUp.vue +523 -0
  40. package/src/components/AppCompQuiz.vue +2998 -0
  41. package/src/components/AppCompSettingsMenu.vue +170 -0
  42. package/src/components/AppCompTableOfContent.vue +209 -0
  43. package/src/components/AppCompToolTip.vue +94 -0
  44. package/src/components/AppCompViewDisplay.vue +6 -0
  45. package/src/components/BaseModule.vue +148 -0
  46. package/src/main.js +218 -0
  47. package/src/mixins/$pageMixins.js +381 -0
  48. package/src/mixins/$quizMixins.js +456 -0
  49. package/src/mixins/timerMixin.js +132 -0
  50. package/src/module/store.js +874 -0
  51. package/src/module/xapi/ADL.js +339 -0
  52. package/src/module/xapi/Crypto/Hasher.js +241 -0
  53. package/src/module/xapi/Crypto/WordArray.js +278 -0
  54. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -0
  55. package/src/module/xapi/Crypto/algorithms/C_algo.js +319 -0
  56. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -0
  57. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -0
  58. package/src/module/xapi/Crypto/encoders/Base.js +105 -0
  59. package/src/module/xapi/Crypto/encoders/Base64.js +99 -0
  60. package/src/module/xapi/Crypto/encoders/Hex.js +60 -0
  61. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -0
  62. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -0
  63. package/src/module/xapi/Crypto/index.js +53 -0
  64. package/src/module/xapi/Statement/activity.js +47 -0
  65. package/src/module/xapi/Statement/agent.js +55 -0
  66. package/src/module/xapi/Statement/group.js +26 -0
  67. package/src/module/xapi/Statement/index.js +259 -0
  68. package/src/module/xapi/Statement/statement.js +253 -0
  69. package/src/module/xapi/Statement/statementRef.js +23 -0
  70. package/src/module/xapi/Statement/substatement.js +22 -0
  71. package/src/module/xapi/Statement/verb.js +36 -0
  72. package/src/module/xapi/activitytypes.js +17 -0
  73. package/src/module/xapi/launch.js +157 -0
  74. package/src/module/xapi/utils.js +167 -0
  75. package/src/module/xapi/verbs.js +294 -0
  76. package/src/module/xapi/wrapper.js +1890 -0
  77. package/src/module/xapi/xapiStatement.js +444 -0
  78. package/src/plugins/bus.js +3 -0
  79. package/src/plugins/gsap.js +14 -0
  80. package/src/plugins/helper.js +260 -0
  81. package/src/plugins/i18n.js +31 -0
  82. package/src/plugins/idb.js +211 -0
  83. package/src/plugins/save.js +37 -0
  84. package/src/plugins/scorm.js +287 -0
  85. package/src/plugins/timeManager.js +77 -0
  86. package/src/plugins/xapi.js +11 -0
  87. package/src/public/index.html +21 -0
  88. package/src/routes.js +734 -0
  89. package/src/shared/generalfuncs.js +113 -0
  90. package/vue.config.js +83 -0
@@ -0,0 +1,157 @@
1
+ export default function(obj) {
2
+ const getQueryVariable = (variable) => {
3
+ var query = window.location.search.substring(1)
4
+ var vars = query.split('&')
5
+ for (var i = 0; i < vars.length; i++) {
6
+ var pair = vars[i].split('=')
7
+ if (decodeURIComponent(pair[0]) == variable) {
8
+ return decodeURIComponent(pair[1])
9
+ }
10
+ }
11
+ }
12
+
13
+ const cb_wrap = (cb) => {
14
+ return function() {
15
+ var args = arguments
16
+ window.setTimeout(function() {
17
+ var callerArgs = []
18
+ for (var i = 0; i < args.length; i++) {
19
+ callerArgs.push(args[i])
20
+ }
21
+ cb.apply(window, callerArgs)
22
+ }, 0)
23
+ }
24
+ }
25
+
26
+ //The library will append the necessary launch info to each new A that is linked to the page.
27
+ //NOTE: This cannot work if you programmatically change the window location. If you do, you must
28
+ //execute the logic in setupCourseLinks to send the initialization data to the new location (if
29
+ //you wish that new location to track as part of this session)
30
+ const observeForNewLinks = () => {
31
+ // select the target node
32
+ var target = document.body
33
+ // create an observer instance
34
+ var observer = new MutationObserver(function(mutations) {
35
+ mutations.forEach(function(mutation) {
36
+ for (var i in mutation.addedNodes) {
37
+ //if (mutation.addedNodes.hasOwnProperty(i)) {
38
+ if (Object.prototype.hasOwnProperty.call(mutation.addedNodes, i)) {
39
+ if (mutation.addedNodes[i].constructor == HTMLAnchorElement) {
40
+ var node = mutation.addedNodes[i]
41
+ setupCourseLinks([node])
42
+ }
43
+ }
44
+ }
45
+ })
46
+ })
47
+ // configuration of the observer:
48
+ var config = {
49
+ attributes: true,
50
+ childList: true,
51
+ subtree: true
52
+ }
53
+ // pass in the target node, as well as the observer options
54
+ observer.observe(target, config)
55
+ // later, you can stop observing
56
+ /// observer.disconnect();
57
+ }
58
+ //This library will init all links in the DOM that include the attribute "courseLink = true"
59
+ //with the information necessary for the document at that link to track as part of this session.
60
+ const setupCourseLinks = (_nodes) => {
61
+ var launchToken = getQueryVariable('xAPILaunchKey')
62
+ var launchEndpoint = getQueryVariable('xAPILaunchService')
63
+ var encrypted = getQueryVariable('encrypted')
64
+ var query =
65
+ 'xAPILaunchKey=' + launchToken + '&xAPILaunchService=' + launchEndpoint
66
+ if (encrypted) {
67
+ query += '&encrypted=true'
68
+ }
69
+ for (var i = 0; i < _nodes.length; i++) {
70
+ var link = _nodes[i]
71
+ var href = link.href
72
+ var courseLink = link.attributes.getNamedItem('courselink')
73
+ if (courseLink && courseLink.value == 'true') {
74
+ if (href.indexOf('?') > -1) {
75
+ href = href + '&' + query
76
+ } else href = href + '?' + query
77
+ link.href = href
78
+ }
79
+ }
80
+ }
81
+
82
+ const xAPILaunch = (cb, terminate_on_unload, strict_callbacks) => {
83
+ cb = cb_wrap(cb)
84
+
85
+ try {
86
+ var launchToken = getQueryVariable('xAPILaunchKey')
87
+ var launchEndpoint = getQueryVariable('xAPILaunchService')
88
+ var encrypted = getQueryVariable('encrypted')
89
+ if (encrypted) {
90
+ //here, we'd have to implement decryption for the data. This makes little sense in a client side only course
91
+ }
92
+
93
+ xAPILaunch.terminate = function(message) {
94
+ var launch = new URL(launchEndpoint)
95
+ launch.pathname += 'launch/' + launchToken + '/terminate'
96
+ var xhr2 = new XMLHttpRequest()
97
+ xhr2.withCredentials = true
98
+ xhr2.crossDomain = true
99
+
100
+ xhr2.open('POST', launch.toString(), false)
101
+ xhr2.setRequestHeader('Content-type', 'application/json')
102
+ xhr2.send(
103
+ JSON.stringify({
104
+ code: 0,
105
+ description: message || 'User closed content'
106
+ })
107
+ )
108
+ }
109
+
110
+ if (!launchToken || !launchEndpoint)
111
+ return cb('invalid launch parameters')
112
+ var launch = new URL(launchEndpoint)
113
+ launch.pathname += 'launch/' + launchToken
114
+ var xhr = new XMLHttpRequest()
115
+ xhr.withCredentials = true
116
+ xhr.crossDomain = true
117
+ xhr.onerror = function(err) {
118
+ //exit the try catch so inner execptions in the callback don't trigger this catch
119
+ window.setTimeout(function() {
120
+ return cb(err)
121
+ })
122
+ }
123
+ xhr.onload = function(e) {
124
+ e
125
+ if (xhr.status !== 200) {
126
+ return xhr.onerror(xhr.responseText)
127
+ }
128
+ var body = JSON.parse(xhr.responseText)
129
+ var launchData = body
130
+
131
+ var conf = {}
132
+ conf['endpoint'] = launchData.endpoint
133
+ conf['actor'] = launchData.actor
134
+ conf.withCredentials = true
135
+ conf.strictCallbacks = strict_callbacks || false
136
+
137
+ window.onunload = function() {
138
+ if (!terminate_on_unload) return
139
+ xAPILaunch.terminate('User closed content')
140
+ }
141
+ const wrapper = new obj.XAPIWrapper.constructor()
142
+
143
+ wrapper.changeConfig(conf)
144
+ //Links that include "courseLink='true'"
145
+ setupCourseLinks(document.body.querySelectorAll('a'))
146
+ //Also, if links are added dynamically, we will do the same logic for those links.
147
+ observeForNewLinks()
148
+ return cb(null, body, wrapper)
149
+ }
150
+ xhr.open('POST', launch.toString(), true)
151
+ xhr.send()
152
+ } catch (e) {
153
+ cb(e)
154
+ }
155
+ }
156
+ obj.launch = xAPILaunch
157
+ }
@@ -0,0 +1,167 @@
1
+ export const defineUtils = function(obj = {}) {
2
+ let ADL = obj
3
+ let onBrowser = false
4
+ if (typeof window !== 'undefined') {
5
+ ADL = window.ADL = obj.ADL || {}
6
+ onBrowser = true
7
+ }
8
+
9
+ const getObjDefName = function(o) {
10
+ if (o.definition && o.definition.name) {
11
+ return ADL.xapiutil.getLangVal(o.definition.name)
12
+ }
13
+ return undefined
14
+ }
15
+
16
+ const getSubStatementDisplay = function(o) {
17
+ if (o.objectType !== 'SubStatement') return
18
+ if (o.object.objectType === 'SubStatement') return
19
+ if (o.id || o.stored || o.version || o.authority) return
20
+ const disp =
21
+ ADL.xapiutil.getActorId(o.actor) +
22
+ ':' +
23
+ ADL.xapiutil.getVerbDisplay(o.verb) +
24
+ ':' +
25
+ ADL.xapiutil.getObjectId(o.object)
26
+ return disp
27
+ }
28
+
29
+ ADL.xapiutil = {}
30
+
31
+ ADL.xapiutil.getLang = function() {
32
+ let lang
33
+ if (typeof navigator !== 'undefined')
34
+ lang =
35
+ navigator.language ||
36
+ navigator.browserLanguage ||
37
+ navigator.systemLanguage ||
38
+ navigator.userLanguage
39
+ else if (
40
+ typeof process !== 'undefined' &&
41
+ typeof process.env !== 'undefined' &&
42
+ typeof process.env.LANG !== 'undefined'
43
+ ) {
44
+ const str = process.env.LANG
45
+ lang = str.slice(0, str.indexOf('.'))
46
+ lang = lang.replace(/_/, '-')
47
+ }
48
+ return lang || 'en-US'
49
+ }
50
+
51
+ ADL.xapiutil.getLangVal = function(langprop) {
52
+ if (!langprop) return
53
+
54
+ const options = Object.keys(langprop)
55
+ // test that langprop is a dict (obj)
56
+ // skips if not a dict(obj) and returns
57
+ if (options.length == 0) return undefined
58
+
59
+ let lang = ADL.xapiutil.getLang(),
60
+ ret,
61
+ dispGotten = false
62
+
63
+ do {
64
+ //test and retest
65
+ if (langprop[lang]) {
66
+ ret = langprop[lang]
67
+ dispGotten = true
68
+ } else if (lang.indexOf('-')) {
69
+ lang = lang.substring(0, lang.lastIndexOf('-'))
70
+ }
71
+ } while (!dispGotten && lang !== '')
72
+
73
+ return ret
74
+ }
75
+
76
+ ADL.xapiutil.getMoreStatements = function(
77
+ iterations,
78
+ callback,
79
+ searchParams
80
+ ) {
81
+ if (!onBrowser) throw new Error('Node not supported.')
82
+
83
+ let stmts = []
84
+
85
+ ADL.XAPIWrapper.getStatements(searchParams, null, function getMore(r) {
86
+ if (!(r && r.response)) return
87
+ const res = JSON.parse(r.response)
88
+ if (!res.statements) return
89
+ stmts = stmts.concat(res.statements)
90
+
91
+ if (iterations-- <= 0) {
92
+ callback(stmts)
93
+ } else {
94
+ if (res.more && res.more !== '') {
95
+ ADL.XAPIWrapper.getStatements(searchParams, res.more, getMore)
96
+ } else if (res.more === '') {
97
+ callback(stmts)
98
+ }
99
+ }
100
+ })
101
+ }
102
+
103
+ ADL.xapiutil.getActorId = function(a) {
104
+ return a.mbox || a.openid || a.mbox_sha1sum || a.account
105
+ }
106
+
107
+ ADL.xapiutil.getActorIdString = function(a) {
108
+ let id = a.mbox || a.openid || a.mbox_sha1sum
109
+ if (!id) {
110
+ if (a.account) id = a.account.homePage + ':' + a.account.name
111
+ else if (a.member) id = 'Anon Group ' + a.member
112
+ else id = 'unknown'
113
+ }
114
+ return id
115
+ }
116
+
117
+ ADL.xapiutil.getActorDisplay = function(a) {
118
+ return a.name || ADL.xapiutil.getActorIdString(a)
119
+ }
120
+
121
+ ADL.xapiutil.getVerbDisplay = function(v) {
122
+ if (!v) return
123
+ if (v.display) {
124
+ return ADL.xapiutil.getLangVal(v.display) || v.id
125
+ }
126
+ return v.id
127
+ }
128
+
129
+ ADL.xapiutil.getObjectType = function(o) {
130
+ return o.objectType || (o.id ? 'Activity' : 'Agent')
131
+ }
132
+
133
+ ADL.xapiutil.getObjectId = function(o) {
134
+ if (o.id) return o.id
135
+ const type = ADL.xapiutil.getObjectType(o)
136
+ if (type === 'Agent' || type === 'Group') return ADL.xapiutil.getActorId(o)
137
+ return undefined
138
+ }
139
+
140
+ ADL.xapiutil.getObjectIdString = function(o) {
141
+ if (!o) return 'unknown'
142
+ if (o.id) return o.id
143
+ const type = ADL.xapiutil.getObjectType(o)
144
+ if (type === 'Agent' || type === 'Group')
145
+ return ADL.xapiutil.getActorIdString(o)
146
+ else if (type == 'SubStatement') {
147
+ return getSubStatementDisplay(o)
148
+ }
149
+ return 'unknown'
150
+ }
151
+
152
+ ADL.xapiutil.getObjectDisplay = function(o) {
153
+ if (!o) return 'unknown'
154
+ let disp = getObjDefName(o) || o.name || o.id
155
+ if (!disp) {
156
+ const type = ADL.xapiutil.getObjectType(o)
157
+ if (type === 'Agent' || type == 'Group')
158
+ disp = ADL.xapiutil.getActorDisplay(o)
159
+ else if (type == 'SubStatement') {
160
+ disp = getSubStatementDisplay(o)
161
+ }
162
+ }
163
+
164
+ return disp
165
+ }
166
+ return ADL.xapiutil
167
+ }
@@ -0,0 +1,294 @@
1
+ export default {
2
+ abandoned: {
3
+ id: 'https://w3id.org/xapi/adl/verbs/abandoned',
4
+ display: { 'en-US': 'abandoned' }
5
+ },
6
+ answered: {
7
+ id: 'http://adlnet.gov/expapi/verbs/answered',
8
+ display: {
9
+ 'de-DE': 'beantwortete',
10
+ 'en-US': 'answered',
11
+ 'fr-FR': 'a répondu',
12
+ 'es-ES': 'contestó',
13
+ 'ar-AR': 'أجاب'
14
+ }
15
+ },
16
+ asked: {
17
+ id: 'http://adlnet.gov/expapi/verbs/asked',
18
+ display: {
19
+ 'de-DE': 'fragte',
20
+ 'en-US': 'asked',
21
+ 'fr-FR': 'a demandé',
22
+ 'es-ES': 'preguntó',
23
+ 'ar-AR': 'طلب'
24
+ }
25
+ },
26
+ attempted: {
27
+ id: 'http://adlnet.gov/expapi/verbs/attempted',
28
+ display: {
29
+ 'de-DE': 'versuchte',
30
+ 'en-US': 'attempted',
31
+ 'fr-FR': 'a essayé',
32
+ 'es-ES': 'intentó',
33
+ 'ar-AR': 'حاول'
34
+ }
35
+ },
36
+ attended: {
37
+ id: 'http://adlnet.gov/expapi/verbs/attended',
38
+ display: {
39
+ 'de-DE': 'nahm teil an',
40
+ 'en-US': 'attended',
41
+ 'fr-FR': 'a suivi',
42
+ 'es-ES': 'asistió',
43
+ 'ar-AR': 'حضر'
44
+ }
45
+ },
46
+ commented: {
47
+ id: 'http://adlnet.gov/expapi/verbs/commented',
48
+ display: {
49
+ 'de-DE': 'kommentierte',
50
+ 'en-US': 'commented',
51
+ 'fr-FR': 'a commenté',
52
+ 'es-ES': 'comentó',
53
+ 'ar-AR': 'علق'
54
+ }
55
+ },
56
+ completed: {
57
+ id: 'http://adlnet.gov/expapi/verbs/completed',
58
+ display: {
59
+ 'de-DE': 'beendete',
60
+ 'en-US': 'completed',
61
+ 'fr-FR': 'a terminé',
62
+ 'es-ES': 'completó',
63
+ 'ar-AR': 'أكمل'
64
+ }
65
+ },
66
+ exited: {
67
+ id: 'http://adlnet.gov/expapi/verbs/exited',
68
+ display: {
69
+ 'de-DE': 'verließ',
70
+ 'en-US': 'exited',
71
+ 'fr-FR': 'a quitté',
72
+ 'es-ES': 'salió',
73
+ 'ar-AR': 'خرج'
74
+ }
75
+ },
76
+ experienced: {
77
+ id: 'http://adlnet.gov/expapi/verbs/experienced',
78
+ display: {
79
+ 'de-DE': 'erlebte',
80
+ 'en-US': 'experienced',
81
+ 'fr-FR': 'a éprouvé',
82
+ 'es-ES': 'experimentó',
83
+ 'ar-AR': 'شاهد'
84
+ }
85
+ },
86
+ failed: {
87
+ id: 'http://adlnet.gov/expapi/verbs/failed',
88
+ display: {
89
+ 'de-DE': 'verfehlte',
90
+ 'en-US': 'failed',
91
+ 'fr-FR': 'a échoué',
92
+ 'es-ES': 'fracasó',
93
+ 'ar-AR': 'فشل'
94
+ }
95
+ },
96
+ imported: {
97
+ id: 'http://adlnet.gov/expapi/verbs/imported',
98
+ display: {
99
+ 'de-DE': 'importierte',
100
+ 'en-US': 'imported',
101
+ 'fr-FR': 'a importé',
102
+ 'es-ES': 'importó',
103
+ 'ar-AR': 'مستورد'
104
+ }
105
+ },
106
+ initialized: {
107
+ id: 'http://adlnet.gov/expapi/verbs/initialized',
108
+ display: {
109
+ 'de-DE': 'initialisierte',
110
+ 'en-US': 'initialized',
111
+ 'fr-FR': 'a initialisé',
112
+ 'es-ES': 'inicializó',
113
+ 'ar-AR': 'بدأ'
114
+ }
115
+ },
116
+ interacted: {
117
+ id: 'http://adlnet.gov/expapi/verbs/interacted',
118
+ display: {
119
+ 'de-DE': 'interagierte',
120
+ 'en-US': 'interacted',
121
+ 'fr-FR': 'a interagi',
122
+ 'es-ES': 'interactuó',
123
+ 'ar-AR': 'تفاعل'
124
+ }
125
+ },
126
+ launched: {
127
+ id: 'http://adlnet.gov/expapi/verbs/launched',
128
+ display: {
129
+ 'de-DE': 'startete',
130
+ 'en-US': 'launched',
131
+ 'fr-FR': 'a lancé',
132
+ 'es-ES': 'lanzó',
133
+ 'ar-AR': 'أطلق'
134
+ }
135
+ },
136
+ mastered: {
137
+ id: 'http://adlnet.gov/expapi/verbs/mastered',
138
+ display: {
139
+ 'de-DE': 'meisterte',
140
+ 'en-US': 'mastered',
141
+ 'fr-FR': 'a maîtrisé',
142
+ 'es-ES': 'dominó',
143
+ 'ar-AR': 'أتقن'
144
+ }
145
+ },
146
+ passed: {
147
+ id: 'http://adlnet.gov/expapi/verbs/passed',
148
+ display: {
149
+ 'de-DE': 'bestand',
150
+ 'en-US': 'passed',
151
+ 'fr-FR': 'a réussi',
152
+ 'es-ES': 'aprobó',
153
+ 'ar-AR': 'نجح'
154
+ }
155
+ },
156
+ played: {
157
+ id: 'http://adlnet.gov/expapi/verbs/played',
158
+ display: {
159
+ 'de-DE': '',
160
+ 'en-US': 'played',
161
+ 'fr-FR': 'a joué',
162
+ 'es-ES': '',
163
+ 'ar-AR': ''
164
+ }
165
+ },
166
+ preferred: {
167
+ id: 'http://adlnet.gov/expapi/verbs/preferred',
168
+ display: {
169
+ 'de-DE': 'bevorzugte',
170
+ 'en-US': 'preferred',
171
+ 'fr-FR': 'a préféré',
172
+ 'es-ES': 'prefirió',
173
+ 'ar-AR': 'فضل'
174
+ }
175
+ },
176
+ progressed: {
177
+ id: 'http://adlnet.gov/expapi/verbs/progressed',
178
+ display: {
179
+ 'de-DE': 'machte Fortschritt mit',
180
+ 'en-US': 'progressed',
181
+ 'fr-FR': 'a progressé',
182
+ 'es-ES': 'progresó',
183
+ 'ar-AR': 'تقدم'
184
+ }
185
+ },
186
+ registered: {
187
+ id: 'http://adlnet.gov/expapi/verbs/registered',
188
+ display: {
189
+ 'de-DE': 'registrierte',
190
+ 'en-US': 'registered',
191
+ 'fr-FR': 'a enregistré',
192
+ 'es-ES': 'registró',
193
+ 'ar-AR': 'سجل'
194
+ }
195
+ },
196
+ responded: {
197
+ id: 'http://adlnet.gov/expapi/verbs/responded',
198
+ display: {
199
+ 'de-DE': 'reagierte',
200
+ 'en-US': 'responded',
201
+ 'fr-FR': 'a répondu',
202
+ 'es-ES': 'respondió',
203
+ 'ar-AR': 'استجاب'
204
+ }
205
+ },
206
+ resumed: {
207
+ id: 'http://adlnet.gov/expapi/verbs/resumed',
208
+ display: {
209
+ 'de-DE': 'setzte fort',
210
+ 'en-US': 'resumed',
211
+ 'fr-FR': 'a repris',
212
+ 'es-ES': 'continuó',
213
+ 'ar-AR': 'استأنف'
214
+ }
215
+ },
216
+ satisfied: {
217
+ id: 'https://w3id.org/xapi/adl/verbs/satisfied',
218
+ display: {
219
+ 'de-DE': 'befriedigt',
220
+ 'en-US': 'satisfied',
221
+ 'fr-FR': 'satisfaite',
222
+ 'es-ES': 'satisfecho',
223
+ 'ar-AR': 'راض'
224
+ }
225
+ },
226
+ scored: {
227
+ id: 'http://adlnet.gov/expapi/verbs/scored',
228
+ display: {
229
+ 'de-DE': 'erreichte',
230
+ 'en-US': 'scored',
231
+ 'fr-FR': 'a marqué',
232
+ 'es-ES': 'anotó',
233
+ 'ar-AR': 'سحل النقاط'
234
+ }
235
+ },
236
+ shared: {
237
+ id: 'http://adlnet.gov/expapi/verbs/shared',
238
+ display: {
239
+ 'de-DE': 'teilte',
240
+ 'en-US': 'shared',
241
+ 'fr-FR': 'a partagé',
242
+ 'es-ES': 'compartió',
243
+ 'ar-AR': 'شارك'
244
+ }
245
+ },
246
+ started: {
247
+ id: 'http://activitystrea.ms/schema/1.0/start',
248
+ display: {
249
+ 'en-US': 'started',
250
+ 'fr-FR': 'a débuté',
251
+ 'es-ES': 'empezado'
252
+ }
253
+ },
254
+ suspended: {
255
+ id: 'http://adlnet.gov/expapi/verbs/suspended',
256
+ display: {
257
+ 'de-DE': 'pausierte',
258
+ 'en-US': 'suspended',
259
+ 'fr-FR': 'a suspendu',
260
+ 'es-ES': 'aplazó',
261
+ 'ar-AR': 'علق'
262
+ }
263
+ },
264
+ terminated: {
265
+ id: 'http://adlnet.gov/expapi/verbs/terminated',
266
+ display: {
267
+ 'de-DE': 'beendete',
268
+ 'en-US': 'terminated',
269
+ 'fr-FR': 'a terminé',
270
+ 'es-ES': 'terminó',
271
+ 'ar-AR': 'أنهى'
272
+ }
273
+ },
274
+ voided: {
275
+ id: 'http://adlnet.gov/expapi/verbs/voided',
276
+ display: {
277
+ 'de-DE': 'entwertete',
278
+ 'en-US': 'voided',
279
+ 'fr-FR': 'a annulé',
280
+ 'es-ES': 'anuló',
281
+ 'ar-AR': 'فرغ'
282
+ }
283
+ },
284
+ waived: {
285
+ id: 'https://w3id.org/xapi/adl/verbs/waived',
286
+ display: {
287
+ 'de-DE': 'verzichtet',
288
+ 'en-US': 'waived',
289
+ 'fr-FR': 'renoncé',
290
+ 'es-ES': 'renunciado',
291
+ 'ar-AR': 'تخلى'
292
+ }
293
+ }
294
+ }