@lokascript/i18n 1.0.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 (96) hide show
  1. package/README.md +286 -0
  2. package/dist/browser.cjs +7669 -0
  3. package/dist/browser.cjs.map +1 -0
  4. package/dist/browser.d.cts +50 -0
  5. package/dist/browser.d.ts +50 -0
  6. package/dist/browser.js +7592 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/hyperfixi-i18n.min.js +2 -0
  9. package/dist/hyperfixi-i18n.min.js.map +1 -0
  10. package/dist/hyperfixi-i18n.mjs +8558 -0
  11. package/dist/hyperfixi-i18n.mjs.map +1 -0
  12. package/dist/index.cjs +14205 -0
  13. package/dist/index.cjs.map +1 -0
  14. package/dist/index.d.cts +947 -0
  15. package/dist/index.d.ts +947 -0
  16. package/dist/index.js +14095 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/transformer-Ckask-yw.d.cts +1041 -0
  19. package/dist/transformer-Ckask-yw.d.ts +1041 -0
  20. package/package.json +84 -0
  21. package/src/browser.ts +122 -0
  22. package/src/compatibility/browser-tests/grammar-demo.spec.ts +169 -0
  23. package/src/constants.ts +366 -0
  24. package/src/dictionaries/ar.ts +233 -0
  25. package/src/dictionaries/bn.ts +156 -0
  26. package/src/dictionaries/de.ts +233 -0
  27. package/src/dictionaries/derive.ts +515 -0
  28. package/src/dictionaries/en.ts +237 -0
  29. package/src/dictionaries/es.ts +233 -0
  30. package/src/dictionaries/fr.ts +233 -0
  31. package/src/dictionaries/hi.ts +270 -0
  32. package/src/dictionaries/id.ts +233 -0
  33. package/src/dictionaries/index.ts +238 -0
  34. package/src/dictionaries/it.ts +233 -0
  35. package/src/dictionaries/ja.ts +233 -0
  36. package/src/dictionaries/ko.ts +233 -0
  37. package/src/dictionaries/ms.ts +276 -0
  38. package/src/dictionaries/pl.ts +239 -0
  39. package/src/dictionaries/pt.ts +237 -0
  40. package/src/dictionaries/qu.ts +233 -0
  41. package/src/dictionaries/ru.ts +270 -0
  42. package/src/dictionaries/sw.ts +233 -0
  43. package/src/dictionaries/th.ts +156 -0
  44. package/src/dictionaries/tl.ts +276 -0
  45. package/src/dictionaries/tr.ts +233 -0
  46. package/src/dictionaries/uk.ts +270 -0
  47. package/src/dictionaries/vi.ts +210 -0
  48. package/src/dictionaries/zh.ts +233 -0
  49. package/src/enhanced-i18n.test.ts +454 -0
  50. package/src/enhanced-i18n.ts +713 -0
  51. package/src/examples/new-languages.ts +326 -0
  52. package/src/formatting.test.ts +213 -0
  53. package/src/formatting.ts +416 -0
  54. package/src/grammar/direct-mappings.ts +353 -0
  55. package/src/grammar/grammar.test.ts +1053 -0
  56. package/src/grammar/index.ts +59 -0
  57. package/src/grammar/profiles/index.ts +860 -0
  58. package/src/grammar/transformer.ts +1318 -0
  59. package/src/grammar/types.ts +630 -0
  60. package/src/index.ts +202 -0
  61. package/src/new-languages.test.ts +389 -0
  62. package/src/parser/analyze-conflicts.test.ts +229 -0
  63. package/src/parser/ar.ts +40 -0
  64. package/src/parser/create-provider.ts +309 -0
  65. package/src/parser/de.ts +36 -0
  66. package/src/parser/es.ts +31 -0
  67. package/src/parser/fr.ts +31 -0
  68. package/src/parser/id.ts +34 -0
  69. package/src/parser/index.ts +50 -0
  70. package/src/parser/ja.ts +36 -0
  71. package/src/parser/ko.ts +37 -0
  72. package/src/parser/locale-manager.test.ts +198 -0
  73. package/src/parser/locale-manager.ts +197 -0
  74. package/src/parser/parser-integration.test.ts +439 -0
  75. package/src/parser/pt.ts +37 -0
  76. package/src/parser/qu.ts +37 -0
  77. package/src/parser/sw.ts +37 -0
  78. package/src/parser/tr.ts +38 -0
  79. package/src/parser/types.ts +113 -0
  80. package/src/parser/zh.ts +38 -0
  81. package/src/plugins/vite.ts +224 -0
  82. package/src/plugins/webpack.ts +124 -0
  83. package/src/pluralization.test.ts +197 -0
  84. package/src/pluralization.ts +393 -0
  85. package/src/runtime.ts +441 -0
  86. package/src/ssr-integration.ts +225 -0
  87. package/src/test-setup.ts +195 -0
  88. package/src/translation-validation.test.ts +171 -0
  89. package/src/translator.test.ts +252 -0
  90. package/src/translator.ts +297 -0
  91. package/src/types.ts +209 -0
  92. package/src/utils/locale.ts +190 -0
  93. package/src/utils/tokenizer-adapter.ts +469 -0
  94. package/src/utils/tokenizer.ts +19 -0
  95. package/src/validators/index.ts +174 -0
  96. package/src/validators/schema.ts +129 -0
@@ -0,0 +1,239 @@
1
+ // packages/i18n/src/dictionaries/pl.ts
2
+
3
+ import { Dictionary } from '../types';
4
+
5
+ /**
6
+ * Polish Dictionary
7
+ *
8
+ * Polish uses IMPERATIVE verb forms for software commands
9
+ * (unlike most languages which use infinitive).
10
+ */
11
+ export const pl: Dictionary = {
12
+ commands: {
13
+ // Event handling
14
+ on: 'gdy',
15
+ tell: 'powiedz',
16
+ trigger: 'wywołaj',
17
+ send: 'wyślij',
18
+
19
+ // DOM manipulation
20
+ take: 'weź',
21
+ put: 'umieść',
22
+ set: 'ustaw',
23
+ get: 'pobierz',
24
+ add: 'dodaj',
25
+ remove: 'usuń',
26
+ toggle: 'przełącz',
27
+ hide: 'ukryj',
28
+ show: 'pokaż',
29
+
30
+ // Control flow
31
+ if: 'jeśli',
32
+ unless: 'chyba',
33
+ repeat: 'powtórz',
34
+ for: 'dla',
35
+ while: 'dopóki',
36
+ until: 'aż',
37
+ continue: 'kontynuuj',
38
+ break: 'przerwij',
39
+ halt: 'zatrzymaj',
40
+
41
+ // Async
42
+ wait: 'czekaj',
43
+ fetch: 'pobierz',
44
+ call: 'wywołaj',
45
+ return: 'zwróć',
46
+
47
+ // Other commands
48
+ make: 'utwórz',
49
+ log: 'loguj',
50
+ throw: 'rzuć',
51
+ catch: 'złap',
52
+ measure: 'zmierz',
53
+ transition: 'animuj',
54
+
55
+ // Data Commands
56
+ increment: 'zwiększ',
57
+ decrement: 'zmniejsz',
58
+ bind: 'powiąż',
59
+ default: 'domyślnie',
60
+ persist: 'zachowaj',
61
+
62
+ // Navigation Commands
63
+ go: 'idź',
64
+ pushUrl: 'dodajUrl',
65
+ replaceUrl: 'zamieńUrl',
66
+
67
+ // Utility Commands
68
+ copy: 'kopiuj',
69
+ pick: 'wybierz',
70
+ beep: 'sygnał',
71
+
72
+ // Advanced Commands
73
+ js: 'js',
74
+ async: 'async',
75
+ render: 'renderuj',
76
+
77
+ // Animation Commands
78
+ swap: 'zamień',
79
+ morph: 'przekształć',
80
+ settle: 'ustabilizuj',
81
+
82
+ // Content Commands
83
+ append: 'dołącz',
84
+
85
+ // Control Flow
86
+ exit: 'wyjdź',
87
+
88
+ // Behaviors
89
+ install: 'zainstaluj',
90
+ },
91
+
92
+ modifiers: {
93
+ to: 'do',
94
+ from: 'z',
95
+ into: 'do',
96
+ with: 'z',
97
+ at: 'przy',
98
+ in: 'w',
99
+ of: 'z',
100
+ as: 'jako',
101
+ by: 'przez',
102
+ before: 'przed',
103
+ after: 'po',
104
+ over: 'nad',
105
+ under: 'pod',
106
+ between: 'między',
107
+ through: 'przez',
108
+ without: 'bez',
109
+ },
110
+
111
+ events: {
112
+ click: 'kliknięcie',
113
+ dblclick: 'podwójnekliknięcie',
114
+ mousedown: 'myszdół',
115
+ mouseup: 'myszgóra',
116
+ mouseenter: 'myszwejście',
117
+ mouseleave: 'myszwyjście',
118
+ mouseover: 'mysznad',
119
+ mouseout: 'myszpoza',
120
+ mousemove: 'myszruch',
121
+
122
+ keydown: 'klawiszdół',
123
+ keyup: 'klawiszgóra',
124
+ keypress: 'klawisznaciśnięcie',
125
+
126
+ focus: 'fokus',
127
+ blur: 'rozmycie',
128
+ change: 'zmiana',
129
+ input: 'wejście',
130
+ submit: 'wyślij',
131
+ reset: 'resetuj',
132
+
133
+ load: 'załaduj',
134
+ unload: 'wyładuj',
135
+ resize: 'zmieńrozmiar',
136
+ scroll: 'przewiń',
137
+
138
+ touchstart: 'dotykstart',
139
+ touchend: 'dotykkoniec',
140
+ touchmove: 'dotykruch',
141
+ touchcancel: 'dotykanuluj',
142
+ },
143
+
144
+ logical: {
145
+ when: 'kiedy',
146
+ where: 'gdzie',
147
+ and: 'i',
148
+ or: 'lub',
149
+ not: 'nie',
150
+ is: 'jest',
151
+ exists: 'istnieje',
152
+ matches: 'pasuje',
153
+ contains: 'zawiera',
154
+ includes: 'obejmuje',
155
+ equals: 'równa się',
156
+ has: 'ma', // third-person: on/ona ma
157
+ have: 'mam', // first-person: ja mam
158
+ then: 'wtedy',
159
+ else: 'inaczej',
160
+ otherwise: 'wpp',
161
+ end: 'koniec',
162
+ },
163
+
164
+ temporal: {
165
+ seconds: 'sekundy',
166
+ second: 'sekunda',
167
+ milliseconds: 'milisekundy',
168
+ millisecond: 'milisekunda',
169
+ minutes: 'minuty',
170
+ minute: 'minuta',
171
+ hours: 'godziny',
172
+ hour: 'godzina',
173
+ ms: 'ms',
174
+ s: 's',
175
+ min: 'min',
176
+ h: 'godz',
177
+ },
178
+
179
+ values: {
180
+ true: 'prawda',
181
+ false: 'fałsz',
182
+ null: 'null',
183
+ undefined: 'niezdefiniowane',
184
+ it: 'to',
185
+ its: 'jego',
186
+ me: 'ja',
187
+ my: 'mój',
188
+ you: 'ty',
189
+ your: 'twój',
190
+ yourself: 'ty sam',
191
+ myself: 'ja sam',
192
+ element: 'element',
193
+ target: 'cel',
194
+ detail: 'szczegół',
195
+ event: 'zdarzenie',
196
+ window: 'okno',
197
+ document: 'dokument',
198
+ body: 'body',
199
+ result: 'wynik',
200
+ value: 'wartość',
201
+ },
202
+
203
+ attributes: {
204
+ class: 'klasa',
205
+ classes: 'klasy',
206
+ style: 'styl',
207
+ styles: 'style',
208
+ attribute: 'atrybut',
209
+ attributes: 'atrybuty',
210
+ property: 'właściwość',
211
+ properties: 'właściwości',
212
+ },
213
+
214
+ expressions: {
215
+ // Positional
216
+ first: 'pierwszy',
217
+ last: 'ostatni',
218
+ next: 'następny',
219
+ previous: 'poprzedni',
220
+ prev: 'poprz',
221
+ at: 'przy',
222
+ random: 'losowy',
223
+
224
+ // DOM Traversal
225
+ closest: 'najbliższy',
226
+ parent: 'rodzic',
227
+ children: 'dzieci',
228
+ within: 'wewnątrz',
229
+
230
+ // Emptiness/Existence
231
+ no: 'brak',
232
+ empty: 'pusty',
233
+ some: 'jakiś',
234
+
235
+ // String operations
236
+ 'starts with': 'zaczyna się od',
237
+ 'ends with': 'kończy się na',
238
+ },
239
+ };
@@ -0,0 +1,237 @@
1
+ // packages/i18n/src/dictionaries/pt.ts
2
+
3
+ import { Dictionary } from '../types';
4
+
5
+ /**
6
+ * Portuguese (Português) dictionary for hyperscript keywords.
7
+ * Brazilian Portuguese variant.
8
+ */
9
+ export const pt: Dictionary = {
10
+ commands: {
11
+ // Event handling
12
+ on: 'em',
13
+ tell: 'dizer',
14
+ trigger: 'disparar',
15
+ send: 'enviar',
16
+
17
+ // DOM manipulation
18
+ take: 'pegar',
19
+ put: 'colocar',
20
+ set: 'definir',
21
+ get: 'obter',
22
+ add: 'adicionar',
23
+ remove: 'remover',
24
+ toggle: 'alternar',
25
+ hide: 'esconder',
26
+ show: 'mostrar',
27
+
28
+ // Control flow
29
+ if: 'se',
30
+ unless: 'a_menos', // REVIEW: native speaker - multi-word
31
+ repeat: 'repetir',
32
+ for: 'para',
33
+ while: 'enquanto',
34
+ until: 'até',
35
+ continue: 'continuar',
36
+ break: 'parar',
37
+ halt: 'interromper',
38
+
39
+ // Async
40
+ wait: 'esperar',
41
+ fetch: 'buscar',
42
+ call: 'chamar',
43
+ return: 'retornar',
44
+
45
+ // Other commands
46
+ make: 'fazer',
47
+ log: 'registrar',
48
+ throw: 'lançar',
49
+ catch: 'capturar',
50
+ measure: 'medir',
51
+ transition: 'transição',
52
+
53
+ // Data Commands
54
+ increment: 'incrementar',
55
+ decrement: 'decrementar',
56
+ bind: 'vincular',
57
+ default: 'padrão',
58
+ persist: 'persistir',
59
+
60
+ // Navigation Commands
61
+ go: 'ir',
62
+ pushUrl: 'pushUrl',
63
+ replaceUrl: 'substituirUrl',
64
+
65
+ // Utility Commands
66
+ copy: 'copiar',
67
+ pick: 'escolher',
68
+ beep: 'apitar',
69
+
70
+ // Advanced Commands
71
+ js: 'js',
72
+ async: 'assíncrono',
73
+ render: 'renderizar',
74
+
75
+ // Animation Commands
76
+ swap: 'trocar',
77
+ morph: 'transformar',
78
+ settle: 'estabilizar',
79
+
80
+ // Content Commands
81
+ append: 'anexar',
82
+
83
+ // Control Flow
84
+ exit: 'sair',
85
+
86
+ // Behaviors
87
+ install: 'instalar',
88
+ },
89
+
90
+ modifiers: {
91
+ to: 'para',
92
+ from: 'de',
93
+ into: 'em',
94
+ with: 'com',
95
+ at: 'em',
96
+ in: 'dentro',
97
+ of: 'de',
98
+ as: 'como',
99
+ by: 'por',
100
+ before: 'antes',
101
+ after: 'depois',
102
+ over: 'sobre',
103
+ under: 'sob',
104
+ between: 'entre',
105
+ through: 'através',
106
+ without: 'sem',
107
+ },
108
+
109
+ events: {
110
+ click: 'clique',
111
+ dblclick: 'duploClique',
112
+ mousedown: 'mouseBaixo',
113
+ mouseup: 'mouseCima',
114
+ mouseenter: 'mouseEntrar',
115
+ mouseleave: 'mouseSair',
116
+ mouseover: 'mouseSobre',
117
+ mouseout: 'mouseFora',
118
+ mousemove: 'mouseMover',
119
+
120
+ keydown: 'teclaBaixo',
121
+ keyup: 'teclaCima',
122
+ keypress: 'teclaPressionar',
123
+
124
+ focus: 'foco',
125
+ blur: 'desfoque',
126
+ change: 'mudança',
127
+ input: 'entrada',
128
+ submit: 'envio',
129
+ reset: 'reiniciar',
130
+
131
+ load: 'carregar',
132
+ unload: 'descarregar',
133
+ resize: 'redimensionar',
134
+ scroll: 'rolar',
135
+
136
+ touchstart: 'toqueInício',
137
+ touchend: 'toqueFim',
138
+ touchmove: 'toqueMover',
139
+ touchcancel: 'toqueCancelar',
140
+ },
141
+
142
+ logical: {
143
+ when: 'quando',
144
+ where: 'onde',
145
+ and: 'e',
146
+ or: 'ou',
147
+ not: 'não',
148
+ is: 'é',
149
+ exists: 'existe',
150
+ matches: 'corresponde',
151
+ contains: 'contém',
152
+ includes: 'inclui',
153
+ equals: 'igual',
154
+ has: 'tem', // third-person: ele/ela tem
155
+ have: 'tenho', // first-person: eu tenho
156
+ then: 'então',
157
+ else: 'senão',
158
+ otherwise: 'caso_contrário', // REVIEW: native speaker
159
+ end: 'fim',
160
+ },
161
+
162
+ temporal: {
163
+ seconds: 'segundos',
164
+ second: 'segundo',
165
+ milliseconds: 'milissegundos',
166
+ millisecond: 'milissegundo',
167
+ minutes: 'minutos',
168
+ minute: 'minuto',
169
+ hours: 'horas',
170
+ hour: 'hora',
171
+ ms: 'ms',
172
+ s: 's',
173
+ min: 'min',
174
+ h: 'h',
175
+ },
176
+
177
+ values: {
178
+ true: 'verdadeiro',
179
+ false: 'falso',
180
+ null: 'nulo',
181
+ undefined: 'indefinido',
182
+ it: 'isso',
183
+ its: 'seu',
184
+ me: 'eu',
185
+ my: 'meu',
186
+ myself: 'eu mesmo', // REVIEW: native speaker
187
+ you: 'você',
188
+ your: 'seu',
189
+ yourself: 'você mesmo', // REVIEW: native speaker
190
+ element: 'elemento',
191
+ target: 'alvo',
192
+ detail: 'detalhe',
193
+ event: 'evento',
194
+ window: 'janela',
195
+ document: 'documento',
196
+ body: 'corpo',
197
+ result: 'resultado',
198
+ value: 'valor',
199
+ },
200
+
201
+ attributes: {
202
+ class: 'classe',
203
+ classes: 'classes',
204
+ style: 'estilo',
205
+ styles: 'estilos',
206
+ attribute: 'atributo',
207
+ attributes: 'atributos',
208
+ property: 'propriedade',
209
+ properties: 'propriedades',
210
+ },
211
+
212
+ expressions: {
213
+ // Positional
214
+ first: 'primeiro',
215
+ last: 'último',
216
+ next: 'próximo',
217
+ previous: 'anterior',
218
+ prev: 'ant',
219
+ at: 'em',
220
+ random: 'aleatório',
221
+
222
+ // DOM Traversal
223
+ closest: 'mais_próximo', // REVIEW: native speaker - multi-word
224
+ parent: 'pai',
225
+ children: 'filhos',
226
+ within: 'dentro',
227
+
228
+ // Emptiness/Existence
229
+ no: 'nenhum',
230
+ empty: 'vazio',
231
+ some: 'algum',
232
+
233
+ // String operations
234
+ 'starts with': 'começa com',
235
+ 'ends with': 'termina com',
236
+ },
237
+ };
@@ -0,0 +1,233 @@
1
+ // packages/i18n/src/dictionaries/qu.ts
2
+
3
+ import { Dictionary } from '../types';
4
+
5
+ export const qu: Dictionary = {
6
+ commands: {
7
+ // Event handling
8
+ on: 'kaqpi',
9
+ tell: 'niy',
10
+ trigger: 'kichay',
11
+ send: 'kachay',
12
+
13
+ // DOM manipulation
14
+ take: 'hurquy',
15
+ put: 'churay',
16
+ set: 'churay',
17
+ get: 'chaskiy',
18
+ add: 'yapay',
19
+ remove: 'qichuy',
20
+ toggle: 'tikray',
21
+ hide: 'pakay',
22
+ show: 'rikuchiy',
23
+
24
+ // Control flow
25
+ if: 'sichus',
26
+ unless: 'mana_sichus',
27
+ repeat: 'kutichiy',
28
+ for: 'rayku',
29
+ while: 'kay_kaq',
30
+ until: 'hayk_akama',
31
+ continue: 'purichiy',
32
+ break: 'p_akiy',
33
+ halt: 'sayay',
34
+
35
+ // Async
36
+ wait: 'suyay',
37
+ fetch: 'apamuy',
38
+ call: 'qayay',
39
+ return: 'kutimuy',
40
+
41
+ // Other commands
42
+ make: 'ruray',
43
+ log: 'qillqay',
44
+ throw: 'wikchuy',
45
+ catch: 'hapsiy',
46
+ measure: 'tupuy',
47
+ transition: 'tikray',
48
+
49
+ // Data Commands
50
+ increment: 'yapay',
51
+ decrement: 'pisiyachiy',
52
+ bind: 'watay',
53
+ default: 'ñawpaq_kaq',
54
+ persist: 'waqaychay',
55
+
56
+ // Navigation Commands
57
+ go: 'riy',
58
+ pushUrl: 'url_tanqay',
59
+ replaceUrl: 'url_tikray',
60
+
61
+ // Utility Commands
62
+ copy: 'qillqay',
63
+ pick: 'akllay',
64
+ beep: 'waqay',
65
+
66
+ // Advanced Commands
67
+ js: 'js',
68
+ async: 'mana_suyaspa',
69
+ render: 'rikuchiy',
70
+
71
+ // Animation Commands
72
+ swap: 'rantin_tikray',
73
+ morph: 'tikrachiy',
74
+ settle: 'tiyay',
75
+
76
+ // Content Commands
77
+ append: 'qhipaman_yapay',
78
+
79
+ // Control Flow
80
+ exit: 'lluqsiy',
81
+
82
+ // Behaviors
83
+ install: 'churay',
84
+ },
85
+
86
+ modifiers: {
87
+ to: 'man',
88
+ from: 'manta',
89
+ into: 'ukupi',
90
+ with: 'wan',
91
+ at: 'pi',
92
+ in: 'ukupi',
93
+ of: 'pa',
94
+ as: 'hina',
95
+ by: 'rayku',
96
+ before: 'ñawpaqpi',
97
+ after: 'qhepapi',
98
+ over: 'hawapi',
99
+ under: 'urapi',
100
+ between: 'chawpipi',
101
+ through: 'pasaspa',
102
+ without: 'mana',
103
+ },
104
+
105
+ events: {
106
+ click: 'ñitiy',
107
+ dblclick: 'iskay_ñitiy',
108
+ mousedown: 'rat_ñitiy',
109
+ mouseup: 'rat_huqariy',
110
+ mouseenter: 'rat_yaykuy',
111
+ mouseleave: 'rat_lluqsiy',
112
+ mouseover: 'rat_hawapi',
113
+ mouseout: 'rat_hawamanta',
114
+ mousemove: 'rat_kuyuy',
115
+
116
+ keydown: 'yupana_ñitiy',
117
+ keyup: 'yupana_huqariy',
118
+ keypress: 'yupana_ñitana',
119
+
120
+ focus: 'qhaway',
121
+ blur: 'paqariy',
122
+ change: 'tikray',
123
+ input: 'yaykuchiy',
124
+ submit: 'kachay',
125
+ reset: 'qallariy',
126
+
127
+ load: 'apakuy',
128
+ unload: 'urmay',
129
+ resize: 'hatun_kay',
130
+ scroll: 'kunray',
131
+
132
+ touchstart: 'llamiy_qallay',
133
+ touchend: 'llamiy_tukuy',
134
+ touchmove: 'llamiy_kuyuy',
135
+ touchcancel: 'llamiy_hark_ay',
136
+ },
137
+
138
+ logical: {
139
+ when: 'maykama',
140
+ where: 'maypi',
141
+ and: 'chaymanta',
142
+ or: 'utaq',
143
+ not: 'mana',
144
+ is: 'kanqa',
145
+ exists: 'tiyan',
146
+ matches: 'tupan',
147
+ contains: 'ukupi_kan',
148
+ includes: 'churasqa',
149
+ equals: 'kikin',
150
+ has: 'kachkan', // existence suffix (context-based)
151
+ have: 'kachkani', // first-person with suffix
152
+ then: 'chayqa',
153
+ else: 'mana_chayqa',
154
+ otherwise: 'huk_kaqpi',
155
+ end: 'tukuy',
156
+ },
157
+
158
+ temporal: {
159
+ seconds: 'sikundukuna',
160
+ second: 'sikundu',
161
+ milliseconds: 'iskay_paqta_sikundukuna',
162
+ millisecond: 'iskay_paqta_sikundu',
163
+ minutes: 'minutukuna',
164
+ minute: 'minutu',
165
+ hours: 'horakuna',
166
+ hour: 'hora',
167
+ ms: 'ms',
168
+ s: 's',
169
+ min: 'm',
170
+ h: 'h',
171
+ },
172
+
173
+ values: {
174
+ true: 'cheqaq',
175
+ false: 'llulla',
176
+ null: 'ch_usaq',
177
+ undefined: 'mana_riqsisqa',
178
+ it: 'chay',
179
+ its: 'chaypaq', // REVIEW: native speaker
180
+ me: 'noqa',
181
+ my: 'noqaq',
182
+ myself: 'noqa killa',
183
+ you: 'qam', // REVIEW: native speaker
184
+ your: 'qampaq', // REVIEW: native speaker
185
+ yourself: 'qam killa', // REVIEW: native speaker
186
+ element: 'raku',
187
+ target: 'punta',
188
+ detail: 'sut_iy',
189
+ event: 'ruway',
190
+ window: 'k_iri',
191
+ document: 'qillqa',
192
+ body: 'kurku',
193
+ result: 'lluqsiy',
194
+ value: 'chanin',
195
+ },
196
+
197
+ attributes: {
198
+ class: 'ayllu',
199
+ classes: 'ayllukuna',
200
+ style: 'sami',
201
+ styles: 'samikuna',
202
+ attribute: 'kaq',
203
+ attributes: 'kaqkuna',
204
+ property: 'kanay',
205
+ properties: 'kanaykuna',
206
+ },
207
+
208
+ expressions: {
209
+ // Positional
210
+ first: 'ñawpaq',
211
+ last: 'qhipa',
212
+ next: 'qhipantin',
213
+ previous: 'ñawpaqnin',
214
+ prev: 'ñawpaq',
215
+ at: 'pi',
216
+ random: 'imaymanata',
217
+
218
+ // DOM Traversal
219
+ closest: 'aswan_kaylla',
220
+ parent: 'mama_tayta',
221
+ children: 'wawakuna',
222
+ within: 'ukupi',
223
+
224
+ // Emptiness/Existence
225
+ no: 'mana_kanchu',
226
+ empty: 'ch_usaq',
227
+ some: 'wakin',
228
+
229
+ // String operations
230
+ 'starts with': 'qallarisqa wan',
231
+ 'ends with': 'tukusqa wan',
232
+ },
233
+ };