@lokascript/i18n 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/browser.cjs +1274 -154
  2. package/dist/browser.cjs.map +1 -1
  3. package/dist/browser.d.cts +3 -3
  4. package/dist/browser.d.ts +3 -3
  5. package/dist/browser.js +1274 -155
  6. package/dist/browser.js.map +1 -1
  7. package/dist/dictionaries/index.cjs +364 -133
  8. package/dist/dictionaries/index.cjs.map +1 -1
  9. package/dist/dictionaries/index.d.cts +1 -1
  10. package/dist/dictionaries/index.d.ts +1 -1
  11. package/dist/dictionaries/index.js +364 -133
  12. package/dist/dictionaries/index.js.map +1 -1
  13. package/dist/index.cjs +8860 -7740
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.cts +37 -37
  16. package/dist/index.d.ts +37 -37
  17. package/dist/index.js +8860 -7741
  18. package/dist/index.js.map +1 -1
  19. package/dist/lokascript-i18n.min.js +1 -1
  20. package/dist/lokascript-i18n.min.js.map +1 -1
  21. package/dist/lokascript-i18n.mjs +1697 -146
  22. package/dist/lokascript-i18n.mjs.map +1 -1
  23. package/dist/plugins/vite.cjs +359 -132
  24. package/dist/plugins/vite.cjs.map +1 -1
  25. package/dist/plugins/vite.js +359 -132
  26. package/dist/plugins/vite.js.map +1 -1
  27. package/dist/plugins/webpack.cjs +359 -132
  28. package/dist/plugins/webpack.cjs.map +1 -1
  29. package/dist/plugins/webpack.js +359 -132
  30. package/dist/plugins/webpack.js.map +1 -1
  31. package/dist/{transformer-BLv389qz.d.ts → transformer-BA8YX9u1.d.ts} +120 -2
  32. package/dist/{transformer-PFsYELrc.d.cts → transformer-DM7iplCU.d.cts} +120 -2
  33. package/dist/{types-BcALAO6h.d.cts → types-BYtpqGq3.d.cts} +1 -1
  34. package/dist/{types-BcALAO6h.d.ts → types-BYtpqGq3.d.ts} +1 -1
  35. package/package.json +6 -6
  36. package/src/browser.ts +1 -0
  37. package/src/command-primary-roles.test.ts +59 -0
  38. package/src/constants.ts +51 -0
  39. package/src/dictionaries/ar.ts +8 -3
  40. package/src/dictionaries/bn.ts +3 -1
  41. package/src/dictionaries/de.ts +19 -4
  42. package/src/dictionaries/derive.ts +4 -0
  43. package/src/dictionaries/en.ts +9 -0
  44. package/src/dictionaries/es.ts +2 -2
  45. package/src/dictionaries/fr.ts +6 -2
  46. package/src/dictionaries/he.ts +7 -1
  47. package/src/dictionaries/hi.ts +17 -10
  48. package/src/dictionaries/id.ts +15 -8
  49. package/src/dictionaries/it.ts +6 -3
  50. package/src/dictionaries/ja.ts +10 -4
  51. package/src/dictionaries/ko.ts +9 -4
  52. package/src/dictionaries/ms.ts +2 -1
  53. package/src/dictionaries/pl.ts +11 -3
  54. package/src/dictionaries/pt.ts +10 -4
  55. package/src/dictionaries/qu.ts +46 -22
  56. package/src/dictionaries/ru.ts +14 -7
  57. package/src/dictionaries/sw.ts +37 -10
  58. package/src/dictionaries/th.ts +3 -1
  59. package/src/dictionaries/tl.ts +14 -7
  60. package/src/dictionaries/tr.ts +22 -9
  61. package/src/dictionaries/uk.ts +13 -7
  62. package/src/dictionaries/vi.ts +3 -3
  63. package/src/dictionaries/zh.ts +10 -2
  64. package/src/examples/new-languages.ts +1 -1
  65. package/src/grammar/grammar.test.ts +1242 -1
  66. package/src/grammar/index.ts +1 -0
  67. package/src/grammar/profiles/index.ts +358 -12
  68. package/src/grammar/transformer.ts +1053 -16
  69. package/src/grammar/types.ts +22 -1
  70. package/src/index.ts +1 -0
  71. package/src/new-languages.test.ts +7 -3
  72. package/src/parser/parser-integration.test.ts +5 -1
  73. package/src/positional-keyword-drift.test.ts +138 -0
@@ -44,6 +44,13 @@ var en = {
44
44
  increment: "increment",
45
45
  decrement: "decrement",
46
46
  default: "default",
47
+ // Reactivity Commands
48
+ bind: "bind",
49
+ // Realtime / service-worker Commands
50
+ eventsource: "eventsource",
51
+ socket: "socket",
52
+ worker: "worker",
53
+ intercept: "intercept",
47
54
  // Navigation Commands
48
55
  go: "go",
49
56
  pushUrl: "pushUrl",
@@ -278,7 +285,8 @@ var es = {
278
285
  swap: "intercambiar",
279
286
  morph: "transformar",
280
287
  settle: "estabilizar",
281
- append: "a\xF1adir",
288
+ append: "anexar",
289
+ // profile primary; 'añadir' is add's word (parsed as add)
282
290
  exit: "salir",
283
291
  install: "instalar",
284
292
  breakpoint: "punto-interrupci\xF3n",
@@ -411,7 +419,7 @@ var es = {
411
419
  prev: "ant",
412
420
  at: "en",
413
421
  random: "aleatorio",
414
- closest: "m\xE1scercano",
422
+ closest: "cercano",
415
423
  parent: "padre",
416
424
  children: "hijos",
417
425
  within: "dentro",
@@ -445,9 +453,11 @@ var ko = {
445
453
  hide: "\uC228\uAE30\uB2E4",
446
454
  show: "\uBCF4\uC774\uB2E4",
447
455
  if: "\uB9CC\uC57D",
448
- unless: "\uC544\uB2C8\uBA74",
456
+ unless: "\uC544\uB2C8\uB77C\uBA74",
457
+ // distinct from else `아니면` (line ~131) — was a homonym
449
458
  repeat: "\uBC18\uBCF5",
450
- for: "\uB3D9\uC548",
459
+ for: "\uAC01\uAC01",
460
+ // profile's for word — 동안 is while (collision)
451
461
  while: "\uB3D9\uC548",
452
462
  until: "\uAE4C\uC9C0",
453
463
  continue: "\uACC4\uC18D",
@@ -478,8 +488,12 @@ var ko = {
478
488
  swap: "\uAD50\uD658",
479
489
  morph: "\uBCC0\uD615",
480
490
  settle: "\uC548\uC815",
481
- append: "\uCD94\uAC00",
482
- exit: "\uC885\uB8CC",
491
+ append: "\uB367\uBD99\uC774\uB2E4",
492
+ // profile primary; '추가' is add's word (parsed as add)
493
+ // 종료 → 나가기: realigned to the semantic profile primary (ko.ts `exit: 나가기`,
494
+ // whose comment already flags the 종료 end-collision). Rendered as 종료 it
495
+ // tokenized as a plain identifier, so a guard-clause `exit` never parsed.
496
+ exit: "\uB098\uAC00\uAE30",
483
497
  install: "\uC124\uCE58",
484
498
  breakpoint: "\uC911\uB2E8\uC810",
485
499
  clear: "\uC9C0\uC6B0\uAE30",
@@ -487,7 +501,8 @@ var ko = {
487
501
  open: "\uC5F4\uAE30",
488
502
  select: "\uC120\uD0DD",
489
503
  clone: "\uBCF5\uC81C",
490
- prepend: "\uC55E\uC5D0\uCD94\uAC00"
504
+ prepend: "\uC55E\uC5D0\uCD94\uAC00",
505
+ socket: "\uC18C\uCF13"
491
506
  },
492
507
  modifiers: {
493
508
  to: "\uC5D0",
@@ -554,6 +569,7 @@ var ko = {
554
569
  otherwise: "\uADF8\uB807\uC9C0\uC54A\uC73C\uBA74",
555
570
  end: "\uB05D",
556
571
  live: "\uB77C\uC774\uBE0C",
572
+ bind: "\uBC14\uC778\uB4DC",
557
573
  changes: "\uBCC0\uACBD\uB418\uBA74"
558
574
  },
559
575
  temporal: {
@@ -635,7 +651,11 @@ var zh = {
635
651
  tell: "\u544A\u8BC9",
636
652
  trigger: "\u89E6\u53D1",
637
653
  send: "\u53D1\u9001",
638
- take: "\u83B7\u53D6",
654
+ // `拿取` (the semantic zh profile's take primary), not `获取` — `获取` is the
655
+ // profile's GET primary, so emitting it for take made `take …` parse as get
656
+ // (take-class-from-siblings: phantom get, take dropped). Exposed by the get-zh-ba
657
+ // pattern; same dict↔profile homonym family as pl get/fetch.
658
+ take: "\u62FF\u53D6",
639
659
  put: "\u653E\u7F6E",
640
660
  set: "\u8BBE\u7F6E",
641
661
  get: "\u83B7\u5F97",
@@ -654,7 +674,10 @@ var zh = {
654
674
  break: "\u4E2D\u65AD",
655
675
  halt: "\u505C\u6B62",
656
676
  wait: "\u7B49\u5F85",
657
- fetch: "\u83B7\u53D6",
677
+ // 抓取 (zhuāqǔ, "grab/scrape") is the semantic zh profile's `fetch` primary;
678
+ // 获取 (huòqǔ) is its `get` primary, so emitting 获取 here made the semantic
679
+ // parser read a transformed `fetch` as `get`. See ZH_BLOCK_BODY_SCOPE.md #3.
680
+ fetch: "\u6293\u53D6",
658
681
  call: "\u8C03\u7528",
659
682
  return: "\u8FD4\u56DE",
660
683
  make: "\u5236\u4F5C",
@@ -754,6 +777,7 @@ var zh = {
754
777
  otherwise: "\u8981\u4E0D\u7136",
755
778
  end: "\u7ED3\u675F",
756
779
  live: "\u5B9E\u65F6",
780
+ bind: "\u7ED1\u5B9A",
757
781
  changes: "\u6539\u53D8\u65F6"
758
782
  },
759
783
  temporal: {
@@ -842,6 +866,9 @@ var fr = {
842
866
  add: "ajouter",
843
867
  remove: "supprimer",
844
868
  toggle: "basculer",
869
+ // command blur (the events section has the blur EVENT word; without this
870
+ // entry the transformer fell back to it and no profile read it as the verb)
871
+ blur: "d\xE9focaliser",
845
872
  hide: "cacher",
846
873
  show: "montrer",
847
874
  if: "si",
@@ -878,7 +905,8 @@ var fr = {
878
905
  swap: "\xE9changer",
879
906
  morph: "transformer",
880
907
  settle: "stabiliser",
881
- append: "ajouter",
908
+ append: "annexer",
909
+ // profile primary; 'ajouter' is add's word (parsed as add)
882
910
  exit: "sortir",
883
911
  install: "installer",
884
912
  breakpoint: "point-arr\xEAt",
@@ -887,7 +915,8 @@ var fr = {
887
915
  open: "ouvrir",
888
916
  select: "s\xE9lectionner",
889
917
  clone: "cloner",
890
- prepend: "pr\xE9fixer"
918
+ prepend: "pr\xE9fixer",
919
+ focus: "focaliser"
891
920
  },
892
921
  modifiers: {
893
922
  to: "\xE0",
@@ -1011,7 +1040,7 @@ var fr = {
1011
1040
  prev: "pr\xE9c",
1012
1041
  at: "\xE0",
1013
1042
  random: "al\xE9atoire",
1014
- closest: "plusproche",
1043
+ closest: "proche",
1015
1044
  parent: "parent",
1016
1045
  children: "enfants",
1017
1046
  within: "dans",
@@ -1042,9 +1071,17 @@ var de = {
1042
1071
  add: "hinzuf\xFCgen",
1043
1072
  remove: "entfernen",
1044
1073
  toggle: "umschalten",
1074
+ // command blur (the events section has the blur EVENT word; without this
1075
+ // entry the transformer fell back to it and no profile read it as the verb)
1076
+ blur: "defokussieren",
1045
1077
  hide: "verstecken",
1046
1078
  show: "zeigen",
1047
- if: "wenn",
1079
+ // Align with the semantic German profile's `if` primary (`falls`). The previous
1080
+ // `wenn` collides with the profile's `when` keyword (German `wenn` = both
1081
+ // "if" and "when"), so a transformed `if` resolved to `when` and the conditional
1082
+ // wrapper never formed (`if`/`put` dropped). Same dict↔profile alignment as id
1083
+ // `toggle` / get-value. `when` is unaffected (separate dict entry).
1084
+ if: "falls",
1048
1085
  unless: "wennnicht",
1049
1086
  repeat: "wiederholen",
1050
1087
  for: "f\xFCr",
@@ -1054,7 +1091,7 @@ var de = {
1054
1091
  break: "unterbrechen",
1055
1092
  halt: "anhalten",
1056
1093
  wait: "warten",
1057
- fetch: "holen",
1094
+ fetch: "abrufen",
1058
1095
  call: "aufrufen",
1059
1096
  return: "zur\xFCckgeben",
1060
1097
  make: "erstellen",
@@ -1082,12 +1119,14 @@ var de = {
1082
1119
  exit: "beenden",
1083
1120
  install: "installieren",
1084
1121
  breakpoint: "haltepunkt",
1085
- clear: "l\xF6schen",
1122
+ clear: "bereinigen",
1123
+ // löschen is a remove alternative in the profile
1086
1124
  close: "schlie\xDFen",
1087
1125
  open: "\xF6ffnen",
1088
1126
  select: "ausw\xE4hlen",
1089
1127
  clone: "klonen",
1090
- prepend: "voranstellen"
1128
+ prepend: "voranstellen",
1129
+ focus: "fokussieren"
1091
1130
  },
1092
1131
  modifiers: {
1093
1132
  to: "zu",
@@ -1211,7 +1250,13 @@ var de = {
1211
1250
  prev: "vorh",
1212
1251
  at: "bei",
1213
1252
  random: "zuf\xE4llig",
1214
- closest: "n\xE4chste",
1253
+ // `nächste` already serves `next` (line above). German `nächste` is
1254
+ // genuinely ambiguous (next/nearest), so emitting it for `closest` too
1255
+ // collided: the semantic tokenizer normalizes `nächste`→next (a deliberate
1256
+ // last-wins choice — see german.ts), and a closest reading is impossible to
1257
+ // recover. Use the unambiguous `nächstgelegene` ("nearest-located") for
1258
+ // closest so the two readings stay distinct end-to-end.
1259
+ closest: "n\xE4chstgelegene",
1215
1260
  parent: "elternteil",
1216
1261
  children: "kinder",
1217
1262
  within: "innerhalb",
@@ -1245,7 +1290,8 @@ var ja = {
1245
1290
  hide: "\u96A0\u3059",
1246
1291
  show: "\u8868\u793A",
1247
1292
  if: "\u3082\u3057",
1248
- unless: "\u3067\u306A\u3051\u308C\u3070",
1293
+ unless: "\u306A\u3044\u9650\u308A",
1294
+ // not でなければ — leading で particle shatters the marker
1249
1295
  repeat: "\u7E70\u308A\u8FD4\u3057",
1250
1296
  for: "\u305F\u3081\u306B",
1251
1297
  while: "\u306E\u9593",
@@ -1254,7 +1300,7 @@ var ja = {
1254
1300
  break: "\u4E2D\u65AD",
1255
1301
  halt: "\u505C\u6B62",
1256
1302
  wait: "\u5F85\u3064",
1257
- fetch: "\u53D6\u5F97",
1303
+ fetch: "\u30D5\u30A7\u30C3\u30C1",
1258
1304
  call: "\u547C\u3073\u51FA\u3057",
1259
1305
  return: "\u623B\u308B",
1260
1306
  make: "\u4F5C\u308B",
@@ -1279,7 +1325,11 @@ var ja = {
1279
1325
  morph: "\u5909\u5F62",
1280
1326
  settle: "\u5B89\u5B9A",
1281
1327
  append: "\u672B\u5C3E\u8FFD\u52A0",
1282
- exit: "\u7D42\u4E86",
1328
+ // 終了 → 退出: realigned to the semantic profile primary (ja.ts `exit: 退出`).
1329
+ // 終了 was the historic exit/end collision word (see isEndKeyword's ja note);
1330
+ // rendered as 終了 it tokenized as a plain identifier, so a guard-clause
1331
+ // `exit` inside `if … end` never parsed (behavior-sortable ja).
1332
+ exit: "\u9000\u51FA",
1283
1333
  install: "\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",
1284
1334
  breakpoint: "\u30D6\u30EC\u30FC\u30AF\u30DD\u30A4\u30F3\u30C8",
1285
1335
  clear: "\u30AF\u30EA\u30A2",
@@ -1287,7 +1337,8 @@ var ja = {
1287
1337
  open: "\u958B\u304F",
1288
1338
  select: "\u9078\u629E",
1289
1339
  clone: "\u8907\u88FD",
1290
- prepend: "\u5148\u982D\u8FFD\u52A0"
1340
+ prepend: "\u5148\u982D\u8FFD\u52A0",
1341
+ socket: "\u30BD\u30B1\u30C3\u30C8"
1291
1342
  },
1292
1343
  modifiers: {
1293
1344
  to: "\u306B",
@@ -1336,7 +1387,7 @@ var ja = {
1336
1387
  touchcancel: "\u30BF\u30C3\u30C1\u30AD\u30E3\u30F3\u30BB\u30EB"
1337
1388
  },
1338
1389
  logical: {
1339
- when: "\u3068\u304D",
1390
+ when: "\u6642",
1340
1391
  where: "\u3069\u3053",
1341
1392
  and: "\u305D\u3057\u3066",
1342
1393
  or: "\u307E\u305F\u306F",
@@ -1354,6 +1405,7 @@ var ja = {
1354
1405
  otherwise: "\u305D\u3046\u3067\u306A\u3051\u308C\u3070",
1355
1406
  end: "\u7D42\u308F\u308A",
1356
1407
  live: "\u30E9\u30A4\u30D6",
1408
+ bind: "\u30D0\u30A4\u30F3\u30C9",
1357
1409
  changes: "\u5909\u308F\u3063\u305F\u3089"
1358
1410
  },
1359
1411
  temporal: {
@@ -1445,7 +1497,10 @@ var ar = {
1445
1497
  hide: "\u0627\u062E\u0641",
1446
1498
  show: "\u0627\u0638\u0647\u0631",
1447
1499
  if: "\u0625\u0630\u0627",
1448
- unless: "\u0625\u0644\u0627 \u0625\u0630\u0627",
1500
+ // Single-token form: the semantic ar tokenizer splits the two-word `إلا إذا`
1501
+ // into `إلا` + `إذا`(if), which derails the `unless` block. `إلا` alone is the
1502
+ // conventional Arabic shorthand and matches the ar profile's unless keyword.
1503
+ unless: "\u0625\u0644\u0627",
1449
1504
  repeat: "\u0643\u0631\u0631",
1450
1505
  for: "\u0644\u0643\u0644",
1451
1506
  while: "\u0628\u064A\u0646\u0645\u0627",
@@ -1475,19 +1530,22 @@ var ar = {
1475
1530
  js: "\u062C\u0627\u0641\u0627\u0633\u0643\u0631\u0628\u062A",
1476
1531
  async: "\u0645\u062A\u0632\u0627\u0645\u0646",
1477
1532
  render: "\u0627\u0631\u0633\u0645",
1478
- swap: "\u0628\u062F\u0651\u0644",
1533
+ swap: "\u0627\u0633\u062A\u0628\u062F\u0644",
1534
+ // profile primary; 'بدّل' is toggle's word (parsed as toggle)
1479
1535
  morph: "\u062D\u0648\u0651\u0644",
1480
1536
  settle: "\u0627\u0633\u062A\u0642\u0631",
1481
1537
  append: "\u0623\u0644\u062D\u0642",
1482
1538
  exit: "\u0627\u062E\u0631\u062C",
1483
1539
  install: "\u062B\u0628\u0651\u062A",
1484
1540
  breakpoint: "\u0646\u0642\u0637\u0629-\u062A\u0648\u0642\u0641",
1485
- clear: "\u0627\u0645\u0633\u062D",
1541
+ clear: "\u0646\u0638\u0651\u0641",
1542
+ // امسح is a remove alternative in the profile
1486
1543
  close: "\u0623\u063A\u0644\u0642",
1487
1544
  open: "\u0627\u0641\u062A\u062D",
1488
1545
  select: "\u0627\u062E\u062A\u0631",
1489
1546
  clone: "\u0627\u0633\u062A\u0646\u0633\u062E",
1490
- prepend: "\u0633\u0628\u0642"
1547
+ prepend: "\u0633\u0628\u0642",
1548
+ socket: "\u0645\u0642\u0628\u0633"
1491
1549
  },
1492
1550
  modifiers: {
1493
1551
  to: "\u0625\u0644\u0649",
@@ -1554,6 +1612,7 @@ var ar = {
1554
1612
  otherwise: "\u062E\u0644\u0627\u0641 \u0630\u0644\u0643",
1555
1613
  end: "\u0627\u0644\u0646\u0647\u0627\u064A\u0629",
1556
1614
  live: "\u062D\u064A",
1615
+ bind: "\u0627\u0631\u0628\u0637",
1557
1616
  changes: "\u064A\u062A\u063A\u064A\u0631"
1558
1617
  },
1559
1618
  temporal: {
@@ -1635,7 +1694,8 @@ var tr = {
1635
1694
  tell: "s\xF6yle",
1636
1695
  trigger: "tetikle",
1637
1696
  send: "g\xF6nder",
1638
- take: "al",
1697
+ take: "tut",
1698
+ // auditor: dict emitted a word the profile reads differently
1639
1699
  put: "koy",
1640
1700
  set: "ayarla",
1641
1701
  get: "al",
@@ -1648,7 +1708,11 @@ var tr = {
1648
1708
  unless: "de\u011Filse",
1649
1709
  repeat: "tekrarla",
1650
1710
  for: "i\xE7in",
1651
- while: "iken",
1711
+ // `süresince` (the semantic tr profile's while primary), not `iken`: `iken`
1712
+ // is the profile's WHEN primary (logical.when below also emits it), so a
1713
+ // fronted repeat-while head tokenized as `when` and the condition dropped
1714
+ // wholesale. Same dict↔profile homonym disambiguation as pl get/pobierz.
1715
+ while: "s\xFCresince",
1652
1716
  until: "kadar",
1653
1717
  continue: "devam",
1654
1718
  break: "dur",
@@ -1678,7 +1742,8 @@ var tr = {
1678
1742
  swap: "takas",
1679
1743
  morph: "d\xF6n\xFC\u015Ft\xFCr",
1680
1744
  settle: "sabitlen",
1681
- append: "ekle",
1745
+ append: "ili\u015Ftir",
1746
+ // profile primary; 'ekle' is add's word (parsed as add)
1682
1747
  exit: "\xE7\u0131k",
1683
1748
  install: "kur",
1684
1749
  breakpoint: "kesme-noktas\u0131",
@@ -1687,7 +1752,8 @@ var tr = {
1687
1752
  open: "a\xE7",
1688
1753
  select: "se\xE7",
1689
1754
  clone: "klonla",
1690
- prepend: "ba\u015F\u0131naekle"
1755
+ prepend: "ba\u015F\u0131naekle",
1756
+ socket: "soket"
1691
1757
  },
1692
1758
  modifiers: {
1693
1759
  to: "e",
@@ -1710,8 +1776,11 @@ var tr = {
1710
1776
  events: {
1711
1777
  click: "t\u0131klama",
1712
1778
  dblclick: "\xE7ift_t\u0131klama",
1713
- mousedown: "fare_bas",
1714
- mouseup: "fare_b\u0131rak",
1779
+ // Fused (no `_`): the semantic tokenizer splits on `_`, breaking event
1780
+ // recognition (mousedown → "bas" / mouseup mis-captured). Mirrors the #535
1781
+ // ru/uk fuse + #510 resize fix.
1782
+ mousedown: "farebas",
1783
+ mouseup: "fareb\u0131rak",
1715
1784
  mouseenter: "fare_gir",
1716
1785
  mouseleave: "fare_\xE7\u0131k",
1717
1786
  mouseover: "fare_\xFCst\xFC",
@@ -1728,7 +1797,7 @@ var tr = {
1728
1797
  reset: "s\u0131f\u0131rla",
1729
1798
  load: "y\xFCkle",
1730
1799
  unload: "y\xFCkle_kald\u0131r",
1731
- resize: "boyut_de\u011Fi\u015Ftir",
1800
+ resize: "boyutland\u0131rma",
1732
1801
  scroll: "kayd\u0131r",
1733
1802
  touchstart: "dokunma_ba\u015Fla",
1734
1803
  touchend: "dokunma_bitir",
@@ -1749,7 +1818,7 @@ var tr = {
1749
1818
  equals: "e\u015Fittir",
1750
1819
  has: "var",
1751
1820
  have: "var",
1752
- then: "sonra",
1821
+ then: "ard\u0131ndan",
1753
1822
  else: "yoksa",
1754
1823
  otherwise: "aksi_halde",
1755
1824
  end: "son",
@@ -1805,13 +1874,18 @@ var tr = {
1805
1874
  },
1806
1875
  expressions: {
1807
1876
  first: "ilk",
1808
- last: "son",
1877
+ // 'son' is also the END keyword emission (block terminator), and the
1878
+ // parser's end-recognizers match it by value — so a positional `last`
1879
+ // emission of 'son' terminated the enclosing block mid-condition
1880
+ // (focus-trap's `eşleşir son <button/>` dropped the branch body; the sw
1881
+ // mwisho class). 'sonuncu' ("the last one") is unambiguous.
1882
+ last: "sonuncu",
1809
1883
  next: "sonraki",
1810
1884
  previous: "\xF6nceki",
1811
1885
  prev: "\xF6nc",
1812
1886
  at: "de",
1813
1887
  random: "rastgele",
1814
- closest: "en_yak\u0131n",
1888
+ closest: "enyak\u0131n",
1815
1889
  parent: "ebeveyn",
1816
1890
  children: "\xE7ocuklar",
1817
1891
  within: "i\xE7inde",
@@ -1841,7 +1915,7 @@ var id = {
1841
1915
  get: "dapatkan",
1842
1916
  add: "tambah",
1843
1917
  remove: "hapus",
1844
- toggle: "ganti",
1918
+ toggle: "alihkan",
1845
1919
  hide: "sembunyikan",
1846
1920
  show: "tampilkan",
1847
1921
  if: "jika",
@@ -1854,7 +1928,10 @@ var id = {
1854
1928
  break: "hentikan",
1855
1929
  halt: "berhenti",
1856
1930
  wait: "tunggu",
1857
- fetch: "ambil",
1931
+ // profile primary; 'ambil' is take's word — emitting it for fetch made every
1932
+ // fetch parse as take once the fused take-event pattern came alive (the de
1933
+ // holen/abrufen bug class)
1934
+ fetch: "muat",
1858
1935
  call: "panggil",
1859
1936
  return: "kembali",
1860
1937
  make: "buat",
@@ -1863,7 +1940,11 @@ var id = {
1863
1940
  catch: "tangkap",
1864
1941
  measure: "ukur",
1865
1942
  transition: "transisi",
1866
- increment: "tambahkan",
1943
+ // naikkan (raise), not tambahkan — tambahkan is the semantic profile's
1944
+ // `add` alternative, so emitting it made increment-counter parse as ADD
1945
+ // (the #373 collision family). naikkan is the profile's increment
1946
+ // alternative, pairing naturally with the decrement side.
1947
+ increment: "naikkan",
1867
1948
  decrement: "kurangi",
1868
1949
  default: "bawaan",
1869
1950
  go: "pergi",
@@ -1874,15 +1955,20 @@ var id = {
1874
1955
  beep: "bunyi",
1875
1956
  js: "js",
1876
1957
  async: "asinkron",
1877
- render: "tampilkan",
1958
+ render: "olah",
1959
+ // auditor: dict emitted a word the profile reads differently
1878
1960
  swap: "tukar",
1879
- morph: "ubah_bentuk",
1880
- settle: "stabil",
1881
- append: "tambah_akhir",
1961
+ morph: "ubah",
1962
+ // auditor: dict emitted a word the profile reads differently
1963
+ settle: "stabilkan",
1964
+ // auditor: dict emitted a word the profile reads differently
1965
+ append: "sisipkan",
1966
+ // profile primary; 'tambah_akhir' splits and is unrecognized
1882
1967
  exit: "keluar",
1883
1968
  install: "pasang",
1884
1969
  breakpoint: "titik-henti",
1885
- clear: "hapus",
1970
+ clear: "bersihkan",
1971
+ // hapus is the remove PRIMARY in the profile
1886
1972
  close: "tutup",
1887
1973
  open: "buka",
1888
1974
  select: "pilih",
@@ -2035,20 +2121,34 @@ var qu = {
2035
2121
  tell: "niy",
2036
2122
  trigger: "kichay",
2037
2123
  send: "kachay",
2038
- take: "hurquy",
2124
+ take: "hapiy",
2125
+ // auditor: dict emitted a word the profile reads differently
2039
2126
  put: "churay",
2040
- set: "churay",
2041
- get: "chaskiy",
2127
+ // churay is the semantic qu profile's `put` primary; `set` is churanay. Emitting
2128
+ // churay for set made the semantic parser read a transformed `set` as `put`.
2129
+ // See ZH_BLOCK_BODY_SCOPE.md (#2 sweep — keyword realignment, cf. zh fetch).
2130
+ set: "churanay",
2131
+ // Align with the semantic quechua profile's `get` primary (`taripay`); the
2132
+ // previous `chaskiy` had no profile entry, so the transformed `get` dropped
2133
+ // (get-value parsed degenerate). Same dict↔profile alignment as id `toggle`.
2134
+ get: "taripay",
2042
2135
  add: "yapay",
2043
2136
  remove: "qichuy",
2044
2137
  toggle: "tikray",
2045
2138
  hide: "pakay",
2046
2139
  show: "rikuchiy",
2047
2140
  if: "sichus",
2048
- unless: "mana_sichus",
2049
- repeat: "kutichiy",
2050
- for: "rayku",
2051
- while: "kay_kaq",
2141
+ unless: "mana sichus",
2142
+ // spaced phrase ("if not"); `_` form split to `mana`+`sichus`(=if) at parse time
2143
+ repeat: "kutipay",
2144
+ for: "sapankaq",
2145
+ // profile's for word — rayku doubles as `by`
2146
+ // `kaykamaqa` (the semantic qu profile's while primary), not `kay_kaq`: the
2147
+ // `_` form is unknown to the profile (and `_` words split at parse time, cf.
2148
+ // qhipaman_yapay), so the fronted repeat-while head never formed a `while`
2149
+ // node — the condition dropped wholesale. Same dict↔profile alignment as
2150
+ // vi render / de abrufen.
2151
+ while: "kaykamaqa",
2052
2152
  until: "hayk_akama",
2053
2153
  continue: "purichiy",
2054
2154
  break: "p_akiy",
@@ -2058,12 +2158,18 @@ var qu = {
2058
2158
  call: "qayay",
2059
2159
  return: "kutimuy",
2060
2160
  make: "ruray",
2061
- log: "qillqay",
2161
+ // qillqay is the semantic qu profile's `copy` primary; `log` is qillqakuy.
2162
+ // Emitting qillqay for log made the parser read every transformed log as
2163
+ // copy (log-value/log-element/get-value lossy) — same realign as set above.
2164
+ log: "qillqakuy",
2062
2165
  throw: "wikchuy",
2063
2166
  catch: "hapsiy",
2064
2167
  measure: "tupuy",
2065
- transition: "tikray",
2066
- increment: "yapay",
2168
+ // pasay, not tikray: the semantic qu profile's toggle keyword is
2169
+ // t'ikray/tikray, so a tikray render collided with toggle and the
2170
+ // transition command never anchored (sw kama precedent, #569).
2171
+ transition: "pasay",
2172
+ increment: "yapachiy",
2067
2173
  decrement: "pisiyachiy",
2068
2174
  default: "\xF1awpaq_kaq",
2069
2175
  go: "riy",
@@ -2074,20 +2180,26 @@ var qu = {
2074
2180
  beep: "waqay",
2075
2181
  js: "js",
2076
2182
  async: "mana_suyaspa",
2077
- render: "rikuchiy",
2078
- swap: "rantin_tikray",
2079
- morph: "tikrachiy",
2080
- settle: "tiyay",
2081
- append: "qhipaman_yapay",
2183
+ render: "rikurichiy",
2184
+ // auditor: dict emitted a word the profile reads differently
2185
+ swap: "t'inkuy",
2186
+ // profile primary; 'rantin_tikray' splits, 'tikray' is toggle's word
2187
+ morph: "tukunay",
2188
+ // auditor: dict emitted a word the profile reads differently
2189
+ settle: "tiyakuy",
2190
+ // auditor: dict emitted a word the profile reads differently
2191
+ append: "qatichiy",
2192
+ // profile's append primary (single token); `qhipaman_yapay` `_`-split to qhipaman+yapay(=add) at parse time
2082
2193
  exit: "lluqsiy",
2083
- install: "churay",
2194
+ install: "tarpuy",
2084
2195
  breakpoint: "sayachinay",
2085
2196
  clear: "pichay",
2086
2197
  close: "wichqay",
2087
2198
  open: "kichay",
2088
2199
  select: "akllay",
2089
2200
  clone: "kikinchay",
2090
- prepend: "\xF1awpachiy"
2201
+ prepend: "\xF1awpachiy",
2202
+ socket: "tinkina"
2091
2203
  },
2092
2204
  modifiers: {
2093
2205
  to: "man",
@@ -2110,8 +2222,10 @@ var qu = {
2110
2222
  events: {
2111
2223
  click: "\xF1itiy",
2112
2224
  dblclick: "iskay_\xF1itiy",
2113
- mousedown: "rat_\xF1itiy",
2114
- mouseup: "rat_huqariy",
2225
+ // Fused (no `_`): the semantic tokenizer splits on `_` — and `rat_ñitiy` then
2226
+ // mis-captured as the `click` event (ñitiy→click). Mirrors the #535 ru/uk fuse.
2227
+ mousedown: "rat\xF1itiy",
2228
+ mouseup: "rathuqariy",
2115
2229
  mouseenter: "rat_yaykuy",
2116
2230
  mouseleave: "rat_lluqsiy",
2117
2231
  mouseover: "rat_hawapi",
@@ -2150,7 +2264,11 @@ var qu = {
2150
2264
  has: "kachkan",
2151
2265
  have: "kachkani",
2152
2266
  then: "chayqa",
2153
- else: "mana_chayqa",
2267
+ // Align to the semantic profile's else word `manachus`. The old `mana_chayqa`
2268
+ // tokenized as `mana`(false) + `_` + `chayqa`(then) — no else keyword formed,
2269
+ // so qu conditionals never split their else branch. `manachus` is a single
2270
+ // token the profile-derived keyword map reads as `else` (dict↔profile align).
2271
+ else: "manachus",
2154
2272
  otherwise: "huk_kaqpi",
2155
2273
  end: "tukuy",
2156
2274
  live: "kawsay",
@@ -2173,7 +2291,7 @@ var qu = {
2173
2291
  values: {
2174
2292
  true: "cheqaq",
2175
2293
  false: "llulla",
2176
- null: "ch_usaq",
2294
+ null: "chusaq",
2177
2295
  undefined: "mana_riqsisqa",
2178
2296
  it: "chay",
2179
2297
  its: "chaypaq",
@@ -2211,12 +2329,12 @@ var qu = {
2211
2329
  prev: "\xF1awpaq",
2212
2330
  at: "pi",
2213
2331
  random: "imaymanata",
2214
- closest: "aswan_kaylla",
2332
+ closest: "kaylla",
2215
2333
  parent: "mama_tayta",
2216
2334
  children: "wawakuna",
2217
2335
  within: "ukupi",
2218
2336
  no: "mana_kanchu",
2219
- empty: "ch_usaq",
2337
+ empty: "chusaq",
2220
2338
  some: "wakin",
2221
2339
  "starts with": "qallarisqa wan",
2222
2340
  "ends with": "tukusqa wan",
@@ -2237,11 +2355,17 @@ var sw = {
2237
2355
  send: "tuma",
2238
2356
  take: "chukua",
2239
2357
  put: "weka",
2240
- set: "weka",
2358
+ // weka is the semantic sw profile's `put` primary; `set` is seti. Emitting weka
2359
+ // for set made the semantic parser read a transformed `set` as `put`.
2360
+ // See ZH_BLOCK_BODY_SCOPE.md (#2 sweep — keyword realignment, cf. zh fetch).
2361
+ set: "seti",
2241
2362
  get: "pata",
2242
2363
  add: "ongeza",
2243
2364
  remove: "ondoa",
2244
2365
  toggle: "badilisha",
2366
+ // command blur (the events section has the blur EVENT word; without this
2367
+ // entry the transformer fell back to it and no profile read it as the verb)
2368
+ blur: "blur",
2245
2369
  hide: "ficha",
2246
2370
  show: "onyesha",
2247
2371
  if: "kama",
@@ -2257,13 +2381,14 @@ var sw = {
2257
2381
  fetch: "leta",
2258
2382
  call: "ita",
2259
2383
  return: "rudi",
2260
- make: "fanya",
2384
+ make: "tengeneza",
2385
+ // auditor: dict emitted a word the profile reads differently
2261
2386
  log: "andika",
2262
2387
  throw: "tupa",
2263
2388
  catch: "shika",
2264
2389
  measure: "pima",
2265
2390
  transition: "mpito",
2266
- increment: "ongeza",
2391
+ increment: "ongezeko",
2267
2392
  decrement: "punguza",
2268
2393
  default: "msingi",
2269
2394
  go: "nenda",
@@ -2276,18 +2401,23 @@ var sw = {
2276
2401
  async: "sainkroni",
2277
2402
  render: "chora",
2278
2403
  swap: "badilishana",
2279
- morph: "badilishaUmbo",
2404
+ morph: "geuza",
2405
+ // auditor: dict emitted a word the profile reads differently
2280
2406
  settle: "tulia",
2281
- append: "ongezaMwisho",
2407
+ append: "ambatanisha",
2408
+ // profile primary; 'ongezaMwisho' is unrecognized
2282
2409
  exit: "toka",
2283
2410
  install: "sakinisha",
2284
2411
  breakpoint: "nukta-simama",
2285
- clear: "futa",
2412
+ clear: "safisha",
2413
+ // futa is a remove alternative in the profile
2286
2414
  close: "funga",
2287
2415
  open: "fungua",
2288
2416
  select: "chagua",
2289
2417
  clone: "nakili",
2290
- prepend: "tanguliza"
2418
+ prepend: "tanguliza",
2419
+ focus: "lenga",
2420
+ socket: "soketi"
2291
2421
  },
2292
2422
  modifiers: {
2293
2423
  to: "kwa",
@@ -2297,7 +2427,14 @@ var sw = {
2297
2427
  at: "katika",
2298
2428
  in: "ndani",
2299
2429
  of: "ya",
2300
- as: "kama",
2430
+ // `kuwa` ("to be/become" — the conversion sense, cf. `badilisha kuwa`), not
2431
+ // `kama`: sw `kama` is the IF keyword (commands.if above and the semantic sw
2432
+ // profile's if primary), so emitting it for `as` grew a phantom `if` command
2433
+ // out of every transformed `as <Type>` tail (`kama JSON`, `kama Number`) when
2434
+ // the semantic parser split event-body statements. Same dict↔profile homonym
2435
+ // disambiguation as pl get/pobierz. The semantic fetch-sw pattern still
2436
+ // tolerates hand-written `kama` in as-marker position.
2437
+ as: "kuwa",
2301
2438
  by: "na",
2302
2439
  before: "kabla",
2303
2440
  after: "baada",
@@ -2353,7 +2490,7 @@ var sw = {
2353
2490
  else: "sivyo",
2354
2491
  otherwise: "vinginevyo",
2355
2492
  end: "mwisho",
2356
- live: "moja_kwa_moja",
2493
+ live: "mubashara",
2357
2494
  changes: "inabadilika"
2358
2495
  },
2359
2496
  temporal: {
@@ -2405,13 +2542,25 @@ var sw = {
2405
2542
  },
2406
2543
  expressions: {
2407
2544
  first: "kwanza",
2408
- last: "mwisho",
2545
+ // 'mwisho' is the END keyword (block terminator) — the tokenizer's keyword
2546
+ // map is last-wins, so a positional `last` emission of 'mwisho' reads as
2547
+ // `end` and terminates the enclosing block mid-condition (focus-trap's
2548
+ // `… inafanana mwisho <button/>` dropped the whole branch body). Emit the
2549
+ // concatenated adjective form instead (wa mwisho — the saufsi/wennnicht/
2550
+ // enyakın single-token class); the tokenizer reads it as `last`.
2551
+ last: "wamwisho",
2409
2552
  next: "ijayo",
2410
2553
  previous: "iliyopita",
2411
2554
  prev: "awali",
2412
2555
  at: "katika",
2413
2556
  random: "nasibu",
2414
- closest: "karibu_zaidi",
2557
+ // Natural Swahili: `karibu` ("near/close") is the ordinary word and already
2558
+ // maps to closest. The earlier `karibu_zaidi` ("nearer") underscore-split to
2559
+ // karibu/_/zaidi (the stray `_ zaidi` broke positional capture); the fused
2560
+ // `karibuzaidi` parsed but isn't real Swahili. `karibu` alone is both natural
2561
+ // and correct (the sw tokenizer is single-word-only, so a spaced `karibu
2562
+ // zaidi` would strand `zaidi` regardless).
2563
+ closest: "karibu",
2415
2564
  parent: "mzazi",
2416
2565
  children: "watoto",
2417
2566
  within: "ndani_ya",
@@ -2442,17 +2591,22 @@ var pt = {
2442
2591
  add: "adicionar",
2443
2592
  remove: "remover",
2444
2593
  toggle: "alternar",
2594
+ // command blur (the events section has the blur EVENT word; without this
2595
+ // entry the transformer fell back to it and no profile read it as the verb)
2596
+ blur: "desfocar",
2445
2597
  hide: "esconder",
2446
2598
  show: "mostrar",
2447
2599
  if: "se",
2448
- unless: "a_menos",
2600
+ unless: "salvo",
2601
+ // a_menos splits at _ in the pt extractor (see profile)
2449
2602
  repeat: "repetir",
2450
2603
  for: "para",
2451
2604
  while: "enquanto",
2452
2605
  until: "at\xE9",
2453
2606
  continue: "continuar",
2454
- break: "parar",
2455
- halt: "interromper",
2607
+ // un-crossed: the profile/tokenizer read parar=halt, interromper=break
2608
+ break: "interromper",
2609
+ halt: "parar",
2456
2610
  wait: "esperar",
2457
2611
  fetch: "buscar",
2458
2612
  call: "chamar",
@@ -2487,7 +2641,9 @@ var pt = {
2487
2641
  open: "abrir",
2488
2642
  select: "selecionar",
2489
2643
  clone: "clonar",
2490
- prepend: "preceder"
2644
+ prepend: "preceder",
2645
+ focus: "focar",
2646
+ socket: "soquete"
2491
2647
  },
2492
2648
  modifiers: {
2493
2649
  to: "para",
@@ -2611,7 +2767,7 @@ var pt = {
2611
2767
  prev: "ant",
2612
2768
  at: "em",
2613
2769
  random: "aleat\xF3rio",
2614
- closest: "mais_pr\xF3ximo",
2770
+ closest: "maispr\xF3ximo",
2615
2771
  parent: "pai",
2616
2772
  children: "filhos",
2617
2773
  within: "dentro",
@@ -2645,7 +2801,7 @@ var it = {
2645
2801
  hide: "nascondere",
2646
2802
  show: "mostrare",
2647
2803
  if: "se",
2648
- unless: "a meno che",
2804
+ unless: "salvo",
2649
2805
  repeat: "ripetere",
2650
2806
  for: "per",
2651
2807
  while: "mentre",
@@ -2678,7 +2834,8 @@ var it = {
2678
2834
  swap: "scambiare",
2679
2835
  morph: "trasformare",
2680
2836
  settle: "stabilizzare",
2681
- append: "aggiungere",
2837
+ append: "accodare",
2838
+ // profile primary; 'aggiungere' is add's word (parsed as add)
2682
2839
  exit: "uscire",
2683
2840
  install: "installare",
2684
2841
  breakpoint: "punto-interruzione",
@@ -2687,7 +2844,10 @@ var it = {
2687
2844
  open: "aprire",
2688
2845
  select: "selezionare",
2689
2846
  clone: "clonare",
2690
- prepend: "anteporre"
2847
+ prepend: "anteporre",
2848
+ // profile primary; without a commands entry the transformer fell back to
2849
+ // the EVENTS noun 'fuoco', which generated focus patterns can't match
2850
+ focus: "focalizzare"
2691
2851
  },
2692
2852
  modifiers: {
2693
2853
  to: "a",
@@ -2811,7 +2971,7 @@ var it = {
2811
2971
  prev: "prec",
2812
2972
  at: "a",
2813
2973
  random: "casuale",
2814
- closest: "pi\xF9vicino",
2974
+ closest: "vicino",
2815
2975
  parent: "genitore",
2816
2976
  children: "figli",
2817
2977
  within: "dentro",
@@ -2874,7 +3034,8 @@ var vi = {
2874
3034
  beep: "beep",
2875
3035
  js: "js",
2876
3036
  async: "b\u1EA5t \u0111\u1ED3ng b\u1ED9",
2877
- render: "hi\u1EC3n th\u1ECB",
3037
+ render: "k\u1EBFt xu\u1EA5t",
3038
+ // distinct from `show` (was `hiển thị`, which collides with show: the semantic profile reads `hiển thị` as show, `kết xuất` as render)
2878
3039
  swap: "ho\xE1n \u0111\u1ED5i",
2879
3040
  morph: "bi\u1EBFn \u0111\u1ED5i",
2880
3041
  settle: "\u1ED5n \u0111\u1ECBnh",
@@ -2889,7 +3050,8 @@ var vi = {
2889
3050
  prepend: "th\xEAm \u0111\u1EA7u",
2890
3051
  else: "kh\xF4ng th\xEC",
2891
3052
  breakpoint: "\u0111i\u1EC3m-d\u1EEBng",
2892
- clear: "x\xF3a",
3053
+ clear: "t\u1EA9y",
3054
+ // xóa is the remove PRIMARY in the profile
2893
3055
  close: "\u0111\xF3ng",
2894
3056
  open: "m\u1EDF",
2895
3057
  select: "ch\u1ECDn"
@@ -2953,7 +3115,7 @@ var vi = {
2953
3115
  else: "kh\xF4ng th\xEC",
2954
3116
  end: "k\u1EBFt th\xFAc",
2955
3117
  then: "r\u1ED3i",
2956
- live: "tr\u1EF1c ti\u1EBFp",
3118
+ live: "live",
2957
3119
  changes: "thay \u0111\u1ED5i"
2958
3120
  },
2959
3121
  temporal: {
@@ -3035,15 +3197,23 @@ var pl = {
3035
3197
  commands: {
3036
3198
  on: "gdy",
3037
3199
  tell: "powiedz",
3038
- trigger: "wywo\u0142aj",
3200
+ trigger: "wyzw\xF3l",
3201
+ // auditor: dict emitted a word the profile reads differently
3039
3202
  send: "wy\u015Blij",
3040
3203
  take: "we\u017A",
3041
3204
  put: "umie\u015B\u0107",
3042
3205
  set: "ustaw",
3043
- get: "pobierz",
3206
+ // `uzyskaj` (the semantic pl profile's get primary), not `pobierz`: pl `pobierz`
3207
+ // ("download") is the profile's FETCH primary, so emitting it for get made the
3208
+ // parser read every transformed get as fetch (get-value lossy + a phantom fetch).
3209
+ // Same dict↔profile homonym disambiguation as tr load/install, qu get.
3210
+ get: "uzyskaj",
3044
3211
  add: "dodaj",
3045
3212
  remove: "usu\u0144",
3046
3213
  toggle: "prze\u0142\u0105cz",
3214
+ // command blur (the events section has the blur EVENT word; without this
3215
+ // entry the transformer fell back to it and no profile read it as the verb)
3216
+ blur: "rozmyj",
3047
3217
  hide: "ukryj",
3048
3218
  show: "poka\u017C",
3049
3219
  if: "je\u015Bli",
@@ -3084,12 +3254,14 @@ var pl = {
3084
3254
  exit: "wyjd\u017A",
3085
3255
  install: "zainstaluj",
3086
3256
  breakpoint: "punkt-przerwania",
3087
- clear: "wyczy\u015B\u0107",
3257
+ clear: "zeruj",
3258
+ // wyczyść is a remove alternative in the profile
3088
3259
  close: "zamknij",
3089
3260
  open: "otw\xF3rz",
3090
3261
  select: "wybierz",
3091
3262
  clone: "sklonuj",
3092
- prepend: "poprzed\u017A"
3263
+ prepend: "poprzed\u017A",
3264
+ focus: "skup"
3093
3265
  },
3094
3266
  modifiers: {
3095
3267
  to: "do",
@@ -3235,7 +3407,8 @@ var russianDictionary = {
3235
3407
  commands: {
3236
3408
  on: "\u043F\u0440\u0438",
3237
3409
  tell: "\u0441\u043A\u0430\u0437\u0430\u0442\u044C",
3238
- trigger: "\u0432\u044B\u0437\u0432\u0430\u0442\u044C",
3410
+ trigger: "\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C",
3411
+ // auditor: dict emitted a word the profile reads differently
3239
3412
  send: "\u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C",
3240
3413
  take: "\u0432\u0437\u044F\u0442\u044C",
3241
3414
  put: "\u043F\u043E\u043B\u043E\u0436\u0438\u0442\u044C",
@@ -3246,8 +3419,12 @@ var russianDictionary = {
3246
3419
  toggle: "\u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C",
3247
3420
  hide: "\u0441\u043A\u0440\u044B\u0442\u044C",
3248
3421
  show: "\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C",
3422
+ // command verb; the events section keeps the noun прокрутка for `on scroll`.
3423
+ // Without this entry the transformer fell back to the event noun, which the
3424
+ // parser doesn't read as the scroll command (#321 focus family).
3425
+ scroll: "\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C",
3249
3426
  if: "\u0435\u0441\u043B\u0438",
3250
- unless: "\u0435\u0441\u043B\u0438_\u043D\u0435",
3427
+ unless: "\u043A\u0440\u043E\u043C\u0435",
3251
3428
  repeat: "\u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C",
3252
3429
  for: "\u0434\u043B\u044F",
3253
3430
  while: "\u043F\u043E\u043A\u0430",
@@ -3280,10 +3457,12 @@ var russianDictionary = {
3280
3457
  swap: "\u043F\u043E\u043C\u0435\u043D\u044F\u0442\u044C",
3281
3458
  morph: "\u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
3282
3459
  settle: "\u0441\u0442\u0430\u0431\u0438\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
3283
- append: "\u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C_\u0432_\u043A\u043E\u043D\u0435\u0446",
3460
+ append: "\u0434\u043E\u043F\u0438\u0441\u0430\u0442\u044C",
3461
+ // profile alternative; the compound splits and добавить parses as add
3284
3462
  exit: "\u0432\u044B\u0439\u0442\u0438",
3285
3463
  else: "\u0438\u043D\u0430\u0447\u0435",
3286
- install: "\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C",
3464
+ install: "\u0438\u043D\u0441\u0442\u0430\u043B\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
3465
+ // loanword — `установить` is `set` (homonym); see russian profile
3287
3466
  init: "\u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
3288
3467
  behavior: "\u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435",
3289
3468
  focus: "\u0441\u0444\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
@@ -3318,8 +3497,11 @@ var russianDictionary = {
3318
3497
  events: {
3319
3498
  click: "\u043A\u043B\u0438\u043A",
3320
3499
  dblclick: "\u0434\u0432\u043E\u0439\u043D\u043E\u0439_\u043A\u043B\u0438\u043A",
3321
- mousedown: "\u043C\u044B\u0448\u044C_\u0432\u043D\u0438\u0437",
3322
- mouseup: "\u043C\u044B\u0448\u044C_\u0432\u0432\u0435\u0440\u0445",
3500
+ // Fused (no `_`): the semantic tokenizer splits on `_`, so an underscore form
3501
+ // breaks event recognition (mousedown → bare expression). Mirrors the #510 tr
3502
+ // resize fix (boyut_değiştir → boyutlandırma) and the enyakın superlative.
3503
+ mousedown: "\u043C\u044B\u0448\u044C\u0432\u043D\u0438\u0437",
3504
+ mouseup: "\u043C\u044B\u0448\u044C\u0432\u0432\u0435\u0440\u0445",
3323
3505
  mouseenter: "\u043C\u044B\u0448\u044C_\u0432\u0445\u043E\u0434",
3324
3506
  mouseleave: "\u043C\u044B\u0448\u044C_\u0432\u044B\u0445\u043E\u0434",
3325
3507
  mouseover: "\u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435",
@@ -3336,7 +3518,8 @@ var russianDictionary = {
3336
3518
  reset: "\u0441\u0431\u0440\u043E\u0441",
3337
3519
  load: "\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430",
3338
3520
  unload: "\u0432\u044B\u0433\u0440\u0443\u0437\u043A\u0430",
3339
- resize: "\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435_\u0440\u0430\u0437\u043C\u0435\u0440\u0430",
3521
+ resize: "\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435\u0440\u0430\u0437\u043C\u0435\u0440\u0430",
3522
+ // fused (no `_`) — see mousedown note above
3340
3523
  scroll: "\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430",
3341
3524
  touchstart: "\u043A\u0430\u0441\u0430\u043D\u0438\u0435_\u043D\u0430\u0447\u0430\u043B\u043E",
3342
3525
  touchend: "\u043A\u0430\u0441\u0430\u043D\u0438\u0435_\u043A\u043E\u043D\u0435\u0446",
@@ -3461,7 +3644,8 @@ var ukrainianDictionary = {
3461
3644
  commands: {
3462
3645
  on: "\u043F\u0440\u0438",
3463
3646
  tell: "\u0441\u043A\u0430\u0437\u0430\u0442\u0438",
3464
- trigger: "\u0432\u0438\u043A\u043B\u0438\u043A\u0430\u0442\u0438",
3647
+ trigger: "\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438",
3648
+ // auditor: dict emitted a word the profile reads differently
3465
3649
  send: "\u043D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438",
3466
3650
  take: "\u0432\u0437\u044F\u0442\u0438",
3467
3651
  put: "\u043F\u043E\u043A\u043B\u0430\u0441\u0442\u0438",
@@ -3472,8 +3656,12 @@ var ukrainianDictionary = {
3472
3656
  toggle: "\u043F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438",
3473
3657
  hide: "\u0441\u0445\u043E\u0432\u0430\u0442\u0438",
3474
3658
  show: "\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438",
3659
+ // command verb; the events section keeps the noun прокрутка for `on scroll`.
3660
+ // Without this entry the transformer fell back to the event noun, which the
3661
+ // parser doesn't read as the scroll command (#321 focus family).
3662
+ scroll: "\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u0438",
3475
3663
  if: "\u044F\u043A\u0449\u043E",
3476
- unless: "\u044F\u043A\u0449\u043E_\u043D\u0435",
3664
+ unless: "\u043A\u0440\u0456\u043C",
3477
3665
  repeat: "\u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438",
3478
3666
  for: "\u0434\u043B\u044F",
3479
3667
  while: "\u043F\u043E\u043A\u0438",
@@ -3506,10 +3694,12 @@ var ukrainianDictionary = {
3506
3694
  swap: "\u043F\u043E\u043C\u0456\u043D\u044F\u0442\u0438",
3507
3695
  morph: "\u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0443\u0432\u0430\u0442\u0438",
3508
3696
  settle: "\u0441\u0442\u0430\u0431\u0456\u043B\u0456\u0437\u0443\u0432\u0430\u0442\u0438",
3509
- append: "\u0434\u043E\u0434\u0430\u0442\u0438_\u0432_\u043A\u0456\u043D\u0435\u0446\u044C",
3697
+ append: "\u0434\u043E\u043F\u0438\u0441\u0430\u0442\u0438",
3698
+ // profile alternative; the compound splits and додати parses as add
3510
3699
  exit: "\u0432\u0438\u0439\u0442\u0438",
3511
3700
  else: "\u0456\u043D\u0430\u043A\u0448\u0435",
3512
- install: "\u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438",
3701
+ install: "\u0456\u043D\u0441\u0442\u0430\u043B\u044E\u0432\u0430\u0442\u0438",
3702
+ // loanword — `встановити` is `set` (homonym); see ukrainian profile
3513
3703
  init: "\u0456\u043D\u0456\u0446\u0456\u0430\u043B\u0456\u0437\u0443\u0432\u0430\u0442\u0438",
3514
3704
  behavior: "\u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0430",
3515
3705
  focus: "\u0441\u0444\u043E\u043A\u0443\u0441\u0443\u0432\u0430\u0442\u0438",
@@ -3544,8 +3734,10 @@ var ukrainianDictionary = {
3544
3734
  events: {
3545
3735
  click: "\u043A\u043B\u0456\u043A",
3546
3736
  dblclick: "\u043F\u043E\u0434\u0432\u0456\u0439\u043D\u0438\u0439_\u043A\u043B\u0456\u043A",
3547
- mousedown: "\u043C\u0438\u0448\u0430_\u0432\u043D\u0438\u0437",
3548
- mouseup: "\u043C\u0438\u0448\u0430_\u0432\u0433\u043E\u0440\u0443",
3737
+ // Fused (no `_`): the semantic tokenizer splits on `_`, so an underscore form
3738
+ // breaks event recognition. Mirrors the #510 tr resize fix + enyakın.
3739
+ mousedown: "\u043C\u0438\u0448\u0430\u0432\u043D\u0438\u0437",
3740
+ mouseup: "\u043C\u0438\u0448\u0430\u0432\u0433\u043E\u0440\u0443",
3549
3741
  mouseenter: "\u043C\u0438\u0448\u0430_\u0432\u0445\u0456\u0434",
3550
3742
  mouseleave: "\u043C\u0438\u0448\u0430_\u0432\u0438\u0445\u0456\u0434",
3551
3743
  mouseover: "\u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043D\u044F",
@@ -3562,7 +3754,8 @@ var ukrainianDictionary = {
3562
3754
  reset: "\u0441\u043A\u0438\u0434\u0430\u043D\u043D\u044F",
3563
3755
  load: "\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",
3564
3756
  unload: "\u0432\u0438\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",
3565
- resize: "\u0437\u043C\u0456\u043D\u0430_\u0440\u043E\u0437\u043C\u0456\u0440\u0443",
3757
+ resize: "\u0437\u043C\u0456\u043D\u0430\u0440\u043E\u0437\u043C\u0456\u0440\u0443",
3758
+ // fused (no `_`) — see mousedown note above
3566
3759
  scroll: "\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430",
3567
3760
  touchstart: "\u0434\u043E\u0442\u0438\u043A_\u043F\u043E\u0447\u0430\u0442\u043E\u043A",
3568
3761
  touchend: "\u0434\u043E\u0442\u0438\u043A_\u043A\u0456\u043D\u0435\u0446\u044C",
@@ -3699,10 +3892,12 @@ var hindiDictionary = {
3699
3892
  hide: "\u091B\u093F\u092A\u093E\u090F\u0902",
3700
3893
  show: "\u0926\u093F\u0916\u093E\u090F\u0902",
3701
3894
  if: "\u0905\u0917\u0930",
3702
- unless: "\u091C\u092C_\u0924\u0915_\u0928\u0939\u0940\u0902",
3895
+ unless: "\u091C\u092C \u0924\u0915 \u0928\u0939\u0940\u0902",
3896
+ // spaced (not जब_तक_नहीं) → one multi-word `unless` token
3703
3897
  repeat: "\u0926\u094B\u0939\u0930\u093E\u090F\u0902",
3704
- for: "\u0915\u0947_\u0932\u093F\u090F",
3705
- while: "\u091C\u092C_\u0924\u0915",
3898
+ for: "\u0939\u0947\u0924\u0941",
3899
+ // single token — के_लिए splits at _ in the hi extractor
3900
+ while: "\u091C\u092C \u0924\u0915",
3706
3901
  until: "\u0924\u0915",
3707
3902
  continue: "\u091C\u093E\u0930\u0940",
3708
3903
  break: "\u0930\u094B\u0915\u0947\u0902",
@@ -3729,10 +3924,10 @@ var hindiDictionary = {
3729
3924
  js: "\u091C\u0947\u090F\u0938",
3730
3925
  async: "\u0905\u0938\u093F\u0902\u0915",
3731
3926
  render: "\u0930\u0947\u0902\u0921\u0930",
3732
- swap: "\u092C\u0926\u0932\u0947\u0902",
3927
+ swap: "\u0935\u093F\u0928\u093F\u092E\u092F",
3733
3928
  morph: "\u0930\u0942\u092A\u093E\u0902\u0924\u0930",
3734
3929
  settle: "\u0938\u094D\u0925\u093F\u0930",
3735
- append: "\u091C\u094B\u0921\u093C\u0947\u0902_\u0905\u0902\u0924",
3930
+ append: "\u0938\u0902\u0932\u0917\u094D\u0928",
3736
3931
  exit: "\u092C\u093E\u0939\u0930",
3737
3932
  else: "\u0935\u0930\u0928\u093E",
3738
3933
  install: "\u0907\u0902\u0938\u094D\u091F\u0949\u0932",
@@ -3746,7 +3941,8 @@ var hindiDictionary = {
3746
3941
  clear: "\u0938\u093E\u092B\u093C-\u0915\u0930\u0947\u0902",
3747
3942
  close: "\u092C\u0902\u0926-\u0915\u0930\u0947\u0902",
3748
3943
  open: "\u0916\u094B\u0932\u0947\u0902",
3749
- select: "\u091A\u0941\u0928\u0947\u0902"
3944
+ select: "\u091A\u0941\u0928\u0947\u0902",
3945
+ socket: "\u0938\u0949\u0915\u0947\u091F"
3750
3946
  },
3751
3947
  modifiers: {
3752
3948
  to: "\u0915\u094B",
@@ -3758,8 +3954,8 @@ var hindiDictionary = {
3758
3954
  of: "\u0915\u093E",
3759
3955
  as: "\u0915\u0947_\u0930\u0942\u092A_\u092E\u0947\u0902",
3760
3956
  by: "\u0926\u094D\u0935\u093E\u0930\u093E",
3761
- before: "\u0938\u0947_\u092A\u0939\u0932\u0947",
3762
- after: "\u0915\u0947_\u092C\u093E\u0926",
3957
+ before: "\u0938\u0947 \u092A\u0939\u0932\u0947",
3958
+ after: "\u0915\u0947 \u092C\u093E\u0926",
3763
3959
  over: "\u0915\u0947_\u090A\u092A\u0930",
3764
3960
  under: "\u0915\u0947_\u0928\u0940\u091A\u0947",
3765
3961
  between: "\u0915\u0947_\u092C\u0940\u091A",
@@ -3770,8 +3966,10 @@ var hindiDictionary = {
3770
3966
  events: {
3771
3967
  click: "\u0915\u094D\u0932\u093F\u0915",
3772
3968
  dblclick: "\u0921\u092C\u0932_\u0915\u094D\u0932\u093F\u0915",
3773
- mousedown: "\u092E\u093E\u0909\u0938_\u0928\u0940\u091A\u0947",
3774
- mouseup: "\u092E\u093E\u0909\u0938_\u090A\u092A\u0930",
3969
+ // Fused (no `_`): the semantic tokenizer splits on `_`, breaking event
3970
+ // recognition (mousedown → "नीचे"). Mirrors the #535 ru/uk fuse.
3971
+ mousedown: "\u092E\u093E\u0909\u0938\u0928\u0940\u091A\u0947",
3972
+ mouseup: "\u092E\u093E\u0909\u0938\u090A\u092A\u0930",
3775
3973
  mouseenter: "\u092E\u093E\u0909\u0938_\u092A\u094D\u0930\u0935\u0947\u0936",
3776
3974
  mouseleave: "\u092E\u093E\u0909\u0938_\u092C\u093E\u0939\u0930",
3777
3975
  mouseover: "\u092E\u093E\u0909\u0938_\u0913\u0935\u0930",
@@ -3803,7 +4001,11 @@ var hindiDictionary = {
3803
4001
  not: "\u0928\u0939\u0940\u0902",
3804
4002
  is: "\u0939\u0948",
3805
4003
  exists: "\u092E\u094C\u091C\u0942\u0926",
3806
- matches: "\u092E\u0947\u0932_\u0916\u093E\u0924\u093E",
4004
+ // Natural spaced phrase `मेल खाता` ("matches") — how Hindi writes it. The base
4005
+ // tokenizer now matches multi-word profile keywords, so the hindi profile maps
4006
+ // `मेल खाता`→matches without the underscore (`मेल_खाता` split) or the
4007
+ // concatenated `मेलखाता` (parsed, but unnatural) workarounds.
4008
+ matches: "\u092E\u0947\u0932 \u0916\u093E\u0924\u093E",
3807
4009
  contains: "\u0936\u093E\u092E\u093F\u0932",
3808
4010
  includes: "\u092E\u0947\u0902_\u0939\u0948",
3809
4011
  equals: "\u092C\u0930\u093E\u092C\u0930",
@@ -3940,7 +4142,7 @@ var bengaliDictionary = {
3940
4142
  throw: "\u09A8\u09BF\u0995\u09CD\u09B7\u09C7\u09AA",
3941
4143
  continue: "\u099A\u09BE\u09B2\u09BF\u09AF\u09BC\u09C7 \u09AF\u09BE\u09A8",
3942
4144
  make: "\u09A4\u09C8\u09B0\u09BF \u0995\u09B0\u09C1\u09A8",
3943
- append: "\u09B6\u09C7\u09B7\u09C7 \u09AF\u09CB\u0997",
4145
+ append: "\u099C\u09C1\u09A1\u09BC\u09C1\u09A8",
3944
4146
  prepend: "\u09B6\u09C1\u09B0\u09C1\u09A4\u09C7 \u09AF\u09CB\u0997",
3945
4147
  focus: "\u09AB\u09CB\u0995\u09BE\u09B8",
3946
4148
  blur: "\u099D\u09BE\u09AA\u09B8\u09BE",
@@ -3968,7 +4170,8 @@ var bengaliDictionary = {
3968
4170
  clear: "\u09AA\u09B0\u09BF\u09B7\u09CD\u0995\u09BE\u09B0",
3969
4171
  close: "\u09AC\u09A8\u09CD\u09A7",
3970
4172
  open: "\u0996\u09C1\u09B2\u09C1\u09A8",
3971
- select: "\u09A8\u09BF\u09B0\u09CD\u09AC\u09BE\u099A\u09A8"
4173
+ select: "\u09A8\u09BF\u09B0\u09CD\u09AC\u09BE\u099A\u09A8",
4174
+ socket: "\u09B8\u0995\u09C7\u099F"
3972
4175
  },
3973
4176
  modifiers: {
3974
4177
  to: "\u0995\u09C7",
@@ -4027,6 +4230,7 @@ var bengaliDictionary = {
4027
4230
  end: "\u09B6\u09C7\u09B7",
4028
4231
  then: "\u09A4\u09BE\u09B0\u09AA\u09B0",
4029
4232
  live: "\u09B2\u09BE\u0987\u09AD",
4233
+ bind: "\u09AC\u09BE\u0987\u09A8\u09CD\u09A1",
4030
4234
  changes: "\u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09BF\u09A4 \u09B9\u09B2\u09C7"
4031
4235
  },
4032
4236
  temporal: {
@@ -4120,7 +4324,9 @@ var thaiDictionary = {
4120
4324
  prepend: "\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E2B\u0E19\u0E49\u0E32",
4121
4325
  focus: "\u0E42\u0E1F\u0E01\u0E31\u0E2A",
4122
4326
  blur: "\u0E40\u0E1A\u0E25\u0E2D",
4123
- transition: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19",
4327
+ // เปลี่ยนผ่าน, not เปลี่ยน: the semantic th profile's `change` keyword is
4328
+ // เปลี่ยน, so a เปลี่ยน render could never anchor a transition command.
4329
+ transition: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E1C\u0E48\u0E32\u0E19",
4124
4330
  settle: "\u0E04\u0E07\u0E17\u0E35\u0E48",
4125
4331
  measure: "\u0E27\u0E31\u0E14",
4126
4332
  async: "\u0E2D\u0E30\u0E0B\u0E34\u0E07\u0E04\u0E4C",
@@ -4321,10 +4527,13 @@ var malayDictionary = {
4321
4527
  init: "mula",
4322
4528
  clone: "klon",
4323
4529
  breakpoint: "titik-henti",
4324
- clear: "padam",
4530
+ clear: "bersihkan",
4531
+ // padam is a remove alternative in the profile
4325
4532
  close: "tutup",
4326
4533
  open: "buka",
4327
- select: "pilih"
4534
+ select: "pilih",
4535
+ socket: "soket"
4536
+ // derived from the ms profile (socket.primary); see generate-i18n-dictionaries
4328
4537
  },
4329
4538
  modifiers: {
4330
4539
  to: "ke",
@@ -4495,10 +4704,14 @@ var tagalogDictionary = {
4495
4704
  tell: "sabihin",
4496
4705
  trigger: "palitawin",
4497
4706
  send: "ipadala",
4498
- take: "kunin",
4707
+ take: "kumuha",
4708
+ // auditor: dict emitted a word the profile reads differently
4499
4709
  put: "ilagay",
4500
4710
  set: "itakda",
4501
- get: "kuhanin",
4711
+ // Align with the semantic tl profile's `get` primary (`kunin`); the previous
4712
+ // `kuhanin` is the base of fetch's `kuhanin_mula`, so the transformed `get`
4713
+ // dropped (get-value parsed degenerate). Same dict↔profile alignment as id `toggle`.
4714
+ get: "kunin",
4502
4715
  add: "idagdag",
4503
4716
  remove: "alisin",
4504
4717
  toggle: "palitan",
@@ -4522,7 +4735,7 @@ var tagalogDictionary = {
4522
4735
  throw: "ihagis",
4523
4736
  catch: "hulihin",
4524
4737
  measure: "sukatin",
4525
- transition: "baguhin",
4738
+ transition: "lumipat",
4526
4739
  increment: "dagdagan",
4527
4740
  decrement: "bawasan",
4528
4741
  default: "pamantayan",
@@ -4534,10 +4747,13 @@ var tagalogDictionary = {
4534
4747
  beep: "tunog",
4535
4748
  js: "js",
4536
4749
  async: "sabay",
4537
- render: "ipakita",
4750
+ render: "irender",
4751
+ // auditor: dict emitted a word the profile reads differently
4538
4752
  swap: "palitan_pwesto",
4539
- morph: "baguhin_hugis",
4540
- settle: "ayusin",
4753
+ morph: "baguhin",
4754
+ // auditor: dict emitted a word the profile reads differently
4755
+ settle: "magpatahimik",
4756
+ // auditor: dict emitted a word the profile reads differently
4541
4757
  append: "idagdag_sa_dulo",
4542
4758
  prepend: "idagdag_sa_simula",
4543
4759
  exit: "lumabas",
@@ -4565,7 +4781,11 @@ var tagalogDictionary = {
4565
4781
  as: "bilang",
4566
4782
  by: "sa_pamamagitan_ng",
4567
4783
  before: "bago",
4568
- after: "pagkatapos",
4784
+ // `matapos` (not `pagkatapos`) for the positional "after": `pagkatapos` is
4785
+ // also Tagalog "then", so emitting it for the position modifier collides with
4786
+ // the sequence connector. `matapos` is the unambiguous positional form and
4787
+ // matches the semantic tl profile's `after`.
4788
+ after: "matapos",
4569
4789
  over: "sa_ibabaw",
4570
4790
  under: "sa_ilalim",
4571
4791
  between: "sa_pagitan",
@@ -4725,6 +4945,8 @@ var he = {
4725
4945
  beep: "\u05D1\u05D9\u05E4",
4726
4946
  break: "\u05E9\u05D1\u05D5\u05E8",
4727
4947
  call: "\u05E7\u05E8\u05D0",
4948
+ clear: "\u05E0\u05E7\u05D4",
4949
+ // profile's clear word — was untranslated (parsed as nothing)
4728
4950
  continue: "\u05D4\u05DE\u05E9\u05DA",
4729
4951
  copy: "\u05D4\u05E2\u05EA\u05E7",
4730
4952
  decrement: "\u05D4\u05E7\u05D8\u05DF",
@@ -4737,6 +4959,7 @@ var he = {
4737
4959
  halt: "\u05E2\u05E6\u05D5\u05E8",
4738
4960
  hide: "\u05D4\u05E1\u05EA\u05E8",
4739
4961
  if: "\u05D0\u05DD",
4962
+ unless: "\u05D0\u05DC\u05D0",
4740
4963
  increment: "\u05D4\u05D2\u05D3\u05DC",
4741
4964
  install: "\u05D4\u05EA\u05E7\u05DF",
4742
4965
  js: "js",
@@ -4751,6 +4974,7 @@ var he = {
4751
4974
  render: "\u05E8\u05E0\u05D3\u05E8",
4752
4975
  repeat: "\u05D7\u05D6\u05D5\u05E8",
4753
4976
  return: "\u05D4\u05D7\u05D6\u05E8",
4977
+ scroll: "\u05D2\u05DC\u05D5\u05DC",
4754
4978
  send: "\u05E9\u05DC\u05D7",
4755
4979
  set: "\u05E7\u05D1\u05E2",
4756
4980
  settle: "\u05D4\u05EA\u05D9\u05D9\u05E6\u05D1",
@@ -4788,6 +5012,7 @@ var he = {
4788
5012
  end: "\u05E1\u05D5\u05E3",
4789
5013
  then: "\u05D0\u05D6",
4790
5014
  live: "\u05D7\u05D9",
5015
+ bind: "\u05E7\u05E9\u05D5\u05E8",
4791
5016
  changes: "\u05DE\u05E9\u05EA\u05E0\u05D4",
4792
5017
  when: "\u05DB\u05D0\u05E9\u05E8",
4793
5018
  where: "\u05D0\u05D9\u05E4\u05D4"
@@ -4806,7 +5031,9 @@ var he = {
4806
5031
  your: "\u05E9\u05DC\u05DA"
4807
5032
  },
4808
5033
  attributes: {},
4809
- expressions: {}
5034
+ expressions: {
5035
+ last: "\u05D0\u05D7\u05E8\u05D5\u05DF"
5036
+ }
4810
5037
  };
4811
5038
 
4812
5039
  // src/dictionaries/derive.ts
@@ -4880,7 +5107,11 @@ var COMMAND_KEYWORDS = [
4880
5107
  "init",
4881
5108
  // Focus
4882
5109
  "focus",
4883
- "blur"
5110
+ "blur",
5111
+ // Streaming / concurrency (postdated the original list — keep in sync with profiles)
5112
+ "socket",
5113
+ "eventsource",
5114
+ "worker"
4884
5115
  ];
4885
5116
  var MODIFIER_KEYWORDS = [
4886
5117
  "to",