@the-inclusionist/engine 9.0.0 → 11.0.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 (532) hide show
  1. package/README.md +120 -78
  2. package/app/css/style.css +761 -377
  3. package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
  4. package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
  5. package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
  6. package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
  7. package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
  8. package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
  9. package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
  10. package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
  11. package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
  12. package/app/public/vendor/fonts.css +36 -84
  13. package/dist-pkg/boot/create-game.d.ts +499 -219
  14. package/dist-pkg/boot/create-game.js +3944 -562
  15. package/dist-pkg/core/a11y-sr.d.ts +25 -3
  16. package/dist-pkg/core/a11y-sr.js +38 -19
  17. package/dist-pkg/core/accessible-label.d.ts +17 -0
  18. package/dist-pkg/core/accessible-label.js +37 -0
  19. package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
  20. package/dist-pkg/core/accommodation-subjects.js +32 -0
  21. package/dist-pkg/core/accommodations.d.ts +125 -0
  22. package/dist-pkg/core/accommodations.js +195 -0
  23. package/dist-pkg/core/actions.d.ts +108 -55
  24. package/dist-pkg/core/actions.js +122 -71
  25. package/dist-pkg/core/calm-mode.d.ts +31 -0
  26. package/dist-pkg/core/calm-mode.js +47 -0
  27. package/dist-pkg/core/camera-cycle.d.ts +15 -0
  28. package/dist-pkg/core/camera-cycle.js +7 -0
  29. package/dist-pkg/core/caption-duration.d.ts +15 -0
  30. package/dist-pkg/core/caption-duration.js +19 -0
  31. package/dist-pkg/core/cartridge-problems.d.ts +34 -0
  32. package/dist-pkg/core/cartridge-problems.js +53 -0
  33. package/dist-pkg/core/constants.d.ts +0 -54
  34. package/dist-pkg/core/constants.js +9 -76
  35. package/dist-pkg/core/contract.d.ts +142 -164
  36. package/dist-pkg/core/contract.js +222 -208
  37. package/dist-pkg/core/dom-query.d.ts +4 -4
  38. package/dist-pkg/core/dom-query.js +12 -20
  39. package/dist-pkg/core/entity.d.ts +62 -77
  40. package/dist-pkg/core/entity.js +18 -32
  41. package/dist-pkg/core/escape-html.d.ts +9 -10
  42. package/dist-pkg/core/escape-html.js +16 -20
  43. package/dist-pkg/core/flash-threshold.d.ts +17 -0
  44. package/dist-pkg/core/flash-threshold.js +113 -0
  45. package/dist-pkg/core/game-speed.d.ts +11 -0
  46. package/dist-pkg/core/game-speed.js +16 -0
  47. package/dist-pkg/core/genres.d.ts +20 -0
  48. package/dist-pkg/core/genres.js +44 -0
  49. package/dist-pkg/core/i18n.d.ts +71 -60
  50. package/dist-pkg/core/i18n.js +186 -200
  51. package/dist-pkg/core/loop.d.ts +17 -6
  52. package/dist-pkg/core/loop.js +26 -26
  53. package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
  54. package/dist-pkg/core/pause-icon-catalogue.js +54 -0
  55. package/dist-pkg/core/ring.d.ts +17 -0
  56. package/dist-pkg/core/ring.js +29 -0
  57. package/dist-pkg/core/rng.d.ts +7 -12
  58. package/dist-pkg/core/rng.js +23 -53
  59. package/dist-pkg/core/route.d.ts +26 -26
  60. package/dist-pkg/core/route.js +126 -121
  61. package/dist-pkg/core/scenes.d.ts +37 -40
  62. package/dist-pkg/core/scenes.js +41 -43
  63. package/dist-pkg/core/screens.d.ts +4 -4
  64. package/dist-pkg/core/screens.js +11 -16
  65. package/dist-pkg/core/session-clock.d.ts +23 -0
  66. package/dist-pkg/core/session-clock.js +37 -0
  67. package/dist-pkg/core/setting-defaults.d.ts +61 -0
  68. package/dist-pkg/core/setting-defaults.js +66 -0
  69. package/dist-pkg/core/speech-rate.d.ts +29 -0
  70. package/dist-pkg/core/speech-rate.js +47 -0
  71. package/dist-pkg/core/state.d.ts +118 -118
  72. package/dist-pkg/core/state.js +322 -297
  73. package/dist-pkg/core/visual-cycles.d.ts +30 -0
  74. package/dist-pkg/core/visual-cycles.js +52 -0
  75. package/dist-pkg/core/visual-state.d.ts +13 -0
  76. package/dist-pkg/core/visual-state.js +6 -0
  77. package/dist-pkg/educational/activities-registry.d.ts +1 -1
  78. package/dist-pkg/educational/activities-registry.js +9 -8
  79. package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
  80. package/dist-pkg/educational/adaptive-engine.js +17 -17
  81. package/dist-pkg/educational/segment-bar.d.ts +12 -12
  82. package/dist-pkg/educational/segment-bar.js +9 -9
  83. package/dist-pkg/i18n/en.js +324 -223
  84. package/dist-pkg/i18n/es.js +323 -223
  85. package/dist-pkg/i18n/pt.js +348 -226
  86. package/dist-pkg/input/default-bindings.d.ts +37 -38
  87. package/dist-pkg/input/default-bindings.js +127 -144
  88. package/dist-pkg/input/devices.d.ts +7 -7
  89. package/dist-pkg/input/devices.js +17 -16
  90. package/dist-pkg/input/edges.d.ts +23 -32
  91. package/dist-pkg/input/edges.js +23 -28
  92. package/dist-pkg/input/empathy-filter.d.ts +22 -0
  93. package/dist-pkg/input/empathy-filter.js +34 -0
  94. package/dist-pkg/input/face-map.d.ts +96 -0
  95. package/dist-pkg/input/face-map.js +255 -0
  96. package/dist-pkg/input/face-signals.d.ts +40 -0
  97. package/dist-pkg/input/face-signals.js +48 -0
  98. package/dist-pkg/input/gamepad.d.ts +195 -145
  99. package/dist-pkg/input/gamepad.js +383 -556
  100. package/dist-pkg/input/gaze-cycle.d.ts +64 -0
  101. package/dist-pkg/input/gaze-cycle.js +133 -0
  102. package/dist-pkg/input/gaze-relative.d.ts +68 -0
  103. package/dist-pkg/input/gaze-relative.js +142 -0
  104. package/dist-pkg/input/hand-map.d.ts +28 -0
  105. package/dist-pkg/input/hand-map.js +142 -0
  106. package/dist-pkg/input/input-cooldown.d.ts +17 -0
  107. package/dist-pkg/input/input-cooldown.js +39 -0
  108. package/dist-pkg/input/key-default.d.ts +30 -0
  109. package/dist-pkg/input/key-default.js +60 -0
  110. package/dist-pkg/input/keyboard-runtime.d.ts +15 -21
  111. package/dist-pkg/input/keyboard-runtime.js +23 -27
  112. package/dist-pkg/input/keyboard.d.ts +68 -63
  113. package/dist-pkg/input/keyboard.js +83 -105
  114. package/dist-pkg/input/keydown.d.ts +123 -137
  115. package/dist-pkg/input/keydown.js +284 -289
  116. package/dist-pkg/input/latch-edge.d.ts +33 -21
  117. package/dist-pkg/input/latch-edge.js +34 -35
  118. package/dist-pkg/input/latch-scope.d.ts +51 -50
  119. package/dist-pkg/input/latch-scope.js +61 -82
  120. package/dist-pkg/input/latch-store.d.ts +26 -30
  121. package/dist-pkg/input/latch-store.js +42 -50
  122. package/dist-pkg/input/latch-sync.d.ts +29 -29
  123. package/dist-pkg/input/latch-sync.js +25 -25
  124. package/dist-pkg/input/latch.d.ts +14 -17
  125. package/dist-pkg/input/latch.js +29 -37
  126. package/dist-pkg/input/pad-defaults.d.ts +13 -16
  127. package/dist-pkg/input/pad-defaults.js +21 -28
  128. package/dist-pkg/input/pad-reading.d.ts +76 -0
  129. package/dist-pkg/input/pad-reading.js +169 -0
  130. package/dist-pkg/input/pad-wizard.d.ts +99 -0
  131. package/dist-pkg/input/pad-wizard.js +256 -0
  132. package/dist-pkg/input/pointer-space.d.ts +19 -20
  133. package/dist-pkg/input/pointer-space.js +27 -32
  134. package/dist-pkg/input/pointer.d.ts +39 -40
  135. package/dist-pkg/input/pointer.js +42 -45
  136. package/dist-pkg/input/state.d.ts +101 -89
  137. package/dist-pkg/input/state.js +54 -134
  138. package/dist-pkg/input/switch-scan.d.ts +59 -0
  139. package/dist-pkg/input/switch-scan.js +67 -0
  140. package/dist-pkg/input/synthetic-source.d.ts +42 -0
  141. package/dist-pkg/input/synthetic-source.js +57 -0
  142. package/dist-pkg/input/touch-bindings.d.ts +127 -116
  143. package/dist-pkg/input/touch-bindings.js +158 -173
  144. package/dist-pkg/input/touch.d.ts +147 -72
  145. package/dist-pkg/input/touch.js +362 -126
  146. package/dist-pkg/input/transport-in-use.d.ts +107 -0
  147. package/dist-pkg/input/transport-in-use.js +130 -0
  148. package/dist-pkg/input/transports.d.ts +90 -117
  149. package/dist-pkg/input/transports.js +104 -106
  150. package/dist-pkg/input/virtual-controller.d.ts +82 -0
  151. package/dist-pkg/input/virtual-controller.js +69 -0
  152. package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
  153. package/dist-pkg/input/vocabulary-migration.js +80 -79
  154. package/dist-pkg/input/voice-map.d.ts +59 -0
  155. package/dist-pkg/input/voice-map.js +123 -0
  156. package/dist-pkg/platform/audio-ambient.d.ts +13 -2
  157. package/dist-pkg/platform/audio-ambient.js +14 -14
  158. package/dist-pkg/platform/audio-earcons.d.ts +20 -19
  159. package/dist-pkg/platform/audio-earcons.js +51 -42
  160. package/dist-pkg/platform/audio-jingles.js +9 -10
  161. package/dist-pkg/platform/audio-mixer.d.ts +14 -2
  162. package/dist-pkg/platform/audio-mixer.js +31 -39
  163. package/dist-pkg/platform/audio-sonar.d.ts +49 -152
  164. package/dist-pkg/platform/audio-sonar.js +124 -302
  165. package/dist-pkg/platform/audio.d.ts +62 -19
  166. package/dist-pkg/platform/audio.js +193 -168
  167. package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
  168. package/dist-pkg/platform/choose-by-voice.js +157 -0
  169. package/dist-pkg/platform/flash-sampler.d.ts +19 -0
  170. package/dist-pkg/platform/flash-sampler.js +79 -0
  171. package/dist-pkg/platform/font-library.d.ts +77 -0
  172. package/dist-pkg/platform/font-library.js +98 -0
  173. package/dist-pkg/platform/font-library.json +721 -0
  174. package/dist-pkg/platform/heavy-catalogue.d.ts +77 -0
  175. package/dist-pkg/platform/heavy-catalogue.js +256 -0
  176. package/dist-pkg/platform/heavy-mirror.d.ts +20 -0
  177. package/dist-pkg/platform/heavy-mirror.js +73 -0
  178. package/dist-pkg/platform/heavy.d.ts +136 -0
  179. package/dist-pkg/platform/heavy.js +324 -0
  180. package/dist-pkg/platform/interruptible-speech.d.ts +23 -16
  181. package/dist-pkg/platform/interruptible-speech.js +77 -54
  182. package/dist-pkg/platform/kokoro-port.d.ts +27 -0
  183. package/dist-pkg/platform/kokoro-port.js +50 -0
  184. package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
  185. package/dist-pkg/platform/kokoro-runtime.js +52 -0
  186. package/dist-pkg/platform/kokoro.d.ts +70 -0
  187. package/dist-pkg/platform/kokoro.js +133 -0
  188. package/dist-pkg/platform/listener-scope.d.ts +12 -0
  189. package/dist-pkg/platform/listener-scope.js +90 -0
  190. package/dist-pkg/platform/locale-host.d.ts +14 -0
  191. package/dist-pkg/platform/locale-host.js +45 -0
  192. package/dist-pkg/platform/microphone.d.ts +51 -0
  193. package/dist-pkg/platform/microphone.js +118 -0
  194. package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
  195. package/dist-pkg/platform/onnx-runtime.js +42 -0
  196. package/dist-pkg/platform/reading-in-worker.d.ts +64 -0
  197. package/dist-pkg/platform/reading-in-worker.js +125 -0
  198. package/dist-pkg/platform/reading-model.d.ts +94 -0
  199. package/dist-pkg/platform/reading-model.js +272 -0
  200. package/dist-pkg/platform/reading-runtime.d.ts +24 -0
  201. package/dist-pkg/platform/reading-runtime.js +164 -0
  202. package/dist-pkg/platform/reading-worker.d.ts +41 -0
  203. package/dist-pkg/platform/reading-worker.js +58 -0
  204. package/dist-pkg/platform/reading.d.ts +80 -0
  205. package/dist-pkg/platform/reading.js +136 -0
  206. package/dist-pkg/platform/speech-recognition.d.ts +60 -0
  207. package/dist-pkg/platform/speech-recognition.js +104 -0
  208. package/dist-pkg/platform/speech.d.ts +23 -1
  209. package/dist-pkg/platform/speech.js +29 -18
  210. package/dist-pkg/platform/storage-keys.d.ts +96 -0
  211. package/dist-pkg/platform/storage-keys.js +106 -0
  212. package/dist-pkg/platform/storage.d.ts +46 -111
  213. package/dist-pkg/platform/storage.js +104 -169
  214. package/dist-pkg/platform/tts.d.ts +85 -39
  215. package/dist-pkg/platform/tts.js +447 -127
  216. package/dist-pkg/platform/vision-loop.d.ts +23 -0
  217. package/dist-pkg/platform/vision-loop.js +56 -0
  218. package/dist-pkg/platform/vision.d.ts +132 -0
  219. package/dist-pkg/platform/vision.js +117 -0
  220. package/dist-pkg/platform/voice-listener.d.ts +40 -0
  221. package/dist-pkg/platform/voice-listener.js +88 -0
  222. package/dist-pkg/platform/voice-plan.d.ts +15 -98
  223. package/dist-pkg/platform/voice-plan.js +56 -143
  224. package/dist-pkg/platform/vosk-runtime.d.ts +96 -0
  225. package/dist-pkg/platform/vosk-runtime.js +151 -0
  226. package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
  227. package/dist-pkg/platform/vosk-vocabulary.js +178 -0
  228. package/dist-pkg/render/canvas.d.ts +13 -7
  229. package/dist-pkg/render/canvas.js +13 -13
  230. package/dist-pkg/render/crt.d.ts +48 -12
  231. package/dist-pkg/render/crt.js +78 -80
  232. package/dist-pkg/render/cvd-matrices.d.ts +22 -18
  233. package/dist-pkg/render/cvd-matrices.js +37 -38
  234. package/dist-pkg/render/hc-role-data.d.ts +7 -7
  235. package/dist-pkg/render/hc-role-data.js +14 -14
  236. package/dist-pkg/render/high-contrast.d.ts +67 -56
  237. package/dist-pkg/render/high-contrast.js +226 -217
  238. package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
  239. package/dist-pkg/render/low-vision-drawing.js +46 -0
  240. package/dist-pkg/render/lq-filter.d.ts +32 -20
  241. package/dist-pkg/render/lq-filter.js +59 -65
  242. package/dist-pkg/render/port.d.ts +86 -88
  243. package/dist-pkg/render/port.js +17 -23
  244. package/dist-pkg/render/screen-pipeline.d.ts +42 -42
  245. package/dist-pkg/render/screen-pipeline.js +80 -87
  246. package/dist-pkg/render/sprite-fx.d.ts +2 -1
  247. package/dist-pkg/render/sprite-fx.js +16 -14
  248. package/dist-pkg/render/viewports.d.ts +20 -15
  249. package/dist-pkg/render/viewports.js +83 -114
  250. package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
  251. package/dist-pkg/render/viz-axes-labels.js +88 -0
  252. package/dist-pkg/render/viz-axes.d.ts +89 -86
  253. package/dist-pkg/render/viz-axes.js +128 -116
  254. package/dist-pkg/render/viz-modes.d.ts +28 -29
  255. package/dist-pkg/render/viz-modes.js +40 -45
  256. package/dist-pkg/render/viz-refusal.d.ts +32 -0
  257. package/dist-pkg/render/viz-refusal.js +57 -0
  258. package/dist-pkg/render/viz-setters.d.ts +104 -66
  259. package/dist-pkg/render/viz-setters.js +182 -191
  260. package/dist-pkg/ui/aac-sets.d.ts +45 -0
  261. package/dist-pkg/ui/aac-sets.js +41 -0
  262. package/dist-pkg/ui/audio-choices.d.ts +68 -0
  263. package/dist-pkg/ui/audio-choices.js +98 -0
  264. package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
  265. package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
  266. package/dist-pkg/ui/camera-control.d.ts +53 -0
  267. package/dist-pkg/ui/camera-control.js +48 -0
  268. package/dist-pkg/ui/changed-mark.d.ts +9 -8
  269. package/dist-pkg/ui/changed-mark.js +22 -53
  270. package/dist-pkg/ui/control-choices.d.ts +37 -0
  271. package/dist-pkg/ui/control-choices.js +84 -0
  272. package/dist-pkg/ui/debug-panel.d.ts +59 -43
  273. package/dist-pkg/ui/debug-panel.js +68 -69
  274. package/dist-pkg/ui/declared-words.d.ts +21 -0
  275. package/dist-pkg/ui/declared-words.js +66 -0
  276. package/dist-pkg/ui/dom.d.ts +10 -14
  277. package/dist-pkg/ui/dom.js +10 -47
  278. package/dist-pkg/ui/drawing-problems.d.ts +25 -0
  279. package/dist-pkg/ui/drawing-problems.js +94 -0
  280. package/dist-pkg/ui/eye-control.d.ts +36 -0
  281. package/dist-pkg/ui/eye-control.js +178 -0
  282. package/dist-pkg/ui/face-control.d.ts +25 -0
  283. package/dist-pkg/ui/face-control.js +183 -0
  284. package/dist-pkg/ui/focus-trap.d.ts +39 -49
  285. package/dist-pkg/ui/focus-trap.js +56 -65
  286. package/dist-pkg/ui/fonts.d.ts +157 -68
  287. package/dist-pkg/ui/fonts.js +305 -115
  288. package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
  289. package/dist-pkg/ui/footer-scroll-driver.js +201 -0
  290. package/dist-pkg/ui/footer-scroll.d.ts +38 -0
  291. package/dist-pkg/ui/footer-scroll.js +55 -0
  292. package/dist-pkg/ui/game-options.d.ts +47 -0
  293. package/dist-pkg/ui/game-options.js +158 -0
  294. package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
  295. package/dist-pkg/ui/gaze-overlay.js +165 -0
  296. package/dist-pkg/ui/hand-control.d.ts +25 -0
  297. package/dist-pkg/ui/hand-control.js +143 -0
  298. package/dist-pkg/ui/help-panel.d.ts +87 -0
  299. package/dist-pkg/ui/help-panel.js +242 -0
  300. package/dist-pkg/ui/hud-bands.d.ts +62 -0
  301. package/dist-pkg/ui/hud-bands.js +146 -0
  302. package/dist-pkg/ui/hud-row.d.ts +34 -0
  303. package/dist-pkg/ui/hud-row.js +80 -0
  304. package/dist-pkg/ui/hud.d.ts +73 -73
  305. package/dist-pkg/ui/hud.js +94 -98
  306. package/dist-pkg/ui/item-announcement.d.ts +13 -12
  307. package/dist-pkg/ui/item-announcement.js +25 -26
  308. package/dist-pkg/ui/layout.d.ts +103 -28
  309. package/dist-pkg/ui/layout.js +117 -99
  310. package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
  311. package/dist-pkg/ui/libras-avatar-clip.js +86 -0
  312. package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
  313. package/dist-pkg/ui/libras-avatar-load.js +134 -0
  314. package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
  315. package/dist-pkg/ui/libras-avatar-plan.js +211 -0
  316. package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
  317. package/dist-pkg/ui/libras-avatar-player.js +226 -0
  318. package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
  319. package/dist-pkg/ui/libras-avatar-stage.js +208 -0
  320. package/dist-pkg/ui/libras-glosses.d.ts +28 -0
  321. package/dist-pkg/ui/libras-glosses.js +161 -0
  322. package/dist-pkg/ui/locale-flags.d.ts +16 -0
  323. package/dist-pkg/ui/locale-flags.js +30 -0
  324. package/dist-pkg/ui/loop-crash.d.ts +17 -17
  325. package/dist-pkg/ui/loop-crash.js +33 -62
  326. package/dist-pkg/ui/menu-intent.d.ts +61 -0
  327. package/dist-pkg/ui/menu-intent.js +88 -0
  328. package/dist-pkg/ui/menu-items.d.ts +20 -0
  329. package/dist-pkg/ui/menu-items.js +51 -0
  330. package/dist-pkg/ui/menu-nav.d.ts +98 -92
  331. package/dist-pkg/ui/menu-nav.js +398 -286
  332. package/dist-pkg/ui/mobility-choices.d.ts +26 -0
  333. package/dist-pkg/ui/mobility-choices.js +41 -0
  334. package/dist-pkg/ui/motion-choices.d.ts +31 -0
  335. package/dist-pkg/ui/motion-choices.js +68 -0
  336. package/dist-pkg/ui/motion-scene.d.ts +24 -19
  337. package/dist-pkg/ui/motion-scene.js +29 -61
  338. package/dist-pkg/ui/mount-panel.d.ts +81 -0
  339. package/dist-pkg/ui/mount-panel.js +61 -0
  340. package/dist-pkg/ui/panel-shell.d.ts +65 -31
  341. package/dist-pkg/ui/panel-shell.js +92 -66
  342. package/dist-pkg/ui/panel-widgets.d.ts +150 -0
  343. package/dist-pkg/ui/panel-widgets.js +294 -0
  344. package/dist-pkg/ui/pause-buttons.d.ts +35 -0
  345. package/dist-pkg/ui/pause-buttons.js +66 -0
  346. package/dist-pkg/ui/pause-icons.d.ts +261 -347
  347. package/dist-pkg/ui/pause-icons.js +671 -601
  348. package/dist-pkg/ui/pause-markup.d.ts +86 -0
  349. package/dist-pkg/ui/pause-markup.js +125 -0
  350. package/dist-pkg/ui/reach-notice.d.ts +22 -23
  351. package/dist-pkg/ui/reach-notice.js +55 -58
  352. package/dist-pkg/ui/scan-overlay.d.ts +23 -0
  353. package/dist-pkg/ui/scan-overlay.js +50 -0
  354. package/dist-pkg/ui/screen-text.d.ts +25 -0
  355. package/dist-pkg/ui/screen-text.js +152 -0
  356. package/dist-pkg/ui/session-clock.d.ts +32 -0
  357. package/dist-pkg/ui/session-clock.js +67 -0
  358. package/dist-pkg/ui/settings-aac.d.ts +70 -0
  359. package/dist-pkg/ui/settings-aac.js +208 -0
  360. package/dist-pkg/ui/settings-audio.d.ts +97 -114
  361. package/dist-pkg/ui/settings-audio.js +493 -425
  362. package/dist-pkg/ui/settings-controls.d.ts +53 -96
  363. package/dist-pkg/ui/settings-controls.js +143 -215
  364. package/dist-pkg/ui/settings-empathy.d.ts +39 -30
  365. package/dist-pkg/ui/settings-empathy.js +53 -60
  366. package/dist-pkg/ui/settings-mobility.d.ts +192 -0
  367. package/dist-pkg/ui/settings-mobility.js +332 -0
  368. package/dist-pkg/ui/settings-motion.d.ts +91 -70
  369. package/dist-pkg/ui/settings-motion.js +287 -198
  370. package/dist-pkg/ui/settings-panel.d.ts +58 -45
  371. package/dist-pkg/ui/settings-panel.js +189 -94
  372. package/dist-pkg/ui/settings-typo.d.ts +29 -78
  373. package/dist-pkg/ui/settings-typo.js +158 -129
  374. package/dist-pkg/ui/settings-visual.d.ts +29 -87
  375. package/dist-pkg/ui/settings-visual.js +240 -193
  376. package/dist-pkg/ui/shell.d.ts +112 -135
  377. package/dist-pkg/ui/shell.js +148 -217
  378. package/dist-pkg/ui/simulation-list.d.ts +27 -0
  379. package/dist-pkg/ui/simulation-list.js +76 -0
  380. package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
  381. package/dist-pkg/ui/simulation-over-the-world.js +131 -0
  382. package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
  383. package/dist-pkg/ui/simulation-refusal.js +8 -56
  384. package/dist-pkg/ui/switchable-control.d.ts +11 -0
  385. package/dist-pkg/ui/switchable-control.js +19 -0
  386. package/dist-pkg/ui/title.d.ts +3 -12
  387. package/dist-pkg/ui/title.js +49 -18
  388. package/dist-pkg/ui/top-band.d.ts +26 -0
  389. package/dist-pkg/ui/top-band.js +96 -0
  390. package/dist-pkg/ui/typo-choices.d.ts +71 -0
  391. package/dist-pkg/ui/typo-choices.js +85 -0
  392. package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
  393. package/dist-pkg/ui/visual-axes-panel.js +12 -94
  394. package/dist-pkg/ui/visual-choices.d.ts +77 -0
  395. package/dist-pkg/ui/visual-choices.js +107 -0
  396. package/dist-pkg/ui/vlibras.d.ts +77 -10
  397. package/dist-pkg/ui/vlibras.js +130 -81
  398. package/dist-pkg/ui/voice-control.d.ts +68 -0
  399. package/dist-pkg/ui/voice-control.js +276 -0
  400. package/dist-pkg/ui/voice-settings.d.ts +95 -0
  401. package/dist-pkg/ui/voice-settings.js +352 -0
  402. package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
  403. package/dist-pkg/ui/where-the-child-is.js +70 -0
  404. package/docs/CREDITS.md +300 -44
  405. package/docs/LICENSES.md +189 -145
  406. package/package.json +51 -27
  407. package/scripts/check-cartridge.mjs +78 -0
  408. package/scripts/game-build.d.mts +25 -0
  409. package/scripts/game-build.mjs +144 -0
  410. package/scripts/heavy-into-the-delivery.mjs +388 -0
  411. package/scripts/libras-avatar.json +680 -0
  412. package/scripts/libras-avatar.mjs +246 -0
  413. package/scripts/libras-glosses/gloss.py +95 -0
  414. package/scripts/libras-glosses/pyproject.toml +32 -0
  415. package/scripts/libras-glosses/uv.lock +781 -0
  416. package/scripts/libras-glosses.mjs +351 -0
  417. package/scripts/licences/Apache-2.0.txt +176 -0
  418. package/scripts/licences/GPL-3.0.txt +674 -0
  419. package/scripts/licences/MIT.txt +17 -0
  420. package/scripts/licences/OFL-1.1.txt +86 -0
  421. package/scripts/licences/UFL-1.0.txt +96 -0
  422. package/scripts/licences/fonts.mjs +389 -0
  423. package/scripts/licences/third-party.mjs +301 -0
  424. package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
  425. package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
  426. package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
  427. package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
  428. package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
  429. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  430. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  431. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  432. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  433. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  434. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  435. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  436. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  437. package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
  438. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  439. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  440. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  441. package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
  442. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  443. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  444. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  445. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  446. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  447. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  448. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  449. package/dist-pkg/core/anel.d.ts +0 -17
  450. package/dist-pkg/core/anel.js +0 -31
  451. package/dist-pkg/core/collision.d.ts +0 -21
  452. package/dist-pkg/core/collision.js +0 -62
  453. package/dist-pkg/core/layers.d.ts +0 -63
  454. package/dist-pkg/core/layers.js +0 -95
  455. package/dist-pkg/core/letter-grid.d.ts +0 -55
  456. package/dist-pkg/core/letter-grid.js +0 -116
  457. package/dist-pkg/core/password.d.ts +0 -34
  458. package/dist-pkg/core/password.js +0 -205
  459. package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
  460. package/dist-pkg/core/rotulo-acessivel.js +0 -41
  461. package/dist-pkg/core/run-state.d.ts +0 -115
  462. package/dist-pkg/core/run-state.js +0 -40
  463. package/dist-pkg/core/tiles.d.ts +0 -12
  464. package/dist-pkg/core/tiles.js +0 -61
  465. package/dist-pkg/core/world.d.ts +0 -4
  466. package/dist-pkg/core/world.js +0 -58
  467. package/dist-pkg/input/origem-sintetica.d.ts +0 -44
  468. package/dist-pkg/input/origem-sintetica.js +0 -60
  469. package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
  470. package/dist-pkg/input/transporte-em-uso.js +0 -130
  471. package/dist-pkg/platform/audio-nav.d.ts +0 -51
  472. package/dist-pkg/platform/audio-nav.js +0 -99
  473. package/dist-pkg/platform/guide-intensity.d.ts +0 -40
  474. package/dist-pkg/platform/guide-intensity.js +0 -73
  475. package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
  476. package/dist-pkg/platform/pesados-catalogo.js +0 -177
  477. package/dist-pkg/platform/pesados.d.ts +0 -31
  478. package/dist-pkg/platform/pesados.js +0 -75
  479. package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
  480. package/dist-pkg/platform/vozes-prontas.js +0 -61
  481. package/dist-pkg/render/camera.d.ts +0 -58
  482. package/dist-pkg/render/camera.js +0 -105
  483. package/dist-pkg/render/cenario-data.d.ts +0 -127
  484. package/dist-pkg/render/cenario-data.js +0 -145
  485. package/dist-pkg/render/city-tex.d.ts +0 -63
  486. package/dist-pkg/render/city-tex.js +0 -228
  487. package/dist-pkg/render/city-tiles.d.ts +0 -11
  488. package/dist-pkg/render/city-tiles.js +0 -140
  489. package/dist-pkg/render/draw.d.ts +0 -149
  490. package/dist-pkg/render/draw.js +0 -231
  491. package/dist-pkg/render/fx.d.ts +0 -63
  492. package/dist-pkg/render/fx.js +0 -123
  493. package/dist-pkg/render/minimap.d.ts +0 -11
  494. package/dist-pkg/render/minimap.js +0 -94
  495. package/dist-pkg/render/parallax.d.ts +0 -85
  496. package/dist-pkg/render/parallax.js +0 -158
  497. package/dist-pkg/render/player-anim.d.ts +0 -71
  498. package/dist-pkg/render/player-anim.js +0 -152
  499. package/dist-pkg/render/recycling-tex.d.ts +0 -48
  500. package/dist-pkg/render/recycling-tex.js +0 -164
  501. package/dist-pkg/render/scene-city.d.ts +0 -77
  502. package/dist-pkg/render/scene-city.js +0 -181
  503. package/dist-pkg/render/scene-parallax.d.ts +0 -72
  504. package/dist-pkg/render/scene-parallax.js +0 -426
  505. package/dist-pkg/render/scene-sky.d.ts +0 -126
  506. package/dist-pkg/render/scene-sky.js +0 -295
  507. package/dist-pkg/render/set-cenario.d.ts +0 -54
  508. package/dist-pkg/render/set-cenario.js +0 -103
  509. package/dist-pkg/render/textures.d.ts +0 -75
  510. package/dist-pkg/render/textures.js +0 -240
  511. package/dist-pkg/render/title-scene.d.ts +0 -46
  512. package/dist-pkg/render/title-scene.js +0 -75
  513. package/dist-pkg/render/weather.d.ts +0 -96
  514. package/dist-pkg/render/weather.js +0 -171
  515. package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
  516. package/dist-pkg/render/wheelchair-sprites.js +0 -69
  517. package/dist-pkg/render/world-tex.d.ts +0 -18
  518. package/dist-pkg/render/world-tex.js +0 -87
  519. package/dist-pkg/ui/activities-menu.d.ts +0 -258
  520. package/dist-pkg/ui/activities-menu.js +0 -648
  521. package/dist-pkg/ui/caa-sets.d.ts +0 -39
  522. package/dist-pkg/ui/caa-sets.js +0 -65
  523. package/dist-pkg/ui/latch-refusal.d.ts +0 -32
  524. package/dist-pkg/ui/latch-refusal.js +0 -60
  525. package/dist-pkg/ui/map-hub.d.ts +0 -56
  526. package/dist-pkg/ui/map-hub.js +0 -138
  527. package/dist-pkg/ui/settings-caa.d.ts +0 -45
  528. package/dist-pkg/ui/settings-caa.js +0 -137
  529. package/dist-pkg/ui/settings-motor.d.ts +0 -175
  530. package/dist-pkg/ui/settings-motor.js +0 -342
  531. package/dist-pkg/ui/webcam.d.ts +0 -7
  532. package/dist-pkg/ui/webcam.js +0 -93
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // Locale es — SEED (só as chaves-piloto; completar UI+Matemática+Lúdico na Etapa 4). Ver docs/plano-i18n.md.
2
+ // Locale es — SEED (só as chaves-piloto; completar UI+Matemática+Lúdico na Etapa 4). Ver docs/1-Discovery/plan-i18n.md.
3
3
  // Parcial de propósito: as chaves ausentes caem no fallback pt (core/i18n).
4
4
  const es = {
5
5
  // ===================== ANUNCIOS DE LECTOR DE PANTALLA (`sr.*`) =====================
@@ -14,15 +14,11 @@ const es = {
14
14
  'sr.player.entered': '¡Jugador {n} entró!',
15
15
  // El reciclaje (ADR-0049 §1). Los cuatro colores son contenido curricular (CONAMA 275/2001, la norma
16
16
  // brasileña), así que el aviso DICE el color y no solo "bien/mal".
17
- 'sr.lixo.pegou': 'Recogiste: {o}.',
18
17
  'sr.lixo.soltou': 'Soltaste: {o}.',
19
- 'sr.lixo.acertou': '¡Bien! {o} va en el contenedor {cor}. Un punto.',
20
- 'sr.lixo.errou': 'Ese no es el contenedor del {o}. Prueba otro color.',
21
18
  'sr.lixo.solta': 'Aquí no se tira basura. Se te cayó junto al cartel.',
22
19
  'sr.lixo.barreira': 'El cartel no deja pasar la basura.',
23
20
  'lixo.obj.papel': 'caja de cartón',
24
21
  'lixo.obj.plastico': 'botella PET',
25
- 'lixo.obj.metal': 'lata de aluminio',
26
22
  'lixo.obj.vidro': 'frasco de vidrio',
27
23
  'lixo.cor.azul': 'azul',
28
24
  'lixo.cor.vermelha': 'rojo',
@@ -30,65 +26,76 @@ const es = {
30
26
  'lixo.cor.verde': 'verde',
31
27
  'sr.print.on': 'Modo Foto: mira la pantalla sin menús. Aprieta cualquier botón para volver.',
32
28
  'sr.player.pressToJoin': 'Jugador {n}: aprieta un botón para entrar.',
29
+ 'hud.waitBadge': 'Jugador {n}: aprieta un botón de TU teclado, o de un mando libre, para entrar',
30
+ 'menu.help': 'Ayuda',
31
+ 'help.grupo.rotulo': 'Los botones de este juego',
32
+ 'help.noKey': 'sin tecla',
33
+ 'help.slide.tecla': 'Tecla {k}',
33
34
  'sr.libras.loading': 'El intérprete de lengua de señas todavía está cargando — inténtalo de nuevo en un momento.',
34
- 'sr.eyes.loadFailed': 'WebGazer no cargó.',
35
- 'sr.eyes.calibrate': 'Jugar con los ojos: mira por la pantalla y haz clic en algunos puntos para calibrar. Mirar izquierda y derecha camina; mirar arriba salta.',
36
- 'sr.eyes.needsInternet': 'No se pudo cargar WebGazer (necesita internet la primera vez).',
35
+ 'sr.deaf.noSigning': 'Sin intérprete de lengua de señas ahora: los subtítulos y el texto siguen en la pantalla.',
36
+ 'sr.deaf.interpreter': 'Intérprete de Libras (lengua de señas brasileña)',
37
+ 'sr.eyes.needsInternet': 'El control con la mirada todavía no llegó a este aparato: se descarga la primera vez que el juego se abre con internet.',
38
+ 'sr.eyes.failed': 'El control con la mirada no pudo empezar en este aparato.',
39
+ // the eye control's words over the game (ADR-0213 §6): a region tells a preparing look which way to go, the opposite of itself
40
+ 'gaze.lookHere': 'Mira aquí',
41
+ 'gaze.loading': 'Cargando...',
42
+ 'gaze.prepare.up': '¡Baja!',
43
+ 'gaze.prepare.right': '¡A la izquierda!',
44
+ 'gaze.prepare.down': '¡Sube!',
45
+ 'gaze.prepare.left': '¡A la derecha!',
46
+ 'sr.face.lookMiddle': 'Mira al centro de la pantalla con la cara quieta hasta que diga listo.',
47
+ 'sr.face.ready': 'Listo: ya puedes jugar con la cara.',
48
+ 'sr.face.noCamera': 'El control con la cara necesita la cámara, y no se abrió. Permite la cámara para esta página.',
49
+ 'sr.face.needsInternet': 'El control con la cara todavía no llegó a este dispositivo: baja la primera vez que el juego se abre con internet.',
50
+ 'sr.face.failed': 'El control con la cara no pudo empezar en este aparato.',
51
+ 'sr.face.stopped': 'El control con la cara dejó de recibir imágenes de la cámara.',
52
+ 'sr.face.slow': 'El control con la cara va lento en este dispositivo y puede no responder.',
53
+ 'sr.eyes.lookMiddle': 'Mira al centro de la pantalla y no muevas los ojos hasta que diga listo.',
54
+ 'sr.eyes.ready': 'Listo: ya puedes jugar con los ojos.',
55
+ 'sr.eyes.noCamera': 'El control con la mirada necesita la cámara, y no se abrió. Permite la cámara para esta página.',
56
+ 'sr.eyes.stopped': 'El control con la mirada dejó de recibir imágenes de la cámara.',
57
+ 'sr.eyes.slow': 'El control con la mirada va lento en este dispositivo y puede no responder.',
37
58
  'sr.typo.font': 'Tipografía: {fam}.',
59
+ 'sr.icon.velocidade': 'Velocidad del juego: {pct} %.',
38
60
  'sr.visual.contrast': 'Alto contraste: {v}.',
39
61
  'sr.visual.lq': 'Realce de contraste: {v}.',
40
- 'sr.gate.open': '¡Portón abierto!',
41
- 'sr.key.taken': '{who}recogió la llave. Toca el portón para abrirlo.',
42
- 'sr.key.returned': 'La llave volvió a su lugar de origen.',
43
- 'sr.power.swapHint': '{msg} (Cambiar poder alterna entre los que ya tienes.)',
44
- 'sr.round.multi': '{n} jugadores, cada uno en su pantalla. Corran por las monedas.',
45
- 'sr.round.somasub': 'Modo Suma y Resta. Toca las figuras y resuelve las cuentas.',
46
- 'sr.round.silabas': 'Modo Sílabas. Toca las letras y arma las palabras.',
47
- 'sr.round.ludico': 'Nueva ronda. Junta 10 monedas.',
48
- 'sr.screens.mobileOnly': 'En el celular el juego funciona en una sola pantalla.',
49
- 'sr.screens.alreadyN': '{n} pantallas ya activas.',
50
- 'sr.screens.already1': 'Una pantalla.',
51
- 'sr.screens.wontFitN': 'No caben {n} pantallas en esta ventana — cada pantalla necesita al menos 640 por 360. Agranda la ventana o usa pantalla completa.',
52
62
  'sr.screens.wontFitOneMore': 'No cabe una pantalla más en esta ventana — cada pantalla necesita al menos 640 por 360. Agranda la ventana o usa pantalla completa.',
53
- 'sr.screens.activeN': '{n} pantallas activas.',
54
- 'sr.screens.newRoundN': '{n} pantallas activas — nueva ronda.',
55
- 'sr.screens.newRound1': 'Una pantalla — nueva ronda.',
56
63
  'sr.screens.maxPlayers': 'Ya son 4 jugadores.',
57
- 'sr.player.restarted': 'Jugador {n} volvió a empezar en esta pantalla.',
58
- 'sr.player.joined': 'Jugador {n} entró al juego en curso.',
59
- 'sr.player.quit': 'Jugador {n} abandonó el juego.',
60
64
  // Objetivo del HUD (texto en DOM; el mismo árbol de decisión del anuncio de ronda)
61
- 'hud.objective.multi': '{n} jugadores — carrera por las {alvo} monedas',
62
- 'hud.objective.somasub': 'Resuelve 10 cuentas',
63
- 'hud.objective.silabas': 'Arma 10 palabras',
64
- 'hud.objective.ludico': 'Junta 10 monedas',
65
65
  'hud.contador': '{have} de {need} {nome}',
66
- 'hud.nome.moedas': 'monedas',
67
- 'hud.nome.moeda': 'moneda',
66
+ 'hud.numero': '{nome}: {valor}',
67
+ 'hud.barra': '{nome}: {azuis} a la primera, {verdes} con ayuda, {vermelhos} sin acertar',
68
+ 'hud.barra.sobe': 'el nivel sube',
69
+ 'hud.barra.desce': 'el nivel baja',
70
+ // The score in the HUD row is drawn as five digits (ADR-0238, ADR-0239); a listener hears the number itself, not the zeros.
71
+ 'hud.points': '{count} {name}',
72
+ // The session clock's accessible name (ADR-0236): the time left in words, never «0:45». Rewritten each whole minute.
73
+ 'clock.left': 'Tiempo de juego: quedan {minutes} minutos',
74
+ 'clock.left.one': 'Tiempo de juego: queda 1 minuto',
75
+ 'clock.over': 'Tiempo de juego: se acabó',
76
+ 'clock.label': 'TIEMPO', // the small word over the clock's digits (ADR-0239)
68
77
  'pause.nivel': '📚 Nivel {n} · {nome}',
69
- 'sfx.jump': '🔊 Salto',
70
- 'sfx.coin': '🔊 Recogida',
71
- 'sfx.hurt': '🔊 ¡Ay! Daño',
72
- 'sfx.win': '🔊 ¡Ganaste!',
73
- 'sfx.correct': '🔊 ¡Correcto!',
74
- 'sfx.wrong': '🔊 Inténtalo de nuevo',
75
- 'sfx.power': '🔊 ¡Power-up!',
76
- 'sfx.key': '🔊 Llave',
77
- 'sfx.gate': '🔊 Portón abierto',
78
78
  'skip.toGame': 'Saltar al juego',
79
- 'menu.ludico': 'Juego libre',
80
- 'menu.alfabetizacao': 'Alfabetización',
81
- 'menu.matematica': 'Matemáticas',
82
79
  // Controles táctiles — las 9 posiciones, las 9 acciones asignables (panel #touchcfg) y los anuncios.
83
80
  'touch.slot.up': 'Direccional ↑ (arriba)',
84
81
  'touch.slot.down': 'Direccional ↓ (abajo)',
85
82
  'touch.slot.left': 'Direccional ← (izquierda)',
86
83
  'touch.slot.right': 'Direccional → (derecha)',
87
84
  'touch.slot.start': 'START (enter)',
85
+ 'touch.start': 'START',
86
+ 'touch.nome.up': 'Arriba',
87
+ 'touch.nome.down': 'Abajo',
88
+ 'touch.nome.left': 'Izquierda',
89
+ 'touch.nome.right': 'Derecha',
90
+ 'touch.select': 'SELECT',
88
91
  'touch.slot.b0': 'Botón 0 (abajo)',
89
92
  'touch.slot.b1': 'Botón 1 (derecha)',
90
93
  'touch.slot.b2': 'Botón 2 (izquierda)',
91
94
  'touch.slot.b3': 'Botón 3 (arriba)',
95
+ 'touch.slot.bl2': 'L2 (gatillo izquierdo)',
96
+ 'touch.slot.bl1': 'L1 (hombro izquierdo)',
97
+ 'touch.slot.br2': 'R2 (gatillo derecho)',
98
+ 'touch.slot.br1': 'R1 (hombro derecho)',
92
99
  'touch.slot.fallback': 'Botón',
93
100
  'touch.act.left': 'Caminar a la izquierda',
94
101
  'touch.act.right': 'Caminar a la derecha',
@@ -98,7 +105,6 @@ const es = {
98
105
  'touch.act.run': 'Correr / interactuar',
99
106
  'touch.act.especial': 'Especial',
100
107
  'touch.act.swap': 'Cambiar poder',
101
- 'touch.act.pause': 'Pausar (START)',
102
108
  'touch.dir.cross': 'cruceta (D-pad)',
103
109
  'touch.dir.stick': 'palanca analógica',
104
110
  'sr.touch.slotSet': '{slot}: {acao}.',
@@ -135,7 +141,6 @@ const es = {
135
141
  'audio.sinksUnsupported': 'Este navegador no permite cambiar la salida (p. ej. Safari/iOS).',
136
142
  'audio.voiceSample': '¡Hola! Esta es la voz de la narración del Inclusionista. Uno, dos, tres, probando.',
137
143
  'tts.engine.webspeech': 'Voz del navegador (Web Speech)',
138
- 'tts.engine.piper': 'Piper (neuronal, sin conexión) — se descarga en el 1.er uso',
139
144
  'tts.engine.kokoro': 'Kokoro-82M (neuronal) — se descarga en el 1.er uso',
140
145
  'tts.engine.kitten': 'Kitten (neuronal) — se descarga en el 1.er uso',
141
146
  'tts.engine.espeak': 'eSpeak NG (integrado)',
@@ -152,18 +157,69 @@ const es = {
152
157
  'sr.audio.voicePicked': 'Voz seleccionada.',
153
158
  'sr.audio.testingVoice': 'Probando la voz seleccionada.',
154
159
  // Barra de iconos de accesibilidad (menu de pausa y portada) + los niveles que recorre.
155
- 'icon.blind': 'Modo ciego (navegación sonora)',
156
- 'icon.tts': 'Narración por voz (TTS)',
157
- 'icon.libras': 'Modo persona sorda (lengua de señas)',
158
- 'icon.tea': 'Modo TEA (calmado / silencioso)',
159
- 'icon.altmove': 'Teclas de alternancia',
160
+ 'icon.blind': 'Modo ciego',
161
+ 'icon.tts': 'Narración por voz',
162
+ 'icon.libras': 'Modo persona sorda',
163
+ 'icon.tea': 'Modo TEA',
164
+ // ☝️ dejó de ser un interruptor y pasó a tres posiciones (ADR-0218): el nombre dice el ASUNTO y el valor dice la posición.
165
+ 'icon.altmove': 'Cómo pulsar',
166
+ 'input.standard': 'estándar',
167
+ 'input.sticky': 'no hace falta mantener',
168
+ 'scan.nothing': 'cancelar',
169
+ // One-button scanning inside a menu: that menu's own steps (ADR-0218 erratum of 2026-09-26, interface log).
170
+ 'scan.menu.next': 'siguiente',
171
+ 'scan.menu.confirm': 'confirmar',
172
+ 'scan.menu.back': 'volver',
173
+ 'scan.menu.previous': 'anterior',
174
+ // ...and, on a control with a value, the sideways step (the interface log's entry on the sideways step).
175
+ 'scan.menu.increase': 'aumentar',
176
+ 'scan.menu.decrease': 'disminuir',
177
+ // ...and the engine's two doors, offered in play after the game's own words (ADR-0218 §3).
178
+ 'scan.door.menus': 'menú',
179
+ 'scan.door.pause': 'pausar',
180
+ 'input.scan': 'un botón solo',
160
181
  'icon.contrast': 'Alto contraste',
161
- 'icon.cvd': 'Corrección de daltonismo (protan/deutan/tritan)',
162
- 'icon.face': 'Cámara web — rostro',
163
- 'icon.eyes': 'Cámara web — ojos',
182
+ 'icon.cvd': 'Corrección de daltonismo',
164
183
  'icon.voice': 'Comando de voz',
184
+ 'icon.tipografia': 'Comunicación',
185
+ 'icon.velocidade': 'Velocidad del juego',
186
+ 'icon.velocidade.valor': '{pct} %',
187
+ 'icon.blind.dica': 'Se juega por el sonido: la navegación sonora dice lo que muestra la pantalla.',
188
+ 'icon.tts.dica': 'El juego lee en voz alta lo que está escrito en la pantalla.',
189
+ 'icon.libras.dica': 'Los sonidos tienen subtítulos, y el sonar llama a un intérprete de lengua de señas para lo que está en la pantalla.',
190
+ 'icon.tea.dica': 'Deja el juego más tranquilo o en silencio, para quien se sobrecarga con estímulos.',
191
+ 'icon.altmove.dica': 'Cómo se leen tus pulsaciones: del modo estándar; o con un toque que activa y otro que desactiva, sin mantener; o con un botón solo, donde el juego muestra una cosa por vez y tú pulsas en la que quieres.',
192
+ 'sr.icon.inputMode': 'Cómo pulsar: {v}.',
193
+ 'icon.contrast.dica': 'Aumenta la diferencia entre lo que importa y el fondo: 3:1, 4,5:1 o 7:1.',
194
+ 'icon.cvd.dica': 'Ajusta los colores para quien confunde rojo y verde (protan, deutan) o azul y amarillo (tritan).',
195
+ 'icon.idioma': 'Idioma',
196
+ 'icon.idioma.dica': 'Cambiar el idioma del juego: menús, explicaciones, voz y reconocimiento de voz.',
197
+ 'icon.camera': 'Cámara web',
198
+ 'icon.camera.dica': 'Jugar con la cámara web: con gestos de las manos, con la cara o con los ojos. Las líneas muestran lo que lee la cámara.',
199
+ 'camera.hands': 'gestos de las manos',
200
+ 'camera.face': 'cara',
201
+ 'camera.eyes': 'ojos',
202
+ 'sr.icon.voice': 'Comando de voz: {v}.',
203
+ 'sr.icon.camera': 'Jugar con la cámara web: {v}.',
204
+ 'sr.voice.ready': 'Listo: ya puedes jugar hablando.',
205
+ 'sr.voice.noMicrophone': 'El control por voz necesita el micrófono, y no se abrió. Permite el micrófono para esta página.',
206
+ 'sr.voice.failed': 'El comando de voz no pudo empezar en este aparato.',
207
+ 'sr.voice.needsInternet': 'El control por voz todavía no llegó a este aparato: baja la primera vez que el juego se abre con internet.',
208
+ 'sr.reading.failed': 'La lectura en voz alta no pudo empezar en este idioma en este aparato.',
209
+ 'sr.hands.ready': 'Listo: ya puedes jugar con gestos de las manos.',
210
+ 'sr.hands.noCamera': 'El control con gestos necesita la cámara, y no se abrió. Permite la cámara para esta página.',
211
+ 'sr.hands.needsInternet': 'El control con gestos todavía no llegó a este dispositivo: baja la primera vez que el juego se abre con internet.',
212
+ 'sr.hands.failed': 'El control con gestos no pudo empezar en este aparato.',
213
+ 'sr.hands.stopped': 'El control con gestos dejó de recibir imágenes de la cámara.',
214
+ 'sr.hands.slow': 'El control con gestos va lento en este dispositivo y puede no responder.',
215
+ 'icon.menu': 'Menú',
216
+ 'icon.menu.dica': 'Abrir los menús: ayuda, configuraciones de inclusión, opciones del juego y salir.',
217
+ 'sr.icon.idioma': 'Idioma elegido: {v}.',
218
+ 'icon.voice.dica': 'Controlar el juego hablando.',
219
+ 'icon.tipografia.dica': 'Cambia la forma de las letras: mayúsculas, letras más legibles o la letra cursiva de tu país.',
220
+ 'icon.velocidade.dica': 'Hace más lento todo el juego: el tiempo, el mundo y el momento de actuar.',
165
221
  'icon.state': '{nome}: {v}',
166
- 'icon.soon': '{nome} (en construcción)',
222
+ 'ui.soon': 'próximamente',
167
223
  'state.on': 'activado',
168
224
  'state.off': 'desactivado',
169
225
  'calm.off': 'desactivado',
@@ -178,6 +234,29 @@ const es = {
178
234
  'contrast.3': '3:1',
179
235
  'contrast.45': '4,5:1',
180
236
  'contrast.7': '7:1',
237
+ 'visual.lq': 'Realce de contraste',
238
+ 'visual.lq.dica': 'Curva de tono en toda la pantalla: lineal estira el contraste, cuadrático realza sombras y luces, y mixto queda entre los dos. Vale para todos los jugadores.',
239
+ 'menu.visual': 'Accesibilidad visual',
240
+ 'menu.empathy': 'Modo empatía',
241
+ 'empathy.grupo.rotulo': 'Simulaciones',
242
+ 'empathy.simulacao.dica': 'Muestra el juego como lo ve quien tiene la discapacidad elegida.',
243
+ 'empathy.hearing': 'Simular pérdida auditiva',
244
+ 'empathy.hearing.dica': 'Los sonidos suaves se oyen apagados y los agudos se cortan, como oye quien tiene pérdida auditiva.',
245
+ 'empathy.onebtn': 'Simular un botón a la vez',
246
+ 'empathy.onebtn.dica': 'Mientras un botón está presionado, el juego no acepta un segundo, como para quien no puede presionar dos a la vez.',
247
+ 'empathy.semforca': 'Simular sin fuerza para mantener',
248
+ 'empathy.semforca.dica': 'Mantener un botón cuenta como un solo toque, como para quien no tiene fuerza para mantenerlo presionado.',
249
+ 'empathy.select': 'Seleccionar',
250
+ 'empathy.selected': '✓ Seleccionado',
251
+ 'visual.grupo.rotulo': 'Ajustes visuales',
252
+ 'visual.cbsafe': 'Paleta segura para daltonismo',
253
+ 'visual.cbsafe.dica': 'Cambia los colores de los menús y del HUD por una paleta que se distingue en cualquier tipo de daltonismo (Okabe-Ito).',
254
+ 'visual.dono': 'Objetos en el color de su dueño',
255
+ 'visual.dono.dica': 'En multijugador, cada jugador ve sus propios objetos en su color. Apagado: todos ven los colores originales.',
256
+ 'visual.papeis': 'Colores del color-blocking',
257
+ 'visual.papeis.dica': 'En los modos de alto contraste, elige el color de cada papel. ↺ restaura el valor por defecto.',
258
+ 'visual.papel.cor': 'Color de {papel}',
259
+ 'visual.papel.repor': 'Restaurar los colores por defecto',
181
260
  'lq.off': 'desactivado',
182
261
  'lq.linear': 'lineal',
183
262
  'lq.mixed': 'mixto',
@@ -194,49 +273,34 @@ const es = {
194
273
  'icon.cvd.short': 'Corrección de daltonismo',
195
274
  'pause.iconBarAria': 'Atajos de accesibilidad',
196
275
  // Menú de actividades (portada) — actividad, escenario, número de jugadores y notaciones de fracción.
197
- 'fnot.v': 'Fraccionaria vertical',
198
- 'fnot.d': 'Fraccionaria diagonal',
199
- 'fnot.dec': 'Decimal',
200
- 'fnot.pct': 'Porcentual',
201
- 'fnot.mix': 'Mixta',
202
- 'menu.playerCountAria': 'Número de jugadores: {n}. Pulsa a la izquierda para menos, a la derecha para más.',
203
- 'sr.menu.pickScenario': 'Elige el escenario.',
204
- 'sr.menu.gameStarted': '{atividade}. Juego iniciado.',
205
- 'sr.menu.pickNumbers': '{atividade}: elige los números.',
206
- 'sr.menu.player1': '{n} jugador.',
207
- 'sr.menu.playersN': '{n} jugadores.',
208
276
  'sr.menu.index': '{n} de {m}',
277
+ 'sr.papel.botao': 'botón',
278
+ 'sr.papel.interruptor': 'interruptor',
279
+ 'sr.papel.lista': 'lista',
280
+ 'sr.papel.cursor': 'control deslizante',
281
+ 'sr.papel.passos': 'selector',
282
+ 'sr.papel.opcao': 'opción',
283
+ 'sr.estado.selecionado': 'seleccionada',
209
284
  'sr.menu.indexOn': 'Posición en la lista activada.',
210
285
  'sr.menu.indexOff': 'Posición en la lista desactivada.',
211
- 'sr.a11y.barEnter': 'Barra de accesibilidad. Usa las direcciones para elegir y confirmar para activar. Para volver al juego, pulsa volver o START.',
286
+ 'sr.a11y.barEnter': 'Juego en pausa. Barra de accesibilidad. Usa las direcciones para elegir y confirmar para activar. Para volver al juego, pulsa volver o START.',
212
287
  'sr.a11y.barExit': 'De vuelta al juego.',
288
+ 'sr.a11y.quickPause': 'Juego en pausa. Para volver al juego, pulsa START.',
213
289
  'pad.glyph.cross': 'equis',
214
290
  'pad.glyph.circle': 'círculo',
215
291
  'pad.glyph.square': 'cuadrado',
216
292
  'pad.glyph.triangle': 'triángulo',
217
293
  'pad.wiz.step': '{n} de {total} — pulsa: {acao}',
294
+ 'pad.wiz.stepStart': '{n} de {total} — pulsa el botón que quieras como START (pausa el juego)',
295
+ 'pad.wiz.stepSelect': '{n} de {total} — pulsa el botón que quieras como SELECT (abre los menús)',
218
296
  'pad.wiz.mapped': 'Asignados: {lista}',
219
297
  'pad.wiz.pressAny': 'Pulsa CUALQUIER botón del mando que quieras configurar.',
220
298
  'pad.wiz.detected': 'Mando nuevo detectado: {id}. El juego se pausó para que puedas configurarlo. SUELTA todo para empezar.',
221
299
  'pad.wiz.releaseAll': 'Mando: {id}. Ahora SUELTA todo.',
222
300
  'menu.legendSpoken': 'Botón {sim} para confirmar, botón {nao} para volver.',
223
- 'sr.menu.fractionsIntro': 'Suma y resta de fracciones: elige la notación y el tipo.',
224
- 'sr.menu.keepOneNotation': 'Deja al menos una notación activada.',
225
- 'sr.menu.notationOn': '{notacao} activada.',
226
- 'sr.menu.notationOff': '{notacao} desactivada.',
227
- 'sr.menu.pickOneNumber': 'Elige al menos un número para practicar.',
228
- 'sr.menu.numberOn': 'Número {n} activado.',
229
- 'sr.menu.numberOff': 'Número {n} desactivado.',
230
- 'fnot.desc.v': 'Muestra fracciones verticales, un número sobre el otro.',
231
- 'fnot.desc.d': 'Muestra fracciones en una línea, con barra.',
232
301
  'fnot.desc.dec': 'Muestra números que siempre llevan un decimal.',
233
- 'fnot.desc.pct': 'Muestra porcentajes.',
234
- 'fnot.desc.mix': 'Muestra números enteros junto con fracciones reducidas.',
235
- 'menu.notationGroupAria': 'Notación',
236
302
  // Física (lava, ventosa araña), navegación sonora y el modo demostración.
237
- 'sr.physics.lava': '¡Cuidado! Tocaste la lava. Las monedas volvieron a posiciones aleatorias.',
238
303
  'sr.physics.spiderOn': '¡Modo araña! Trepas por paredes y techos y doblas esquinas. {botao} suelta.',
239
- 'sr.physics.spiderOff': 'Soltaste la superficie.',
240
304
  'sr.nav.noTargetNear': 'No hay nada cerca.',
241
305
  // El bucle se detuvo porque un fotograma lanzó (ADR-0054). Una niña ciega no ve una pantalla congelada.
242
306
  'sr.laco.parou': 'El juego se detuvo por un error. Recarga la página para volver a jugar.',
@@ -250,6 +314,7 @@ const es = {
250
314
  'eixo.correcao.tricro': 'Visión tricromática',
251
315
  'viz.escolher': 'Seleccionar',
252
316
  'viz.escolhido': '✓ Seleccionado',
317
+ 'sim.indisponivel.alternancia': 'Para ver la simulación sin fuerza para mantener, las teclas de alternancia tienen que estar desactivadas: con ellas activadas, la demostración mostraría el ajuste y no la dificultad.',
253
318
  'sim.indisponivel.tema': 'Para ver la simulación, el tema tiene que estar en su valor predeterminado: sobre el alto contraste mostraría lo que hace el tema, y no lo que hace la deficiencia.',
254
319
  'sim.indisponivel.correcao': 'Para ver la simulación, la corrección de color tiene que estar en visión tricromática: desde una pantalla ya corregida no mostraría ni la deficiencia ni la corrección.',
255
320
  'sim.indisponivel.ambos': 'Para ver la simulación, el tema y la corrección de color tienen que estar en sus valores predeterminados: sobre un ajuste, la demostración muestra el ajuste y no la deficiencia.',
@@ -260,18 +325,9 @@ const es = {
260
325
  'reach.nome.gamepad': 'mando',
261
326
  'reach.nome.teclado': 'teclado',
262
327
  'reach.nome.toque': 'control en pantalla',
263
- 'sr.attract.demo': 'Demostración.',
264
- 'sr.attract.recorded': 'Demo de 30 segundos grabada para {cenario}.',
265
328
  // Marcos de los submenús de título y los nombres de los escenarios.
266
329
  'menu.back': 'Volver',
267
- 'menu.play': 'Jugar',
268
330
  'menu.alf': 'Alfabetización',
269
- 'menu.mat': 'Matemáticas',
270
- 'menu.frac': 'Fracción',
271
- 'menu.fracTitle': 'Suma y resta de fracciones',
272
- 'menu.tab': 'Tablas de multiplicar',
273
- 'menu.tabHint': 'Elige los números para practicar',
274
- 'menu.cen': 'Escenario',
275
331
  'cen.cidade': 'Ciudad',
276
332
  'cen.campo': 'Día en el Campo',
277
333
  'cen.cemiterio': 'Amanecer en el Campo',
@@ -279,55 +335,129 @@ const es = {
279
335
  'cen.floresta': 'Bosque',
280
336
  // Narración por voz (TTS).
281
337
  'audio.noSystemVoices': '(sin voces del sistema)',
282
- 'sr.tts.engineNoLanguage': 'Este motor todavía no habla este idioma — por ahora, usa Piper (neuronal) o la voz del navegador.',
338
+ 'sr.tts.engineNoLanguage': 'Este motor todavía no habla este idioma — por ahora, usa la voz del navegador.',
283
339
  'sr.tts.noNeuralForLanguage': 'Todavía no hay voz neuronal para este idioma — seguimos con la voz del navegador, que sí lo habla.',
340
+ 'sr.tts.noVoiceForLanguage': 'Este dispositivo no tiene voz en {language}: esa parte no se lee en voz alta, pero sigue en la pantalla.',
284
341
  'sr.tts.neuralNotBundled': 'Esta versión del juego no trae voz neuronal — seguimos con la voz del navegador.',
285
342
  'sr.tts.downloading': 'Descargando la voz neuronal (necesita internet solo en el 1.er uso)…',
286
- 'sr.tts.progress': 'Voz neuronal: {pct} %.',
287
343
  'sr.tts.ready': 'Voz neuronal lista, en {s} segundos.',
288
344
  'sr.tts.loadFailed': 'No se pudo cargar la voz neuronal (necesita internet en el 1.er uso) — seguimos con la voz del navegador.',
289
345
  // Quiz — solo el MARCO; el currículo de alfabetización se mantiene en pt-BR por decisión.
290
- 'sr.quiz.tryAgain': 'Inténtalo de nuevo.',
291
- 'sr.quiz.erase': 'borrar',
292
346
  'sr.quiz.ok': 'ok',
293
347
  'sr.blind.on': 'Modo ciego activado: bastón y pistas de audio activas. El 1.er objeto de poder pasa a ser el bastón de carrera.',
294
348
  'sr.blind.off': 'Modo ciego desactivado.',
295
349
  'sr.motor.oneButtonOn': 'Un botón a la vez activado: solo una tecla o botón cada vez.',
296
- 'sr.motor.oneButtonOff': 'Un botón a la vez desactivado.',
297
- 'sr.motor.wheelchairOn': 'Modo silla de ruedas activado: sin salto; rampas y ascensores en lugar de escalones y escalera; monedas en el suelo; solo vuelo y súper carrera.',
298
- 'sr.motor.wheelchairOff': 'Modo silla de ruedas desactivado.',
299
- 'sr.visual.ownerColorsOn': 'Objetos en el color de su dueño: activado.',
300
- 'sr.visual.ownerColorsOff': 'Objetos en el color de su dueño: desactivado — todos en su color original.',
301
- 'sr.visual.cbSafeOn': 'Paleta segura para daltonismo activada (Okabe-Ito).',
302
- 'sr.visual.cbSafeOff': 'Paleta segura para daltonismo desactivada.',
303
- 'sr.visual.outlineFg': 'Contorno del primer plano: {v}.',
304
- 'sr.visual.outlineBg': 'Contorno del segundo plano: {v}.',
305
- 'outline.none': 'ninguno',
306
- 'outline.thin': 'fino',
307
- 'outline.thick': 'grueso',
308
- 'sr.captions.on': 'Subtítulos activados.',
309
- 'sr.captions.off': 'Subtítulos desactivados.',
310
350
  // Quiz — MATEMÁTICAS: el enunciado entero se traduce, operadores incluidos (2+3 no depende del idioma).
311
- 'math.howManyDots': '¿Cuántas bolitas?',
312
- 'math.op.plus': 'más',
313
- 'math.op.minus': 'menos',
314
- 'math.op.times': 'por',
315
- 'math.op.dividedBy': 'dividido por',
316
- 'sr.math.howManyDots': '¿Cuántas bolitas ves?',
317
- 'sr.math.howMuchIs': '¿Cuánto es {a} {op} {b}?',
318
351
  // Quiz — ALFABETIZACIÓN: el MARCO se traduce; la palabra, la letra y la celda Braille pasan como
319
352
  // parámetros, en pt-BR, porque son la materia de una disciplina de idioma.
320
- 'sr.quiz.who': 'Jugador {n}: ',
321
- 'sr.quiz.wins': '{n} de 3 aciertos para la moneda',
322
353
  'sr.quiz.buildWord': 'Letra {letra}. Forma la palabra: {palavra}.',
323
354
  'sr.quiz.whichSpelling': '{palavra}. ¿Cuál es la escritura correcta? El juego deletrea cada opción.',
324
355
  'sr.quiz.writeWord': 'Escribe la palabra: {palavra}. {n} letras.',
325
356
  'sr.quiz.brailleDictation': '{palavra}. {celas} Salta para recoger.',
326
357
  'sr.quiz.wellDone': '¡Muy bien! {palavra}. {n} de 3.',
327
- 'sr.quiz.correctSoFar': '¡Acertaste! {n} de 3 para ganar la moneda.',
328
358
  'menu.restoreDefaults': 'Restaurar los valores predeterminados de este menú',
329
359
  'menu.close': 'Cerrar',
330
360
  'menu.typo': 'Tipografía',
361
+ // El TÍTULO del panel, sin el emoji: `pause.caa` rotula el BOTÓN de la tarjeta de pausa, donde un símbolo
362
+ // ayuda a distinguir siete elementos de un vistazo. Dentro del panel ya se sabe dónde se está, y un emoji en
363
+ // el `<h2>` se lee en voz alta antes del nombre de lo que abrió.
364
+ 'menu.caa': 'Comunicación',
365
+ 'aac.grupo.rotulo': 'Opciones de comunicación',
366
+ // Nombrado por lo que la persona siente, no por lo que hace el código: quien necesita este panel llega por
367
+ // mareo o por riesgo de crisis, no por curiosidad sobre los fotogramas.
368
+ 'menu.animation': 'Sensibilidad visual',
369
+ 'animation.grupo.rotulo': 'Movimiento y animación',
370
+ // ===================== LAS LÍNEAS DEL PANEL MOTOR =====================
371
+ // Rótulo CORTO y la explicación en una sola pista, que la casca mueve al pie (CLAUDE.md §4). Las pistas son
372
+ // las mismas frases que los anuncios `sr.motor.*On` ya dicen, en presente en vez de en pasado: dos
373
+ // redacciones de la misma opción divergen, y quien oye el anuncio tras leer la línea merece reconocerla.
374
+ 'motor.facil': 'Modo Fácil',
375
+ 'motor.facil.dica': 'Menos gravedad, salto más alto, recogida tolerante, monedas en el suelo, sin peligros ni caídas accidentales.',
376
+ 'motor.altmove': 'Cómo pulsar',
377
+ 'motor.espera': 'Esperar entre pulsaciones',
378
+ 'motora.camera': 'Jugar con la cámara',
379
+ 'motora.camera.dica': 'La cámara se queda en el aparato: nada de lo que ve sale de aquí. Elige qué juega — las manos, la cara o los ojos.',
380
+ 'motora.voz': 'Jugar hablando',
381
+ 'motora.voz.dica': 'El micrófono se queda en el aparato: lo que la niña dice se oye aquí y no sale de aquí. Di el nombre de lo que quieres — «arriba», «confirma» — o el nombre del ítem del menú que está a la vista.',
382
+ 'motor.espera.dica': 'Después de un toque, espera medio segundo antes de aceptar el siguiente — para cuando la mano tiembla y el toque sale doble.',
383
+ 'motor.altmove.dica': 'Un toque lo activa y otro lo desactiva, en vez de mantener el botón pulsado.',
384
+ 'motor.togglerun': 'Alternancia de correr',
385
+ 'motor.togglerun.dica': 'El botón de correr queda activado con un toque, en vez de tener que mantenerlo.',
386
+ 'motor.grupo.rotulo': 'Opciones de movimiento',
387
+ 'motora.pad': 'Tamaño del control',
388
+ 'motora.pad.dica': 'Elige por la mano de quien juega: niño pequeño hasta 6 años, niño mayor alrededor de 12. El niño pequeño tiene los botones más grandes: todavía acierta lejos del centro.',
389
+ 'motora.pad.crianca-pequena': 'niño pequeño',
390
+ 'motora.pad.crianca-grande': 'niño mayor',
391
+ 'motora.pad.adulto-pequeno': 'adulto pequeño',
392
+ 'motora.pad.adulto-maos-grandes': 'adulto de manos grandes',
393
+ 'motora.teclado.1': 'Asignar teclado — 1 jugador',
394
+ 'motora.teclado.2': 'Asignar teclado — 2 jugadores',
395
+ 'motora.teclado.34': 'Asignar teclado — 3–4 jugadores',
396
+ 'motora.controle': 'Mapear mando',
397
+ 'motora.toque': 'Mapear táctil',
398
+ 'motora.abrir': 'Abrir',
399
+ 'ctrl.assento': 'Teclado de',
400
+ 'ctrl.jogador': 'Jugador {n}',
401
+ 'menu.motora': 'Accesibilidad motora',
402
+ // ===================== LAS LÍNEAS DEL PANEL AUDITIVO =====================
403
+ // Donde ya había palabra para la cosa, se REUSA — `icon.blind` e `icon.tts` nombran esos mismos dos ajustes
404
+ // en la barra de accesibilidad. Dos nombres para un ajuste en dos pantallas del mismo motor es como una
405
+ // niña deja de reconocer lo que ya aprendió.
406
+ 'audio.som': 'Sonido',
407
+ 'audio.som.dica': 'Apaga todo el sonido del juego de una vez, sin tocar las opciones de cada tipo.',
408
+ 'audio.volume': 'Volumen general',
409
+ 'audio.modocego': 'Modo ciego',
410
+ 'audio.narracao': 'Narración por voz',
411
+ 'audio.cat.music': 'Música',
412
+ 'audio.cat.ambient': 'Sonidos ambientales',
413
+ 'audio.cat.interact': 'Efectos de interacción',
414
+ 'audio.cat.earcons': 'Earcons',
415
+ 'audio.cat.tts': 'Narración',
416
+ 'audio.cat.sonar': 'Sonar',
417
+ 'audio.cat.volumeDe': 'Volumen de {c}',
418
+ 'audio.navsound.grupo': 'Sonidos de navegación',
419
+ 'audio.cane': 'Golpe del bastón',
420
+ 'audio.cane.dica': 'Cada cuánto suelo golpea el bastón. Uno por bloque es más calmo; cada medio bloque da más detalle.',
421
+ 'audio.cane.block': 'uno por bloque',
422
+ 'audio.cane.halfBlock': 'cada medio bloque',
423
+ 'audio.menuindex': 'Índice hablado de los menús',
424
+ 'audio.menuindex.dica': 'El lector de pantalla dice "3 de 7" al recorrer un menú, para saber dónde se está sin contar.',
425
+ 'audio.tts.dica': 'El juego lee en voz alta lo que está escrito en la pantalla.',
426
+ 'audio.ttsEngine': 'Motor de voz',
427
+ 'audio.ttsEngine.dica': 'La voz del navegador funciona enseguida; las neuronales suenan mejor y se descargan en el primer uso.',
428
+ 'audio.ttsVoice': 'Voz',
429
+ 'audio.ttsVol': 'Volumen de la narración',
430
+ 'audio.ttsPpm': 'Ritmo del habla',
431
+ 'audio.ttsPpm.dica': 'Cuántas palabras por minuto dice la narración.',
432
+ 'tts.kokoro.teste': 'Hola.', // the short sentence that tests whether WebGPU speaks (ADR-0198 §4)
433
+ 'visual.captions': 'Subtítulos',
434
+ 'visual.legenda.ritmo': 'Ritmo de los subtítulos',
435
+ 'visual.legenda.ppm': '{n} PPM',
436
+ 'visual.legenda.ritmo.dica': 'Cuánto tiempo queda el subtítulo en pantalla, en palabras por minuto.',
437
+ 'visual.contorno.fg': 'Contorno del primer plano',
438
+ 'visual.contorno.bg': 'Contorno del segundo plano',
439
+ 'visual.contorno.fg.dica': 'En alto contraste, contornea lo que se mueve y lo que se recoge.',
440
+ 'visual.contorno.bg.dica': 'En alto contraste, contornea por dónde se camina y por dónde no.',
441
+ 'visual.contorno.0': 'ninguno',
442
+ 'visual.contorno.1': 'fino',
443
+ 'visual.contorno.2': 'grueso',
444
+ 'visual.captions.dica': 'Escribe en la pantalla los sonidos del juego.',
445
+ 'sr.visual.captionsOn': 'Subtítulos activados.',
446
+ 'sr.visual.captionsOff': 'Subtítulos desactivados.',
447
+ 'audio.voz': 'Voz de narración',
448
+ 'audio.voz.nenhuma': 'Ninguna voz',
449
+ 'audio.semVoz': 'No hay ninguna voz que hable este idioma.',
450
+ 'audio.comVoz': 'Ahora hay una voz que habla este idioma.',
451
+ 'sr.audio.voz': 'Voz de narración: {nome}.',
452
+ 'audio.ttsTest': 'Probar la voz',
453
+ 'audio.ttsTest.dica': 'Dice una frase de ejemplo con la voz elegida ahora.',
454
+ 'audio.sinks.grupo': 'Salida de audio por jugador',
455
+ 'audio.detect': 'Detectar salidas',
456
+ 'menu.audio': 'Accesibilidad auditiva',
457
+ 'menu.som': 'Confort auditivo',
458
+ 'audio.grupo.rotulo': 'Sonidos del juego',
459
+ // El texto de REPOSO del pie de cada panel — lo que dice mientras nadie apunta a ninguna línea.
460
+ 'menu.explainIdle': 'Pasa el ratón o navega por las opciones para ver la explicación.',
331
461
  'sr.audio.reset': 'Accesibilidad auditiva restaurada a sus valores predeterminados. Los demás menús no cambiaron.',
332
462
  'sr.empathy.reset': 'Modo empatía restaurado a sus valores predeterminados: simulaciones desactivadas. Las correcciones de daltonismo y los demás menús no cambiaron.',
333
463
  'sr.motor.reset': 'Modo Fácil y movimiento por alternancia restaurados a sus valores predeterminados. El control con los ojos y el mapeo de teclas siguen igual.',
@@ -335,20 +465,32 @@ const es = {
335
465
  'a11y.changed': 'modificado',
336
466
  'sr.visual.reset': 'Accesibilidad visual restaurada a sus valores predeterminados: contraste, realce, colores y contornos. Los subtítulos y los demás menús no cambiaron.',
337
467
  'sr.motion.reset': 'Sensibilidad visual restaurada a sus valores predeterminados: animaciones y estética CRT. Las animaciones vuelven a lo que pide su sistema.',
338
- 'caa.emPreparo': 'en preparación',
339
- 'caa.aguardandoNegociacao': 'esperando negociación',
340
- 'caa.secao.agora': 'Disponible ahora',
341
- 'caa.secao.agoraTag': 'funciona sin red',
342
- 'caa.secao.preparo': 'En preparación',
343
- 'caa.secao.preparoTag': 'licencia resuelta; falta el trabajo',
344
- 'caa.secao.negociacao': 'Esperando negociación',
345
- 'caa.secao.negociacaoTag': 'el permiso no es nuestro',
346
- 'sr.caa.escolha': 'Comunicación: {v}.',
347
- 'sr.caa.reset': 'Comunicación restaurada a su valor predeterminado: letras mayúsculas, donde suele comenzar la alfabetización.',
348
- 'pause.caa': '🔠 Comunicación',
349
- 'sr.caa.caixaAltaOn': 'Letras mayúsculas activadas: todo el juego en mayúsculas.',
350
- 'sr.caa.caixaAltaOff': 'Letras mayúsculas desactivadas: mayúsculas y minúsculas.',
351
- 'sr.quiz.bemVindo': 'Cuestionario. Use las flechas para elegir y Enter para responder.',
468
+ 'aac.letras': 'Letras mayúsculas',
469
+ 'aac.letras.dica': 'Encendido: todo el juego en mayúsculas, como suele empezar la alfabetización. '
470
+ + 'Apagado: mayúsculas y minúsculas, la escritura de cada día.',
471
+ 'aac.noLicence': 'sin licencia',
472
+ 'aac.secao.agora': 'Disponible ahora',
473
+ 'aac.secao.agoraTag': 'funciona sin red',
474
+ 'aac.section.pictograms': 'Pictogramas',
475
+ 'aac.section.pictogramsTag': 'cada uno solo con licencia',
476
+ 'sr.aac.escolha': 'Comunicación: {v}.',
477
+ 'sr.aac.reset': 'Comunicación restaurada a su valor predeterminado: letras mayúsculas, donde suele comenzar la alfabetización.',
478
+ 'pause.caa': 'Comunicación',
479
+ 'sr.aac.caixaAltaOn': 'Letras mayúsculas activadas: todo el juego en mayúsculas.',
480
+ 'sr.aac.caixaAltaOff': 'Letras mayúsculas desactivadas: mayúsculas y minúsculas.',
481
+ 'sr.quiz.bemVindo': 'Cuestionario. Use {mover} para elegir y {responder} para responder.',
482
+ 'sr.quiz.bemVindo.soEscolher': 'Cuestionario. Use {mover} para elegir.',
483
+ 'sr.quiz.bemVindo.soResponder': 'Cuestionario. Use {responder} para responder.',
484
+ 'sr.quiz.bemVindo.semTeclas': 'Cuestionario. Toca una respuesta para darla.',
485
+ 'sr.quiz.teclas.duas': '{a} y {b}',
486
+ // Las preguntas del quiz — claves, no frases, para que cambiar la bandera alcance la ACTIVIDAD y no sólo el
487
+ // marco del motor (ADR-0225). Un quiz no es una materia de idioma: nada de esto queda sin traducir.
488
+ 'quiz.pageTitle': 'The Inclusionist — cuestionario de demostración',
489
+ 'quiz.carregando': 'Cargando…',
490
+ 'quiz.ouvindo': 'Estoy escuchando. Di la respuesta.',
491
+ 'quiz.ouviNada': 'No escuché nada. Dilo otra vez o elige con las flechas.',
492
+ 'quiz.semLeitura': 'Este aparato no puede escuchar ahora. Elige con las flechas.',
493
+ 'quiz.alternativas': 'Alternativas',
352
494
  'sr.nav.sonarFound': 'Sonar: {alvo} {lado}, {dist}.',
353
495
  'sr.nav.coin': 'moneda',
354
496
  'sr.nav.target': 'objetivo',
@@ -367,42 +509,36 @@ const es = {
367
509
  'sr.player.prefix': 'Jugador {n}: ',
368
510
  'sr.empathy.hearingOn': 'Simulación de pérdida auditiva activada: los sonidos débiles se apagan y los agudos se cortan; el habla se vuelve difícil de entender.',
369
511
  'sr.empathy.hearingOff': 'Simulación de pérdida auditiva desactivada.',
370
- 'sr.pad.disconnected': 'El mando del Jugador {n} se desconectó — el teclado sigue funcionando. Pulse START para volver a asociarlo.',
371
- 'sr.quiz.levelSet': 'Nivel {n}: {v}.',
372
- 'sr.visual.roleColorSet': 'Color de {v} cambiado.',
373
- 'sr.visual.roleColorsReset': 'Colores del color-blocking restaurados a sus valores predeterminados.',
374
- 'sr.visual.defaultColors': 'Colores predeterminados restaurados.',
375
- 'sr.pad.connected': 'Mando conectado: diseño {v}.',
376
- 'sr.pad.design': 'Diseño de los botones: {v}.',
377
- 'sr.eyes.loading': 'Jugar con los ojos: cargando la cámara web (permita el acceso).',
378
- 'sr.eyes.off': 'Jugar con los ojos desactivado.',
379
- 'sr.boot.loaded': 'Juego cargado. Recoge {n} monedas. Sube escaleras con W/S, nada manteniendo el salto en el agua.',
512
+ 'sr.empathy.onebtnOn': 'Simulación de un botón a la vez activada: un segundo botón presionado a la vez no cuenta.',
513
+ 'sr.empathy.onebtnOff': 'Simulación de un botón a la vez desactivada.',
514
+ 'sr.empathy.semforcaOn': 'Simulación sin fuerza para mantener activada: mantener un botón cuenta como un solo toque.',
515
+ 'sr.empathy.semforcaOff': 'Simulación sin fuerza para mantener desactivada.',
380
516
  // ===================== PODERES =====================
381
517
  'sr.power.superjump': '¡Súper salto! El salto llega siempre a su altura máxima.',
382
518
  'sr.power.ultrajump': '¡Ultra salto! Saltos de distancia gigante.',
383
519
  'sr.power.turbo': '¡Súper carrera! Al correr te vuelves mucho más rápido.',
384
520
  'sr.power.fly': '¡Vuelo! En el aire, pulsa Saltar para empezar a volar; Saltar de nuevo lo termina.',
385
521
  'sr.power.wallcling': '¡Escalada (araña)! En el aire, pulsa {botao} cerca de una pared o techo para pegarte; trepas y doblas esquinas; {botao} otra vez suelta.',
386
- 'sr.power.none': 'Sin poder activo.',
387
- 'sr.power.generic': '¡Poder activado!',
388
522
  'hud.power.off': '—',
389
523
  'hud.power.superjump': '🐇 Súper salto',
390
524
  'hud.power.ultrajump': '🦘 Ultra salto',
391
525
  'hud.power.turbo': '👟 Súper carrera',
392
- 'hud.power.fly': '🎈 Vuelo',
393
526
  'hud.power.wallcling': '🕷️ Escalada',
394
527
  'hud.power.runcane': '👟 Bastón de carrera',
395
528
  // ===================== MOVIMIENTO REDUCIDO (WCAG 2.3.3) + CRT =====================
396
529
  'rm.parallax': 'Parallax del fondo',
397
- 'rm.decor': 'Decoración (nubes, hierba)',
398
- 'rm.items': 'Animación de objetos (monedas)',
399
- 'rm.walk': 'Personaje en movimiento (andar, trepar, nadar, saltar)',
400
- 'rm.breath': 'Respiración (quieto)',
401
- 'rm.flavor': 'Gracias (animaciones de descanso)',
530
+ 'rm.decor': 'Decoración',
531
+ 'rm.items': 'Animación de objetos',
532
+ 'rm.walk': 'Personaje en movimiento',
533
+ 'rm.breath': 'Respiración',
534
+ 'rm.flavor': 'Gracias',
402
535
  'rm.particles': 'Partículas y destellos',
403
536
  'rm.crt.scan': 'Líneas de barrido',
404
537
  'rm.crt.vig': 'Viñeta',
405
538
  'rm.crt.round': 'Esquinas redondeadas',
539
+ 'crt.round.off': 'desactivado',
540
+ 'crt.round.small': 'pequeño',
541
+ 'crt.round.large': 'grande',
406
542
  'rm.sec.all': 'todos los jugadores',
407
543
  'sr.rm.frozen': '{alvo} congelado.',
408
544
  'sr.rm.animated': '{alvo} animado.',
@@ -412,32 +548,19 @@ const es = {
412
548
  'sr.crt.off': '{efeito} desactivada.',
413
549
  'sr.crt.round': '{efeito}: {nivel}.',
414
550
  // ===================== ENCENDIDO / APAGADO =====================
415
- 'ui.toggle.on': '❚❚ Activado',
416
- 'ui.toggle.off': '▶ Desactivado',
551
+ 'ui.toggle.on': 'Activado',
552
+ 'ui.toggle.off': 'Desactivado',
417
553
  'ui.toggle.ariaOn': '{alvo}: activado',
418
554
  'ui.toggle.ariaOff': '{alvo}: desactivado',
419
555
  // ===================== LAS DOS OPCIONES MOTORAS POR JUGADOR =====================
420
556
  'sr.motor.easyOn': 'Modo Fácil activado: menos gravedad, salto más alto, recogida tolerante, monedas en el suelo, sin peligros ni caídas accidentales (mantén ↓ para bajar).',
421
557
  'sr.motor.easyOff': 'Modo Fácil desactivado.',
422
- 'sr.motor.toggleMoveOn': 'Movimiento por alternancia activado: toca la dirección para andar sin mantener; toca de nuevo para parar; mantén para ir más rápido. El salto no interrumpe la marcha.',
423
- 'sr.motor.toggleMoveOff': 'Movimiento por alternancia desactivado.',
424
- 'alt.exigida.olhos': 'El control por mirada necesita el movimiento por alternancia para funcionar.',
425
- 'alt.exigida.rosto': 'El control por rostro necesita el movimiento por alternancia para funcionar.',
426
- 'alt.exigida.gestos': 'Los gestos necesitan el movimiento por alternancia para funcionar.',
427
- 'alt.exigida.fala': 'El comando de voz necesita el movimiento por alternancia para funcionar.',
558
+ 'sr.motor.toggleMoveOn': 'No hace falta mantener, activado: un toque lo activa y otro lo desactiva.',
559
+ 'sr.motor.toggleMoveOff': 'No hace falta mantener, desactivado.',
428
560
  'sr.motor.toggleRunOn': 'Alternancia de correr activada.',
429
561
  'sr.motor.toggleRunOff': 'Alternancia de correr desactivada.',
430
- 'sr.physics.runLatchOn': 'Corriendo.',
431
- 'sr.physics.runLatchOff': 'Caminando.',
432
562
  // ===================== AYUDA (menú de pausa) + etiqueta de nivel =====================
433
563
  'pause.level': '📚 Nivel {n} · {v}',
434
- 'help.controls': 'Tus controles',
435
- 'help.controlsPlayer': 'Tus controles · Jugador {n}',
436
- 'help.keyboard': 'teclado',
437
- 'help.buildNotes': 'Notas de esta versión',
438
- 'help.powerups': 'Poderes: 👟 súper carrera · 🕷️ escalada · 🎈 vuelo · 🐇 súper salto · 🦘 ultra salto · 🔑 la llave abre la 🚪 puerta.',
439
- 'help.multiplayer': '2–4 jugadores: pantallas una al lado de la otra, cada una con su menú y su configuración.',
440
- 'help.tech': 'v{v} — PixiJS (WebGL, Canvas de reserva) · texto e interfaz en el DOM (accesibilidad) · sin conexión vía PWA.',
441
564
  'menu.yes': 'Sí',
442
565
  'menu.no': 'No',
443
566
  // ===================== LOS 16 MODOS DE VISIÓN =====================
@@ -474,16 +597,17 @@ const es = {
474
597
  'viz.blind': 'Simular ceguera total',
475
598
  'viz.desc.blind': 'Pantalla negra — juega como lo hace una persona ciega (respuesta táctil y sonora). (punto blanco; toca 2 veces para salir)',
476
599
  // ===================== LO QUE FALTABA (item 14, ronda final) =====================
477
- 'title.byline': 'por el Prof. José Rocha',
478
- 'title.wait': 'Espera a que el Jugador 1 elija el juego',
479
- 'win.title': '🎉 ¡Recogiste las 10 monedas!',
480
- 'win.again': 'Jugar de nuevo',
481
600
  'pause.title': 'En pausa',
482
- 'pause.resume': '▶ Continuar',
483
- 'pause.acessibilidade': '♿ Accesibilidad',
484
- 'pause.options': '⚙ Opciones',
485
- 'pause.pmback': '↩ Volver',
601
+ 'pause.resume': 'Volver',
602
+ 'pause.quick': 'EN PAUSA',
603
+ 'pause.quick.legenda': '2: confirmar · 3: volver · 4: menú · START: volver al juego',
604
+ 'pause.card.legenda': '2: confirmar · 3: volver',
605
+ 'pause.acessibilidade': 'Accesibilidad',
606
+ 'pause.options': 'Ajustes de inclusión',
607
+ 'pause.opcoesdojogo': 'Opciones del juego',
608
+ 'pause.pmback': 'Volver',
486
609
  'pause.cardAria': 'Menú de pausa del jugador {n}',
610
+ 'pause.cardSeat': ' · Jugador {n}',
487
611
  /* --- CATÁLOGO DE ACTIVIDADES: todo menos alfabetización. Las cinco de alfabetización siguen en pt-BR
488
612
  crudo en `educational/activities-registry`: la palabra y la sílaba SON la materia (pilar 3). --- */
489
613
  'act.ludico.nome': 'Recoger 10 monedas',
@@ -511,54 +635,27 @@ const es = {
511
635
  'act.fr632.d': 'Suma y resta sextos, tercios y medios.',
512
636
  'act.fr2a6.nome': 'Suma y resta con fracciones de medios a sextos',
513
637
  'act.fr2a6.d': 'Suma y resta fracciones de medios a sextos.',
514
- 'pause.tipo': '🔤 Tipografía',
515
- 'pause.addplayer': '👥 Añadir jugador',
516
- 'pause.audio': '🦻 Accesibilidad auditiva',
517
- 'pause.motora': '♿ Accesibilidad motora',
518
- 'pause.anim': '🎞 Sensibilidad visual',
519
- 'pause.visual': '🎨 Accesibilidad visual',
520
- 'pause.empatia': '🫂 Modo empatía',
521
- 'pause.ajuda': '❓ Ayuda',
522
- 'pause.print': '📷 Print (ver la pantalla)',
523
- 'pause.quit': '🚪 Salir del juego',
524
- 'a11y.gameRegion': 'Área de juego. Muévete con A y D o las flechas; salta con L o Espacio; sube y baja escaleras (y nada en el agua) con W y S o las flechas; corre con P o Shift. Recoge 10 monedas.',
525
- 'game.instructions': 'Mueve al personaje por la cueva y recoge 10 monedas. Sin límite de tiempo. Controles: A y D o las flechas mueven; L o Espacio saltan; W y S (o flechas arriba/abajo) suben escaleras y nadan; P o Shift corren.',
638
+ 'pause.tipo': 'Tipografía',
639
+ 'pause.addplayer': 'Número de jugadores',
640
+ 'pause.audio': 'Accesibilidad auditiva',
641
+ 'pause.som': 'Confort auditivo',
642
+ 'pause.motora': 'Accesibilidad motora',
643
+ 'pause.anim': 'Sensibilidad visual',
644
+ 'pause.visual': 'Accesibilidad visual',
645
+ 'pause.empatia': 'Modo empatía',
646
+ 'pause.ajuda': 'Ayuda — Cómo jugar',
647
+ 'pause.print': 'Print (ver la pantalla)',
648
+ 'pause.quit': 'Salir del juego',
649
+ 'pause.motivo': 'Este juego no usa esta opción.',
650
+ 'pause.motivo.ajuda': 'Este juego todavía no dijo qué hace cada botón.',
651
+ 'pause.motivo.addplayer': 'Es el juego quien decide cuántos jugadores pueden jugar.',
652
+ 'pause.motivo.opcoesdojogo': 'Este juego no tiene opciones propias.',
653
+ 'pause.motivo.caa': 'Menú deshabilitado',
526
654
  // ===================== ARIA-LABEL DEL index.html =====================
527
- 'a11y.choosePlayer': 'Elige el jugador',
528
- 'a11y.animations': 'Animaciones',
529
- 'a11y.literacy': 'Alfabetización',
530
- 'a11y.shortcuts': 'Atajos de accesibilidad',
531
- 'a11y.hearing': 'Audición',
532
- 'a11y.actionButtons': 'Botones de acción',
533
- 'a11y.screenButtons': 'Botones en pantalla (táctil)',
534
- 'a11y.touchButtons': 'Botones táctiles en pantalla',
535
- 'a11y.audioCategories': 'Categorías de audio',
536
655
  'a11y.communication': 'Comunicación: letras y símbolos',
537
- 'a11y.outlineFg': 'Contorno de primer plano',
538
- 'a11y.outlineBg': 'Contorno de segundo plano',
539
- 'a11y.outlines': 'Contornos del alto contraste',
540
- 'a11y.touchControls': 'Controles táctiles',
541
- 'a11y.padDesign': 'Diseño de los botones',
542
- 'a11y.chooseScenery': 'Elige el escenario',
543
- 'a11y.chooseGame': 'Elige el juego',
544
- 'a11y.chooseNumbers': 'Elige los números',
545
- 'a11y.hideDebug': 'Ocultar las herramientas de depuración',
546
- 'a11y.btnSpecial': 'Especial (botón 1)',
547
- 'a11y.fraction': 'Fracción',
548
- 'a11y.touchRoles': 'Función de cada botón táctil',
549
- 'a11y.btnRun': 'Interactuar / correr (botón 2)',
550
- 'a11y.eyeGaze': 'Jugar con los ojos',
551
- 'a11y.mapControls': 'Asignar controles (por jugador)',
552
- 'a11y.math': 'Matemáticas',
553
656
  'a11y.pauseMenu': 'Menú de pausa',
554
- 'a11y.simActive': 'Modo de simulación activo. Toca dos veces para volver a los colores normales.',
555
657
  'a11y.stopAll': 'Detener todas las animaciones',
556
- 'a11y.btnJump': 'Saltar (botón 0)',
557
- 'a11y.audioOut': 'Salida de audio por jugador',
558
- 'a11y.visualSim': 'Simulación visual',
559
- 'a11y.switchScreens': 'Cambiar el número de pantallas (jugadores)',
560
- 'a11y.btnSwap': 'Cambiar poder (botón 3)',
561
- 'menu.playerCount': '◀ Nº de jugadores: {n} ▶',
658
+ 'a11y.resumeAll': 'Reanudar todas las animaciones',
562
659
  // ===================== LEYENDA DE CONTROLES (fila bajo el título) =====================
563
660
  'legend.move': 'moverse',
564
661
  'legend.pause': 'pausa',
@@ -568,13 +665,16 @@ const es = {
568
665
  'legend.swap': 'cambiar',
569
666
  // ===================== CATÁLOGO DE FUENTES =====================
570
667
  'font.grupo.rotulo': 'Familia de letra',
668
+ // UN PANGRAMA, y por eso cambia de idioma en vez de traducirse: la muestra existe para poner el alfabeto
669
+ // entero a la vista de quien pregunta «¿consigo leer esto?». Este lleva la ñ, los acentos y la apertura de
670
+ // exclamación — las formas que deciden si una fuente sirve en español.
671
+ 'font.amostra': 'Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!',
571
672
  'font.group.sans': 'Sin serifa',
572
673
  'font.group.serif': 'Con serifa',
573
674
  'font.group.hand': 'Manuscrita',
574
675
  'font.group.arcade': 'Arcade',
575
676
  'font.desc.atkinson': 'hecha por el Braille Institute para personas con baja visión (la predeterminada del juego)',
576
677
  'font.desc.lexend': 'hecha para reducir el estrés visual y atender a personas disléxicas (activa el espaciado extra)',
577
- 'font.desc.quattro': 'creada para reducir la fatiga visual de quien pasa mucho tiempo ante la pantalla',
578
678
  'font.desc.andika': 'basada en la Sassoon; fruto de la investigación sobre cómo leen y escriben los niños',
579
679
  'font.desc.opendyslexic': 'Letras con la base más pesada, para que no se den vuelta al leer.',
580
680
  'font.desc.fondamento': 'Caligráfica de pluma, para las actividades de escritura a mano.',
@@ -587,13 +687,13 @@ const es = {
587
687
  'font.desc.pw.cl': 'Cursiva escolar de Chile.',
588
688
  'font.desc.pw.co': 'Cursiva escolar de Colombia.',
589
689
  'font.desc.ronde': 'Ronde francesa, la letra ligada que se enseña en la escuela.',
590
- 'font.off.ronde': 'Instale en el dispositivo una de estas tres: Ronde Script, OPTIFrench-Script o Merveille. '
591
- + 'Son gratuitas para uso personal, y por eso no pueden venir dentro del juego.',
690
+ 'font.notice.ronde': 'Instale en el dispositivo una de estas tres: Ronde Script, OPTIFrench-Script o Merveille. '
691
+ + 'Son gratuitas para uso personal, y por eso no pueden venir dentro del juego. '
692
+ + 'Sin ellas, el juego muestra Cookie: una letra ligada parecida, pero que no es la ronde de la escuela.',
592
693
  'font.desc.greatvibes': 'caligráfica inglesa',
593
694
  'font.desc.pinyon': 'caligráfica inglesa',
594
695
  'font.desc.ufcook': 'blackletter alemana',
595
696
  'font.desc.ufmag': 'blackletter alemana',
596
- 'font.desc.comicneue': 'bola y palo (alfabetización)',
597
697
  'font.desc.pressstart': 'píxel de 8 bits (HUD y título del juego)',
598
698
  'font.desc.learningcurve': 'cursiva inglesa',
599
699
  'font.desc.kindergarten': 'cursiva brasileña',