@the-inclusionist/engine 6.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +107 -0
  3. package/app/css/style.css +622 -0
  4. package/app/public/vendor/fonts/andika-400-ext.woff2 +0 -0
  5. package/app/public/vendor/fonts/andika-400.woff2 +0 -0
  6. package/app/public/vendor/fonts/andika-700-ext.woff2 +0 -0
  7. package/app/public/vendor/fonts/andika-700.woff2 +0 -0
  8. package/app/public/vendor/fonts/atkinson-400-ext.woff2 +0 -0
  9. package/app/public/vendor/fonts/atkinson-400.woff2 +0 -0
  10. package/app/public/vendor/fonts/atkinson-700-ext.woff2 +0 -0
  11. package/app/public/vendor/fonts/atkinson-700.woff2 +0 -0
  12. package/app/public/vendor/fonts/atkinson-mono-400-ext.woff2 +0 -0
  13. package/app/public/vendor/fonts/atkinson-mono-400.woff2 +0 -0
  14. package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
  15. package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
  16. package/app/public/vendor/fonts/greatvibes-400.woff2 +0 -0
  17. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  18. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  19. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  20. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  21. package/app/public/vendor/fonts/lexend-400-ext.woff2 +0 -0
  22. package/app/public/vendor/fonts/lexend-400.woff2 +0 -0
  23. package/app/public/vendor/fonts/lexend-700-ext.woff2 +0 -0
  24. package/app/public/vendor/fonts/lexend-700.woff2 +0 -0
  25. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  26. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  27. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  28. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  29. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  30. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  31. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  32. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  33. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  34. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  35. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  36. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  37. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  38. package/app/public/vendor/fonts/ufcook-700.woff2 +0 -0
  39. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  40. package/app/public/vendor/fonts.css +88 -0
  41. package/dist-pkg/boot/create-game.d.ts +159 -0
  42. package/dist-pkg/boot/create-game.js +266 -0
  43. package/dist-pkg/core/a11y-sr.d.ts +4 -0
  44. package/dist-pkg/core/a11y-sr.js +20 -0
  45. package/dist-pkg/core/actions.d.ts +100 -0
  46. package/dist-pkg/core/actions.js +149 -0
  47. package/dist-pkg/core/anel.d.ts +17 -0
  48. package/dist-pkg/core/anel.js +31 -0
  49. package/dist-pkg/core/collision.d.ts +21 -0
  50. package/dist-pkg/core/collision.js +62 -0
  51. package/dist-pkg/core/constants.d.ts +84 -0
  52. package/dist-pkg/core/constants.js +64 -0
  53. package/dist-pkg/core/contract.d.ts +227 -0
  54. package/dist-pkg/core/contract.js +184 -0
  55. package/dist-pkg/core/dom-query.d.ts +9 -0
  56. package/dist-pkg/core/dom-query.js +25 -0
  57. package/dist-pkg/core/entity.d.ts +150 -0
  58. package/dist-pkg/core/entity.js +38 -0
  59. package/dist-pkg/core/escape-html.d.ts +16 -0
  60. package/dist-pkg/core/escape-html.js +32 -0
  61. package/dist-pkg/core/i18n.d.ts +71 -0
  62. package/dist-pkg/core/i18n.js +236 -0
  63. package/dist-pkg/core/layers.d.ts +39 -0
  64. package/dist-pkg/core/layers.js +71 -0
  65. package/dist-pkg/core/letter-grid.d.ts +55 -0
  66. package/dist-pkg/core/letter-grid.js +116 -0
  67. package/dist-pkg/core/loop.d.ts +17 -0
  68. package/dist-pkg/core/loop.js +36 -0
  69. package/dist-pkg/core/password.d.ts +34 -0
  70. package/dist-pkg/core/password.js +205 -0
  71. package/dist-pkg/core/rng.d.ts +20 -0
  72. package/dist-pkg/core/rng.js +61 -0
  73. package/dist-pkg/core/rotulo-acessivel.d.ts +17 -0
  74. package/dist-pkg/core/rotulo-acessivel.js +41 -0
  75. package/dist-pkg/core/run-state.d.ts +115 -0
  76. package/dist-pkg/core/run-state.js +40 -0
  77. package/dist-pkg/core/scenes.d.ts +68 -0
  78. package/dist-pkg/core/scenes.js +64 -0
  79. package/dist-pkg/core/screens.d.ts +16 -0
  80. package/dist-pkg/core/screens.js +28 -0
  81. package/dist-pkg/core/state.d.ts +138 -0
  82. package/dist-pkg/core/state.js +290 -0
  83. package/dist-pkg/core/tiles.d.ts +12 -0
  84. package/dist-pkg/core/tiles.js +61 -0
  85. package/dist-pkg/core/world.d.ts +4 -0
  86. package/dist-pkg/core/world.js +58 -0
  87. package/dist-pkg/educational/activities-registry.d.ts +47 -0
  88. package/dist-pkg/educational/activities-registry.js +95 -0
  89. package/dist-pkg/i18n/en.d.ts +3 -0
  90. package/dist-pkg/i18n/en.js +560 -0
  91. package/dist-pkg/i18n/es.d.ts +3 -0
  92. package/dist-pkg/i18n/es.js +558 -0
  93. package/dist-pkg/i18n/pt.d.ts +3 -0
  94. package/dist-pkg/i18n/pt.js +618 -0
  95. package/dist-pkg/input/default-bindings.d.ts +24 -0
  96. package/dist-pkg/input/default-bindings.js +122 -0
  97. package/dist-pkg/input/devices.d.ts +15 -0
  98. package/dist-pkg/input/devices.js +31 -0
  99. package/dist-pkg/input/edges.d.ts +58 -0
  100. package/dist-pkg/input/edges.js +49 -0
  101. package/dist-pkg/input/gamepad.d.ts +203 -0
  102. package/dist-pkg/input/gamepad.js +531 -0
  103. package/dist-pkg/input/keyboard-runtime.d.ts +61 -0
  104. package/dist-pkg/input/keyboard-runtime.js +83 -0
  105. package/dist-pkg/input/keyboard.d.ts +45 -0
  106. package/dist-pkg/input/keyboard.js +80 -0
  107. package/dist-pkg/input/keydown.d.ts +270 -0
  108. package/dist-pkg/input/keydown.js +381 -0
  109. package/dist-pkg/input/latch.d.ts +30 -0
  110. package/dist-pkg/input/latch.js +63 -0
  111. package/dist-pkg/input/pointer-space.d.ts +40 -0
  112. package/dist-pkg/input/pointer-space.js +51 -0
  113. package/dist-pkg/input/state.d.ts +11 -0
  114. package/dist-pkg/input/state.js +12 -0
  115. package/dist-pkg/input/touch-bindings.d.ts +210 -0
  116. package/dist-pkg/input/touch-bindings.js +365 -0
  117. package/dist-pkg/input/touch.d.ts +173 -0
  118. package/dist-pkg/input/touch.js +314 -0
  119. package/dist-pkg/input/transports.d.ts +90 -0
  120. package/dist-pkg/input/transports.js +96 -0
  121. package/dist-pkg/input/vocabulary-migration.d.ts +58 -0
  122. package/dist-pkg/input/vocabulary-migration.js +125 -0
  123. package/dist-pkg/platform/audio-ambient.d.ts +27 -0
  124. package/dist-pkg/platform/audio-ambient.js +89 -0
  125. package/dist-pkg/platform/audio-earcons.d.ts +24 -0
  126. package/dist-pkg/platform/audio-earcons.js +62 -0
  127. package/dist-pkg/platform/audio-jingles.d.ts +17 -0
  128. package/dist-pkg/platform/audio-jingles.js +54 -0
  129. package/dist-pkg/platform/audio-mixer.d.ts +14 -0
  130. package/dist-pkg/platform/audio-mixer.js +62 -0
  131. package/dist-pkg/platform/audio-nav.d.ts +51 -0
  132. package/dist-pkg/platform/audio-nav.js +99 -0
  133. package/dist-pkg/platform/audio-sonar.d.ts +71 -0
  134. package/dist-pkg/platform/audio-sonar.js +173 -0
  135. package/dist-pkg/platform/audio.d.ts +32 -0
  136. package/dist-pkg/platform/audio.js +191 -0
  137. package/dist-pkg/platform/interruptible-speech.d.ts +19 -0
  138. package/dist-pkg/platform/interruptible-speech.js +79 -0
  139. package/dist-pkg/platform/speech.d.ts +2 -0
  140. package/dist-pkg/platform/speech.js +35 -0
  141. package/dist-pkg/platform/storage.d.ts +87 -0
  142. package/dist-pkg/platform/storage.js +148 -0
  143. package/dist-pkg/platform/tts.d.ts +33 -0
  144. package/dist-pkg/platform/tts.js +142 -0
  145. package/dist-pkg/render/camera.d.ts +58 -0
  146. package/dist-pkg/render/camera.js +105 -0
  147. package/dist-pkg/render/canvas.d.ts +13 -0
  148. package/dist-pkg/render/canvas.js +26 -0
  149. package/dist-pkg/render/cenario-data.d.ts +127 -0
  150. package/dist-pkg/render/cenario-data.js +145 -0
  151. package/dist-pkg/render/city-tex.d.ts +63 -0
  152. package/dist-pkg/render/city-tex.js +228 -0
  153. package/dist-pkg/render/city-tiles.d.ts +11 -0
  154. package/dist-pkg/render/city-tiles.js +140 -0
  155. package/dist-pkg/render/crt.d.ts +19 -0
  156. package/dist-pkg/render/crt.js +92 -0
  157. package/dist-pkg/render/cvd-matrices.d.ts +35 -0
  158. package/dist-pkg/render/cvd-matrices.js +91 -0
  159. package/dist-pkg/render/draw.d.ts +149 -0
  160. package/dist-pkg/render/draw.js +221 -0
  161. package/dist-pkg/render/fx.d.ts +63 -0
  162. package/dist-pkg/render/fx.js +123 -0
  163. package/dist-pkg/render/hc-role-data.d.ts +14 -0
  164. package/dist-pkg/render/hc-role-data.js +24 -0
  165. package/dist-pkg/render/high-contrast.d.ts +109 -0
  166. package/dist-pkg/render/high-contrast.js +254 -0
  167. package/dist-pkg/render/lq-filter.d.ts +37 -0
  168. package/dist-pkg/render/lq-filter.js +94 -0
  169. package/dist-pkg/render/minimap.d.ts +11 -0
  170. package/dist-pkg/render/minimap.js +94 -0
  171. package/dist-pkg/render/parallax.d.ts +85 -0
  172. package/dist-pkg/render/parallax.js +158 -0
  173. package/dist-pkg/render/player-anim.d.ts +71 -0
  174. package/dist-pkg/render/player-anim.js +152 -0
  175. package/dist-pkg/render/port.d.ts +143 -0
  176. package/dist-pkg/render/port.js +29 -0
  177. package/dist-pkg/render/recycling-tex.d.ts +48 -0
  178. package/dist-pkg/render/recycling-tex.js +164 -0
  179. package/dist-pkg/render/scene-city.d.ts +77 -0
  180. package/dist-pkg/render/scene-city.js +181 -0
  181. package/dist-pkg/render/scene-parallax.d.ts +72 -0
  182. package/dist-pkg/render/scene-parallax.js +426 -0
  183. package/dist-pkg/render/scene-sky.d.ts +126 -0
  184. package/dist-pkg/render/scene-sky.js +295 -0
  185. package/dist-pkg/render/screen-pipeline.d.ts +134 -0
  186. package/dist-pkg/render/screen-pipeline.js +177 -0
  187. package/dist-pkg/render/set-cenario.d.ts +54 -0
  188. package/dist-pkg/render/set-cenario.js +103 -0
  189. package/dist-pkg/render/sprite-fx.d.ts +3 -0
  190. package/dist-pkg/render/sprite-fx.js +40 -0
  191. package/dist-pkg/render/textures.d.ts +75 -0
  192. package/dist-pkg/render/textures.js +240 -0
  193. package/dist-pkg/render/title-scene.d.ts +46 -0
  194. package/dist-pkg/render/title-scene.js +75 -0
  195. package/dist-pkg/render/viewports.d.ts +52 -0
  196. package/dist-pkg/render/viewports.js +185 -0
  197. package/dist-pkg/render/viz-axes.d.ts +98 -0
  198. package/dist-pkg/render/viz-axes.js +184 -0
  199. package/dist-pkg/render/viz-modes.d.ts +61 -0
  200. package/dist-pkg/render/viz-modes.js +74 -0
  201. package/dist-pkg/render/viz-setters.d.ts +130 -0
  202. package/dist-pkg/render/viz-setters.js +244 -0
  203. package/dist-pkg/render/weather.d.ts +96 -0
  204. package/dist-pkg/render/weather.js +171 -0
  205. package/dist-pkg/render/wheelchair-sprites.d.ts +24 -0
  206. package/dist-pkg/render/wheelchair-sprites.js +63 -0
  207. package/dist-pkg/render/world-tex.d.ts +18 -0
  208. package/dist-pkg/render/world-tex.js +87 -0
  209. package/dist-pkg/ui/activities-menu.d.ts +258 -0
  210. package/dist-pkg/ui/activities-menu.js +648 -0
  211. package/dist-pkg/ui/caa-sets.d.ts +39 -0
  212. package/dist-pkg/ui/caa-sets.js +65 -0
  213. package/dist-pkg/ui/changed-mark.d.ts +15 -0
  214. package/dist-pkg/ui/changed-mark.js +96 -0
  215. package/dist-pkg/ui/debug-panel.d.ts +67 -0
  216. package/dist-pkg/ui/debug-panel.js +173 -0
  217. package/dist-pkg/ui/dom.d.ts +24 -0
  218. package/dist-pkg/ui/dom.js +47 -0
  219. package/dist-pkg/ui/focus-trap.d.ts +71 -0
  220. package/dist-pkg/ui/focus-trap.js +99 -0
  221. package/dist-pkg/ui/fonts.d.ts +41 -0
  222. package/dist-pkg/ui/fonts.js +59 -0
  223. package/dist-pkg/ui/hud.d.ts +137 -0
  224. package/dist-pkg/ui/hud.js +229 -0
  225. package/dist-pkg/ui/item-announcement.d.ts +19 -0
  226. package/dist-pkg/ui/item-announcement.js +36 -0
  227. package/dist-pkg/ui/layout.d.ts +6 -0
  228. package/dist-pkg/ui/layout.js +54 -0
  229. package/dist-pkg/ui/loop-crash.d.ts +19 -0
  230. package/dist-pkg/ui/loop-crash.js +60 -0
  231. package/dist-pkg/ui/map-hub.d.ts +56 -0
  232. package/dist-pkg/ui/map-hub.js +138 -0
  233. package/dist-pkg/ui/menu-nav.d.ts +141 -0
  234. package/dist-pkg/ui/menu-nav.js +390 -0
  235. package/dist-pkg/ui/pause-icons.d.ts +327 -0
  236. package/dist-pkg/ui/pause-icons.js +620 -0
  237. package/dist-pkg/ui/reach-notice.d.ts +34 -0
  238. package/dist-pkg/ui/reach-notice.js +71 -0
  239. package/dist-pkg/ui/settings-audio.d.ts +139 -0
  240. package/dist-pkg/ui/settings-audio.js +544 -0
  241. package/dist-pkg/ui/settings-caa.d.ts +45 -0
  242. package/dist-pkg/ui/settings-caa.js +137 -0
  243. package/dist-pkg/ui/settings-controls.d.ts +100 -0
  244. package/dist-pkg/ui/settings-controls.js +152 -0
  245. package/dist-pkg/ui/settings-empathy.d.ts +62 -0
  246. package/dist-pkg/ui/settings-empathy.js +137 -0
  247. package/dist-pkg/ui/settings-motion.d.ts +95 -0
  248. package/dist-pkg/ui/settings-motion.js +282 -0
  249. package/dist-pkg/ui/settings-motor.d.ts +77 -0
  250. package/dist-pkg/ui/settings-motor.js +215 -0
  251. package/dist-pkg/ui/settings-panel.d.ts +76 -0
  252. package/dist-pkg/ui/settings-panel.js +187 -0
  253. package/dist-pkg/ui/settings-typo.d.ts +74 -0
  254. package/dist-pkg/ui/settings-typo.js +150 -0
  255. package/dist-pkg/ui/settings-visual.d.ts +111 -0
  256. package/dist-pkg/ui/settings-visual.js +252 -0
  257. package/dist-pkg/ui/shell.d.ts +239 -0
  258. package/dist-pkg/ui/shell.js +430 -0
  259. package/dist-pkg/ui/title.d.ts +36 -0
  260. package/dist-pkg/ui/title.js +60 -0
  261. package/dist-pkg/ui/vlibras.d.ts +11 -0
  262. package/dist-pkg/ui/vlibras.js +87 -0
  263. package/dist-pkg/ui/webcam.d.ts +7 -0
  264. package/dist-pkg/ui/webcam.js +88 -0
  265. package/docs/CREDITS.md +64 -0
  266. package/docs/LICENSES.md +132 -0
  267. package/package.json +115 -0
@@ -0,0 +1,558 @@
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.
3
+ // Parcial de propósito: as chaves ausentes caem no fallback pt (core/i18n).
4
+ const es = {
5
+ // ===================== ANUNCIOS DE LECTOR DE PANTALLA (`sr.*`) =====================
6
+ // EL MARCO SE TRADUCE; EL CONTENIDO NO. Todo lo que llega por `{param}` pasa sin traducir — nombre de jugador,
7
+ // numero de pantallas y, sobre todo, CONTENIDO CURRICULAR (palabra, silaba, letra, celda braille). El curriculo de
8
+ // alfabetizacion es especifico de cada lengua: el deletreo, la relacion grafema-fonema y la psicogenesis de
9
+ // Ferreiro no se traducen, se reescriben por idioma (ADR-0010, pilar 3). Una clave nueva con contenido curricular
10
+ // dentro es un error.
11
+ 'sr.pad.mapSaved': 'Mapeo guardado para: {id}.',
12
+ 'sr.pad.assigned': 'Mando asignado al Jugador {n}. El teclado sigue funcionando.',
13
+ 'sr.title.waitP1': 'Espera a que el Jugador 1 elija el juego.',
14
+ 'sr.player.entered': '¡Jugador {n} entró!',
15
+ // El reciclaje (ADR-0049 §1). Los cuatro colores son contenido curricular (CONAMA 275/2001, la norma
16
+ // brasileña), así que el aviso DICE el color y no solo "bien/mal".
17
+ 'sr.lixo.pegou': 'Recogiste: {o}.',
18
+ '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
+ 'sr.lixo.solta': 'Aquí no se tira basura. Se te cayó junto al cartel.',
22
+ 'sr.lixo.barreira': 'El cartel no deja pasar la basura.',
23
+ 'lixo.obj.papel': 'caja de cartón',
24
+ 'lixo.obj.plastico': 'botella PET',
25
+ 'lixo.obj.metal': 'lata de aluminio',
26
+ 'lixo.obj.vidro': 'frasco de vidrio',
27
+ 'lixo.cor.azul': 'azul',
28
+ 'lixo.cor.vermelha': 'rojo',
29
+ 'lixo.cor.amarela': 'amarillo',
30
+ 'lixo.cor.verde': 'verde',
31
+ 'sr.print.on': 'Modo Foto: mira la pantalla sin menús. Aprieta cualquier botón para volver.',
32
+ 'sr.player.pressToJoin': 'Jugador {n}: aprieta un botón para entrar.',
33
+ '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).',
37
+ 'sr.typo.font': 'Tipografía: {fam}.',
38
+ 'sr.visual.contrast': 'Alto contraste: {v}.',
39
+ '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
+ '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
+ '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
+ // 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
+ 'hud.contador': '{have} de {need} {nome}',
66
+ 'hud.nome.moedas': 'monedas',
67
+ 'hud.nome.moeda': 'moneda',
68
+ '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
+ 'skip.toGame': 'Saltar al juego',
79
+ 'menu.ludico': 'Juego libre',
80
+ 'menu.alfabetizacao': 'Alfabetización',
81
+ 'menu.matematica': 'Matemáticas',
82
+ // Controles táctiles — las 9 posiciones, las 9 acciones asignables (panel #touchcfg) y los anuncios.
83
+ 'touch.slot.up': 'Direccional ↑ (arriba)',
84
+ 'touch.slot.down': 'Direccional ↓ (abajo)',
85
+ 'touch.slot.left': 'Direccional ← (izquierda)',
86
+ 'touch.slot.right': 'Direccional → (derecha)',
87
+ 'touch.slot.start': 'START (enter)',
88
+ 'touch.slot.b0': 'Botón 0 (abajo)',
89
+ 'touch.slot.b1': 'Botón 1 (derecha)',
90
+ 'touch.slot.b2': 'Botón 2 (izquierda)',
91
+ 'touch.slot.b3': 'Botón 3 (arriba)',
92
+ 'touch.slot.fallback': 'Botón',
93
+ 'touch.act.left': 'Caminar a la izquierda',
94
+ 'touch.act.right': 'Caminar a la derecha',
95
+ 'touch.act.up': 'Subir / escalera',
96
+ 'touch.act.down': 'Bajar / escalera',
97
+ 'touch.act.jump': 'Saltar',
98
+ 'touch.act.run': 'Correr / interactuar',
99
+ 'touch.act.especial': 'Especial',
100
+ 'touch.act.swap': 'Cambiar poder',
101
+ 'touch.act.pause': 'Pausar (START)',
102
+ 'touch.dir.cross': 'cruceta (D-pad)',
103
+ 'touch.dir.stick': 'palanca analógica',
104
+ 'sr.touch.slotSet': '{slot}: {acao}.',
105
+ 'sr.touch.dirSet': 'Direccional: {tipo}.',
106
+ 'sr.touch.presetChild': 'Controles del tamaño de una mano infantil (6 a 12 años).',
107
+ 'sr.touch.presetAdult': 'Controles del tamaño de una mano adulta.',
108
+ // Acciones reasignables (panel de controles + pantalla de Ayuda) y los anuncios de la captura de tecla.
109
+ 'act.left': 'Izquierda',
110
+ 'act.right': 'Derecha',
111
+ 'act.up': 'Subir / escalera',
112
+ 'act.down': 'Bajar / escalera',
113
+ 'act.run': 'Correr / interactuar',
114
+ 'act.jump': 'Saltar',
115
+ 'act.swap': 'Cambiar poder',
116
+ 'act.especial': 'Especial',
117
+ 'key.space': 'Espacio',
118
+ 'ctrl.change': 'Cambiar',
119
+ 'ctrl.changeKeyAria': 'Cambiar la tecla de {acao} del Jugador {n}',
120
+ 'sr.ctrl.pressNewKey': 'Pulsa la nueva tecla para {acao} del Jugador {n}, o Esc para cancelar.',
121
+ 'sr.ctrl.keyTaken': 'Esa tecla ya es del Jugador {n}. Elige otra, o Esc para cancelar.',
122
+ 'sr.ctrl.reset': 'Controles restaurados a los valores predeterminados.',
123
+ // Panel de audio (#audio) — salidas por jugador, sonido/narración, bastón, motores de voz.
124
+ 'audio.playerN': 'Jugador {n}',
125
+ 'audio.sinkShared': 'Predeterminada (compartida)',
126
+ 'audio.sinkFallback': 'Salida {n}',
127
+ 'audio.sinksHint': 'Pulsa Detectar (pide permiso de audio para listar los aparatos).',
128
+ 'audio.sinksUnsupported': 'Este navegador no permite cambiar la salida (p. ej. Safari/iOS).',
129
+ 'audio.voiceSample': '¡Hola! Esta es la voz de la narración del Inclusionista. Uno, dos, tres, probando.',
130
+ 'tts.engine.webspeech': 'Voz del navegador (Web Speech)',
131
+ 'tts.engine.piper': 'Piper (neuronal, sin conexión) — se descarga en el 1.er uso',
132
+ 'tts.engine.kokoro': 'Kokoro-82M (neuronal) — se descarga en el 1.er uso',
133
+ 'tts.engine.kitten': 'Kitten (neuronal) — se descarga en el 1.er uso',
134
+ 'tts.engine.espeak': 'eSpeak NG (integrado)',
135
+ 'sr.audio.sinkChanged': 'Jugador {n} — salida de audio cambiada.',
136
+ 'sr.audio.sinkDefault': 'Jugador {n} — salida de audio predeterminada.',
137
+ 'sr.audio.soundOn': 'Sonido activado.',
138
+ 'sr.audio.soundOff': 'Sonido desactivado.',
139
+ 'sr.audio.ttsOn': 'Narración activada.',
140
+ 'sr.audio.ttsOff': 'Narración desactivada.',
141
+ 'sr.audio.ttsOnSpoken': 'Narración por voz activada.',
142
+ 'sr.audio.canePerBlock': 'Bastón: un toque por cada bloque pisado.',
143
+ 'sr.audio.caneHalfBlock': 'Bastón: un toque cada medio bloque pisado.',
144
+ 'sr.audio.engineSet': 'Motor de voz: {motor}.',
145
+ 'sr.audio.voicePicked': 'Voz seleccionada.',
146
+ 'sr.audio.testingVoice': 'Probando la voz seleccionada.',
147
+ // Barra de iconos de accesibilidad (menu de pausa y portada) + los niveles que recorre.
148
+ 'icon.blind': 'Modo ciego (navegación sonora)',
149
+ 'icon.tts': 'Narración por voz (TTS)',
150
+ 'icon.libras': 'Modo persona sorda (lengua de señas)',
151
+ 'icon.tea': 'Modo TEA (calmado / silencioso)',
152
+ 'icon.altmove': 'Teclas de alternancia',
153
+ 'icon.contrast': 'Alto contraste',
154
+ 'icon.cvd': 'Corrección de daltonismo (protan/deutan/tritan)',
155
+ 'icon.face': 'Cámara web — rostro',
156
+ 'icon.eyes': 'Cámara web — ojos',
157
+ 'icon.voice': 'Comando de voz',
158
+ 'icon.state': '{nome}: {v}',
159
+ 'icon.soon': '{nome} (en construcción)',
160
+ 'state.on': 'activado',
161
+ 'state.off': 'desactivado',
162
+ 'calm.off': 'desactivado',
163
+ 'calm.quiet': 'calmado',
164
+ 'calm.silent': 'silencioso',
165
+ 'cvd.off': 'desactivado',
166
+ 'cvd.tricro': 'visión tricromática',
167
+ 'cvd.protan': 'protanopía',
168
+ 'cvd.deuter': 'deuteranopía',
169
+ 'cvd.tritan': 'tritanopía',
170
+ 'contrast.off': 'desactivado',
171
+ 'contrast.3': '3:1',
172
+ 'contrast.45': '4,5:1',
173
+ 'contrast.7': '7:1',
174
+ 'lq.off': 'desactivado',
175
+ 'lq.linear': 'lineal',
176
+ 'lq.mixed': 'mixto',
177
+ 'lq.quadratic': 'cuadrático',
178
+ 'sr.icon.blindOn': 'Modo ciego activado.',
179
+ 'sr.icon.blindOff': 'Modo ciego desactivado.',
180
+ 'sr.icon.librasOn': 'Modo persona sorda: lengua de señas activada.',
181
+ 'sr.icon.librasOff': 'Modo persona sorda: lengua de señas desactivada.',
182
+ 'sr.icon.tea': 'Modo TEA: {v}.',
183
+ 'sr.icon.cvd': 'Corrección de daltonismo: {v}.',
184
+ 'sr.icon.underConstruction': '{nome}: en construcción — llega con los subsistemas de cámara web/habla y el filtro de daltonismo.',
185
+ 'sr.icon.needsPrivateOutput': 'Solo se puede cambiar sonido/TTS/modo ciego con una salida de audio SOLO tuya (no compartida). Elige un dispositivo propio en accesibilidad auditiva.',
186
+ 'icon.tea.short': 'Modo TEA',
187
+ 'icon.cvd.short': 'Corrección de daltonismo',
188
+ 'pause.iconBarAria': 'Atajos de accesibilidad',
189
+ // Menú de actividades (portada) — actividad, escenario, número de jugadores y notaciones de fracción.
190
+ 'fnot.v': 'Fraccionaria vertical',
191
+ 'fnot.d': 'Fraccionaria diagonal',
192
+ 'fnot.dec': 'Decimal',
193
+ 'fnot.pct': 'Porcentual',
194
+ 'fnot.mix': 'Mixta',
195
+ 'menu.playerCountAria': 'Número de jugadores: {n}. Pulsa a la izquierda para menos, a la derecha para más.',
196
+ 'sr.menu.pickScenario': 'Elige el escenario.',
197
+ 'sr.menu.gameStarted': '{atividade}. Juego iniciado.',
198
+ 'sr.menu.pickNumbers': '{atividade}: elige los números.',
199
+ 'sr.menu.player1': '{n} jugador.',
200
+ 'sr.menu.playersN': '{n} jugadores.',
201
+ 'sr.menu.index': '{n} de {m}',
202
+ 'sr.menu.indexOn': 'Posición en la lista activada.',
203
+ 'sr.menu.indexOff': 'Posición en la lista desactivada.',
204
+ 'sr.a11y.barEnter': 'Barra de accesibilidad. Usa las direcciones para elegir y confirmar para activar. Para volver al juego, pulsa volver o START.',
205
+ 'sr.a11y.barExit': 'De vuelta al juego.',
206
+ 'pad.glyph.cross': 'equis',
207
+ 'pad.glyph.circle': 'círculo',
208
+ 'pad.glyph.square': 'cuadrado',
209
+ 'pad.glyph.triangle': 'triángulo',
210
+ 'menu.legendSpoken': 'Botón {sim} para confirmar, botón {nao} para volver.',
211
+ 'sr.menu.fractionsIntro': 'Suma y resta de fracciones: elige la notación y el tipo.',
212
+ 'sr.menu.keepOneNotation': 'Deja al menos una notación activada.',
213
+ 'sr.menu.notationOn': '{notacao} activada.',
214
+ 'sr.menu.notationOff': '{notacao} desactivada.',
215
+ 'sr.menu.pickOneNumber': 'Elige al menos un número para practicar.',
216
+ 'sr.menu.numberOn': 'Número {n} activado.',
217
+ 'sr.menu.numberOff': 'Número {n} desactivado.',
218
+ 'fnot.desc.v': 'Muestra fracciones verticales, un número sobre el otro.',
219
+ 'fnot.desc.d': 'Muestra fracciones en una línea, con barra.',
220
+ 'fnot.desc.dec': 'Muestra números que siempre llevan un decimal.',
221
+ 'fnot.desc.pct': 'Muestra porcentajes.',
222
+ 'fnot.desc.mix': 'Muestra números enteros junto con fracciones reducidas.',
223
+ 'menu.notationGroupAria': 'Notación',
224
+ // Física (lava, ventosa araña), navegación sonora y el modo demostración.
225
+ 'sr.physics.lava': '¡Cuidado! Tocaste la lava. Las monedas volvieron a posiciones aleatorias.',
226
+ 'sr.physics.spiderOn': '¡Modo araña! Trepas por paredes y techos y doblas esquinas. {botao} suelta.',
227
+ 'sr.physics.spiderOff': 'Soltaste la superficie.',
228
+ 'sr.nav.noTargetNear': 'No hay nada cerca.',
229
+ // El bucle se detuvo porque un fotograma lanzó (ADR-0054). Una niña ciega no ve una pantalla congelada.
230
+ 'sr.laco.parou': 'El juego se detuvo por un error. Recarga la página para volver a jugar.',
231
+ // ===== EL AVISO DE ALCANCE (issue #112, ADR-0079 seccion 3) =====
232
+ 'reach.titulo': 'Este juego usa {pedidas} acciones.',
233
+ 'reach.curto': 'El {transporte} tiene {lugares} lugares: no alcanzan para todas.',
234
+ 'reach.ligue': 'Conecta {saida} y podrás usarlas todas.',
235
+ 'reach.semSaida': 'Ningún control de este aparato alcanza todas. Puedes jugar igual, pero algunas acciones quedarán sin lugar.',
236
+ 'reach.continuar': 'Jugar así',
237
+ 'reach.ou': ' o ',
238
+ 'reach.nome.gamepad': 'mando',
239
+ 'reach.nome.teclado': 'teclado',
240
+ 'reach.nome.toque': 'control en pantalla',
241
+ 'sr.attract.demo': 'Demostración.',
242
+ 'sr.attract.recorded': 'Demo de 30 segundos grabada para {cenario}.',
243
+ // Marcos de los submenús de título y los nombres de los escenarios.
244
+ 'menu.back': 'Volver',
245
+ 'menu.play': 'Jugar',
246
+ 'menu.alf': 'Alfabetización',
247
+ 'menu.mat': 'Matemáticas',
248
+ 'menu.frac': 'Fracción',
249
+ 'menu.fracTitle': 'Suma y resta de fracciones',
250
+ 'menu.tab': 'Tablas de multiplicar',
251
+ 'menu.tabHint': 'Elige los números para practicar',
252
+ 'menu.cen': 'Escenario',
253
+ 'cen.cidade': 'Ciudad',
254
+ 'cen.campo': 'Día en el Campo',
255
+ 'cen.cemiterio': 'Amanecer en el Campo',
256
+ 'cen.espaco': 'Noche en el Campo',
257
+ 'cen.floresta': 'Bosque',
258
+ // Narración por voz (TTS).
259
+ 'audio.noSystemVoices': '(sin voces del sistema)',
260
+ 'sr.tts.engineNoLanguage': 'Este motor todavía no habla este idioma — por ahora, usa Piper (neuronal) o la voz del navegador.',
261
+ 'sr.tts.noNeuralForLanguage': 'Todavía no hay voz neuronal para este idioma — seguimos con la voz del navegador, que sí lo habla.',
262
+ 'sr.tts.downloading': 'Descargando la voz neuronal (necesita internet solo en el 1.er uso)…',
263
+ 'sr.tts.progress': 'Voz neuronal: {pct} %.',
264
+ 'sr.tts.ready': 'Voz neuronal lista, en {s} segundos.',
265
+ 'sr.tts.loadFailed': 'No se pudo cargar la voz neuronal (necesita internet en el 1.er uso) — seguimos con la voz del navegador.',
266
+ // Quiz — solo el MARCO; el currículo de alfabetización se mantiene en pt-BR por decisión.
267
+ 'sr.quiz.tryAgain': 'Inténtalo de nuevo.',
268
+ 'sr.quiz.erase': 'borrar',
269
+ 'sr.quiz.ok': 'ok',
270
+ '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.',
271
+ 'sr.blind.off': 'Modo ciego desactivado.',
272
+ 'sr.motor.oneButtonOn': 'Un botón a la vez activado: solo una tecla o botón cada vez.',
273
+ 'sr.motor.oneButtonOff': 'Un botón a la vez desactivado.',
274
+ '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.',
275
+ 'sr.motor.wheelchairOff': 'Modo silla de ruedas desactivado.',
276
+ 'sr.visual.ownerColorsOn': 'Objetos en el color de su dueño: activado.',
277
+ 'sr.visual.ownerColorsOff': 'Objetos en el color de su dueño: desactivado — todos en su color original.',
278
+ 'sr.visual.cbSafeOn': 'Paleta segura para daltonismo activada (Okabe-Ito).',
279
+ 'sr.visual.cbSafeOff': 'Paleta segura para daltonismo desactivada.',
280
+ 'sr.visual.outlineFg': 'Contorno del primer plano: {v}.',
281
+ 'sr.visual.outlineBg': 'Contorno del segundo plano: {v}.',
282
+ 'outline.none': 'ninguno',
283
+ 'outline.thin': 'fino',
284
+ 'outline.thick': 'grueso',
285
+ 'sr.captions.on': 'Subtítulos activados.',
286
+ 'sr.captions.off': 'Subtítulos desactivados.',
287
+ // Quiz — MATEMÁTICAS: el enunciado entero se traduce, operadores incluidos (2+3 no depende del idioma).
288
+ 'math.howManyDots': '¿Cuántas bolitas?',
289
+ 'math.op.plus': 'más',
290
+ 'math.op.minus': 'menos',
291
+ 'math.op.times': 'por',
292
+ 'math.op.dividedBy': 'dividido por',
293
+ 'sr.math.howManyDots': '¿Cuántas bolitas ves?',
294
+ 'sr.math.howMuchIs': '¿Cuánto es {a} {op} {b}?',
295
+ // Quiz — ALFABETIZACIÓN: el MARCO se traduce; la palabra, la letra y la celda Braille pasan como
296
+ // parámetros, en pt-BR, porque son la materia de una disciplina de idioma.
297
+ 'sr.quiz.who': 'Jugador {n}: ',
298
+ 'sr.quiz.wins': '{n} de 3 aciertos para la moneda',
299
+ 'sr.quiz.buildWord': 'Letra {letra}. Forma la palabra: {palavra}.',
300
+ 'sr.quiz.whichSpelling': '{palavra}. ¿Cuál es la escritura correcta? El juego deletrea cada opción.',
301
+ 'sr.quiz.writeWord': 'Escribe la palabra: {palavra}. {n} letras.',
302
+ 'sr.quiz.brailleDictation': '{palavra}. {celas} Salta para recoger.',
303
+ 'sr.quiz.wellDone': '¡Muy bien! {palavra}. {n} de 3.',
304
+ 'sr.quiz.correctSoFar': '¡Acertaste! {n} de 3 para ganar la moneda.',
305
+ 'menu.restoreDefaults': 'Restaurar los valores predeterminados de este menú',
306
+ 'sr.audio.reset': 'Accesibilidad auditiva restaurada a sus valores predeterminados. Los demás menús no cambiaron.',
307
+ '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.',
308
+ '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.',
309
+ 'sr.typo.reset': 'Tipografía restaurada a su valor predeterminado: {fam}, diseñada para personas con baja visión.',
310
+ 'a11y.changed': 'modificado',
311
+ '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.',
312
+ 'sr.motion.reset': 'Sensibilidad visual restaurada a sus valores predeterminados: animaciones y estética CRT. Las animaciones vuelven a lo que pide su sistema.',
313
+ 'caa.emPreparo': 'en preparación',
314
+ 'caa.aguardandoNegociacao': 'esperando negociación',
315
+ 'caa.secao.agora': 'Disponible ahora',
316
+ 'caa.secao.agoraTag': 'funciona sin red',
317
+ 'caa.secao.preparo': 'En preparación',
318
+ 'caa.secao.preparoTag': 'licencia resuelta; falta el trabajo',
319
+ 'caa.secao.negociacao': 'Esperando negociación',
320
+ 'caa.secao.negociacaoTag': 'el permiso no es nuestro',
321
+ 'sr.caa.escolha': 'Comunicación: {v}.',
322
+ 'sr.caa.reset': 'Comunicación restaurada a su valor predeterminado: letras mayúsculas, donde suele comenzar la alfabetización.',
323
+ 'pause.caa': '🔠 Comunicación',
324
+ 'sr.caa.caixaAltaOn': 'Letras mayúsculas activadas: todo el juego en mayúsculas.',
325
+ 'sr.caa.caixaAltaOff': 'Letras mayúsculas desactivadas: mayúsculas y minúsculas.',
326
+ 'sr.quiz.bemVindo': 'Cuestionario. Use las flechas para elegir y Enter para responder.',
327
+ 'sr.nav.sonarFound': 'Sonar: {alvo} {lado}, {dist}.',
328
+ 'sr.nav.coin': 'moneda',
329
+ 'sr.nav.target': 'objetivo',
330
+ // EL RUMBO, en los dos marcos que una topología puede declarar (ADR-0089). Sustituyen a `left`/`right`/
331
+ // `ahead`, que eran tres palabras donde el contrato tiene ocho - y mezclaban el marco de PANTALLA
332
+ // (izquierda, derecha) con el del CUERPO (al frente).
333
+ 'sr.nav.dir.n': 'al norte', 'sr.nav.dir.ne': 'al noreste', 'sr.nav.dir.e': 'al este',
334
+ 'sr.nav.dir.se': 'al sureste', 'sr.nav.dir.s': 'al sur', 'sr.nav.dir.sw': 'al suroeste',
335
+ 'sr.nav.dir.w': 'al oeste', 'sr.nav.dir.nw': 'al noroeste',
336
+ 'sr.nav.dir.zenith': 'arriba', 'sr.nav.dir.nadir': 'abajo',
337
+ 'sr.nav.clock': 'a las {h}', 'sr.nav.clockOne': 'a la 1',
338
+ 'sr.nav.here': 'aquí mismo',
339
+ 'sr.nav.veryClose': 'muy cerca',
340
+ 'sr.nav.close': 'cerca',
341
+ 'sr.nav.far': 'lejos',
342
+ 'sr.player.prefix': 'Jugador {n}: ',
343
+ '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.',
344
+ 'sr.empathy.hearingOff': 'Simulación de pérdida auditiva desactivada.',
345
+ 'sr.pad.disconnected': 'El mando del Jugador {n} se desconectó — el teclado sigue funcionando. Pulse START para volver a asociarlo.',
346
+ 'sr.quiz.levelSet': 'Nivel {n}: {v}.',
347
+ 'sr.visual.roleColorSet': 'Color de {v} cambiado.',
348
+ 'sr.visual.roleColorsReset': 'Colores del color-blocking restaurados a sus valores predeterminados.',
349
+ 'sr.visual.defaultColors': 'Colores predeterminados restaurados.',
350
+ 'sr.pad.connected': 'Mando conectado: diseño {v}.',
351
+ 'sr.pad.design': 'Diseño de los botones: {v}.',
352
+ 'sr.eyes.loading': 'Jugar con los ojos: cargando la cámara web (permita el acceso).',
353
+ 'sr.eyes.off': 'Jugar con los ojos desactivado.',
354
+ 'sr.boot.loaded': 'Juego cargado. Recoge {n} monedas. Sube escaleras con W/S, nada manteniendo el salto en el agua.',
355
+ // ===================== PODERES =====================
356
+ 'sr.power.superjump': '¡Súper salto! El salto llega siempre a su altura máxima.',
357
+ 'sr.power.ultrajump': '¡Ultra salto! Saltos de distancia gigante.',
358
+ 'sr.power.turbo': '¡Súper carrera! Al correr te vuelves mucho más rápido.',
359
+ 'sr.power.fly': '¡Vuelo! En el aire, pulsa Saltar para empezar a volar; Saltar de nuevo lo termina.',
360
+ '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.',
361
+ 'sr.power.none': 'Sin poder activo.',
362
+ 'sr.power.generic': '¡Poder activado!',
363
+ 'hud.power.off': '—',
364
+ 'hud.power.superjump': '🐇 Súper salto',
365
+ 'hud.power.ultrajump': '🦘 Ultra salto',
366
+ 'hud.power.turbo': '👟 Súper carrera',
367
+ 'hud.power.fly': '🎈 Vuelo',
368
+ 'hud.power.wallcling': '🕷️ Escalada',
369
+ 'hud.power.runcane': '👟 Bastón de carrera',
370
+ // ===================== MOVIMIENTO REDUCIDO (WCAG 2.3.3) + CRT =====================
371
+ 'rm.parallax': 'Parallax del fondo',
372
+ 'rm.decor': 'Decoración (nubes, hierba)',
373
+ 'rm.items': 'Animación de objetos (monedas)',
374
+ 'rm.walk': 'Personaje en movimiento (andar, trepar, nadar, saltar)',
375
+ 'rm.breath': 'Respiración (quieto)',
376
+ 'rm.flavor': 'Gracias (animaciones de descanso)',
377
+ 'rm.particles': 'Partículas y destellos',
378
+ 'rm.crt.scan': 'Líneas de barrido',
379
+ 'rm.crt.vig': 'Viñeta',
380
+ 'rm.crt.round': 'Esquinas redondeadas',
381
+ 'rm.sec.all': 'todos los jugadores',
382
+ 'sr.rm.frozen': '{alvo} congelado.',
383
+ 'sr.rm.animated': '{alvo} animado.',
384
+ 'sr.rm.allStopped': 'Todas las animaciones detenidas.',
385
+ 'sr.rm.allResumed': 'Todas las animaciones reanudadas.',
386
+ 'sr.crt.on': '{efeito} activada.',
387
+ 'sr.crt.off': '{efeito} desactivada.',
388
+ 'sr.crt.round': '{efeito}: {nivel}.',
389
+ // ===================== ENCENDIDO / APAGADO =====================
390
+ 'ui.toggle.on': '❚❚ Activado',
391
+ 'ui.toggle.off': '▶ Desactivado',
392
+ 'ui.toggle.ariaOn': '{alvo}: activado',
393
+ 'ui.toggle.ariaOff': '{alvo}: desactivado',
394
+ // ===================== LAS DOS OPCIONES MOTORAS POR JUGADOR =====================
395
+ '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).',
396
+ 'sr.motor.easyOff': 'Modo Fácil desactivado.',
397
+ '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.',
398
+ 'sr.motor.toggleMoveOff': 'Movimiento por alternancia desactivado.',
399
+ 'sr.motor.toggleRunOn': 'Alternancia de correr activada.',
400
+ 'sr.motor.toggleRunOff': 'Alternancia de correr desactivada.',
401
+ 'sr.physics.runLatchOn': 'Corriendo.',
402
+ 'sr.physics.runLatchOff': 'Caminando.',
403
+ // ===================== AYUDA (menú de pausa) + etiqueta de nivel =====================
404
+ 'pause.level': '📚 Nivel {n} · {v}',
405
+ 'help.controls': 'Tus controles',
406
+ 'help.controlsPlayer': 'Tus controles · Jugador {n}',
407
+ 'help.keyboard': 'teclado',
408
+ 'help.buildNotes': 'Notas de esta versión',
409
+ 'help.powerups': 'Poderes: 👟 súper carrera · 🕷️ escalada · 🎈 vuelo · 🐇 súper salto · 🦘 ultra salto · 🔑 la llave abre la 🚪 puerta.',
410
+ 'help.multiplayer': '2–4 jugadores: pantallas una al lado de la otra, cada una con su menú y su configuración.',
411
+ 'help.tech': 'v{v} — PixiJS (WebGL, Canvas de reserva) · texto e interfaz en el DOM (accesibilidad) · sin conexión vía PWA.',
412
+ 'menu.yes': 'Sí',
413
+ 'menu.no': 'No',
414
+ // ===================== LOS 16 MODOS DE VISIÓN =====================
415
+ 'viz.normal': 'Modo estándar',
416
+ 'viz.desc.normal': 'El arte original del juego.',
417
+ 'viz.hc-direto': 'Alto contraste: Renderizado Directo (3:1)',
418
+ 'viz.desc.hc-direto': 'El fondo retrocede + contornos + color por papel; plataforma vs fondo ~3:1 (AA gráficos), tonos agradables.',
419
+ 'viz.hc-direto-45': 'Alto contraste: Renderizado Directo (4,5:1)',
420
+ 'viz.desc.hc-direto-45': 'Más contraste (AA texto): plataformas más claras y fondo más oscuro.',
421
+ 'viz.hc-direto-7': 'Alto contraste: Renderizado Directo (7:1)',
422
+ 'viz.desc.hc-direto-7': 'Contraste máximo (AAA texto): casi blanco y negro. Menos agradable, para quien necesita el máximo.',
423
+ 'viz.sim-deuter': 'Simular deuteranopía',
424
+ 'viz.desc.sim-deuter': 'Cómo ve quien no percibe el verde (la más común).',
425
+ 'viz.sim-protan': 'Simular protanopía',
426
+ 'viz.desc.sim-protan': 'Cómo ve quien no percibe el rojo.',
427
+ 'viz.sim-tritan': 'Simular tritanopía',
428
+ 'viz.desc.sim-tritan': 'Cómo ve quien no percibe el azul.',
429
+ 'viz.fix-protan': 'Corrección protanopía',
430
+ 'viz.desc.fix-protan': 'Daltonización: refuerza la distinción rojo/verde para la protanopía.',
431
+ 'viz.fix-deuter': 'Corrección deuteranopía',
432
+ 'viz.desc.fix-deuter': 'Daltonización: refuerza la distinción rojo/verde para la deuteranopía.',
433
+ 'viz.fix-tritan': 'Corrección tritanopía',
434
+ 'viz.desc.fix-tritan': 'Daltonización: refuerza la distinción azul/amarillo para la tritanopía.',
435
+ 'viz.lv-blur': 'Baja visión: desenfoque',
436
+ 'viz.desc.lv-blur': 'Miopía severa / astigmatismo. (punto verde; toca 2 veces para salir)',
437
+ 'viz.lv-haze': 'Baja visión: neblina',
438
+ 'viz.desc.lv-haze': 'Catarata — película blanquecina, bajo contraste.',
439
+ 'viz.lv-tunnel': 'Baja visión: visión de túnel',
440
+ 'viz.desc.lv-tunnel': 'Glaucoma — solo el centro es visible.',
441
+ 'viz.lv-macular': 'Baja visión: mancha central',
442
+ 'viz.desc.lv-macular': 'Degeneración macular — borrón en el centro.',
443
+ 'viz.lv-diabetic': 'Baja visión: manchas dispersas',
444
+ 'viz.desc.lv-diabetic': 'Retinopatía diabética — manchas repartidas.',
445
+ 'viz.blind': 'Simular ceguera total',
446
+ 'viz.desc.blind': 'Pantalla negra — juega como lo hace una persona ciega (respuesta táctil y sonora). (punto blanco; toca 2 veces para salir)',
447
+ // ===================== LO QUE FALTABA (item 14, ronda final) =====================
448
+ 'title.byline': 'por el Prof. José Rocha',
449
+ 'title.wait': 'Espera a que el Jugador 1 elija el juego',
450
+ 'win.title': '🎉 ¡Recogiste las 10 monedas!',
451
+ 'win.again': 'Jugar de nuevo',
452
+ 'pause.title': 'En pausa',
453
+ 'pause.resume': '▶ Continuar',
454
+ 'pause.acessibilidade': '♿ Accesibilidad',
455
+ 'pause.options': '⚙ Opciones',
456
+ 'pause.pmback': '↩ Volver',
457
+ 'pause.cardAria': 'Menú de pausa del jugador {n}',
458
+ /* --- CATÁLOGO DE ACTIVIDADES: todo menos alfabetización. Las cinco de alfabetización siguen en pt-BR
459
+ crudo en `educational/activities-registry`: la palabra y la sílaba SON la materia (pilar 3). --- */
460
+ 'act.ludico.nome': 'Recoger 10 monedas',
461
+ 'act.mat1.nome': 'Cantidad',
462
+ 'act.mat1.d': 'Cuenta las bolitas y elige el número correcto (1 a 9).',
463
+ 'act.mat2.nome': 'Suma fácil',
464
+ 'act.mat2.d': 'Sumas con sumandos de 0 a 5.',
465
+ 'act.mat3.nome': 'Suma y Resta 1',
466
+ 'act.mat3.d': 'Cuentas que se pueden hacer con los dedos (hasta 10).',
467
+ 'act.mat4.nome': 'Suma y Resta 2',
468
+ 'act.mat4.d': 'Guarda un número en la cabeza y opera el otro con los dedos (hasta 20).',
469
+ 'act.mat5.nome': 'Tablas de multiplicar',
470
+ 'act.mat5.d': 'Elige los números y practica la multiplicación.',
471
+ 'act.mat6.nome': 'División',
472
+ 'act.mat6.d': 'Elige los números y practica la división.',
473
+ 'act.fr2.nome': 'Suma y resta con medios',
474
+ 'act.fr2.d': 'Suma y resta medios.',
475
+ 'act.fr3.nome': 'Suma y resta con tercios',
476
+ 'act.fr3.d': 'Suma y resta tercios.',
477
+ 'act.fr42.nome': 'Suma y resta con cuartos y medios',
478
+ 'act.fr42.d': 'Suma y resta cuartos y medios.',
479
+ 'act.fr5.nome': 'Suma y resta con quintos',
480
+ 'act.fr5.d': 'Suma y resta quintos.',
481
+ 'act.fr632.nome': 'Suma y resta con sextos, tercios y medios',
482
+ 'act.fr632.d': 'Suma y resta sextos, tercios y medios.',
483
+ 'act.fr2a6.nome': 'Suma y resta con fracciones de medios a sextos',
484
+ 'act.fr2a6.d': 'Suma y resta fracciones de medios a sextos.',
485
+ 'pause.tipo': '🔤 Tipografía',
486
+ 'pause.addplayer': '👥 Añadir jugador',
487
+ 'pause.audio': '🦻 Accesibilidad auditiva',
488
+ 'pause.motora': '♿ Accesibilidad motora',
489
+ 'pause.anim': '🎞 Sensibilidad visual',
490
+ 'pause.visual': '🎨 Accesibilidad visual',
491
+ 'pause.empatia': '🫂 Modo empatía',
492
+ 'pause.ajuda': '❓ Ayuda',
493
+ 'pause.print': '📷 Print (ver la pantalla)',
494
+ 'pause.quit': '🚪 Salir del juego',
495
+ '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.',
496
+ '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.',
497
+ // ===================== ARIA-LABEL DEL index.html =====================
498
+ 'a11y.choosePlayer': 'Elige el jugador',
499
+ 'a11y.animations': 'Animaciones',
500
+ 'a11y.literacy': 'Alfabetización',
501
+ 'a11y.shortcuts': 'Atajos de accesibilidad',
502
+ 'a11y.hearing': 'Audición',
503
+ 'a11y.actionButtons': 'Botones de acción',
504
+ 'a11y.screenButtons': 'Botones en pantalla (táctil)',
505
+ 'a11y.touchButtons': 'Botones táctiles en pantalla',
506
+ 'a11y.audioCategories': 'Categorías de audio',
507
+ 'a11y.communication': 'Comunicación: letras y símbolos',
508
+ 'a11y.outlineFg': 'Contorno de primer plano',
509
+ 'a11y.outlineBg': 'Contorno de segundo plano',
510
+ 'a11y.outlines': 'Contornos del alto contraste',
511
+ 'a11y.touchControls': 'Controles táctiles',
512
+ 'a11y.padDesign': 'Diseño de los botones',
513
+ 'a11y.chooseScenery': 'Elige el escenario',
514
+ 'a11y.chooseGame': 'Elige el juego',
515
+ 'a11y.chooseNumbers': 'Elige los números',
516
+ 'a11y.hideDebug': 'Ocultar las herramientas de depuración',
517
+ 'a11y.btnSpecial': 'Especial (botón 1)',
518
+ 'a11y.fraction': 'Fracción',
519
+ 'a11y.touchRoles': 'Función de cada botón táctil',
520
+ 'a11y.btnRun': 'Interactuar / correr (botón 2)',
521
+ 'a11y.eyeGaze': 'Jugar con los ojos',
522
+ 'a11y.mapControls': 'Asignar controles (por jugador)',
523
+ 'a11y.math': 'Matemáticas',
524
+ 'a11y.pauseMenu': 'Menú de pausa',
525
+ 'a11y.simActive': 'Modo de simulación activo. Toca dos veces para volver a los colores normales.',
526
+ 'a11y.stopAll': 'Detener todas las animaciones',
527
+ 'a11y.btnJump': 'Saltar (botón 0)',
528
+ 'a11y.audioOut': 'Salida de audio por jugador',
529
+ 'a11y.visualSim': 'Simulación visual',
530
+ 'a11y.switchScreens': 'Cambiar el número de pantallas (jugadores)',
531
+ 'a11y.btnSwap': 'Cambiar poder (botón 3)',
532
+ 'menu.playerCount': '◀ Nº de jugadores: {n} ▶',
533
+ // ===================== LEYENDA DE CONTROLES (fila bajo el título) =====================
534
+ 'legend.move': 'moverse',
535
+ 'legend.pause': 'pausa',
536
+ 'legend.jump': 'saltar',
537
+ 'legend.especial': 'especial',
538
+ 'legend.run': 'correr',
539
+ 'legend.swap': 'cambiar',
540
+ // ===================== CATÁLOGO DE FUENTES =====================
541
+ 'font.group.sans': 'Sin serifa',
542
+ 'font.group.serif': 'Con serifa',
543
+ 'font.group.hand': 'Manuscrita',
544
+ 'font.desc.atkinson': 'hecha por el Braille Institute para personas con baja visión (la predeterminada del juego)',
545
+ 'font.desc.lexend': 'hecha para reducir el estrés visual y atender a personas disléxicas (activa el espaciado extra)',
546
+ 'font.desc.quattro': 'creada para reducir la fatiga visual de quien pasa mucho tiempo ante la pantalla',
547
+ 'font.desc.andika': 'basada en la Sassoon; fruto de la investigación sobre cómo leen y escriben los niños',
548
+ 'font.desc.greatvibes': 'caligráfica inglesa',
549
+ 'font.desc.pinyon': 'caligráfica inglesa',
550
+ 'font.desc.ufcook': 'blackletter alemana',
551
+ 'font.desc.ufmag': 'blackletter alemana',
552
+ 'font.desc.comicneue': 'bola y palo (alfabetización)',
553
+ 'font.desc.learningcurve': 'cursiva inglesa',
554
+ 'font.desc.kindergarten': 'cursiva brasileña',
555
+ 'font.off.pending': 'licencia por confirmar — aún no incluida',
556
+ 'font.off.negotiating': 'licencia en negociación',
557
+ };
558
+ export default es;
@@ -0,0 +1,3 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ declare const pt: Record<string, string>;
3
+ export default pt;