@lokascript/i18n 2.7.2 → 2.8.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 (60) hide show
  1. package/README.md +1 -1
  2. package/dist/browser.cjs +649 -180
  3. package/dist/browser.cjs.map +1 -1
  4. package/dist/browser.d.cts +2 -2
  5. package/dist/browser.d.ts +2 -2
  6. package/dist/browser.js +649 -180
  7. package/dist/browser.js.map +1 -1
  8. package/dist/dictionaries/index.cjs +370 -174
  9. package/dist/dictionaries/index.cjs.map +1 -1
  10. package/dist/dictionaries/index.js +370 -174
  11. package/dist/dictionaries/index.js.map +1 -1
  12. package/dist/index.cjs +649 -180
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +35 -35
  15. package/dist/index.d.ts +35 -35
  16. package/dist/index.js +649 -180
  17. package/dist/index.js.map +1 -1
  18. package/dist/lokascript-i18n.min.js +1 -1
  19. package/dist/lokascript-i18n.min.js.map +1 -1
  20. package/dist/lokascript-i18n.mjs +678 -175
  21. package/dist/lokascript-i18n.mjs.map +1 -1
  22. package/dist/plugins/vite.cjs +370 -174
  23. package/dist/plugins/vite.cjs.map +1 -1
  24. package/dist/plugins/vite.js +370 -174
  25. package/dist/plugins/vite.js.map +1 -1
  26. package/dist/plugins/webpack.cjs +370 -174
  27. package/dist/plugins/webpack.cjs.map +1 -1
  28. package/dist/plugins/webpack.js +370 -174
  29. package/dist/plugins/webpack.js.map +1 -1
  30. package/dist/{transformer-DM7iplCU.d.cts → transformer--W46PGaW.d.cts} +8 -0
  31. package/dist/{transformer-BA8YX9u1.d.ts → transformer-FU06J6kG.d.ts} +8 -0
  32. package/package.json +7 -9
  33. package/src/dictionaries/ar.ts +20 -15
  34. package/src/dictionaries/bn.ts +10 -5
  35. package/src/dictionaries/de.ts +20 -8
  36. package/src/dictionaries/es.ts +10 -5
  37. package/src/dictionaries/fr.ts +15 -6
  38. package/src/dictionaries/he.ts +4 -0
  39. package/src/dictionaries/hi.ts +3 -2
  40. package/src/dictionaries/id.ts +31 -16
  41. package/src/dictionaries/it.ts +11 -4
  42. package/src/dictionaries/ja.ts +23 -15
  43. package/src/dictionaries/ko.ts +10 -5
  44. package/src/dictionaries/ms.ts +4 -1
  45. package/src/dictionaries/pl.ts +12 -5
  46. package/src/dictionaries/pt.ts +10 -5
  47. package/src/dictionaries/qu.ts +30 -19
  48. package/src/dictionaries/ru.ts +5 -2
  49. package/src/dictionaries/sw.ts +29 -14
  50. package/src/dictionaries/th.ts +5 -2
  51. package/src/dictionaries/tl.ts +4 -1
  52. package/src/dictionaries/tr.ts +24 -16
  53. package/src/dictionaries/uk.ts +5 -2
  54. package/src/dictionaries/vi.ts +23 -17
  55. package/src/dictionaries/zh.ts +24 -9
  56. package/src/grammar/grammar.test.ts +152 -0
  57. package/src/grammar/profiles/index.ts +316 -1
  58. package/src/grammar/transformer.ts +64 -1
  59. package/src/new-languages.test.ts +9 -3
  60. package/src/positional-keyword-drift.test.ts +6 -19
@@ -907,6 +907,14 @@ declare class GrammarTransformer {
907
907
  * Transform a single hyperscript statement (no compound "then" chains).
908
908
  */
909
909
  private transformSingle;
910
+ /**
911
+ * `<command …> end` fragments: transform the command without its stranded
912
+ * terminator, then re-append the translated terminator as a standalone
913
+ * trailing token. Fragments that open a block of their own (`if … end`,
914
+ * `repeat … end`, `js … end`) bail — their terminator belongs to them and
915
+ * their dedicated paths handle it.
916
+ */
917
+ private transformWithTrailingEnd;
910
918
  /**
911
919
  * Detect and transform an inline JS block (`[on <event>] js <raw js> end`).
912
920
  *
@@ -907,6 +907,14 @@ declare class GrammarTransformer {
907
907
  * Transform a single hyperscript statement (no compound "then" chains).
908
908
  */
909
909
  private transformSingle;
910
+ /**
911
+ * `<command …> end` fragments: transform the command without its stranded
912
+ * terminator, then re-append the translated terminator as a standalone
913
+ * trailing token. Fragments that open a block of their own (`if … end`,
914
+ * `repeat … end`, `js … end`) bail — their terminator belongs to them and
915
+ * their dedicated paths handle it.
916
+ */
917
+ private transformWithTrailingEnd;
910
918
  /**
911
919
  * Detect and transform an inline JS block (`[on <event>] js <raw js> end`).
912
920
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokascript/i18n",
3
- "version": "2.7.2",
3
+ "version": "2.8.0",
4
4
  "description": "Grammar transformation and keyword translation for hyperscript",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -41,8 +41,7 @@
41
41
  "test:check": "VITEST_QUIET=1 bash ../../scripts/vitest-run.sh --reporter=dot",
42
42
  "test:coverage": "bash ../../scripts/vitest-run.sh --coverage",
43
43
  "typecheck": "tsc --noEmit",
44
- "lint": "eslint src --ext ts,tsx",
45
- "validate-dictionaries": "node scripts/validate-dictionaries.js"
44
+ "validate-dictionaries": "npx tsx ../testing-framework/src/vocab/cli.ts validate --check V1,V1b --warn-only"
46
45
  },
47
46
  "browser": "dist/lokascript-i18n.min.js",
48
47
  "sideEffects": false,
@@ -65,11 +64,11 @@
65
64
  },
66
65
  "homepage": "https://github.com/codetalcott/hyperfixi/tree/main/packages/i18n#readme",
67
66
  "dependencies": {
68
- "@hyperfixi/core": "^2.7.2",
69
- "@lokascript/semantic": "^2.7.2",
67
+ "@hyperfixi/core": "^2.8.0",
68
+ "@lokascript/semantic": "^2.8.0",
70
69
  "esbuild": "^0.28.0",
71
- "happy-dom": "^20.8.9",
72
- "vite": "^7.1.12"
70
+ "happy-dom": "^20.10.6",
71
+ "vite": "^8.1.4"
73
72
  },
74
73
  "devDependencies": {
75
74
  "@rollup/plugin-node-resolve": "^16.0.1",
@@ -77,8 +76,7 @@
77
76
  "@rollup/plugin-typescript": "^12.1.2",
78
77
  "@types/node": "^20.0.0",
79
78
  "@vitest/coverage-v8": "^4.0.0",
80
- "eslint": "^8.0.0",
81
- "rollup": "^4.60.2",
79
+ "rollup": "^4.62.2",
82
80
  "tsup": "^8.0.0",
83
81
  "typescript": "^5.0.0",
84
82
  "vitest": "^4.1.5"
@@ -62,7 +62,7 @@ export const ar: Dictionary = {
62
62
  clear: 'نظّف', // امسح is a remove alternative in the profile
63
63
  close: 'أغلق',
64
64
  open: 'افتح',
65
- select: 'اختر',
65
+ select: 'ظلل', // Batch 3: اختر is the pick keyword — bare select rendered with it parses null
66
66
  clone: 'استنسخ',
67
67
  prepend: 'سبق',
68
68
  socket: 'مقبس',
@@ -89,31 +89,33 @@ export const ar: Dictionary = {
89
89
 
90
90
  events: {
91
91
  click: 'نقر',
92
- dblclick: 'نقر مزدوج',
93
- mousedown: 'فأرة أسفل',
94
- mouseup: 'فأرة أعلى',
95
- mouseenter: 'فأرة دخول',
96
- mouseleave: 'فأرة خروج',
92
+ // V3c burn-down (2026-07-14): English passthrough — no native form round-trips
93
+ // on the parse side (probe: split forms shatter, fused forms capture verbatim).
94
+ dblclick: 'dblclick',
95
+ mousedown: 'mousedown',
96
+ mouseup: 'mouseup',
97
+ mouseenter: 'mouseenter',
98
+ mouseleave: 'mouseleave',
97
99
  mouseover: 'فأرة فوق',
98
- mouseout: 'فأرة خارج',
99
- mousemove: 'فأرة تحرك',
100
+ mouseout: 'mouseout',
101
+ mousemove: 'mousemove',
100
102
  keydown: 'مفتاح أسفل',
101
103
  keyup: 'مفتاح أعلى',
102
- keypress: 'مفتاح ضغط',
104
+ keypress: 'keypress',
103
105
  focus: 'تركيز',
104
106
  blur: 'ضبابية',
105
107
  change: 'تغيير',
106
108
  input: 'إدخال',
107
109
  submit: 'إرسال',
108
- reset: 'إعادة تعيين',
110
+ reset: 'reset',
109
111
  load: 'تحميل',
110
- unload: 'إلغاء تحميل',
112
+ unload: 'unload',
111
113
  resize: 'تغيير حجم',
112
114
  scroll: 'تمرير',
113
- touchstart: 'بداية لمس',
114
- touchend: 'نهاية لمس',
115
- touchmove: 'تحرك لمس',
116
- touchcancel: 'إلغاء لمس',
115
+ touchstart: 'touchstart',
116
+ touchend: 'touchend',
117
+ touchmove: 'touchmove',
118
+ touchcancel: 'touchcancel',
117
119
  },
118
120
 
119
121
  logical: {
@@ -190,6 +192,9 @@ export const ar: Dictionary = {
190
192
  },
191
193
 
192
194
  expressions: {
195
+ characters: 'حروف',
196
+ inclusive: 'شامل',
197
+ exclusive: 'حصري',
193
198
  first: 'أول',
194
199
  last: 'آخر',
195
200
  next: 'التالي',
@@ -47,7 +47,7 @@ export const bengaliDictionary: Dictionary = {
47
47
  init: 'শুরু',
48
48
  behavior: 'আচরণ',
49
49
  install: 'ইনস্টল',
50
- clone: 'কপি',
50
+ clone: 'ক্লোন', // Batch 3: কপি is the copy verb — rendered clone parsed as action=copy
51
51
  swap: 'বদল',
52
52
  morph: 'রূপান্তর',
53
53
  beep: 'বীপ',
@@ -96,10 +96,12 @@ export const bengaliDictionary: Dictionary = {
96
96
  focus: 'ফোকাস',
97
97
  blur: 'ঝাপসা',
98
98
  reset: 'রিসেট',
99
- keydown: 'কি-ডাউন',
100
- keyup: 'কি-আপ',
101
- mouseover: 'মাউস-ওভার',
102
- mouseout: 'মাউস-আউট',
99
+ keydown: 'keydown',
100
+ keyup: 'keyup',
101
+ // V3c burn-down (2026-07-14): English passthrough — no native form round-trips
102
+ // on the parse side (probe: split forms shatter, fused forms capture verbatim).
103
+ mouseover: 'mouseover',
104
+ mouseout: 'mouseout',
103
105
  scroll: 'স্ক্রোল',
104
106
  resize: 'রিসাইজ',
105
107
  every: 'প্রতি',
@@ -166,6 +168,9 @@ export const bengaliDictionary: Dictionary = {
166
168
  },
167
169
 
168
170
  expressions: {
171
+ characters: 'অক্ষর',
172
+ inclusive: 'অন্তর্ভুক্ত',
173
+ exclusive: 'বাদ',
169
174
  first: 'প্রথম',
170
175
  last: 'শেষ',
171
176
  next: 'পরবর্তী',
@@ -67,7 +67,7 @@ export const de: Dictionary = {
67
67
  clear: 'bereinigen', // löschen is a remove alternative in the profile
68
68
  close: 'schließen',
69
69
  open: 'öffnen',
70
- select: 'auswählen',
70
+ select: 'markieren', // Batch 3: auswählen is the pick keyword — bare select rendered with it parses null
71
71
  clone: 'klonen',
72
72
  prepend: 'voranstellen',
73
73
  focus: 'fokussieren',
@@ -95,18 +95,27 @@ export const de: Dictionary = {
95
95
  events: {
96
96
  click: 'klick',
97
97
  dblclick: 'doppelklick',
98
- mousedown: 'mausunten',
99
- mouseup: 'mausoben',
98
+ // mousedown/mouseup: English passthrough — no native form round-trips on the
99
+ // parse side (V3c probe 2026-07-14: fused forms captured verbatim, split forms
100
+ // shattered to their first word — live broken listeners in repeat-until-event).
101
+ // The Batch-2 id-keyup precedent; revisit if S5b + tokenizer gain native entries.
102
+ mousedown: 'mousedown',
103
+ mouseup: 'mouseup',
100
104
  mouseenter: 'mauseintreten',
101
105
  mouseleave: 'mausverlassen',
102
- mouseover: 'mausüber',
103
- mouseout: 'maushinaus',
106
+ // V3 Batch 2: fused/dead event words realigned to the de tokenizer's
107
+ // registered forms (S5b's `maus über`/`taste runter` are aspirational — they
108
+ // do not tokenize; `mausüber` etc. captured event=expression:undefined).
109
+ mouseover: 'maus drüber',
110
+ mouseout: 'maus weg',
104
111
  mousemove: 'mausbewegen',
105
- keydown: 'tasteunten',
106
- keyup: 'tasteoben',
112
+ keydown: 'taste unten',
113
+ keyup: 'taste oben',
107
114
  keypress: 'tastedrücken',
108
115
  focus: 'fokus',
109
- blur: 'unscharf',
116
+ // matches commands.blur (which shadows this at render time) and the live
117
+ // corpus render; `unscharf` was dead vocab that captured no event
118
+ blur: 'defokussieren',
110
119
  change: 'ändern',
111
120
  input: 'eingabe',
112
121
  submit: 'absenden',
@@ -194,6 +203,9 @@ export const de: Dictionary = {
194
203
  },
195
204
 
196
205
  expressions: {
206
+ characters: 'Zeichen',
207
+ inclusive: 'inklusiv',
208
+ exclusive: 'exklusiv',
197
209
  first: 'erste',
198
210
  last: 'letzte',
199
211
  next: 'nächste',
@@ -90,17 +90,19 @@ export const es: Dictionary = {
90
90
  mouseup: 'ratónarriba',
91
91
  mouseenter: 'ratónentrar',
92
92
  mouseleave: 'ratónsalir',
93
- mouseover: 'ratónencima',
94
- mouseout: 'ratónfuera',
93
+ // V3 Batch 2: fused forms split to the S5b/tokenizer-known forms (the fused
94
+ // spellings captured event=expression:undefined — broken listeners)
95
+ mouseover: 'ratón encima',
96
+ mouseout: 'ratón fuera',
95
97
  mousemove: 'ratónmover',
96
- keydown: 'teclaabajo',
97
- keyup: 'teclaarriba',
98
+ keydown: 'tecla abajo',
99
+ keyup: 'tecla arriba',
98
100
  keypress: 'teclapresar',
99
101
  focus: 'enfocar',
100
102
  blur: 'desenfocar',
101
103
  change: 'cambiar',
102
104
  input: 'entrada',
103
- submit: 'enviar',
105
+ submit: 'envío', // Batch 3: enviar is the send verb — on-submit listener captured event "send"
104
106
  reset: 'reiniciar',
105
107
  load: 'cargar',
106
108
  unload: 'descargar',
@@ -185,6 +187,9 @@ export const es: Dictionary = {
185
187
  },
186
188
 
187
189
  expressions: {
190
+ characters: 'caracteres',
191
+ inclusive: 'inclusivo',
192
+ exclusive: 'exclusivo',
188
193
  first: 'primero',
189
194
  last: 'último',
190
195
  next: 'siguiente',
@@ -90,15 +90,21 @@ export const fr: Dictionary = {
90
90
  events: {
91
91
  click: 'clic',
92
92
  dblclick: 'doubleclic',
93
- mousedown: 'sourisappuyée',
94
- mouseup: 'sourisrelâchée',
93
+ // mousedown/mouseup: English passthrough — no native form round-trips on the
94
+ // parse side (V3c probe 2026-07-14: fused forms captured verbatim, split forms
95
+ // shattered to their first word — live broken listeners in repeat-until-event).
96
+ // The Batch-2 id-keyup precedent; revisit if S5b + tokenizer gain native entries.
97
+ mousedown: 'mousedown',
98
+ mouseup: 'mouseup',
95
99
  mouseenter: 'sourisentrer',
96
100
  mouseleave: 'sourissortir',
97
- mouseover: 'sourissur',
98
- mouseout: 'sourisdehors',
101
+ // V3 Batch 2: fused forms split to the S5b/tokenizer-known forms (the fused
102
+ // spellings captured event=expression:undefined — broken listeners)
103
+ mouseover: 'souris dessus',
104
+ mouseout: 'souris dehors',
99
105
  mousemove: 'sourisbouger',
100
- keydown: 'toucheappuyée',
101
- keyup: 'toucherelâchée',
106
+ keydown: 'touche bas',
107
+ keyup: 'touche haut',
102
108
  keypress: 'touchepressée',
103
109
  focus: 'focus',
104
110
  blur: 'flou',
@@ -189,6 +195,9 @@ export const fr: Dictionary = {
189
195
  },
190
196
 
191
197
  expressions: {
198
+ characters: 'caractères',
199
+ inclusive: 'inclusif',
200
+ exclusive: 'exclusif',
192
201
  first: 'premier',
193
202
  last: 'dernier',
194
203
  next: 'suivant',
@@ -104,6 +104,10 @@ export const he: Dictionary = {
104
104
  attributes: {},
105
105
 
106
106
  expressions: {
107
+ random: 'אקראי',
108
+ characters: 'תווים',
109
+ inclusive: 'כולל',
110
+ exclusive: 'בלעדי',
107
111
  last: 'אחרון',
108
112
  },
109
113
  };
@@ -60,13 +60,13 @@ export const hindiDictionary: Dictionary = {
60
60
  behavior: 'व्यवहार',
61
61
  focus: 'फोकस',
62
62
  blur: 'धुंधला',
63
- clone: 'कॉपी',
63
+ clone: 'क्लोन', // Batch 3: कॉपी is the copy verb — rendered clone parsed as action=copy
64
64
  prepend: 'जोड़ें_शुरू',
65
65
  breakpoint: 'ब्रेकप्वाइंट',
66
66
  clear: 'साफ़-करें',
67
67
  close: 'बंद-करें',
68
68
  open: 'खोलें',
69
- select: 'चुनें',
69
+ select: 'चिह्नित-करें', // Batch 3: चुनें is the pick keyword — bare select rendered with it parses null
70
70
  socket: 'सॉकेट',
71
71
  },
72
72
 
@@ -218,6 +218,7 @@ export const hindiDictionary: Dictionary = {
218
218
  },
219
219
 
220
220
  expressions: {
221
+ characters: 'अक्षर',
221
222
  first: 'पहला',
222
223
  last: 'अंतिम',
223
224
  next: 'अगला',
@@ -64,9 +64,9 @@ export const id: Dictionary = {
64
64
  install: 'pasang',
65
65
  breakpoint: 'titik-henti',
66
66
  clear: 'bersihkan', // hapus is the remove PRIMARY in the profile
67
- close: 'tutup',
67
+ close: 'tutupkan', // Batch 3: tutup is the hide keyword — rendered close parsed as action=hide
68
68
  open: 'buka',
69
- select: 'pilih',
69
+ select: 'tandai', // Batch 3: pilih is the pick keyword — bare select rendered with it parses null
70
70
  clone: 'klon',
71
71
  prepend: 'awali',
72
72
  },
@@ -92,17 +92,27 @@ export const id: Dictionary = {
92
92
 
93
93
  events: {
94
94
  click: 'klik',
95
- dblclick: 'klik_ganda',
96
- mousedown: 'tekan_mouse',
97
- mouseup: 'lepas_mouse',
98
- mouseenter: 'mouse_masuk',
99
- mouseleave: 'mouse_keluar',
100
- mouseover: 'mouse_atas',
101
- mouseout: 'mouse_luar',
102
- mousemove: 'gerak_mouse',
95
+ dblclick: 'dblclick',
96
+ // mousedown/mouseup: English passthrough — no native form round-trips on the
97
+ // parse side (V3c probe 2026-07-14: fused forms captured verbatim, split forms
98
+ // shattered to their first word — live broken listeners in repeat-until-event).
99
+ // The Batch-2 id-keyup precedent; revisit if S5b + tokenizer gain native entries.
100
+ mousedown: 'mousedown',
101
+ mouseup: 'mouseup',
102
+ mouseenter: 'mouseenter',
103
+ mouseleave: 'mouseleave',
104
+ // V3 Batch 2: mouse_atas/mouse_luar captured no event (the S5b forms
105
+ // `mouse masuk`/`mouse keluar` are aspirational — they don't tokenize
106
+ // either) — realigned to the tokenizer-registered natives. keydown keeps
107
+ // tekan_tombol (captures keydown via the registered `tekan`; S5b-aliased).
108
+ // keyup has NO parseable native (lepas is unregistered) → English
109
+ // passthrough, matching the blur/reset precedent below.
110
+ mouseover: 'arahkan',
111
+ mouseout: 'tinggalkan',
112
+ mousemove: 'mousemove',
103
113
  keydown: 'tekan_tombol',
104
- keyup: 'lepas_tombol',
105
- keypress: 'pencet_tombol',
114
+ keyup: 'keyup',
115
+ keypress: 'keypress',
106
116
  focus: 'fokus',
107
117
  blur: 'blur',
108
118
  change: 'ubah',
@@ -113,10 +123,12 @@ export const id: Dictionary = {
113
123
  unload: 'bongkar',
114
124
  resize: 'ubah_ukuran',
115
125
  scroll: 'gulir',
116
- touchstart: 'mulai_sentuh',
117
- touchend: 'akhir_sentuh',
118
- touchmove: 'gerak_sentuh',
119
- touchcancel: 'batal_sentuh',
126
+ touchstart: 'touchstart',
127
+ touchend: 'touchend',
128
+ touchmove: 'touchmove',
129
+ // V3c burn-down (2026-07-14): English passthrough — no native form round-trips
130
+ // on the parse side (probe: split forms shatter, fused forms capture verbatim).
131
+ touchcancel: 'touchcancel',
120
132
  },
121
133
 
122
134
  logical: {
@@ -192,6 +204,9 @@ export const id: Dictionary = {
192
204
  },
193
205
 
194
206
  expressions: {
207
+ characters: 'karakter',
208
+ inclusive: 'inklusif',
209
+ exclusive: 'eksklusif',
195
210
  first: 'pertama',
196
211
  last: 'terakhir',
197
212
  next: 'berikutnya',
@@ -89,8 +89,12 @@ export const it: Dictionary = {
89
89
  events: {
90
90
  click: 'clic',
91
91
  dblclick: 'doppioclic',
92
- mousedown: 'mousegiù',
93
- mouseup: 'mousesu',
92
+ // mousedown/mouseup: English passthrough — no native form round-trips on the
93
+ // parse side (V3c probe 2026-07-14: fused forms captured verbatim, split forms
94
+ // shattered to their first word — live broken listeners in repeat-until-event).
95
+ // The Batch-2 id-keyup precedent; revisit if S5b + tokenizer gain native entries.
96
+ mousedown: 'mousedown',
97
+ mouseup: 'mouseup',
94
98
  mouseenter: 'mouseentra',
95
99
  mouseleave: 'mouseesce',
96
100
  mouseover: 'mousesopra',
@@ -100,11 +104,11 @@ export const it: Dictionary = {
100
104
  keyup: 'tastosu',
101
105
  keypress: 'tastopremi',
102
106
  focus: 'fuoco',
103
- blur: 'sfuocatura',
107
+ blur: 'sfuocare', // Batch 3: the noun form parsed the blur command with no patient; the verb round-trips both event and command slots
104
108
  change: 'cambio',
105
109
  input: 'input',
106
110
  submit: 'invio',
107
- reset: 'reset',
111
+ reset: 'reimpostare', // Batch 3: English passthrough captured on.event as expression — profile verb round-trips
108
112
  load: 'carica',
109
113
  unload: 'scarica',
110
114
  resize: 'ridimensiona',
@@ -188,6 +192,9 @@ export const it: Dictionary = {
188
192
  },
189
193
 
190
194
  expressions: {
195
+ characters: 'caratteri',
196
+ inclusive: 'inclusivo',
197
+ exclusive: 'esclusivo',
191
198
  first: 'primo',
192
199
  last: 'ultimo',
193
200
  next: 'prossimo',
@@ -63,7 +63,7 @@ export const ja: Dictionary = {
63
63
  clear: 'クリア',
64
64
  close: '閉じる',
65
65
  open: '開く',
66
- select: '選択',
66
+ select: '選ぶ', // Batch 3: 選択 is the pick keyword — bare select rendered with it parses null
67
67
  clone: '複製',
68
68
  prepend: '先頭追加',
69
69
  socket: 'ソケット',
@@ -90,17 +90,22 @@ export const ja: Dictionary = {
90
90
 
91
91
  events: {
92
92
  click: 'クリック',
93
- dblclick: 'ダブルクリック',
93
+ dblclick: 'dblclick',
94
94
  mousedown: 'マウス押下',
95
95
  mouseup: 'マウス解放',
96
- mouseenter: 'マウス入る',
97
- mouseleave: 'マウス離れる',
98
- mouseover: 'マウス上',
99
- mouseout: 'マウス外',
100
- mousemove: 'マウス移動',
101
- keydown: 'キー押下',
102
- keyup: 'キー解放',
103
- keypress: 'キー押す',
96
+ // V3c burn-down (2026-07-14): English passthrough — no native form round-trips
97
+ // on the parse side (probe: split forms shatter, fused forms capture verbatim).
98
+ mouseenter: 'mouseenter',
99
+ mouseleave: 'mouseleave',
100
+ // V3 Batch 2: kanji compounds realigned to the S5b/tokenizer katakana
101
+ // loanwords (the standard JS event terms; the compounds captured
102
+ // event=expression:undefined — broken listeners)
103
+ mouseover: 'マウスオーバー',
104
+ mouseout: 'マウスアウト',
105
+ mousemove: 'mousemove',
106
+ keydown: 'キーダウン',
107
+ keyup: 'キーアップ',
108
+ keypress: 'キープレス',
104
109
  focus: 'フォーカス',
105
110
  blur: 'ぼかし',
106
111
  change: '変更',
@@ -108,13 +113,13 @@ export const ja: Dictionary = {
108
113
  submit: '送信',
109
114
  reset: 'リセット',
110
115
  load: '読み込み',
111
- unload: '読み込み解除',
116
+ unload: 'unload',
112
117
  resize: 'サイズ変更',
113
118
  scroll: 'スクロール',
114
- touchstart: 'タッチ開始',
115
- touchend: 'タッチ終了',
116
- touchmove: 'タッチ移動',
117
- touchcancel: 'タッチキャンセル',
119
+ touchstart: 'touchstart',
120
+ touchend: 'touchend',
121
+ touchmove: 'touchmove',
122
+ touchcancel: 'touchcancel',
118
123
  },
119
124
 
120
125
  logical: {
@@ -191,6 +196,9 @@ export const ja: Dictionary = {
191
196
  },
192
197
 
193
198
  expressions: {
199
+ characters: '文字',
200
+ inclusive: '含む',
201
+ exclusive: '除く',
194
202
  first: '最初',
195
203
  last: '最後',
196
204
  next: '次',
@@ -62,7 +62,7 @@ export const ko: Dictionary = {
62
62
  clear: '지우기',
63
63
  close: '닫기',
64
64
  open: '열기',
65
- select: '선택',
65
+ select: '고르기', // Batch 3: 선택 is the pick keyword — bare select rendered with it parses null
66
66
  clone: '복제',
67
67
  prepend: '앞에추가',
68
68
  socket: '소켓',
@@ -105,14 +105,16 @@ export const ko: Dictionary = {
105
105
  change: '변경',
106
106
  input: '입력',
107
107
  submit: '제출',
108
- reset: '리셋',
108
+ reset: '재설정', // Batch 3: 리셋 captured on.event as expression (broken listener) — profile word round-trips
109
109
  load: '로드',
110
- unload: '언로드',
110
+ unload: 'unload',
111
111
  resize: '리사이즈',
112
112
  scroll: '스크롤',
113
- touchstart: '터치시작',
113
+ // V3c burn-down (2026-07-14): English passthrough — no native form round-trips
114
+ // on the parse side (probe: split forms shatter, fused forms capture verbatim).
115
+ touchstart: 'touchstart',
114
116
  touchend: '터치종료',
115
- touchmove: '터치이동',
117
+ touchmove: 'touchmove',
116
118
  touchcancel: '터치취소',
117
119
  },
118
120
 
@@ -190,6 +192,9 @@ export const ko: Dictionary = {
190
192
  },
191
193
 
192
194
  expressions: {
195
+ characters: '문자',
196
+ inclusive: '포함',
197
+ exclusive: '제외',
193
198
  first: '첫번째',
194
199
  last: '마지막',
195
200
  next: '다음',
@@ -66,7 +66,7 @@ export const malayDictionary: Dictionary = {
66
66
  clear: 'bersihkan', // padam is a remove alternative in the profile
67
67
  close: 'tutup',
68
68
  open: 'buka',
69
- select: 'pilih',
69
+ select: 'tandai', // Batch 3: pilih is the pick keyword — bare select rendered with it parses null
70
70
  socket: 'soket', // derived from the ms profile (socket.primary); see generate-i18n-dictionaries
71
71
  },
72
72
 
@@ -212,6 +212,9 @@ export const malayDictionary: Dictionary = {
212
212
  },
213
213
 
214
214
  expressions: {
215
+ characters: 'aksara',
216
+ inclusive: 'inklusif',
217
+ exclusive: 'eksklusif',
215
218
  first: 'pertama',
216
219
  last: 'terakhir',
217
220
  next: 'seterusnya',
@@ -66,7 +66,7 @@ export const pl: Dictionary = {
66
66
  clear: 'zeruj', // wyczyść is a remove alternative in the profile
67
67
  close: 'zamknij',
68
68
  open: 'otwórz',
69
- select: 'wybierz',
69
+ select: 'zaznacz', // Batch 3: wybierz is the pick keyword — bare select rendered with it parses null
70
70
  clone: 'sklonuj',
71
71
  prepend: 'poprzedź',
72
72
  focus: 'skup',
@@ -94,8 +94,12 @@ export const pl: Dictionary = {
94
94
  events: {
95
95
  click: 'kliknięcie',
96
96
  dblclick: 'podwójnekliknięcie',
97
- mousedown: 'myszdół',
98
- mouseup: 'myszgóra',
97
+ // mousedown/mouseup: English passthrough — no native form round-trips on the
98
+ // parse side (V3c probe 2026-07-14: fused forms captured verbatim, split forms
99
+ // shattered to their first word — live broken listeners in repeat-until-event).
100
+ // The Batch-2 id-keyup precedent; revisit if S5b + tokenizer gain native entries.
101
+ mousedown: 'mousedown',
102
+ mouseup: 'mouseup',
99
103
  mouseenter: 'myszwejście',
100
104
  mouseleave: 'myszwyjście',
101
105
  mouseover: 'mysznad',
@@ -108,8 +112,8 @@ export const pl: Dictionary = {
108
112
  blur: 'rozmycie',
109
113
  change: 'zmiana',
110
114
  input: 'wejście',
111
- submit: 'wyślij',
112
- reset: 'resetuj',
115
+ submit: 'wysłaniu', // Batch 3: wyślij is the send verb — on-submit listener captured event "send"
116
+ reset: 'zresetuj', // Batch 3: resetuj captured on.event as expression (broken listener) — profile word round-trips
113
117
  load: 'załaduj',
114
118
  unload: 'wyładuj',
115
119
  resize: 'zmieńrozmiar',
@@ -193,6 +197,9 @@ export const pl: Dictionary = {
193
197
  },
194
198
 
195
199
  expressions: {
200
+ characters: 'znaki',
201
+ inclusive: 'włącznie',
202
+ exclusive: 'wyłącznie',
196
203
  first: 'pierwszy',
197
204
  last: 'ostatni',
198
205
  next: 'następny',