@lokascript/i18n 2.5.1 → 2.7.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 +3 -3
  16. package/dist/index.d.ts +3 -3
  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 +9 -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
@@ -52,7 +52,7 @@ export const es: Dictionary = {
52
52
  swap: 'intercambiar',
53
53
  morph: 'transformar',
54
54
  settle: 'estabilizar',
55
- append: 'añadir',
55
+ append: 'anexar', // profile primary; 'añadir' is add's word (parsed as add)
56
56
  exit: 'salir',
57
57
  install: 'instalar',
58
58
  breakpoint: 'punto-interrupción',
@@ -192,7 +192,7 @@ export const es: Dictionary = {
192
192
  prev: 'ant',
193
193
  at: 'en',
194
194
  random: 'aleatorio',
195
- closest: 'máscercano',
195
+ closest: 'cercano',
196
196
  parent: 'padre',
197
197
  children: 'hijos',
198
198
  within: 'dentro',
@@ -16,6 +16,9 @@ export const fr: Dictionary = {
16
16
  add: 'ajouter',
17
17
  remove: 'supprimer',
18
18
  toggle: 'basculer',
19
+ // command blur (the events section has the blur EVENT word; without this
20
+ // entry the transformer fell back to it and no profile read it as the verb)
21
+ blur: 'défocaliser',
19
22
  hide: 'cacher',
20
23
  show: 'montrer',
21
24
  if: 'si',
@@ -52,7 +55,7 @@ export const fr: Dictionary = {
52
55
  swap: 'échanger',
53
56
  morph: 'transformer',
54
57
  settle: 'stabiliser',
55
- append: 'ajouter',
58
+ append: 'annexer', // profile primary; 'ajouter' is add's word (parsed as add)
56
59
  exit: 'sortir',
57
60
  install: 'installer',
58
61
  breakpoint: 'point-arrêt',
@@ -62,6 +65,7 @@ export const fr: Dictionary = {
62
65
  select: 'sélectionner',
63
66
  clone: 'cloner',
64
67
  prepend: 'préfixer',
68
+ focus: 'focaliser',
65
69
  },
66
70
 
67
71
  modifiers: {
@@ -192,7 +196,7 @@ export const fr: Dictionary = {
192
196
  prev: 'préc',
193
197
  at: 'à',
194
198
  random: 'aléatoire',
195
- closest: 'plusproche',
199
+ closest: 'proche',
196
200
  parent: 'parent',
197
201
  children: 'enfants',
198
202
  within: 'dans',
@@ -11,6 +11,7 @@ export const he: Dictionary = {
11
11
  beep: 'ביפ',
12
12
  break: 'שבור',
13
13
  call: 'קרא',
14
+ clear: 'נקה', // profile's clear word — was untranslated (parsed as nothing)
14
15
  continue: 'המשך',
15
16
  copy: 'העתק',
16
17
  decrement: 'הקטן',
@@ -23,6 +24,7 @@ export const he: Dictionary = {
23
24
  halt: 'עצור',
24
25
  hide: 'הסתר',
25
26
  if: 'אם',
27
+ unless: 'אלא',
26
28
  increment: 'הגדל',
27
29
  install: 'התקן',
28
30
  js: 'js',
@@ -37,6 +39,7 @@ export const he: Dictionary = {
37
39
  render: 'רנדר',
38
40
  repeat: 'חזור',
39
41
  return: 'החזר',
42
+ scroll: 'גלול',
40
43
  send: 'שלח',
41
44
  set: 'קבע',
42
45
  settle: 'התייצב',
@@ -77,6 +80,7 @@ export const he: Dictionary = {
77
80
  end: 'סוף',
78
81
  then: 'אז',
79
82
  live: 'חי',
83
+ bind: 'קשור',
80
84
  changes: 'משתנה',
81
85
  when: 'כאשר',
82
86
  where: 'איפה',
@@ -99,5 +103,7 @@ export const he: Dictionary = {
99
103
 
100
104
  attributes: {},
101
105
 
102
- expressions: {},
106
+ expressions: {
107
+ last: 'אחרון',
108
+ },
103
109
  };
@@ -19,10 +19,10 @@ export const hindiDictionary: Dictionary = {
19
19
  hide: 'छिपाएं',
20
20
  show: 'दिखाएं',
21
21
  if: 'अगर',
22
- unless: 'जब_तक_नहीं',
22
+ unless: 'जब तक नहीं', // spaced (not जब_तक_नहीं) → one multi-word `unless` token
23
23
  repeat: 'दोहराएं',
24
- for: 'के_लिए',
25
- while: 'जब_तक',
24
+ for: 'हेतु', // single token — के_लिए splits at _ in the hi extractor
25
+ while: 'जब तक',
26
26
  until: 'तक',
27
27
  continue: 'जारी',
28
28
  break: 'रोकें',
@@ -49,10 +49,10 @@ export const hindiDictionary: Dictionary = {
49
49
  js: 'जेएस',
50
50
  async: 'असिंक',
51
51
  render: 'रेंडर',
52
- swap: 'बदलें',
52
+ swap: 'विनिमय',
53
53
  morph: 'रूपांतर',
54
54
  settle: 'स्थिर',
55
- append: 'जोड़ें_अंत',
55
+ append: 'संलग्न',
56
56
  exit: 'बाहर',
57
57
  else: 'वरना',
58
58
  install: 'इंस्टॉल',
@@ -67,6 +67,7 @@ export const hindiDictionary: Dictionary = {
67
67
  close: 'बंद-करें',
68
68
  open: 'खोलें',
69
69
  select: 'चुनें',
70
+ socket: 'सॉकेट',
70
71
  },
71
72
 
72
73
  modifiers: {
@@ -79,8 +80,8 @@ export const hindiDictionary: Dictionary = {
79
80
  of: 'का',
80
81
  as: 'के_रूप_में',
81
82
  by: 'द्वारा',
82
- before: 'से_पहले',
83
- after: 'के_बाद',
83
+ before: 'से पहले',
84
+ after: 'के बाद',
84
85
  over: 'के_ऊपर',
85
86
  under: 'के_नीचे',
86
87
  between: 'के_बीच',
@@ -92,8 +93,10 @@ export const hindiDictionary: Dictionary = {
92
93
  events: {
93
94
  click: 'क्लिक',
94
95
  dblclick: 'डबल_क्लिक',
95
- mousedown: 'माउस_नीचे',
96
- mouseup: 'माउस_ऊपर',
96
+ // Fused (no `_`): the semantic tokenizer splits on `_`, breaking event
97
+ // recognition (mousedown → "नीचे"). Mirrors the #535 ru/uk fuse.
98
+ mousedown: 'माउसनीचे',
99
+ mouseup: 'माउसऊपर',
97
100
  mouseenter: 'माउस_प्रवेश',
98
101
  mouseleave: 'माउस_बाहर',
99
102
  mouseover: 'माउस_ओवर',
@@ -126,7 +129,11 @@ export const hindiDictionary: Dictionary = {
126
129
  not: 'नहीं',
127
130
  is: 'है',
128
131
  exists: 'मौजूद',
129
- matches: 'मेल_खाता',
132
+ // Natural spaced phrase `मेल खाता` ("matches") — how Hindi writes it. The base
133
+ // tokenizer now matches multi-word profile keywords, so the hindi profile maps
134
+ // `मेल खाता`→matches without the underscore (`मेल_खाता` split) or the
135
+ // concatenated `मेलखाता` (parsed, but unnatural) workarounds.
136
+ matches: 'मेल खाता',
130
137
  contains: 'शामिल',
131
138
  includes: 'में_है',
132
139
  equals: 'बराबर',
@@ -15,7 +15,7 @@ export const id: Dictionary = {
15
15
  get: 'dapatkan',
16
16
  add: 'tambah',
17
17
  remove: 'hapus',
18
- toggle: 'ganti',
18
+ toggle: 'alihkan',
19
19
  hide: 'sembunyikan',
20
20
  show: 'tampilkan',
21
21
  if: 'jika',
@@ -28,7 +28,10 @@ export const id: Dictionary = {
28
28
  break: 'hentikan',
29
29
  halt: 'berhenti',
30
30
  wait: 'tunggu',
31
- fetch: 'ambil',
31
+ // profile primary; 'ambil' is take's word — emitting it for fetch made every
32
+ // fetch parse as take once the fused take-event pattern came alive (the de
33
+ // holen/abrufen bug class)
34
+ fetch: 'muat',
32
35
  call: 'panggil',
33
36
  return: 'kembali',
34
37
  make: 'buat',
@@ -37,7 +40,11 @@ export const id: Dictionary = {
37
40
  catch: 'tangkap',
38
41
  measure: 'ukur',
39
42
  transition: 'transisi',
40
- increment: 'tambahkan',
43
+ // naikkan (raise), not tambahkan — tambahkan is the semantic profile's
44
+ // `add` alternative, so emitting it made increment-counter parse as ADD
45
+ // (the #373 collision family). naikkan is the profile's increment
46
+ // alternative, pairing naturally with the decrement side.
47
+ increment: 'naikkan',
41
48
  decrement: 'kurangi',
42
49
  default: 'bawaan',
43
50
  go: 'pergi',
@@ -48,15 +55,15 @@ export const id: Dictionary = {
48
55
  beep: 'bunyi',
49
56
  js: 'js',
50
57
  async: 'asinkron',
51
- render: 'tampilkan',
58
+ render: 'olah', // auditor: dict emitted a word the profile reads differently
52
59
  swap: 'tukar',
53
- morph: 'ubah_bentuk',
54
- settle: 'stabil',
55
- append: 'tambah_akhir',
60
+ morph: 'ubah', // auditor: dict emitted a word the profile reads differently
61
+ settle: 'stabilkan', // auditor: dict emitted a word the profile reads differently
62
+ append: 'sisipkan', // profile primary; 'tambah_akhir' splits and is unrecognized
56
63
  exit: 'keluar',
57
64
  install: 'pasang',
58
65
  breakpoint: 'titik-henti',
59
- clear: 'hapus',
66
+ clear: 'bersihkan', // hapus is the remove PRIMARY in the profile
60
67
  close: 'tutup',
61
68
  open: 'buka',
62
69
  select: 'pilih',
@@ -19,7 +19,7 @@ export const it: Dictionary = {
19
19
  hide: 'nascondere',
20
20
  show: 'mostrare',
21
21
  if: 'se',
22
- unless: 'a meno che',
22
+ unless: 'salvo',
23
23
  repeat: 'ripetere',
24
24
  for: 'per',
25
25
  while: 'mentre',
@@ -52,7 +52,7 @@ export const it: Dictionary = {
52
52
  swap: 'scambiare',
53
53
  morph: 'trasformare',
54
54
  settle: 'stabilizzare',
55
- append: 'aggiungere',
55
+ append: 'accodare', // profile primary; 'aggiungere' is add's word (parsed as add)
56
56
  exit: 'uscire',
57
57
  install: 'installare',
58
58
  breakpoint: 'punto-interruzione',
@@ -62,6 +62,9 @@ export const it: Dictionary = {
62
62
  select: 'selezionare',
63
63
  clone: 'clonare',
64
64
  prepend: 'anteporre',
65
+ // profile primary; without a commands entry the transformer fell back to
66
+ // the EVENTS noun 'fuoco', which generated focus patterns can't match
67
+ focus: 'focalizzare',
65
68
  },
66
69
 
67
70
  modifiers: {
@@ -192,7 +195,7 @@ export const it: Dictionary = {
192
195
  prev: 'prec',
193
196
  at: 'a',
194
197
  random: 'casuale',
195
- closest: 'piùvicino',
198
+ closest: 'vicino',
196
199
  parent: 'genitore',
197
200
  children: 'figli',
198
201
  within: 'dentro',
@@ -19,7 +19,7 @@ export const ja: Dictionary = {
19
19
  hide: '隠す',
20
20
  show: '表示',
21
21
  if: 'もし',
22
- unless: 'でなければ',
22
+ unless: 'ない限り', // not でなければ — leading で particle shatters the marker
23
23
  repeat: '繰り返し',
24
24
  for: 'ために',
25
25
  while: 'の間',
@@ -28,7 +28,7 @@ export const ja: Dictionary = {
28
28
  break: '中断',
29
29
  halt: '停止',
30
30
  wait: '待つ',
31
- fetch: '取得',
31
+ fetch: 'フェッチ',
32
32
  call: '呼び出し',
33
33
  return: '戻る',
34
34
  make: '作る',
@@ -53,7 +53,11 @@ export const ja: Dictionary = {
53
53
  morph: '変形',
54
54
  settle: '安定',
55
55
  append: '末尾追加',
56
- exit: '終了',
56
+ // 終了 → 退出: realigned to the semantic profile primary (ja.ts `exit: 退出`).
57
+ // 終了 was the historic exit/end collision word (see isEndKeyword's ja note);
58
+ // rendered as 終了 it tokenized as a plain identifier, so a guard-clause
59
+ // `exit` inside `if … end` never parsed (behavior-sortable ja).
60
+ exit: '退出',
57
61
  install: 'インストール',
58
62
  breakpoint: 'ブレークポイント',
59
63
  clear: 'クリア',
@@ -62,6 +66,7 @@ export const ja: Dictionary = {
62
66
  select: '選択',
63
67
  clone: '複製',
64
68
  prepend: '先頭追加',
69
+ socket: 'ソケット',
65
70
  },
66
71
 
67
72
  modifiers: {
@@ -113,7 +118,7 @@ export const ja: Dictionary = {
113
118
  },
114
119
 
115
120
  logical: {
116
- when: 'とき',
121
+ when: '時',
117
122
  where: 'どこ',
118
123
  and: 'そして',
119
124
  or: 'または',
@@ -131,6 +136,7 @@ export const ja: Dictionary = {
131
136
  otherwise: 'そうでなければ',
132
137
  end: '終わり',
133
138
  live: 'ライブ',
139
+ bind: 'バインド',
134
140
  changes: '変わったら',
135
141
  },
136
142
 
@@ -19,9 +19,9 @@ export const ko: Dictionary = {
19
19
  hide: '숨기다',
20
20
  show: '보이다',
21
21
  if: '만약',
22
- unless: '아니면',
22
+ unless: '아니라면', // distinct from else `아니면` (line ~131) — was a homonym
23
23
  repeat: '반복',
24
- for: '동안',
24
+ for: '각각', // profile's for word — 동안 is while (collision)
25
25
  while: '동안',
26
26
  until: '까지',
27
27
  continue: '계속',
@@ -52,8 +52,11 @@ export const ko: Dictionary = {
52
52
  swap: '교환',
53
53
  morph: '변형',
54
54
  settle: '안정',
55
- append: '추가',
56
- exit: '종료',
55
+ append: '덧붙이다', // profile primary; '추가' is add's word (parsed as add)
56
+ // 종료 → 나가기: realigned to the semantic profile primary (ko.ts `exit: 나가기`,
57
+ // whose comment already flags the 종료 end-collision). Rendered as 종료 it
58
+ // tokenized as a plain identifier, so a guard-clause `exit` never parsed.
59
+ exit: '나가기',
57
60
  install: '설치',
58
61
  breakpoint: '중단점',
59
62
  clear: '지우기',
@@ -62,6 +65,7 @@ export const ko: Dictionary = {
62
65
  select: '선택',
63
66
  clone: '복제',
64
67
  prepend: '앞에추가',
68
+ socket: '소켓',
65
69
  },
66
70
 
67
71
  modifiers: {
@@ -131,6 +135,7 @@ export const ko: Dictionary = {
131
135
  otherwise: '그렇지않으면',
132
136
  end: '끝',
133
137
  live: '라이브',
138
+ bind: '바인드',
134
139
  changes: '변경되면',
135
140
  },
136
141
 
@@ -63,10 +63,11 @@ export const malayDictionary: Dictionary = {
63
63
  init: 'mula',
64
64
  clone: 'klon',
65
65
  breakpoint: 'titik-henti',
66
- clear: 'padam',
66
+ clear: 'bersihkan', // padam is a remove alternative in the profile
67
67
  close: 'tutup',
68
68
  open: 'buka',
69
69
  select: 'pilih',
70
+ socket: 'soket', // derived from the ms profile (socket.primary); see generate-i18n-dictionaries
70
71
  },
71
72
 
72
73
  modifiers: {
@@ -7,15 +7,22 @@ export const pl: Dictionary = {
7
7
  commands: {
8
8
  on: 'gdy',
9
9
  tell: 'powiedz',
10
- trigger: 'wywołaj',
10
+ trigger: 'wyzwól', // auditor: dict emitted a word the profile reads differently
11
11
  send: 'wyślij',
12
12
  take: 'weź',
13
13
  put: 'umieść',
14
14
  set: 'ustaw',
15
- get: 'pobierz',
15
+ // `uzyskaj` (the semantic pl profile's get primary), not `pobierz`: pl `pobierz`
16
+ // ("download") is the profile's FETCH primary, so emitting it for get made the
17
+ // parser read every transformed get as fetch (get-value lossy + a phantom fetch).
18
+ // Same dict↔profile homonym disambiguation as tr load/install, qu get.
19
+ get: 'uzyskaj',
16
20
  add: 'dodaj',
17
21
  remove: 'usuń',
18
22
  toggle: 'przełącz',
23
+ // command blur (the events section has the blur EVENT word; without this
24
+ // entry the transformer fell back to it and no profile read it as the verb)
25
+ blur: 'rozmyj',
19
26
  hide: 'ukryj',
20
27
  show: 'pokaż',
21
28
  if: 'jeśli',
@@ -56,12 +63,13 @@ export const pl: Dictionary = {
56
63
  exit: 'wyjdź',
57
64
  install: 'zainstaluj',
58
65
  breakpoint: 'punkt-przerwania',
59
- clear: 'wyczyść',
66
+ clear: 'zeruj', // wyczyść is a remove alternative in the profile
60
67
  close: 'zamknij',
61
68
  open: 'otwórz',
62
69
  select: 'wybierz',
63
70
  clone: 'sklonuj',
64
71
  prepend: 'poprzedź',
72
+ focus: 'skup',
65
73
  },
66
74
 
67
75
  modifiers: {
@@ -16,17 +16,21 @@ export const pt: Dictionary = {
16
16
  add: 'adicionar',
17
17
  remove: 'remover',
18
18
  toggle: 'alternar',
19
+ // command blur (the events section has the blur EVENT word; without this
20
+ // entry the transformer fell back to it and no profile read it as the verb)
21
+ blur: 'desfocar',
19
22
  hide: 'esconder',
20
23
  show: 'mostrar',
21
24
  if: 'se',
22
- unless: 'a_menos',
25
+ unless: 'salvo', // a_menos splits at _ in the pt extractor (see profile)
23
26
  repeat: 'repetir',
24
27
  for: 'para',
25
28
  while: 'enquanto',
26
29
  until: 'até',
27
30
  continue: 'continuar',
28
- break: 'parar',
29
- halt: 'interromper',
31
+ // un-crossed: the profile/tokenizer read parar=halt, interromper=break
32
+ break: 'interromper',
33
+ halt: 'parar',
30
34
  wait: 'esperar',
31
35
  fetch: 'buscar',
32
36
  call: 'chamar',
@@ -62,6 +66,8 @@ export const pt: Dictionary = {
62
66
  select: 'selecionar',
63
67
  clone: 'clonar',
64
68
  prepend: 'preceder',
69
+ focus: 'focar',
70
+ socket: 'soquete',
65
71
  },
66
72
 
67
73
  modifiers: {
@@ -192,7 +198,7 @@ export const pt: Dictionary = {
192
198
  prev: 'ant',
193
199
  at: 'em',
194
200
  random: 'aleatório',
195
- closest: 'mais_próximo',
201
+ closest: 'maispróximo',
196
202
  parent: 'pai',
197
203
  children: 'filhos',
198
204
  within: 'dentro',
@@ -9,20 +9,31 @@ export const qu: Dictionary = {
9
9
  tell: 'niy',
10
10
  trigger: 'kichay',
11
11
  send: 'kachay',
12
- take: 'hurquy',
12
+ take: 'hapiy', // auditor: dict emitted a word the profile reads differently
13
13
  put: 'churay',
14
- set: 'churay',
15
- get: 'chaskiy',
14
+ // churay is the semantic qu profile's `put` primary; `set` is churanay. Emitting
15
+ // churay for set made the semantic parser read a transformed `set` as `put`.
16
+ // See ZH_BLOCK_BODY_SCOPE.md (#2 sweep — keyword realignment, cf. zh fetch).
17
+ set: 'churanay',
18
+ // Align with the semantic quechua profile's `get` primary (`taripay`); the
19
+ // previous `chaskiy` had no profile entry, so the transformed `get` dropped
20
+ // (get-value parsed degenerate). Same dict↔profile alignment as id `toggle`.
21
+ get: 'taripay',
16
22
  add: 'yapay',
17
23
  remove: 'qichuy',
18
24
  toggle: 'tikray',
19
25
  hide: 'pakay',
20
26
  show: 'rikuchiy',
21
27
  if: 'sichus',
22
- unless: 'mana_sichus',
23
- repeat: 'kutichiy',
24
- for: 'rayku',
25
- while: 'kay_kaq',
28
+ unless: 'mana sichus', // spaced phrase ("if not"); `_` form split to `mana`+`sichus`(=if) at parse time
29
+ repeat: 'kutipay',
30
+ for: 'sapankaq', // profile's for word — rayku doubles as `by`
31
+ // `kaykamaqa` (the semantic qu profile's while primary), not `kay_kaq`: the
32
+ // `_` form is unknown to the profile (and `_` words split at parse time, cf.
33
+ // qhipaman_yapay), so the fronted repeat-while head never formed a `while`
34
+ // node — the condition dropped wholesale. Same dict↔profile alignment as
35
+ // vi render / de abrufen.
36
+ while: 'kaykamaqa',
26
37
  until: 'hayk_akama',
27
38
  continue: 'purichiy',
28
39
  break: 'p_akiy',
@@ -32,12 +43,18 @@ export const qu: Dictionary = {
32
43
  call: 'qayay',
33
44
  return: 'kutimuy',
34
45
  make: 'ruray',
35
- log: 'qillqay',
46
+ // qillqay is the semantic qu profile's `copy` primary; `log` is qillqakuy.
47
+ // Emitting qillqay for log made the parser read every transformed log as
48
+ // copy (log-value/log-element/get-value lossy) — same realign as set above.
49
+ log: 'qillqakuy',
36
50
  throw: 'wikchuy',
37
51
  catch: 'hapsiy',
38
52
  measure: 'tupuy',
39
- transition: 'tikray',
40
- increment: 'yapay',
53
+ // pasay, not tikray: the semantic qu profile's toggle keyword is
54
+ // t'ikray/tikray, so a tikray render collided with toggle and the
55
+ // transition command never anchored (sw kama precedent, #569).
56
+ transition: 'pasay',
57
+ increment: 'yapachiy',
41
58
  decrement: 'pisiyachiy',
42
59
  default: 'ñawpaq_kaq',
43
60
  go: 'riy',
@@ -48,13 +65,13 @@ export const qu: Dictionary = {
48
65
  beep: 'waqay',
49
66
  js: 'js',
50
67
  async: 'mana_suyaspa',
51
- render: 'rikuchiy',
52
- swap: 'rantin_tikray',
53
- morph: 'tikrachiy',
54
- settle: 'tiyay',
55
- append: 'qhipaman_yapay',
68
+ render: 'rikurichiy', // auditor: dict emitted a word the profile reads differently
69
+ swap: "t'inkuy", // profile primary; 'rantin_tikray' splits, 'tikray' is toggle's word
70
+ morph: 'tukunay', // auditor: dict emitted a word the profile reads differently
71
+ settle: 'tiyakuy', // auditor: dict emitted a word the profile reads differently
72
+ append: 'qatichiy', // profile's append primary (single token); `qhipaman_yapay` `_`-split to qhipaman+yapay(=add) at parse time
56
73
  exit: 'lluqsiy',
57
- install: 'churay',
74
+ install: 'tarpuy',
58
75
  breakpoint: 'sayachinay',
59
76
  clear: 'pichay',
60
77
  close: 'wichqay',
@@ -62,6 +79,7 @@ export const qu: Dictionary = {
62
79
  select: 'akllay',
63
80
  clone: 'kikinchay',
64
81
  prepend: 'ñawpachiy',
82
+ socket: 'tinkina',
65
83
  },
66
84
 
67
85
  modifiers: {
@@ -86,8 +104,10 @@ export const qu: Dictionary = {
86
104
  events: {
87
105
  click: 'ñitiy',
88
106
  dblclick: 'iskay_ñitiy',
89
- mousedown: 'rat_ñitiy',
90
- mouseup: 'rat_huqariy',
107
+ // Fused (no `_`): the semantic tokenizer splits on `_` — and `rat_ñitiy` then
108
+ // mis-captured as the `click` event (ñitiy→click). Mirrors the #535 ru/uk fuse.
109
+ mousedown: 'ratñitiy',
110
+ mouseup: 'rathuqariy',
91
111
  mouseenter: 'rat_yaykuy',
92
112
  mouseleave: 'rat_lluqsiy',
93
113
  mouseover: 'rat_hawapi',
@@ -127,7 +147,11 @@ export const qu: Dictionary = {
127
147
  has: 'kachkan',
128
148
  have: 'kachkani',
129
149
  then: 'chayqa',
130
- else: 'mana_chayqa',
150
+ // Align to the semantic profile's else word `manachus`. The old `mana_chayqa`
151
+ // tokenized as `mana`(false) + `_` + `chayqa`(then) — no else keyword formed,
152
+ // so qu conditionals never split their else branch. `manachus` is a single
153
+ // token the profile-derived keyword map reads as `else` (dict↔profile align).
154
+ else: 'manachus',
131
155
  otherwise: 'huk_kaqpi',
132
156
  end: 'tukuy',
133
157
  live: 'kawsay',
@@ -152,7 +176,7 @@ export const qu: Dictionary = {
152
176
  values: {
153
177
  true: 'cheqaq',
154
178
  false: 'llulla',
155
- null: 'ch_usaq',
179
+ null: 'chusaq',
156
180
  undefined: 'mana_riqsisqa',
157
181
  it: 'chay',
158
182
  its: 'chaypaq',
@@ -192,12 +216,12 @@ export const qu: Dictionary = {
192
216
  prev: 'ñawpaq',
193
217
  at: 'pi',
194
218
  random: 'imaymanata',
195
- closest: 'aswan_kaylla',
219
+ closest: 'kaylla',
196
220
  parent: 'mama_tayta',
197
221
  children: 'wawakuna',
198
222
  within: 'ukupi',
199
223
  no: 'mana_kanchu',
200
- empty: 'ch_usaq',
224
+ empty: 'chusaq',
201
225
  some: 'wakin',
202
226
  'starts with': 'qallarisqa wan',
203
227
  'ends with': 'tukusqa wan',
@@ -7,7 +7,7 @@ export const russianDictionary: Dictionary = {
7
7
  commands: {
8
8
  on: 'при',
9
9
  tell: 'сказать',
10
- trigger: 'вызвать',
10
+ trigger: 'запустить', // auditor: dict emitted a word the profile reads differently
11
11
  send: 'отправить',
12
12
  take: 'взять',
13
13
  put: 'положить',
@@ -18,8 +18,12 @@ export const russianDictionary: Dictionary = {
18
18
  toggle: 'переключить',
19
19
  hide: 'скрыть',
20
20
  show: 'показать',
21
+ // command verb; the events section keeps the noun прокрутка for `on scroll`.
22
+ // Without this entry the transformer fell back to the event noun, which the
23
+ // parser doesn't read as the scroll command (#321 focus family).
24
+ scroll: 'прокрутить',
21
25
  if: 'если',
22
- unless: 'если_не',
26
+ unless: 'кроме',
23
27
  repeat: 'повторить',
24
28
  for: 'для',
25
29
  while: 'пока',
@@ -52,10 +56,10 @@ export const russianDictionary: Dictionary = {
52
56
  swap: 'поменять',
53
57
  morph: 'трансформировать',
54
58
  settle: 'стабилизировать',
55
- append: 'добавить_в_конец',
59
+ append: 'дописать', // profile alternative; the compound splits and добавить parses as add
56
60
  exit: 'выйти',
57
61
  else: 'иначе',
58
- install: 'установить',
62
+ install: 'инсталлировать', // loanword — `установить` is `set` (homonym); see russian profile
59
63
  init: 'инициализировать',
60
64
  behavior: 'поведение',
61
65
  focus: 'сфокусировать',
@@ -92,8 +96,11 @@ export const russianDictionary: Dictionary = {
92
96
  events: {
93
97
  click: 'клик',
94
98
  dblclick: 'двойной_клик',
95
- mousedown: 'мышь_вниз',
96
- mouseup: 'мышь_вверх',
99
+ // Fused (no `_`): the semantic tokenizer splits on `_`, so an underscore form
100
+ // breaks event recognition (mousedown → bare expression). Mirrors the #510 tr
101
+ // resize fix (boyut_değiştir → boyutlandırma) and the enyakın superlative.
102
+ mousedown: 'мышьвниз',
103
+ mouseup: 'мышьвверх',
97
104
  mouseenter: 'мышь_вход',
98
105
  mouseleave: 'мышь_выход',
99
106
  mouseover: 'наведение',
@@ -110,7 +117,7 @@ export const russianDictionary: Dictionary = {
110
117
  reset: 'сброс',
111
118
  load: 'загрузка',
112
119
  unload: 'выгрузка',
113
- resize: 'изменение_размера',
120
+ resize: 'изменениеразмера', // fused (no `_`) — see mousedown note above
114
121
  scroll: 'прокрутка',
115
122
  touchstart: 'касание_начало',
116
123
  touchend: 'касание_конец',