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