@contractspec/module.learning-journey 2.4.0 → 2.6.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 (52) hide show
  1. package/dist/browser/engines/index.js +149 -0
  2. package/dist/browser/engines/xp.js +149 -0
  3. package/dist/browser/entities/index.js +4 -0
  4. package/dist/browser/entities/learner.js +4 -0
  5. package/dist/browser/i18n/catalogs/en.js +43 -0
  6. package/dist/browser/i18n/catalogs/es.js +43 -0
  7. package/dist/browser/i18n/catalogs/fr.js +43 -0
  8. package/dist/browser/i18n/catalogs/index.js +127 -0
  9. package/dist/browser/i18n/index.js +169 -0
  10. package/dist/browser/i18n/keys.js +16 -0
  11. package/dist/browser/i18n/locale.js +13 -0
  12. package/dist/browser/i18n/messages.js +139 -0
  13. package/dist/browser/index.js +153 -0
  14. package/dist/engines/index.js +149 -0
  15. package/dist/engines/xp.d.ts +7 -0
  16. package/dist/engines/xp.js +149 -0
  17. package/dist/entities/index.d.ts +1 -0
  18. package/dist/entities/index.js +4 -0
  19. package/dist/entities/learner.d.ts +2 -0
  20. package/dist/entities/learner.js +4 -0
  21. package/dist/i18n/catalogs/en.d.ts +6 -0
  22. package/dist/i18n/catalogs/en.js +44 -0
  23. package/dist/i18n/catalogs/es.d.ts +6 -0
  24. package/dist/i18n/catalogs/es.js +44 -0
  25. package/dist/i18n/catalogs/fr.d.ts +6 -0
  26. package/dist/i18n/catalogs/fr.js +44 -0
  27. package/dist/i18n/catalogs/index.d.ts +8 -0
  28. package/dist/i18n/catalogs/index.js +128 -0
  29. package/dist/i18n/i18n.test.d.ts +1 -0
  30. package/dist/i18n/index.d.ts +14 -0
  31. package/dist/i18n/index.js +170 -0
  32. package/dist/i18n/keys.d.ts +25 -0
  33. package/dist/i18n/keys.js +17 -0
  34. package/dist/i18n/locale.d.ts +8 -0
  35. package/dist/i18n/locale.js +14 -0
  36. package/dist/i18n/messages.d.ts +14 -0
  37. package/dist/i18n/messages.js +140 -0
  38. package/dist/index.js +153 -0
  39. package/dist/node/engines/index.js +149 -0
  40. package/dist/node/engines/xp.js +149 -0
  41. package/dist/node/entities/index.js +4 -0
  42. package/dist/node/entities/learner.js +4 -0
  43. package/dist/node/i18n/catalogs/en.js +43 -0
  44. package/dist/node/i18n/catalogs/es.js +43 -0
  45. package/dist/node/i18n/catalogs/fr.js +43 -0
  46. package/dist/node/i18n/catalogs/index.js +127 -0
  47. package/dist/node/i18n/index.js +169 -0
  48. package/dist/node/i18n/keys.js +16 -0
  49. package/dist/node/i18n/locale.js +13 -0
  50. package/dist/node/i18n/messages.js +139 -0
  51. package/dist/node/index.js +153 -0
  52. package/package.json +146 -5
@@ -192,6 +192,141 @@ class SRSEngine {
192
192
  }
193
193
  var srsEngine = new SRSEngine;
194
194
 
195
+ // src/i18n/catalogs/en.ts
196
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
197
+ var enMessages = defineTranslation({
198
+ meta: {
199
+ key: "learning-journey.messages",
200
+ version: "1.0.0",
201
+ domain: "learning-journey",
202
+ description: "XP source labels for the learning-journey module",
203
+ owners: ["platform"],
204
+ stability: "experimental"
205
+ },
206
+ locale: "en",
207
+ fallback: "en",
208
+ messages: {
209
+ "xp.source.base": {
210
+ value: "Base",
211
+ description: "XP breakdown label for base XP"
212
+ },
213
+ "xp.source.scoreBonus": {
214
+ value: "Score Bonus",
215
+ description: "XP breakdown label for score-based bonus"
216
+ },
217
+ "xp.source.perfectScore": {
218
+ value: "Perfect Score",
219
+ description: "XP breakdown label for perfect score bonus"
220
+ },
221
+ "xp.source.firstAttempt": {
222
+ value: "First Attempt",
223
+ description: "XP breakdown label for first attempt bonus"
224
+ },
225
+ "xp.source.retryPenalty": {
226
+ value: "Retry Penalty",
227
+ description: "XP breakdown label for retry penalty"
228
+ },
229
+ "xp.source.streakBonus": {
230
+ value: "Streak Bonus",
231
+ description: "XP breakdown label for streak bonus"
232
+ }
233
+ }
234
+ });
235
+
236
+ // src/i18n/catalogs/fr.ts
237
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
238
+ var frMessages = defineTranslation2({
239
+ meta: {
240
+ key: "learning-journey.messages",
241
+ version: "1.0.0",
242
+ domain: "learning-journey",
243
+ description: "XP source labels (French)",
244
+ owners: ["platform"],
245
+ stability: "experimental"
246
+ },
247
+ locale: "fr",
248
+ fallback: "en",
249
+ messages: {
250
+ "xp.source.base": {
251
+ value: "Base",
252
+ description: "XP breakdown label for base XP"
253
+ },
254
+ "xp.source.scoreBonus": {
255
+ value: "Bonus de score",
256
+ description: "XP breakdown label for score-based bonus"
257
+ },
258
+ "xp.source.perfectScore": {
259
+ value: "Score parfait",
260
+ description: "XP breakdown label for perfect score bonus"
261
+ },
262
+ "xp.source.firstAttempt": {
263
+ value: "Premier essai",
264
+ description: "XP breakdown label for first attempt bonus"
265
+ },
266
+ "xp.source.retryPenalty": {
267
+ value: "Pénalité de réessai",
268
+ description: "XP breakdown label for retry penalty"
269
+ },
270
+ "xp.source.streakBonus": {
271
+ value: "Bonus de série",
272
+ description: "XP breakdown label for streak bonus"
273
+ }
274
+ }
275
+ });
276
+
277
+ // src/i18n/catalogs/es.ts
278
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
279
+ var esMessages = defineTranslation3({
280
+ meta: {
281
+ key: "learning-journey.messages",
282
+ version: "1.0.0",
283
+ domain: "learning-journey",
284
+ description: "XP source labels (Spanish)",
285
+ owners: ["platform"],
286
+ stability: "experimental"
287
+ },
288
+ locale: "es",
289
+ fallback: "en",
290
+ messages: {
291
+ "xp.source.base": {
292
+ value: "Base",
293
+ description: "XP breakdown label for base XP"
294
+ },
295
+ "xp.source.scoreBonus": {
296
+ value: "Bonificación por puntuación",
297
+ description: "XP breakdown label for score-based bonus"
298
+ },
299
+ "xp.source.perfectScore": {
300
+ value: "Puntuación perfecta",
301
+ description: "XP breakdown label for perfect score bonus"
302
+ },
303
+ "xp.source.firstAttempt": {
304
+ value: "Primer intento",
305
+ description: "XP breakdown label for first attempt bonus"
306
+ },
307
+ "xp.source.retryPenalty": {
308
+ value: "Penalización por reintento",
309
+ description: "XP breakdown label for retry penalty"
310
+ },
311
+ "xp.source.streakBonus": {
312
+ value: "Bonificación por racha",
313
+ description: "XP breakdown label for streak bonus"
314
+ }
315
+ }
316
+ });
317
+
318
+ // src/i18n/messages.ts
319
+ import {
320
+ createI18nFactory
321
+ } from "@contractspec/lib.contracts-spec/translations";
322
+ var factory = createI18nFactory({
323
+ specKey: "learning-journey.messages",
324
+ catalogs: [enMessages, frMessages, esMessages]
325
+ });
326
+ var createLearningJourneyI18n = factory.create;
327
+ var getDefaultI18n = factory.getDefault;
328
+ var resetI18nRegistry = factory.resetRegistry;
329
+
195
330
  // src/engines/xp.ts
196
331
  var DEFAULT_XP_CONFIG = {
197
332
  baseValues: {
@@ -357,6 +492,19 @@ class XPEngine {
357
492
  return 0;
358
493
  }
359
494
  }
495
+ var SOURCE_KEY_MAP = {
496
+ base: "xp.source.base",
497
+ score_bonus: "xp.source.scoreBonus",
498
+ perfect_score: "xp.source.perfectScore",
499
+ first_attempt: "xp.source.firstAttempt",
500
+ retry_penalty: "xp.source.retryPenalty",
501
+ streak_bonus: "xp.source.streakBonus"
502
+ };
503
+ function getXpSourceLabel(source, locale) {
504
+ const i18n = createLearningJourneyI18n(locale);
505
+ const i18nKey = SOURCE_KEY_MAP[source];
506
+ return i18nKey ? i18n.t(i18nKey) : source;
507
+ }
360
508
  var xpEngine = new XPEngine;
361
509
 
362
510
  // src/engines/streak.ts
@@ -517,6 +665,7 @@ export {
517
665
  xpEngine,
518
666
  streakEngine,
519
667
  srsEngine,
668
+ getXpSourceLabel,
520
669
  XPEngine,
521
670
  StreakEngine,
522
671
  SRSEngine,
@@ -1,3 +1,138 @@
1
+ // src/i18n/catalogs/en.ts
2
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
3
+ var enMessages = defineTranslation({
4
+ meta: {
5
+ key: "learning-journey.messages",
6
+ version: "1.0.0",
7
+ domain: "learning-journey",
8
+ description: "XP source labels for the learning-journey module",
9
+ owners: ["platform"],
10
+ stability: "experimental"
11
+ },
12
+ locale: "en",
13
+ fallback: "en",
14
+ messages: {
15
+ "xp.source.base": {
16
+ value: "Base",
17
+ description: "XP breakdown label for base XP"
18
+ },
19
+ "xp.source.scoreBonus": {
20
+ value: "Score Bonus",
21
+ description: "XP breakdown label for score-based bonus"
22
+ },
23
+ "xp.source.perfectScore": {
24
+ value: "Perfect Score",
25
+ description: "XP breakdown label for perfect score bonus"
26
+ },
27
+ "xp.source.firstAttempt": {
28
+ value: "First Attempt",
29
+ description: "XP breakdown label for first attempt bonus"
30
+ },
31
+ "xp.source.retryPenalty": {
32
+ value: "Retry Penalty",
33
+ description: "XP breakdown label for retry penalty"
34
+ },
35
+ "xp.source.streakBonus": {
36
+ value: "Streak Bonus",
37
+ description: "XP breakdown label for streak bonus"
38
+ }
39
+ }
40
+ });
41
+
42
+ // src/i18n/catalogs/fr.ts
43
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
44
+ var frMessages = defineTranslation2({
45
+ meta: {
46
+ key: "learning-journey.messages",
47
+ version: "1.0.0",
48
+ domain: "learning-journey",
49
+ description: "XP source labels (French)",
50
+ owners: ["platform"],
51
+ stability: "experimental"
52
+ },
53
+ locale: "fr",
54
+ fallback: "en",
55
+ messages: {
56
+ "xp.source.base": {
57
+ value: "Base",
58
+ description: "XP breakdown label for base XP"
59
+ },
60
+ "xp.source.scoreBonus": {
61
+ value: "Bonus de score",
62
+ description: "XP breakdown label for score-based bonus"
63
+ },
64
+ "xp.source.perfectScore": {
65
+ value: "Score parfait",
66
+ description: "XP breakdown label for perfect score bonus"
67
+ },
68
+ "xp.source.firstAttempt": {
69
+ value: "Premier essai",
70
+ description: "XP breakdown label for first attempt bonus"
71
+ },
72
+ "xp.source.retryPenalty": {
73
+ value: "Pénalité de réessai",
74
+ description: "XP breakdown label for retry penalty"
75
+ },
76
+ "xp.source.streakBonus": {
77
+ value: "Bonus de série",
78
+ description: "XP breakdown label for streak bonus"
79
+ }
80
+ }
81
+ });
82
+
83
+ // src/i18n/catalogs/es.ts
84
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
85
+ var esMessages = defineTranslation3({
86
+ meta: {
87
+ key: "learning-journey.messages",
88
+ version: "1.0.0",
89
+ domain: "learning-journey",
90
+ description: "XP source labels (Spanish)",
91
+ owners: ["platform"],
92
+ stability: "experimental"
93
+ },
94
+ locale: "es",
95
+ fallback: "en",
96
+ messages: {
97
+ "xp.source.base": {
98
+ value: "Base",
99
+ description: "XP breakdown label for base XP"
100
+ },
101
+ "xp.source.scoreBonus": {
102
+ value: "Bonificación por puntuación",
103
+ description: "XP breakdown label for score-based bonus"
104
+ },
105
+ "xp.source.perfectScore": {
106
+ value: "Puntuación perfecta",
107
+ description: "XP breakdown label for perfect score bonus"
108
+ },
109
+ "xp.source.firstAttempt": {
110
+ value: "Primer intento",
111
+ description: "XP breakdown label for first attempt bonus"
112
+ },
113
+ "xp.source.retryPenalty": {
114
+ value: "Penalización por reintento",
115
+ description: "XP breakdown label for retry penalty"
116
+ },
117
+ "xp.source.streakBonus": {
118
+ value: "Bonificación por racha",
119
+ description: "XP breakdown label for streak bonus"
120
+ }
121
+ }
122
+ });
123
+
124
+ // src/i18n/messages.ts
125
+ import {
126
+ createI18nFactory
127
+ } from "@contractspec/lib.contracts-spec/translations";
128
+ var factory = createI18nFactory({
129
+ specKey: "learning-journey.messages",
130
+ catalogs: [enMessages, frMessages, esMessages]
131
+ });
132
+ var createLearningJourneyI18n = factory.create;
133
+ var getDefaultI18n = factory.getDefault;
134
+ var resetI18nRegistry = factory.resetRegistry;
135
+
1
136
  // src/engines/xp.ts
2
137
  var DEFAULT_XP_CONFIG = {
3
138
  baseValues: {
@@ -163,9 +298,23 @@ class XPEngine {
163
298
  return 0;
164
299
  }
165
300
  }
301
+ var SOURCE_KEY_MAP = {
302
+ base: "xp.source.base",
303
+ score_bonus: "xp.source.scoreBonus",
304
+ perfect_score: "xp.source.perfectScore",
305
+ first_attempt: "xp.source.firstAttempt",
306
+ retry_penalty: "xp.source.retryPenalty",
307
+ streak_bonus: "xp.source.streakBonus"
308
+ };
309
+ function getXpSourceLabel(source, locale) {
310
+ const i18n = createLearningJourneyI18n(locale);
311
+ const i18nKey = SOURCE_KEY_MAP[source];
312
+ return i18nKey ? i18n.t(i18nKey) : source;
313
+ }
166
314
  var xpEngine = new XPEngine;
167
315
  export {
168
316
  xpEngine,
317
+ getXpSourceLabel,
169
318
  XPEngine,
170
319
  DEFAULT_XP_CONFIG
171
320
  };
@@ -1191,6 +1191,10 @@ var LearnerEntity = defineEntity5({
1191
1191
  isOptional: true,
1192
1192
  description: "Last learning activity"
1193
1193
  }),
1194
+ locale: field5.string({
1195
+ isOptional: true,
1196
+ description: 'Preferred locale for learning content (e.g. "en", "fr", "es")'
1197
+ }),
1194
1198
  timezone: field5.string({
1195
1199
  default: '"UTC"',
1196
1200
  description: "Learner timezone"
@@ -51,6 +51,10 @@ var LearnerEntity = defineEntity({
51
51
  isOptional: true,
52
52
  description: "Last learning activity"
53
53
  }),
54
+ locale: field.string({
55
+ isOptional: true,
56
+ description: 'Preferred locale for learning content (e.g. "en", "fr", "es")'
57
+ }),
54
58
  timezone: field.string({
55
59
  default: '"UTC"',
56
60
  description: "Learner timezone"
@@ -0,0 +1,43 @@
1
+ // src/i18n/catalogs/en.ts
2
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
3
+ var enMessages = defineTranslation({
4
+ meta: {
5
+ key: "learning-journey.messages",
6
+ version: "1.0.0",
7
+ domain: "learning-journey",
8
+ description: "XP source labels for the learning-journey module",
9
+ owners: ["platform"],
10
+ stability: "experimental"
11
+ },
12
+ locale: "en",
13
+ fallback: "en",
14
+ messages: {
15
+ "xp.source.base": {
16
+ value: "Base",
17
+ description: "XP breakdown label for base XP"
18
+ },
19
+ "xp.source.scoreBonus": {
20
+ value: "Score Bonus",
21
+ description: "XP breakdown label for score-based bonus"
22
+ },
23
+ "xp.source.perfectScore": {
24
+ value: "Perfect Score",
25
+ description: "XP breakdown label for perfect score bonus"
26
+ },
27
+ "xp.source.firstAttempt": {
28
+ value: "First Attempt",
29
+ description: "XP breakdown label for first attempt bonus"
30
+ },
31
+ "xp.source.retryPenalty": {
32
+ value: "Retry Penalty",
33
+ description: "XP breakdown label for retry penalty"
34
+ },
35
+ "xp.source.streakBonus": {
36
+ value: "Streak Bonus",
37
+ description: "XP breakdown label for streak bonus"
38
+ }
39
+ }
40
+ });
41
+ export {
42
+ enMessages
43
+ };
@@ -0,0 +1,43 @@
1
+ // src/i18n/catalogs/es.ts
2
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
3
+ var esMessages = defineTranslation({
4
+ meta: {
5
+ key: "learning-journey.messages",
6
+ version: "1.0.0",
7
+ domain: "learning-journey",
8
+ description: "XP source labels (Spanish)",
9
+ owners: ["platform"],
10
+ stability: "experimental"
11
+ },
12
+ locale: "es",
13
+ fallback: "en",
14
+ messages: {
15
+ "xp.source.base": {
16
+ value: "Base",
17
+ description: "XP breakdown label for base XP"
18
+ },
19
+ "xp.source.scoreBonus": {
20
+ value: "Bonificación por puntuación",
21
+ description: "XP breakdown label for score-based bonus"
22
+ },
23
+ "xp.source.perfectScore": {
24
+ value: "Puntuación perfecta",
25
+ description: "XP breakdown label for perfect score bonus"
26
+ },
27
+ "xp.source.firstAttempt": {
28
+ value: "Primer intento",
29
+ description: "XP breakdown label for first attempt bonus"
30
+ },
31
+ "xp.source.retryPenalty": {
32
+ value: "Penalización por reintento",
33
+ description: "XP breakdown label for retry penalty"
34
+ },
35
+ "xp.source.streakBonus": {
36
+ value: "Bonificación por racha",
37
+ description: "XP breakdown label for streak bonus"
38
+ }
39
+ }
40
+ });
41
+ export {
42
+ esMessages
43
+ };
@@ -0,0 +1,43 @@
1
+ // src/i18n/catalogs/fr.ts
2
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
3
+ var frMessages = defineTranslation({
4
+ meta: {
5
+ key: "learning-journey.messages",
6
+ version: "1.0.0",
7
+ domain: "learning-journey",
8
+ description: "XP source labels (French)",
9
+ owners: ["platform"],
10
+ stability: "experimental"
11
+ },
12
+ locale: "fr",
13
+ fallback: "en",
14
+ messages: {
15
+ "xp.source.base": {
16
+ value: "Base",
17
+ description: "XP breakdown label for base XP"
18
+ },
19
+ "xp.source.scoreBonus": {
20
+ value: "Bonus de score",
21
+ description: "XP breakdown label for score-based bonus"
22
+ },
23
+ "xp.source.perfectScore": {
24
+ value: "Score parfait",
25
+ description: "XP breakdown label for perfect score bonus"
26
+ },
27
+ "xp.source.firstAttempt": {
28
+ value: "Premier essai",
29
+ description: "XP breakdown label for first attempt bonus"
30
+ },
31
+ "xp.source.retryPenalty": {
32
+ value: "Pénalité de réessai",
33
+ description: "XP breakdown label for retry penalty"
34
+ },
35
+ "xp.source.streakBonus": {
36
+ value: "Bonus de série",
37
+ description: "XP breakdown label for streak bonus"
38
+ }
39
+ }
40
+ });
41
+ export {
42
+ frMessages
43
+ };
@@ -0,0 +1,127 @@
1
+ // src/i18n/catalogs/en.ts
2
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
3
+ var enMessages = defineTranslation({
4
+ meta: {
5
+ key: "learning-journey.messages",
6
+ version: "1.0.0",
7
+ domain: "learning-journey",
8
+ description: "XP source labels for the learning-journey module",
9
+ owners: ["platform"],
10
+ stability: "experimental"
11
+ },
12
+ locale: "en",
13
+ fallback: "en",
14
+ messages: {
15
+ "xp.source.base": {
16
+ value: "Base",
17
+ description: "XP breakdown label for base XP"
18
+ },
19
+ "xp.source.scoreBonus": {
20
+ value: "Score Bonus",
21
+ description: "XP breakdown label for score-based bonus"
22
+ },
23
+ "xp.source.perfectScore": {
24
+ value: "Perfect Score",
25
+ description: "XP breakdown label for perfect score bonus"
26
+ },
27
+ "xp.source.firstAttempt": {
28
+ value: "First Attempt",
29
+ description: "XP breakdown label for first attempt bonus"
30
+ },
31
+ "xp.source.retryPenalty": {
32
+ value: "Retry Penalty",
33
+ description: "XP breakdown label for retry penalty"
34
+ },
35
+ "xp.source.streakBonus": {
36
+ value: "Streak Bonus",
37
+ description: "XP breakdown label for streak bonus"
38
+ }
39
+ }
40
+ });
41
+
42
+ // src/i18n/catalogs/fr.ts
43
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
44
+ var frMessages = defineTranslation2({
45
+ meta: {
46
+ key: "learning-journey.messages",
47
+ version: "1.0.0",
48
+ domain: "learning-journey",
49
+ description: "XP source labels (French)",
50
+ owners: ["platform"],
51
+ stability: "experimental"
52
+ },
53
+ locale: "fr",
54
+ fallback: "en",
55
+ messages: {
56
+ "xp.source.base": {
57
+ value: "Base",
58
+ description: "XP breakdown label for base XP"
59
+ },
60
+ "xp.source.scoreBonus": {
61
+ value: "Bonus de score",
62
+ description: "XP breakdown label for score-based bonus"
63
+ },
64
+ "xp.source.perfectScore": {
65
+ value: "Score parfait",
66
+ description: "XP breakdown label for perfect score bonus"
67
+ },
68
+ "xp.source.firstAttempt": {
69
+ value: "Premier essai",
70
+ description: "XP breakdown label for first attempt bonus"
71
+ },
72
+ "xp.source.retryPenalty": {
73
+ value: "Pénalité de réessai",
74
+ description: "XP breakdown label for retry penalty"
75
+ },
76
+ "xp.source.streakBonus": {
77
+ value: "Bonus de série",
78
+ description: "XP breakdown label for streak bonus"
79
+ }
80
+ }
81
+ });
82
+
83
+ // src/i18n/catalogs/es.ts
84
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
85
+ var esMessages = defineTranslation3({
86
+ meta: {
87
+ key: "learning-journey.messages",
88
+ version: "1.0.0",
89
+ domain: "learning-journey",
90
+ description: "XP source labels (Spanish)",
91
+ owners: ["platform"],
92
+ stability: "experimental"
93
+ },
94
+ locale: "es",
95
+ fallback: "en",
96
+ messages: {
97
+ "xp.source.base": {
98
+ value: "Base",
99
+ description: "XP breakdown label for base XP"
100
+ },
101
+ "xp.source.scoreBonus": {
102
+ value: "Bonificación por puntuación",
103
+ description: "XP breakdown label for score-based bonus"
104
+ },
105
+ "xp.source.perfectScore": {
106
+ value: "Puntuación perfecta",
107
+ description: "XP breakdown label for perfect score bonus"
108
+ },
109
+ "xp.source.firstAttempt": {
110
+ value: "Primer intento",
111
+ description: "XP breakdown label for first attempt bonus"
112
+ },
113
+ "xp.source.retryPenalty": {
114
+ value: "Penalización por reintento",
115
+ description: "XP breakdown label for retry penalty"
116
+ },
117
+ "xp.source.streakBonus": {
118
+ value: "Bonificación por racha",
119
+ description: "XP breakdown label for streak bonus"
120
+ }
121
+ }
122
+ });
123
+ export {
124
+ frMessages,
125
+ esMessages,
126
+ enMessages
127
+ };