dsh-live-voice-debugger 0.6.0 → 0.6.2

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.
package/lib/client.js CHANGED
@@ -5,6 +5,14 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res, err) => function __init() {
9
+ if (err) throw err[0];
10
+ try {
11
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
12
+ } catch (e) {
13
+ throw err = [e], e;
14
+ }
15
+ };
8
16
  var __export = (target, all) => {
9
17
  for (var name in all)
10
18
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -27,6 +35,1110 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
35
  ));
28
36
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
37
 
38
+ // src/i18n/commons/en.ts
39
+ var translation, en_default;
40
+ var init_en = __esm({
41
+ "src/i18n/commons/en.ts"() {
42
+ translation = {
43
+ activate: "Open debugger in a separate window",
44
+ all: "All modules",
45
+ close: "Close debugger",
46
+ content: "Inspect text content (sensitive)",
47
+ developer: "Developer",
48
+ diagnostics: "Diagnostics",
49
+ empty: "No transitions recorded yet.",
50
+ error: "Diagnostic source failed.",
51
+ eventsClear: "Clear events",
52
+ eventsPause: "Pause events",
53
+ eventsResume: "Resume events",
54
+ filter: "Filter modules",
55
+ freeze: "Freeze view",
56
+ help: "Read-only state tree updated at 10 Hz. Text is hidden by default. This panel does not control voice.",
57
+ omitted: "Additional items omitted",
58
+ popupBlocked: "The browser blocked the debugger window. Allow popups for this site and try again.",
59
+ refreshRate: "Refresh rate",
60
+ resume: "Resume updates",
61
+ states: "Current states",
62
+ title: "Live Voice Debugger",
63
+ transitions: "Recent state transitions",
64
+ waiting: "Waiting for a compatible Live Voice runtime."
65
+ };
66
+ en_default = Object.freeze(translation);
67
+ }
68
+ });
69
+
70
+ // src/i18n/recordings/en.ts
71
+ var translation2, en_default2;
72
+ var init_en2 = __esm({
73
+ "src/i18n/recordings/en.ts"() {
74
+ translation2 = {
75
+ active: "Recording",
76
+ allSources: "All sources",
77
+ assistantEnd: "Assistant playback ended",
78
+ assistantPause: "Assistant playback paused",
79
+ assistantResume: "Assistant playback resumed",
80
+ assistantStart: "Assistant playback started",
81
+ attempts: "Transcription history",
82
+ audio: "Recording playback",
83
+ audioError: "Unable to load or play recording audio.",
84
+ cancel: "Cancel",
85
+ captureEnd: "Capture ended",
86
+ captureGated: "Microphone suspension requested for speaker playback",
87
+ captureStart: "Capture started",
88
+ captured: "Captured audio",
89
+ completed: "Completed",
90
+ confirmDelete: "Delete this entire recording, including its audio and transcription history? This cannot be undone. Deleting an active recording also discards its future saved audio.",
91
+ date: "Started",
92
+ delete: "Delete entire session",
93
+ deleteError: "Unable to delete the recording.",
94
+ duration: "Duration",
95
+ empty: "No recording sessions match this filter.",
96
+ end: "End",
97
+ engine: "Engine",
98
+ error: "Error",
99
+ eventTime: "Event time",
100
+ events: "Assistant and capture events",
101
+ eventsHelp: "Markers show the captured audio boundary and the actual event time. Events after capture stops may share its final boundary; no assistant audio is added to the recording.",
102
+ export: "Export self-contained JSON",
103
+ exportError: "Unable to export the recording.",
104
+ failed: "Failed",
105
+ help: "Inspect saved audio, speech/silence boundaries and transcription attempts. Audio and transcripts may be sensitive. Playback is local; export includes audio and text. Inspection never changes capture; only explicit deletion removes recordings.",
106
+ interrupted: "Interrupted",
107
+ loadError: "Unable to load recording sessions. Try refreshing.",
108
+ loading: "Loading recordings\u2026",
109
+ memory: "Memory only",
110
+ microphone: "Microphone",
111
+ name: "Session name",
112
+ nameError: "Unable to save the name. Star the session and use a single line of at most 120 characters.",
113
+ noAttempts: "No transcription attempts yet.",
114
+ open: "Open segment",
115
+ pending: "Pending",
116
+ persistent: "Saved locally",
117
+ pinConfirmed: "Confirmed at",
118
+ pinDelay: "Confirmation delay",
119
+ pins: "Boundary pins",
120
+ play: "Play segment",
121
+ playSession: "Play saved session",
122
+ refresh: "Refresh recordings",
123
+ saveName: "Save name",
124
+ saved: "Saved audio",
125
+ search: "Search segment transcripts",
126
+ searchEmpty: "No transcribed segments match.",
127
+ segments: "Segments",
128
+ selectSession: "Select a recording session.",
129
+ shared: "Shared audio",
130
+ silence: "Silence",
131
+ source: "Source",
132
+ sourceFilter: "Filter sources",
133
+ speech: "Speech",
134
+ star: "Keep indefinitely",
135
+ starError: "Unable to change recording protection.",
136
+ starHelp: "Exclude this recording from automatic cleanup and the retention count. Manual deletion is still allowed. This does not change browser storage or eviction protection.",
137
+ starred: "Protected from automatic cleanup",
138
+ start: "Start",
139
+ state: "State",
140
+ storageAudio: "Stored audio (MB)",
141
+ storageTotal: "Total stored audio (MB)",
142
+ storageUnknown: "Unavailable",
143
+ success: "Success",
144
+ timeline: "Speech / silence timeline",
145
+ title: "Recordings",
146
+ unavailable: "Recording service unavailable. Enable recording in Live Voice settings with a compatible runtime.",
147
+ unstar: "Remove protection",
148
+ unstarHelp: "Allow automatic cleanup and include this recording in the retention count again. Manual deletion is still allowed. Browser storage and eviction protection are unchanged.",
149
+ window: "Timeline window",
150
+ windowEnd: "Window end",
151
+ windowReset: "Show full session",
152
+ windowStart: "Window start"
153
+ };
154
+ en_default2 = Object.freeze(translation2);
155
+ }
156
+ });
157
+
158
+ // src/i18n/runtimes/en.ts
159
+ var translation3, en_default3;
160
+ var init_en3 = __esm({
161
+ "src/i18n/runtimes/en.ts"() {
162
+ translation3 = {
163
+ active: "Active requests",
164
+ audio: "Last audio duration",
165
+ cache: "Cached model files",
166
+ cancelled: "Cancelled",
167
+ completed: "Completed transcriptions",
168
+ device: "Requested execution provider",
169
+ error: "Error code",
170
+ events: "Runtime events (last 100)",
171
+ failed: "Failed / cancelled transcriptions",
172
+ gpu: "WebGPU adapter available",
173
+ heap: "Page JavaScript heap estimate",
174
+ help: "Model/cache sizes are file bytes, not RAM. PCM counts only queued/active input buffers. Page JavaScript heap, when available, is a non-standard page-wide estimate and excludes complete worker/WASM/GPU memory. Model RAM and VRAM cannot be reliably measured here. WebGPU initialization does not prove every graph operator ran on GPU. Events are plugin lifecycle metadata, not raw ONNX logs; no audio or transcripts are retained.",
175
+ id: "Worker identity",
176
+ inference: "Last worker inference",
177
+ load: "Load round trip / worker",
178
+ memory: "Memory and storage",
179
+ model: "Model",
180
+ modelBytes: "Complete model download",
181
+ no: "No",
182
+ pcm: "Accounted input PCM",
183
+ pending: "Pending worker requests",
184
+ quantization: "Encoder / decoder precision",
185
+ queue: "Queued transcriptions",
186
+ ram: "Model RAM",
187
+ ratio: "Processing / audio ratio",
188
+ ready: "Ready",
189
+ released: "Released",
190
+ revision: "Pinned revision",
191
+ started: "Started",
192
+ status: "Status",
193
+ storage: "Available origin storage",
194
+ success: "Success",
195
+ title: "Runtimes",
196
+ unavailable: "Unavailable",
197
+ versions: "ONNX Runtime / Transformers.js",
198
+ vram: "Model VRAM",
199
+ worker: "Worker active",
200
+ yes: "Yes"
201
+ };
202
+ en_default3 = Object.freeze(translation3);
203
+ }
204
+ });
205
+
206
+ // src/i18n/en.ts
207
+ var en_exports = {};
208
+ __export(en_exports, {
209
+ default: () => en_default4
210
+ });
211
+ var translation4, en_default4;
212
+ var init_en4 = __esm({
213
+ "src/i18n/en.ts"() {
214
+ init_en();
215
+ init_en2();
216
+ init_en3();
217
+ translation4 = { commons: en_default, recordings: en_default2, runtimes: en_default3 };
218
+ en_default4 = Object.freeze(translation4);
219
+ }
220
+ });
221
+
222
+ // src/i18n/commons/es.ts
223
+ var translation5, es_default;
224
+ var init_es = __esm({
225
+ "src/i18n/commons/es.ts"() {
226
+ translation5 = {
227
+ activate: "Abrir depurador en una ventana separada",
228
+ all: "Todos los m\xF3dulos",
229
+ close: "Cerrar depurador",
230
+ content: "Inspeccionar contenido de texto (sensible)",
231
+ developer: "Desarrollador",
232
+ diagnostics: "Diagn\xF3stico",
233
+ empty: "Todav\xEDa no hay transiciones registradas.",
234
+ error: "La fuente de diagn\xF3stico fall\xF3.",
235
+ eventsClear: "Borrar eventos",
236
+ eventsPause: "Pausar eventos",
237
+ eventsResume: "Reanudar eventos",
238
+ filter: "Filtrar m\xF3dulos",
239
+ freeze: "Congelar vista",
240
+ help: "\xC1rbol de estados de solo lectura actualizado a 10 Hz. Texto oculto por defecto. Este panel no controla la voz.",
241
+ omitted: "Elementos adicionales omitidos",
242
+ popupBlocked: "El navegador bloque\xF3 la ventana del depurador. Permita ventanas emergentes en este sitio e int\xE9ntelo de nuevo.",
243
+ refreshRate: "Frecuencia de actualizaci\xF3n",
244
+ resume: "Reanudar actualizaciones",
245
+ states: "Estados actuales",
246
+ title: "Depurador de Voz en vivo",
247
+ transitions: "Transiciones de estado recientes",
248
+ waiting: "Esperando un runtime de Voz en vivo compatible."
249
+ };
250
+ es_default = Object.freeze(translation5);
251
+ }
252
+ });
253
+
254
+ // src/i18n/recordings/es.ts
255
+ var translation6, es_default2;
256
+ var init_es2 = __esm({
257
+ "src/i18n/recordings/es.ts"() {
258
+ translation6 = {
259
+ active: "Grabando",
260
+ allSources: "Todas las fuentes",
261
+ assistantEnd: "Reproducci\xF3n del asistente finalizada",
262
+ assistantPause: "Reproducci\xF3n del asistente pausada",
263
+ assistantResume: "Reproducci\xF3n del asistente reanudada",
264
+ assistantStart: "Reproducci\xF3n del asistente iniciada",
265
+ attempts: "Historial de transcripci\xF3n",
266
+ audio: "Reproducci\xF3n de la grabaci\xF3n",
267
+ audioError: "No se pudo cargar o reproducir el audio.",
268
+ cancel: "Cancelar",
269
+ captureEnd: "Captura finalizada",
270
+ captureGated: "Suspensi\xF3n del micr\xF3fono solicitada para reproducir por altavoz",
271
+ captureStart: "Captura iniciada",
272
+ captured: "Audio capturado",
273
+ completed: "Completada",
274
+ confirmDelete: "\xBFEliminar toda esta grabaci\xF3n, incluido el audio y el historial de transcripci\xF3n? No se puede deshacer. Eliminar una grabaci\xF3n activa tambi\xE9n descarta su audio guardado futuro.",
275
+ date: "Inicio",
276
+ delete: "Eliminar sesi\xF3n completa",
277
+ deleteError: "No se pudo eliminar la grabaci\xF3n.",
278
+ duration: "Duraci\xF3n",
279
+ empty: "Ninguna grabaci\xF3n coincide con el filtro.",
280
+ end: "Fin",
281
+ engine: "Motor",
282
+ error: "Error",
283
+ eventTime: "Hora del evento",
284
+ events: "Eventos del asistente y la captura",
285
+ eventsHelp: "Los marcadores muestran el l\xEDmite del audio capturado y la hora real del evento. Tras detener la captura, varios eventos pueden compartir su l\xEDmite final; no se a\xF1ade audio del asistente.",
286
+ export: "Exportar JSON completo",
287
+ exportError: "No se pudo exportar la grabaci\xF3n.",
288
+ failed: "Fallida",
289
+ help: "Inspeccione audio guardado, l\xEDmites de voz/silencio e intentos de transcripci\xF3n. Audio y texto pueden ser sensibles. La reproducci\xF3n es local; la exportaci\xF3n incluye audio y texto. Inspeccionar no cambia la captura; solo la eliminaci\xF3n expl\xEDcita borra grabaciones.",
290
+ interrupted: "Interrumpida",
291
+ loadError: "No se pudieron cargar las grabaciones. Intente actualizar.",
292
+ loading: "Cargando grabaciones\u2026",
293
+ memory: "Solo en memoria",
294
+ microphone: "Micr\xF3fono",
295
+ name: "Nombre de la sesi\xF3n",
296
+ nameError: "No se pudo guardar el nombre. Marca la sesi\xF3n con estrella y usa una l\xEDnea de hasta 120 caracteres.",
297
+ noAttempts: "Todav\xEDa no hay intentos de transcripci\xF3n.",
298
+ open: "Segmento abierto",
299
+ pending: "Pendiente",
300
+ persistent: "Guardada localmente",
301
+ pinConfirmed: "Confirmado en",
302
+ pinDelay: "Demora de confirmaci\xF3n",
303
+ pins: "Marcadores de l\xEDmite",
304
+ play: "Reproducir segmento",
305
+ playSession: "Reproducir sesi\xF3n guardada",
306
+ refresh: "Actualizar grabaciones",
307
+ saveName: "Guardar nombre",
308
+ saved: "Audio guardado",
309
+ search: "Buscar transcripciones de segmentos",
310
+ searchEmpty: "No hay segmentos transcritos que coincidan.",
311
+ segments: "Segmentos",
312
+ selectSession: "Seleccione una sesi\xF3n de grabaci\xF3n.",
313
+ shared: "Audio compartido",
314
+ silence: "Silencio",
315
+ source: "Fuente",
316
+ sourceFilter: "Filtrar fuentes",
317
+ speech: "Voz",
318
+ star: "Conservar indefinidamente",
319
+ starError: "No se pudo cambiar la protecci\xF3n de la grabaci\xF3n.",
320
+ starHelp: "Excluye esta grabaci\xF3n de la limpieza autom\xE1tica y del recuento de retenci\xF3n. La eliminaci\xF3n manual sigue permitida. No cambia el almacenamiento ni la protecci\xF3n contra eliminaci\xF3n del navegador.",
321
+ starred: "Protegida de la limpieza autom\xE1tica",
322
+ start: "Inicio",
323
+ state: "Estado",
324
+ storageAudio: "Audio almacenado (MB)",
325
+ storageTotal: "Total de audio almacenado (MB)",
326
+ storageUnknown: "No disponible",
327
+ success: "\xC9xito",
328
+ timeline: "Cronolog\xEDa de voz / silencio",
329
+ title: "Grabaciones",
330
+ unavailable: "Servicio de grabaci\xF3n no disponible. Active la grabaci\xF3n en los ajustes de Voz en vivo con un runtime compatible.",
331
+ unstar: "Quitar protecci\xF3n",
332
+ unstarHelp: "Permite la limpieza autom\xE1tica e incluye de nuevo esta grabaci\xF3n en el recuento de retenci\xF3n. La eliminaci\xF3n manual sigue permitida. El almacenamiento y la protecci\xF3n contra eliminaci\xF3n del navegador no cambian.",
333
+ window: "Intervalo de la l\xEDnea de tiempo",
334
+ windowEnd: "Fin del intervalo",
335
+ windowReset: "Mostrar toda la sesi\xF3n",
336
+ windowStart: "Inicio del intervalo"
337
+ };
338
+ es_default2 = Object.freeze(translation6);
339
+ }
340
+ });
341
+
342
+ // src/i18n/runtimes/es.ts
343
+ var translation7, es_default3;
344
+ var init_es3 = __esm({
345
+ "src/i18n/runtimes/es.ts"() {
346
+ translation7 = {
347
+ active: "Solicitudes activas",
348
+ audio: "Duraci\xF3n del \xFAltimo audio",
349
+ cache: "Archivos del modelo en cach\xE9",
350
+ cancelled: "Cancelado",
351
+ completed: "Transcripciones completadas",
352
+ device: "Proveedor de ejecuci\xF3n solicitado",
353
+ error: "C\xF3digo de error",
354
+ events: "Eventos del runtime (\xFAltimos 100)",
355
+ failed: "Transcripciones fallidas / canceladas",
356
+ gpu: "Adaptador WebGPU disponible",
357
+ heap: "Estimaci\xF3n del heap JavaScript de la p\xE1gina",
358
+ help: "El tama\xF1o del modelo/cach\xE9 corresponde a archivos, no a RAM. PCM cuenta solo los b\xFAferes de entrada activos/en cola. El heap JavaScript es una estimaci\xF3n no est\xE1ndar de toda la p\xE1gina y no incluye toda la memoria de workers/WASM/GPU. La RAM/VRAM del modelo no se puede medir de forma fiable aqu\xED. Inicializar WebGPU no prueba que todos los operadores usen la GPU. Los eventos son metadatos del plugin, no logs brutos de ONNX; no guardan audio ni transcripciones.",
359
+ id: "Identidad del worker",
360
+ inference: "\xDAltima inferencia en el worker",
361
+ load: "Carga ida y vuelta / worker",
362
+ memory: "Memoria y almacenamiento",
363
+ model: "Modelo",
364
+ modelBytes: "Descarga completa del modelo",
365
+ no: "No",
366
+ pcm: "PCM de entrada contabilizado",
367
+ pending: "Solicitudes pendientes del worker",
368
+ quantization: "Precisi\xF3n del encoder / decoder",
369
+ queue: "Transcripciones en cola",
370
+ ram: "RAM del modelo",
371
+ ratio: "Relaci\xF3n procesamiento / audio",
372
+ ready: "Listo",
373
+ released: "Liberado",
374
+ revision: "Revisi\xF3n fijada",
375
+ started: "Iniciado",
376
+ status: "Estado",
377
+ storage: "Almacenamiento disponible de este origen",
378
+ success: "\xC9xito",
379
+ title: "Runtimes",
380
+ unavailable: "No disponible",
381
+ versions: "ONNX Runtime / Transformers.js",
382
+ vram: "VRAM del modelo",
383
+ worker: "Worker activo",
384
+ yes: "S\xED"
385
+ };
386
+ es_default3 = Object.freeze(translation7);
387
+ }
388
+ });
389
+
390
+ // src/i18n/es.ts
391
+ var es_exports = {};
392
+ __export(es_exports, {
393
+ default: () => es_default4
394
+ });
395
+ var translation8, es_default4;
396
+ var init_es4 = __esm({
397
+ "src/i18n/es.ts"() {
398
+ init_es();
399
+ init_es2();
400
+ init_es3();
401
+ translation8 = { commons: es_default, recordings: es_default2, runtimes: es_default3 };
402
+ es_default4 = Object.freeze(translation8);
403
+ }
404
+ });
405
+
406
+ // src/i18n/commons/fr.ts
407
+ var translation9, fr_default;
408
+ var init_fr = __esm({
409
+ "src/i18n/commons/fr.ts"() {
410
+ translation9 = {
411
+ activate: "Ouvrir le d\xE9bogueur dans une fen\xEAtre s\xE9par\xE9e",
412
+ all: "Tous les modules",
413
+ close: "Fermer le d\xE9bogueur",
414
+ content: "Inspecter le texte (sensible)",
415
+ developer: "D\xE9veloppeur",
416
+ diagnostics: "Diagnostic",
417
+ empty: "Aucune transition enregistr\xE9e.",
418
+ error: "La source de diagnostic a \xE9chou\xE9.",
419
+ eventsClear: "Effacer les \xE9v\xE9nements",
420
+ eventsPause: "Suspendre les \xE9v\xE9nements",
421
+ eventsResume: "Reprendre les \xE9v\xE9nements",
422
+ filter: "Filtrer les modules",
423
+ freeze: "Figer la vue",
424
+ help: "Arbre des \xE9tats en lecture seule actualis\xE9 \xE0 10 Hz. Texte masqu\xE9 par d\xE9faut. Ce panneau ne contr\xF4le pas la voix.",
425
+ omitted: "\xC9l\xE9ments suppl\xE9mentaires masqu\xE9s",
426
+ popupBlocked: "Le navigateur a bloqu\xE9 la fen\xEAtre du d\xE9bogueur. Autorisez les fen\xEAtres contextuelles pour ce site et r\xE9essayez.",
427
+ refreshRate: "Fr\xE9quence de mise \xE0 jour",
428
+ resume: "Reprendre les mises \xE0 jour",
429
+ states: "\xC9tats actuels",
430
+ title: "D\xE9bogueur Voix en direct",
431
+ transitions: "Transitions r\xE9centes des \xE9tats",
432
+ waiting: "En attente d\u2019un runtime Voix en direct compatible."
433
+ };
434
+ fr_default = Object.freeze(translation9);
435
+ }
436
+ });
437
+
438
+ // src/i18n/recordings/fr.ts
439
+ var translation10, fr_default2;
440
+ var init_fr2 = __esm({
441
+ "src/i18n/recordings/fr.ts"() {
442
+ translation10 = {
443
+ active: "Enregistrement",
444
+ allSources: "Toutes les sources",
445
+ assistantEnd: "Lecture de l\u2019assistant termin\xE9e",
446
+ assistantPause: "Lecture de l\u2019assistant en pause",
447
+ assistantResume: "Lecture de l\u2019assistant reprise",
448
+ assistantStart: "Lecture de l\u2019assistant d\xE9marr\xE9e",
449
+ attempts: "Historique des transcriptions",
450
+ audio: "Lecture de l\u2019enregistrement",
451
+ audioError: "Impossible de charger ou lire l\u2019audio.",
452
+ cancel: "Annuler",
453
+ captureEnd: "Capture termin\xE9e",
454
+ captureGated: "Suspension du microphone demand\xE9e pour la lecture sur haut-parleur",
455
+ captureStart: "Capture d\xE9marr\xE9e",
456
+ captured: "Audio captur\xE9",
457
+ completed: "Termin\xE9",
458
+ confirmDelete: "Supprimer cet enregistrement entier, y compris son audio et son historique de transcription ? Cette action est irr\xE9versible. Supprimer un enregistrement actif supprime aussi son futur audio enregistr\xE9.",
459
+ date: "D\xE9but",
460
+ delete: "Supprimer toute la session",
461
+ deleteError: "Impossible de supprimer l\u2019enregistrement.",
462
+ duration: "Dur\xE9e",
463
+ empty: "Aucun enregistrement ne correspond au filtre.",
464
+ end: "Fin",
465
+ engine: "Moteur",
466
+ error: "Erreur",
467
+ eventTime: "Heure de l\u2019\xE9v\xE9nement",
468
+ events: "\xC9v\xE9nements de l\u2019assistant et de la capture",
469
+ eventsHelp: "Les rep\xE8res indiquent la limite audio captur\xE9e et l\u2019heure r\xE9elle. Apr\xE8s l\u2019arr\xEAt de la capture, plusieurs \xE9v\xE9nements peuvent partager la limite finale ; aucun audio de l\u2019assistant n\u2019est ajout\xE9.",
470
+ export: "Exporter le JSON autonome",
471
+ exportError: "Impossible d\u2019exporter l\u2019enregistrement.",
472
+ failed: "\xC9chec",
473
+ help: "Inspectez l\u2019audio sauvegard\xE9, les limites parole/silence et les tentatives de transcription. Audio et texte peuvent \xEAtre sensibles. Lecture locale ; l\u2019export contient l\u2019audio et le texte. L\u2019inspection ne change pas la capture ; seule une suppression explicite efface les enregistrements.",
474
+ interrupted: "Interrompu",
475
+ loadError: "Impossible de charger les enregistrements. Actualisez la liste.",
476
+ loading: "Chargement des enregistrements\u2026",
477
+ memory: "En m\xE9moire uniquement",
478
+ microphone: "Microphone",
479
+ name: "Nom de la session",
480
+ nameError: "Impossible d\u2019enregistrer le nom. Marquez la session d\u2019une \xE9toile et utilisez une ligne de 120 caract\xE8res maximum.",
481
+ noAttempts: "Aucune tentative de transcription.",
482
+ open: "Segment ouvert",
483
+ pending: "En attente",
484
+ persistent: "Sauvegard\xE9 localement",
485
+ pinConfirmed: "Confirm\xE9 \xE0",
486
+ pinDelay: "D\xE9lai de confirmation",
487
+ pins: "Marqueurs de limite",
488
+ play: "Lire le segment",
489
+ playSession: "Lire la session sauvegard\xE9e",
490
+ refresh: "Actualiser les enregistrements",
491
+ saveName: "Enregistrer le nom",
492
+ saved: "Audio sauvegard\xE9",
493
+ search: "Rechercher dans les transcriptions",
494
+ searchEmpty: "Aucun segment transcrit ne correspond.",
495
+ segments: "Segments",
496
+ selectSession: "S\xE9lectionnez une session d\u2019enregistrement.",
497
+ shared: "Audio partag\xE9",
498
+ silence: "Silence",
499
+ source: "Source",
500
+ sourceFilter: "Filtrer les sources",
501
+ speech: "Parole",
502
+ star: "Conserver ind\xE9finiment",
503
+ starError: "Impossible de modifier la protection de l\u2019enregistrement.",
504
+ starHelp: "Exclut cet enregistrement du nettoyage automatique et du nombre d\u2019enregistrements \xE0 conserver. La suppression manuelle reste autoris\xE9e. Le stockage et la protection contre l\u2019\xE9viction par le navigateur ne changent pas.",
505
+ starred: "Prot\xE9g\xE9 du nettoyage automatique",
506
+ start: "D\xE9but",
507
+ state: "\xC9tat",
508
+ storageAudio: "Audio stock\xE9 (MB)",
509
+ storageTotal: "Total de l\u2019audio stock\xE9 (MB)",
510
+ storageUnknown: "Indisponible",
511
+ success: "R\xE9ussite",
512
+ timeline: "Chronologie parole / silence",
513
+ title: "Enregistrements",
514
+ unavailable: "Service d\u2019enregistrement indisponible. Activez l\u2019enregistrement dans les param\xE8tres de Voix en direct avec un runtime compatible.",
515
+ unstar: "Retirer la protection",
516
+ unstarHelp: "Autorise le nettoyage automatique et compte \xE0 nouveau cet enregistrement parmi ceux \xE0 conserver. La suppression manuelle reste autoris\xE9e. Le stockage et la protection contre l\u2019\xE9viction par le navigateur ne changent pas.",
517
+ window: "Intervalle de la chronologie",
518
+ windowEnd: "Fin de l\u2019intervalle",
519
+ windowReset: "Afficher toute la session",
520
+ windowStart: "D\xE9but de l\u2019intervalle"
521
+ };
522
+ fr_default2 = Object.freeze(translation10);
523
+ }
524
+ });
525
+
526
+ // src/i18n/runtimes/fr.ts
527
+ var translation11, fr_default3;
528
+ var init_fr3 = __esm({
529
+ "src/i18n/runtimes/fr.ts"() {
530
+ translation11 = {
531
+ active: "Requ\xEAtes actives",
532
+ audio: "Dur\xE9e du dernier audio",
533
+ cache: "Fichiers du mod\xE8le en cache",
534
+ cancelled: "Annul\xE9",
535
+ completed: "Transcriptions termin\xE9es",
536
+ device: "Fournisseur d\u2019ex\xE9cution demand\xE9",
537
+ error: "Code d\u2019erreur",
538
+ events: "\xC9v\xE9nements du runtime (100 derniers)",
539
+ failed: "Transcriptions \xE9chou\xE9es / annul\xE9es",
540
+ gpu: "Adaptateur WebGPU disponible",
541
+ heap: "Estimation du tas JavaScript de la page",
542
+ help: "La taille du mod\xE8le/cache mesure les fichiers, pas la RAM. PCM compte seulement les buffers d\u2019entr\xE9e actifs/en attente. Le tas JavaScript est une estimation non standard de la page et exclut une partie de la m\xE9moire workers/WASM/GPU. La RAM/VRAM du mod\xE8le ne peut pas \xEAtre mesur\xE9e fiablement ici. Initialiser WebGPU ne prouve pas que tous les op\xE9rateurs utilisent le GPU. Les \xE9v\xE9nements sont des m\xE9tadonn\xE9es du plugin, pas des logs ONNX bruts ; aucun audio ni transcription conserv\xE9s.",
543
+ id: "Identit\xE9 du worker",
544
+ inference: "Derni\xE8re inf\xE9rence du worker",
545
+ load: "Chargement aller-retour / worker",
546
+ memory: "M\xE9moire et stockage",
547
+ model: "Mod\xE8le",
548
+ modelBytes: "T\xE9l\xE9chargement complet du mod\xE8le",
549
+ no: "Non",
550
+ pcm: "PCM d\u2019entr\xE9e comptabilis\xE9",
551
+ pending: "Requ\xEAtes du worker en attente",
552
+ quantization: "Pr\xE9cision encoder / decoder",
553
+ queue: "Transcriptions en attente",
554
+ ram: "RAM du mod\xE8le",
555
+ ratio: "Rapport traitement / audio",
556
+ ready: "Pr\xEAt",
557
+ released: "Lib\xE9r\xE9",
558
+ revision: "R\xE9vision fix\xE9e",
559
+ started: "D\xE9marr\xE9",
560
+ status: "\xC9tat",
561
+ storage: "Stockage disponible pour cette origine",
562
+ success: "Succ\xE8s",
563
+ title: "Runtimes",
564
+ unavailable: "Indisponible",
565
+ versions: "ONNX Runtime / Transformers.js",
566
+ vram: "VRAM du mod\xE8le",
567
+ worker: "Worker actif",
568
+ yes: "Oui"
569
+ };
570
+ fr_default3 = Object.freeze(translation11);
571
+ }
572
+ });
573
+
574
+ // src/i18n/fr.ts
575
+ var fr_exports = {};
576
+ __export(fr_exports, {
577
+ default: () => fr_default4
578
+ });
579
+ var translation12, fr_default4;
580
+ var init_fr4 = __esm({
581
+ "src/i18n/fr.ts"() {
582
+ init_fr();
583
+ init_fr2();
584
+ init_fr3();
585
+ translation12 = { commons: fr_default, recordings: fr_default2, runtimes: fr_default3 };
586
+ fr_default4 = Object.freeze(translation12);
587
+ }
588
+ });
589
+
590
+ // src/i18n/commons/hi.ts
591
+ var translation13, hi_default;
592
+ var init_hi = __esm({
593
+ "src/i18n/commons/hi.ts"() {
594
+ translation13 = {
595
+ activate: "\u0921\u0940\u092C\u0917\u0930 \u0905\u0932\u0917 \u0935\u093F\u0902\u0921\u094B \u092E\u0947\u0902 \u0916\u094B\u0932\u0947\u0902",
596
+ all: "\u0938\u092D\u0940 \u092E\u0949\u0921\u094D\u092F\u0942\u0932",
597
+ close: "\u0921\u0940\u092C\u0917\u0930 \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
598
+ content: "\u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0938\u093E\u092E\u0917\u094D\u0930\u0940 \u0926\u0947\u0916\u0947\u0902 (\u0938\u0902\u0935\u0947\u0926\u0928\u0936\u0940\u0932)",
599
+ developer: "\u0921\u0947\u0935\u0932\u092A\u0930",
600
+ diagnostics: "\u0928\u093F\u0926\u093E\u0928",
601
+ empty: "\u0905\u092D\u0940 \u0915\u094B\u0908 \u091F\u094D\u0930\u093E\u0902\u091C\u093C\u093F\u0936\u0928 \u0926\u0930\u094D\u091C \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
602
+ error: "\u0921\u093E\u092F\u0917\u094D\u0928\u094B\u0938\u094D\u091F\u093F\u0915 \u0938\u094D\u0930\u094B\u0924 \u0935\u093F\u092B\u0932 \u0939\u0941\u0906\u0964",
603
+ eventsClear: "\u0907\u0935\u0947\u0902\u091F \u0938\u093E\u092B\u093C \u0915\u0930\u0947\u0902",
604
+ eventsPause: "\u0907\u0935\u0947\u0902\u091F \u0930\u094B\u0915\u0947\u0902",
605
+ eventsResume: "\u0907\u0935\u0947\u0902\u091F \u092B\u093F\u0930 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
606
+ filter: "\u092E\u0949\u0921\u094D\u092F\u0942\u0932 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0915\u0930\u0947\u0902",
607
+ freeze: "\u0926\u0943\u0936\u094D\u092F \u0930\u094B\u0915\u0947\u0902",
608
+ help: "\u0915\u0947\u0935\u0932 \u092A\u0922\u093C\u0928\u0947 \u0935\u093E\u0932\u093E \u0938\u094D\u091F\u0947\u091F \u091F\u094D\u0930\u0940 10 Hz \u092A\u0930 \u0905\u092A\u0921\u0947\u091F \u0939\u094B\u0924\u093E \u0939\u0948\u0964 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F \u0930\u0942\u092A \u0938\u0947 \u091B\u093F\u092A\u093E \u0939\u0948\u0964 \u092F\u0939 \u092A\u0948\u0928\u0932 \u0935\u0949\u0907\u0938 \u0915\u094B \u0928\u093F\u092F\u0902\u0924\u094D\u0930\u093F\u0924 \u0928\u0939\u0940\u0902 \u0915\u0930\u0924\u093E\u0964",
609
+ omitted: "\u0905\u0924\u093F\u0930\u093F\u0915\u094D\u0924 \u0906\u0907\u091F\u092E \u091B\u093F\u092A\u093E\u090F \u0917\u090F",
610
+ popupBlocked: "\u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0928\u0947 \u0921\u0940\u092C\u0917\u0930 \u0935\u093F\u0902\u0921\u094B \u092C\u094D\u0932\u0949\u0915 \u0915\u0930 \u0926\u0940\u0964 \u0907\u0938 \u0938\u093E\u0907\u091F \u0915\u0947 \u0932\u093F\u090F \u092A\u0949\u092A-\u0905\u092A \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
611
+ refreshRate: "\u0905\u092A\u0921\u0947\u091F \u0906\u0935\u0943\u0924\u094D\u0924\u093F",
612
+ resume: "\u0905\u092A\u0921\u0947\u091F \u092B\u093F\u0930 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
613
+ states: "\u0935\u0930\u094D\u0924\u092E\u093E\u0928 \u0938\u094D\u0925\u093F\u0924\u093F\u092F\u093E\u0901",
614
+ title: "\u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0921\u0940\u092C\u0917\u0930",
615
+ transitions: "\u0939\u093E\u0932 \u0915\u0947 \u0938\u094D\u091F\u0947\u091F \u091F\u094D\u0930\u093E\u0902\u091C\u093C\u093F\u0936\u0928",
616
+ waiting: "\u0938\u0902\u0917\u0924 \u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0930\u0928\u091F\u093E\u0907\u092E \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948\u0964"
617
+ };
618
+ hi_default = Object.freeze(translation13);
619
+ }
620
+ });
621
+
622
+ // src/i18n/recordings/hi.ts
623
+ var translation14, hi_default2;
624
+ var init_hi2 = __esm({
625
+ "src/i18n/recordings/hi.ts"() {
626
+ translation14 = {
627
+ active: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u091C\u093E\u0930\u0940",
628
+ allSources: "\u0938\u092D\u0940 \u0938\u094D\u0930\u094B\u0924",
629
+ assistantEnd: "\u0938\u0939\u093E\u092F\u0915 \u0915\u093E \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0938\u092E\u093E\u092A\u094D\u0924",
630
+ assistantPause: "\u0938\u0939\u093E\u092F\u0915 \u0915\u093E \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0930\u0941\u0915\u093E",
631
+ assistantResume: "\u0938\u0939\u093E\u092F\u0915 \u0915\u093E \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u092B\u093F\u0930 \u0936\u0941\u0930\u0942",
632
+ assistantStart: "\u0938\u0939\u093E\u092F\u0915 \u0915\u093E \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0936\u0941\u0930\u0942",
633
+ attempts: "\u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0907\u0924\u093F\u0939\u093E\u0938",
634
+ audio: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092A\u094D\u0932\u0947\u092C\u0948\u0915",
635
+ audioError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0911\u0921\u093F\u092F\u094B \u0932\u094B\u0921 \u092F\u093E \u091A\u0932\u093E\u092F\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964",
636
+ cancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
637
+ captureEnd: "\u0915\u0948\u092A\u094D\u091A\u0930 \u0938\u092E\u093E\u092A\u094D\u0924",
638
+ captureGated: "\u0938\u094D\u092A\u0940\u0915\u0930 \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0915\u0947 \u0932\u093F\u090F \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0930\u094B\u0915\u0928\u0947 \u0915\u093E \u0905\u0928\u0941\u0930\u094B\u0927",
639
+ captureStart: "\u0915\u0948\u092A\u094D\u091A\u0930 \u0936\u0941\u0930\u0942",
640
+ captured: "\u0915\u0948\u092A\u094D\u091A\u0930 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0911\u0921\u093F\u092F\u094B",
641
+ completed: "\u092A\u0942\u0930\u094D\u0923",
642
+ confirmDelete: "\u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0907\u0924\u093F\u0939\u093E\u0938 \u0938\u0939\u093F\u0924 \u092F\u0939 \u092A\u0942\u0930\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u090F\u0901? \u0907\u0938\u0947 \u0935\u093E\u092A\u0938 \u0928\u0939\u0940\u0902 \u0932\u093E\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E\u0964 \u0938\u0915\u094D\u0930\u093F\u092F \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0928\u0947 \u092A\u0930 \u0906\u0917\u0947 \u0938\u0939\u0947\u091C\u093E \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u093E \u0911\u0921\u093F\u092F\u094B \u092D\u0940 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
643
+ date: "\u0936\u0941\u0930\u0941\u0906\u0924",
644
+ delete: "\u092A\u0942\u0930\u0940 \u0938\u0924\u094D\u0930 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u090F\u0901",
645
+ deleteError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0908 \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u0940\u0964",
646
+ duration: "\u0905\u0935\u0927\u093F",
647
+ empty: "\u0907\u0938 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0938\u0947 \u092E\u0947\u0932 \u0916\u093E\u0924\u0940 \u0915\u094B\u0908 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
648
+ end: "\u0905\u0902\u0924",
649
+ engine: "\u0907\u0902\u091C\u0928",
650
+ error: "\u0924\u094D\u0930\u0941\u091F\u093F",
651
+ eventTime: "\u0918\u091F\u0928\u093E \u0915\u093E \u0938\u092E\u092F",
652
+ events: "\u0938\u0939\u093E\u092F\u0915 \u0914\u0930 \u0915\u0948\u092A\u094D\u091A\u0930 \u0915\u0940 \u0918\u091F\u0928\u093E\u090F\u0901",
653
+ eventsHelp: "\u091A\u093F\u0939\u094D\u0928 \u0915\u0948\u092A\u094D\u091A\u0930 \u0915\u093F\u090F \u0917\u090F \u0911\u0921\u093F\u092F\u094B \u0915\u0940 \u0938\u0940\u092E\u093E \u0914\u0930 \u0918\u091F\u0928\u093E \u0915\u093E \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0938\u092E\u092F \u0926\u093F\u0916\u093E\u0924\u0947 \u0939\u0948\u0902\u0964 \u0915\u0948\u092A\u094D\u091A\u0930 \u0930\u0941\u0915\u0928\u0947 \u0915\u0947 \u092C\u093E\u0926 \u0918\u091F\u0928\u093E\u0913\u0902 \u0915\u0940 \u0905\u0902\u0924\u093F\u092E \u0938\u0940\u092E\u093E \u0938\u092E\u093E\u0928 \u0939\u094B \u0938\u0915\u0924\u0940 \u0939\u0948; \u0938\u0939\u093E\u092F\u0915 \u0915\u093E \u0911\u0921\u093F\u092F\u094B \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092E\u0947\u0902 \u0928\u0939\u0940\u0902 \u091C\u094B\u0921\u093C\u093E \u091C\u093E\u0924\u093E\u0964",
654
+ export: "\u0938\u094D\u0935\u092F\u0902\u092A\u0942\u0930\u094D\u0923 JSON \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u0915\u0930\u0947\u0902",
655
+ exportError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091C\u093E \u0938\u0915\u0940\u0964",
656
+ failed: "\u0935\u093F\u092B\u0932",
657
+ help: "\u0938\u0939\u0947\u091C\u093E \u0911\u0921\u093F\u092F\u094B, \u0906\u0935\u093E\u091C\u093C/\u092E\u094C\u0928 \u0938\u0940\u092E\u093E\u090F\u0901 \u0914\u0930 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u092A\u094D\u0930\u092F\u093E\u0938 \u0926\u0947\u0916\u0947\u0902\u0964 \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0938\u0902\u0935\u0947\u0926\u0928\u0936\u0940\u0932 \u0939\u094B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0939\u0948; \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u092E\u0947\u0902 \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0936\u093E\u092E\u093F\u0932 \u0939\u0948\u0902\u0964 \u0928\u093F\u0930\u0940\u0915\u094D\u0937\u0923 \u0915\u0948\u092A\u094D\u091A\u0930 \u0928\u0939\u0940\u0902 \u092C\u0926\u0932\u0924\u093E; \u0915\u0947\u0935\u0932 \u0938\u094D\u092A\u0937\u094D\u091F \u0939\u091F\u093E\u0928\u0947 \u0915\u0940 \u0915\u093E\u0930\u094D\u0930\u0935\u093E\u0908 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0924\u0940 \u0939\u0948\u0964",
658
+ interrupted: "\u092C\u093E\u0927\u093F\u0924",
659
+ loadError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0924\u094D\u0930 \u0932\u094B\u0921 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0947\u0964 \u0930\u0940\u092B\u093C\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902\u0964",
660
+ loading: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0932\u094B\u0921 \u0939\u094B \u0930\u0939\u0940 \u0939\u0948\u0902\u2026",
661
+ memory: "\u0915\u0947\u0935\u0932 \u092E\u0947\u092E\u094B\u0930\u0940 \u092E\u0947\u0902",
662
+ microphone: "\u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928",
663
+ name: "\u0938\u0924\u094D\u0930 \u0915\u093E \u0928\u093E\u092E",
664
+ nameError: "\u0928\u093E\u092E \u0938\u0939\u0947\u091C\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964 \u0938\u0924\u094D\u0930 \u092A\u0930 \u0924\u093E\u0930\u093E \u0932\u0917\u093E\u090F\u0901 \u0914\u0930 \u0905\u0927\u093F\u0915\u0924\u092E 120 \u0905\u0915\u094D\u0937\u0930\u094B\u0902 \u0915\u0940 \u090F\u0915 \u092A\u0902\u0915\u094D\u0924\u093F \u0915\u093E \u0909\u092A\u092F\u094B\u0917 \u0915\u0930\u0947\u0902\u0964",
665
+ noAttempts: "\u0905\u092D\u0940 \u0915\u094B\u0908 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u092A\u094D\u0930\u092F\u093E\u0938 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
666
+ open: "\u0916\u0941\u0932\u093E \u0916\u0902\u0921",
667
+ pending: "\u0932\u0902\u092C\u093F\u0924",
668
+ persistent: "\u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0930\u0942\u092A \u0938\u0947 \u0938\u0939\u0947\u091C\u093E",
669
+ pinConfirmed: "\u092A\u0941\u0937\u094D\u091F\u093F \u0938\u092E\u092F",
670
+ pinDelay: "\u092A\u0941\u0937\u094D\u091F\u093F \u092E\u0947\u0902 \u0935\u093F\u0932\u0902\u092C",
671
+ pins: "\u0938\u0940\u092E\u093E \u091A\u093F\u0939\u094D\u0928",
672
+ play: "\u0916\u0902\u0921 \u091A\u0932\u093E\u090F\u0901",
673
+ playSession: "\u0938\u0939\u0947\u091C\u093E \u0938\u0924\u094D\u0930 \u091A\u0932\u093E\u090F\u0901",
674
+ refresh: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0930\u0940\u092B\u093C\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902",
675
+ saveName: "\u0928\u093E\u092E \u0938\u0939\u0947\u091C\u0947\u0902",
676
+ saved: "\u0938\u0939\u0947\u091C\u093E \u0911\u0921\u093F\u092F\u094B",
677
+ search: "\u0916\u0902\u0921\u094B\u0902 \u0915\u0947 \u092A\u094D\u0930\u0924\u093F\u0932\u0947\u0916 \u0916\u094B\u091C\u0947\u0902",
678
+ searchEmpty: "\u0915\u094B\u0908 \u092E\u0947\u0932 \u0916\u093E\u0924\u093E \u092A\u094D\u0930\u0924\u093F\u0932\u093F\u0916\u093F\u0924 \u0916\u0902\u0921 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964",
679
+ segments: "\u0916\u0902\u0921",
680
+ selectSession: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0924\u094D\u0930 \u091A\u0941\u0928\u0947\u0902\u0964",
681
+ shared: "\u0938\u093E\u091D\u093E \u0911\u0921\u093F\u092F\u094B",
682
+ silence: "\u092E\u094C\u0928",
683
+ source: "\u0938\u094D\u0930\u094B\u0924",
684
+ sourceFilter: "\u0938\u094D\u0930\u094B\u0924 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0915\u0930\u0947\u0902",
685
+ speech: "\u0906\u0935\u093E\u091C\u093C",
686
+ star: "\u0905\u0928\u093F\u0936\u094D\u091A\u093F\u0924 \u0915\u093E\u0932 \u0924\u0915 \u0930\u0916\u0947\u0902",
687
+ starError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092C\u0926\u0932\u0940 \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u0940\u0964",
688
+ starHelp: "\u0907\u0938 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u094B \u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0914\u0930 \u0930\u0916\u0940 \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0917\u093F\u0928\u0924\u0940 \u0938\u0947 \u092C\u093E\u0939\u0930 \u0930\u0916\u0947\u0902\u0964 \u092E\u0948\u0928\u094D\u092F\u0941\u0905\u0932 \u0930\u0942\u092A \u0938\u0947 \u0939\u091F\u093E\u0928\u093E \u0905\u092C \u092D\u0940 \u0938\u0902\u092D\u0935 \u0939\u0948\u0964 \u0907\u0938\u0938\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u0947 \u0938\u094D\u091F\u094B\u0930\u0947\u091C \u092F\u093E \u0928\u093F\u0937\u094D\u0915\u093E\u0938\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092E\u0947\u0902 \u092C\u0926\u0932\u093E\u0935 \u0928\u0939\u0940\u0902 \u0939\u094B\u0924\u093E\u0964",
689
+ starred: "\u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0938\u0947 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924",
690
+ start: "\u0936\u0941\u0930\u0941\u0906\u0924",
691
+ state: "\u0938\u094D\u0925\u093F\u0924\u093F",
692
+ storageAudio: "\u0938\u0939\u0947\u091C\u093E \u0917\u092F\u093E \u0911\u0921\u093F\u092F\u094B (MB)",
693
+ storageTotal: "\u0915\u0941\u0932 \u0938\u0939\u0947\u091C\u093E \u0917\u092F\u093E \u0911\u0921\u093F\u092F\u094B (MB)",
694
+ storageUnknown: "\u0905\u0928\u0941\u092A\u0932\u092C\u094D\u0927",
695
+ success: "\u0938\u092B\u0932",
696
+ timeline: "\u0906\u0935\u093E\u091C\u093C / \u092E\u094C\u0928 \u0938\u092E\u092F\u0930\u0947\u0916\u093E",
697
+ title: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917",
698
+ unavailable: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0947\u0935\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0902\u0917\u0924 \u0930\u0928\u091F\u093E\u0907\u092E \u0915\u0947 \u0938\u093E\u0925 \u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 \u092E\u0947\u0902 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u091A\u093E\u0932\u0942 \u0915\u0930\u0947\u0902\u0964",
699
+ unstar: "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0939\u091F\u093E\u090F\u0901",
700
+ unstarHelp: "\u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u0907\u0938 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u094B \u092B\u093F\u0930 \u0938\u0947 \u0930\u0916\u0940 \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0917\u093F\u0928\u0924\u0940 \u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0915\u0930\u0947\u0902\u0964 \u092E\u0948\u0928\u094D\u092F\u0941\u0905\u0932 \u0930\u0942\u092A \u0938\u0947 \u0939\u091F\u093E\u0928\u093E \u0905\u092C \u092D\u0940 \u0938\u0902\u092D\u0935 \u0939\u0948\u0964 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u093E \u0938\u094D\u091F\u094B\u0930\u0947\u091C \u0914\u0930 \u0928\u093F\u0937\u094D\u0915\u093E\u0938\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0928\u0939\u0940\u0902 \u092C\u0926\u0932\u0924\u0947\u0964",
701
+ window: "\u091F\u093E\u0907\u092E\u0932\u093E\u0907\u0928 \u0915\u093E \u0939\u093F\u0938\u094D\u0938\u093E",
702
+ windowEnd: "\u0939\u093F\u0938\u094D\u0938\u0947 \u0915\u093E \u0905\u0902\u0924",
703
+ windowReset: "\u092A\u0942\u0930\u093E \u0938\u0924\u094D\u0930 \u0926\u093F\u0916\u093E\u090F\u0901",
704
+ windowStart: "\u0939\u093F\u0938\u094D\u0938\u0947 \u0915\u0940 \u0936\u0941\u0930\u0941\u0906\u0924"
705
+ };
706
+ hi_default2 = Object.freeze(translation14);
707
+ }
708
+ });
709
+
710
+ // src/i18n/runtimes/hi.ts
711
+ var translation15, hi_default3;
712
+ var init_hi3 = __esm({
713
+ "src/i18n/runtimes/hi.ts"() {
714
+ translation15 = {
715
+ active: "\u0938\u0915\u094D\u0930\u093F\u092F \u0905\u0928\u0941\u0930\u094B\u0927",
716
+ audio: "\u092A\u093F\u091B\u0932\u0947 \u0911\u0921\u093F\u092F\u094B \u0915\u0940 \u0905\u0935\u0927\u093F",
717
+ cache: "\u0915\u0948\u0936 \u0915\u0940 \u0917\u0908 \u092E\u0949\u0921\u0932 \u092B\u093C\u093E\u0907\u0932\u0947\u0902",
718
+ cancelled: "\u0930\u0926\u094D\u0926",
719
+ completed: "\u092A\u0942\u0930\u0940 \u0939\u0941\u0908 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
720
+ device: "\u0905\u0928\u0941\u0930\u094B\u0927\u093F\u0924 \u0928\u093F\u0937\u094D\u092A\u093E\u0926\u0928 \u092A\u094D\u0930\u0926\u093E\u0924\u093E",
721
+ error: "\u0924\u094D\u0930\u0941\u091F\u093F \u0915\u094B\u0921",
722
+ events: "\u0930\u0928\u091F\u093E\u0907\u092E \u0918\u091F\u0928\u093E\u090F\u0901 (\u092A\u093F\u091B\u0932\u0940 100)",
723
+ failed: "\u0935\u093F\u092B\u0932 / \u0930\u0926\u094D\u0926 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
724
+ gpu: "WebGPU \u090F\u0921\u093E\u092A\u094D\u091F\u0930 \u0909\u092A\u0932\u092C\u094D\u0927",
725
+ heap: "\u092A\u0947\u091C JavaScript \u0939\u0940\u092A \u0915\u093E \u0905\u0928\u0941\u092E\u093E\u0928",
726
+ help: "\u092E\u0949\u0921\u0932/\u0915\u0948\u0936 \u0915\u093E \u0906\u0915\u093E\u0930 \u092B\u093C\u093E\u0907\u0932\u094B\u0902 \u0915\u093E \u0939\u0948, RAM \u0915\u093E \u0928\u0939\u0940\u0902\u0964 PCM \u0915\u0947\u0935\u0932 \u0938\u0915\u094D\u0930\u093F\u092F/\u0915\u0924\u093E\u0930\u092C\u0926\u094D\u0927 \u0907\u0928\u092A\u0941\u091F \u092C\u092B\u093C\u0930 \u0917\u093F\u0928\u0924\u093E \u0939\u0948\u0964 JavaScript \u0939\u0940\u092A \u092A\u0942\u0930\u0947 \u092A\u0947\u091C \u0915\u093E \u0917\u0948\u0930-\u092E\u093E\u0928\u0915 \u0905\u0928\u0941\u092E\u093E\u0928 \u0939\u0948 \u0914\u0930 \u092A\u0942\u0930\u0940 worker/WASM/GPU \u092E\u0947\u092E\u094B\u0930\u0940 \u0928\u0939\u0940\u0902 \u092E\u093E\u092A\u0924\u093E\u0964 \u092E\u0949\u0921\u0932 RAM/VRAM \u092F\u0939\u093E\u0901 \u092D\u0930\u094B\u0938\u0947\u092E\u0902\u0926 \u0924\u0930\u0940\u0915\u0947 \u0938\u0947 \u0928\u0939\u0940\u0902 \u092E\u093E\u092A\u0940 \u091C\u093E \u0938\u0915\u0924\u0940\u0964 WebGPU \u0936\u0941\u0930\u0942 \u0939\u094B\u0928\u0947 \u0915\u093E \u092E\u0924\u0932\u092C \u0938\u092D\u0940 \u0911\u092A\u0930\u0947\u091F\u0930 GPU \u092A\u0930 \u091A\u0932\u0947, \u092F\u0939 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0918\u091F\u0928\u093E\u090F\u0901 \u092A\u094D\u0932\u0917\u0907\u0928 \u091C\u0940\u0935\u0928\u091A\u0915\u094D\u0930 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0939\u0948\u0902, \u0915\u091A\u094D\u091A\u0947 ONNX \u0932\u0949\u0917 \u0928\u0939\u0940\u0902; \u0911\u0921\u093F\u092F\u094B \u092F\u093E \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0928\u0939\u0940\u0902 \u0930\u0916\u0924\u0947\u0964",
727
+ id: "\u0935\u0930\u094D\u0915\u0930 \u092A\u0939\u091A\u093E\u0928",
728
+ inference: "\u0935\u0930\u094D\u0915\u0930 \u0915\u093E \u092A\u093F\u091B\u0932\u093E \u0907\u0928\u094D\u092B\u093C\u0930\u0947\u0902\u0938",
729
+ load: "\u0932\u094B\u0921 \u0930\u093E\u0909\u0902\u0921 \u091F\u094D\u0930\u093F\u092A / \u0935\u0930\u094D\u0915\u0930",
730
+ memory: "\u092E\u0947\u092E\u094B\u0930\u0940 \u0914\u0930 \u0938\u094D\u091F\u094B\u0930\u0947\u091C",
731
+ model: "\u092E\u0949\u0921\u0932",
732
+ modelBytes: "\u092A\u0942\u0930\u093E \u092E\u0949\u0921\u0932 \u0921\u093E\u0909\u0928\u0932\u094B\u0921",
733
+ no: "\u0928\u0939\u0940\u0902",
734
+ pcm: "\u0917\u093F\u0928\u093E \u0917\u092F\u093E \u0907\u0928\u092A\u0941\u091F PCM",
735
+ pending: "\u0932\u0902\u092C\u093F\u0924 \u0935\u0930\u094D\u0915\u0930 \u0905\u0928\u0941\u0930\u094B\u0927",
736
+ quantization: "\u090F\u0928\u0915\u094B\u0921\u0930 / \u0921\u093F\u0915\u094B\u0921\u0930 \u092A\u0930\u093F\u0936\u0941\u0926\u094D\u0927\u0924\u093E",
737
+ queue: "\u0915\u0924\u093E\u0930\u092C\u0926\u094D\u0927 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
738
+ ram: "\u092E\u0949\u0921\u0932 RAM",
739
+ ratio: "\u092A\u094D\u0930\u0938\u0902\u0938\u094D\u0915\u0930\u0923 / \u0911\u0921\u093F\u092F\u094B \u0905\u0928\u0941\u092A\u093E\u0924",
740
+ ready: "\u0924\u0948\u092F\u093E\u0930",
741
+ released: "\u092E\u0941\u0915\u094D\u0924",
742
+ revision: "\u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0930\u093F\u0935\u093F\u091C\u093C\u0928",
743
+ started: "\u0936\u0941\u0930\u0942",
744
+ status: "\u0938\u094D\u0925\u093F\u0924\u093F",
745
+ storage: "\u0907\u0938 \u0913\u0930\u093F\u091C\u093F\u0928 \u0915\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0938\u094D\u091F\u094B\u0930\u0947\u091C",
746
+ success: "\u0938\u092B\u0932",
747
+ title: "\u0930\u0928\u091F\u093E\u0907\u092E",
748
+ unavailable: "\u0905\u0928\u0941\u092A\u0932\u092C\u094D\u0927",
749
+ versions: "ONNX Runtime / Transformers.js",
750
+ vram: "\u092E\u0949\u0921\u0932 VRAM",
751
+ worker: "\u0935\u0930\u094D\u0915\u0930 \u0938\u0915\u094D\u0930\u093F\u092F",
752
+ yes: "\u0939\u093E\u0901"
753
+ };
754
+ hi_default3 = Object.freeze(translation15);
755
+ }
756
+ });
757
+
758
+ // src/i18n/hi.ts
759
+ var hi_exports = {};
760
+ __export(hi_exports, {
761
+ default: () => hi_default4
762
+ });
763
+ var translation16, hi_default4;
764
+ var init_hi4 = __esm({
765
+ "src/i18n/hi.ts"() {
766
+ init_hi();
767
+ init_hi2();
768
+ init_hi3();
769
+ translation16 = { commons: hi_default, recordings: hi_default2, runtimes: hi_default3 };
770
+ hi_default4 = Object.freeze(translation16);
771
+ }
772
+ });
773
+
774
+ // src/i18n/commons/pt-BR.ts
775
+ var translation17, pt_BR_default;
776
+ var init_pt_BR = __esm({
777
+ "src/i18n/commons/pt-BR.ts"() {
778
+ translation17 = {
779
+ activate: "Abrir debugger em janela separada",
780
+ all: "Todos os m\xF3dulos",
781
+ close: "Fechar debugger",
782
+ content: "Inspecionar conte\xFAdo de texto (sens\xEDvel)",
783
+ developer: "Desenvolvedor",
784
+ diagnostics: "Diagn\xF3stico",
785
+ empty: "Nenhuma transi\xE7\xE3o registrada ainda.",
786
+ error: "A fonte de diagn\xF3stico falhou.",
787
+ eventsClear: "Limpar eventos",
788
+ eventsPause: "Pausar eventos",
789
+ eventsResume: "Retomar eventos",
790
+ filter: "Filtrar m\xF3dulos",
791
+ freeze: "Congelar visualiza\xE7\xE3o",
792
+ help: "\xC1rvore de estados somente leitura atualizada a 10 Hz. Texto oculto por padr\xE3o. Este painel n\xE3o controla a voz.",
793
+ omitted: "Itens adicionais omitidos",
794
+ popupBlocked: "O navegador bloqueou a janela do debugger. Permita pop-ups neste site e tente novamente.",
795
+ refreshRate: "Frequ\xEAncia de atualiza\xE7\xE3o",
796
+ resume: "Retomar atualiza\xE7\xF5es",
797
+ states: "Estados atuais",
798
+ title: "Depurador da Voz ao Vivo",
799
+ transitions: "Transi\xE7\xF5es de estado recentes",
800
+ waiting: "Aguardando um runtime da Voz ao Vivo compat\xEDvel."
801
+ };
802
+ pt_BR_default = Object.freeze(translation17);
803
+ }
804
+ });
805
+
806
+ // src/i18n/recordings/pt-BR.ts
807
+ var translation18, pt_BR_default2;
808
+ var init_pt_BR2 = __esm({
809
+ "src/i18n/recordings/pt-BR.ts"() {
810
+ translation18 = {
811
+ active: "Gravando",
812
+ allSources: "Todas as fontes",
813
+ assistantEnd: "Reprodu\xE7\xE3o do assistente encerrada",
814
+ assistantPause: "Reprodu\xE7\xE3o do assistente pausada",
815
+ assistantResume: "Reprodu\xE7\xE3o do assistente retomada",
816
+ assistantStart: "Reprodu\xE7\xE3o do assistente iniciada",
817
+ attempts: "Hist\xF3rico de transcri\xE7\xE3o",
818
+ audio: "Reprodu\xE7\xE3o da grava\xE7\xE3o",
819
+ audioError: "N\xE3o foi poss\xEDvel carregar ou reproduzir o \xE1udio.",
820
+ cancel: "Cancelar",
821
+ captureEnd: "Captura encerrada",
822
+ captureGated: "Suspens\xE3o do microfone solicitada para reprodu\xE7\xE3o no alto-falante",
823
+ captureStart: "Captura iniciada",
824
+ captured: "\xC1udio capturado",
825
+ completed: "Conclu\xEDda",
826
+ confirmDelete: "Excluir esta grava\xE7\xE3o inteira, incluindo \xE1udio e hist\xF3rico de transcri\xE7\xE3o? N\xE3o \xE9 poss\xEDvel desfazer. Excluir uma grava\xE7\xE3o ativa tamb\xE9m descarta o \xE1udio salvo futuro.",
827
+ date: "In\xEDcio",
828
+ delete: "Excluir sess\xE3o inteira",
829
+ deleteError: "N\xE3o foi poss\xEDvel excluir a grava\xE7\xE3o.",
830
+ duration: "Dura\xE7\xE3o",
831
+ empty: "Nenhuma grava\xE7\xE3o corresponde ao filtro.",
832
+ end: "Fim",
833
+ engine: "Motor",
834
+ error: "Erro",
835
+ eventTime: "Hor\xE1rio do evento",
836
+ events: "Eventos do assistente e da captura",
837
+ eventsHelp: "Os marcadores mostram o limite do \xE1udio capturado e o hor\xE1rio real do evento. Eventos ap\xF3s o fim da captura podem compartilhar seu limite final; nenhum \xE1udio do assistente \xE9 adicionado \xE0 grava\xE7\xE3o.",
838
+ export: "Exportar JSON completo",
839
+ exportError: "N\xE3o foi poss\xEDvel exportar a grava\xE7\xE3o.",
840
+ failed: "Falhou",
841
+ help: "Inspecione \xE1udio salvo, limites de fala/sil\xEAncio e tentativas de transcri\xE7\xE3o. \xC1udio e texto podem ser sens\xEDveis. Reprodu\xE7\xE3o local; a exporta\xE7\xE3o inclui \xE1udio e texto. Inspecionar n\xE3o altera a captura; apenas a exclus\xE3o expl\xEDcita remove grava\xE7\xF5es.",
842
+ interrupted: "Interrompida",
843
+ loadError: "N\xE3o foi poss\xEDvel carregar as grava\xE7\xF5es. Tente atualizar.",
844
+ loading: "Carregando grava\xE7\xF5es\u2026",
845
+ memory: "Somente na mem\xF3ria",
846
+ microphone: "Microfone",
847
+ name: "Nome da sess\xE3o",
848
+ nameError: "N\xE3o foi poss\xEDvel salvar o nome. Marque a sess\xE3o com estrela e use uma \xFAnica linha de at\xE9 120 caracteres.",
849
+ noAttempts: "Nenhuma tentativa de transcri\xE7\xE3o ainda.",
850
+ open: "Segmento aberto",
851
+ pending: "Pendente",
852
+ persistent: "Salva localmente",
853
+ pinConfirmed: "Confirmado em",
854
+ pinDelay: "Atraso de confirma\xE7\xE3o",
855
+ pins: "Marcadores de limite",
856
+ play: "Reproduzir segmento",
857
+ playSession: "Reproduzir sess\xE3o salva",
858
+ refresh: "Atualizar grava\xE7\xF5es",
859
+ saveName: "Salvar nome",
860
+ saved: "\xC1udio salvo",
861
+ search: "Pesquisar transcri\xE7\xF5es dos segmentos",
862
+ searchEmpty: "Nenhum segmento transcrito corresponde \xE0 pesquisa.",
863
+ segments: "Segmentos",
864
+ selectSession: "Selecione uma sess\xE3o de grava\xE7\xE3o.",
865
+ shared: "\xC1udio compartilhado",
866
+ silence: "Sil\xEAncio",
867
+ source: "Fonte",
868
+ sourceFilter: "Filtrar fontes",
869
+ speech: "Fala",
870
+ star: "Manter por tempo indeterminado",
871
+ starError: "N\xE3o foi poss\xEDvel alterar a prote\xE7\xE3o da grava\xE7\xE3o.",
872
+ starHelp: "Exclui esta grava\xE7\xE3o da limpeza autom\xE1tica e da contagem de reten\xE7\xE3o. A exclus\xE3o manual continua permitida. N\xE3o altera o armazenamento nem a prote\xE7\xE3o contra remo\xE7\xE3o pelo navegador.",
873
+ starred: "Protegida da limpeza autom\xE1tica",
874
+ start: "In\xEDcio",
875
+ state: "Estado",
876
+ storageAudio: "\xC1udio armazenado (MB)",
877
+ storageTotal: "Total de \xE1udio armazenado (MB)",
878
+ storageUnknown: "Indispon\xEDvel",
879
+ success: "Sucesso",
880
+ timeline: "Linha do tempo de fala / sil\xEAncio",
881
+ title: "Grava\xE7\xF5es",
882
+ unavailable: "Servi\xE7o de grava\xE7\xE3o indispon\xEDvel. Ative a grava\xE7\xE3o nas configura\xE7\xF5es da Voz ao Vivo com um runtime compat\xEDvel.",
883
+ unstar: "Remover prote\xE7\xE3o",
884
+ unstarHelp: "Permite a limpeza autom\xE1tica e inclui novamente esta grava\xE7\xE3o na contagem de reten\xE7\xE3o. A exclus\xE3o manual continua permitida. O armazenamento e a prote\xE7\xE3o contra remo\xE7\xE3o pelo navegador n\xE3o mudam.",
885
+ window: "Recorte da linha do tempo",
886
+ windowEnd: "Fim do recorte",
887
+ windowReset: "Mostrar sess\xE3o inteira",
888
+ windowStart: "In\xEDcio do recorte"
889
+ };
890
+ pt_BR_default2 = Object.freeze(translation18);
891
+ }
892
+ });
893
+
894
+ // src/i18n/runtimes/pt-BR.ts
895
+ var translation19, pt_BR_default3;
896
+ var init_pt_BR3 = __esm({
897
+ "src/i18n/runtimes/pt-BR.ts"() {
898
+ translation19 = {
899
+ active: "Requisi\xE7\xF5es ativas",
900
+ audio: "Dura\xE7\xE3o do \xFAltimo \xE1udio",
901
+ cache: "Arquivos do modelo em cache",
902
+ cancelled: "Cancelado",
903
+ completed: "Transcri\xE7\xF5es conclu\xEDdas",
904
+ device: "Provedor de execu\xE7\xE3o solicitado",
905
+ error: "C\xF3digo do erro",
906
+ events: "Eventos do runtime (\xFAltimos 100)",
907
+ failed: "Transcri\xE7\xF5es com falha / canceladas",
908
+ gpu: "Adaptador WebGPU dispon\xEDvel",
909
+ heap: "Estimativa do heap JavaScript da p\xE1gina",
910
+ help: "O tamanho do modelo/cache \xE9 de arquivos, n\xE3o RAM. PCM conta apenas buffers de entrada ativos/na fila. O heap JavaScript, quando dispon\xEDvel, \xE9 uma estimativa n\xE3o padronizada da p\xE1gina e n\xE3o inclui toda a mem\xF3ria dos workers/WASM/GPU. N\xE3o \xE9 poss\xEDvel medir com confian\xE7a a RAM/VRAM do modelo aqui. Inicializar WebGPU n\xE3o prova que todos os operadores rodaram na GPU. Os eventos s\xE3o metadados do ciclo de vida do plugin, n\xE3o logs brutos do ONNX; n\xE3o guardam \xE1udio nem transcri\xE7\xF5es.",
911
+ id: "Identidade do worker",
912
+ inference: "\xDAltima infer\xEAncia no worker",
913
+ load: "Carregamento ida e volta / worker",
914
+ memory: "Mem\xF3ria e armazenamento",
915
+ model: "Modelo",
916
+ modelBytes: "Download completo do modelo",
917
+ no: "N\xE3o",
918
+ pcm: "PCM de entrada contabilizado",
919
+ pending: "Requisi\xE7\xF5es pendentes no worker",
920
+ quantization: "Precis\xE3o do encoder / decoder",
921
+ queue: "Transcri\xE7\xF5es na fila",
922
+ ram: "RAM do modelo",
923
+ ratio: "Rela\xE7\xE3o processamento / \xE1udio",
924
+ ready: "Pronto",
925
+ released: "Liberado",
926
+ revision: "Revis\xE3o fixada",
927
+ started: "Iniciado",
928
+ status: "Estado",
929
+ storage: "Armazenamento dispon\xEDvel nesta origem",
930
+ success: "Sucesso",
931
+ title: "Runtimes",
932
+ unavailable: "Indispon\xEDvel",
933
+ versions: "ONNX Runtime / Transformers.js",
934
+ vram: "VRAM do modelo",
935
+ worker: "Worker ativo",
936
+ yes: "Sim"
937
+ };
938
+ pt_BR_default3 = Object.freeze(translation19);
939
+ }
940
+ });
941
+
942
+ // src/i18n/pt-BR.ts
943
+ var pt_BR_exports = {};
944
+ __export(pt_BR_exports, {
945
+ default: () => pt_BR_default4
946
+ });
947
+ var translation20, pt_BR_default4;
948
+ var init_pt_BR4 = __esm({
949
+ "src/i18n/pt-BR.ts"() {
950
+ init_pt_BR();
951
+ init_pt_BR2();
952
+ init_pt_BR3();
953
+ translation20 = { commons: pt_BR_default, recordings: pt_BR_default2, runtimes: pt_BR_default3 };
954
+ pt_BR_default4 = Object.freeze(translation20);
955
+ }
956
+ });
957
+
958
+ // src/i18n/commons/zh.ts
959
+ var translation21, zh_default;
960
+ var init_zh = __esm({
961
+ "src/i18n/commons/zh.ts"() {
962
+ translation21 = {
963
+ activate: "\u5728\u72EC\u7ACB\u7A97\u53E3\u4E2D\u6253\u5F00\u8C03\u8BD5\u5668",
964
+ all: "\u6240\u6709\u6A21\u5757",
965
+ close: "\u5173\u95ED\u8C03\u8BD5\u5668",
966
+ content: "\u67E5\u770B\u6587\u672C\u5185\u5BB9\uFF08\u654F\u611F\uFF09",
967
+ developer: "\u5F00\u53D1\u8005",
968
+ diagnostics: "\u8BCA\u65AD",
969
+ empty: "\u5C1A\u672A\u8BB0\u5F55\u72B6\u6001\u8F6C\u6362\u3002",
970
+ error: "\u8BCA\u65AD\u6570\u636E\u6E90\u5931\u8D25\u3002",
971
+ eventsClear: "\u6E05\u9664\u4E8B\u4EF6",
972
+ eventsPause: "\u6682\u505C\u4E8B\u4EF6",
973
+ eventsResume: "\u6062\u590D\u4E8B\u4EF6",
974
+ filter: "\u7B5B\u9009\u6A21\u5757",
975
+ freeze: "\u51BB\u7ED3\u89C6\u56FE",
976
+ help: "\u53EA\u8BFB\u72B6\u6001\u6811\u4EE5 10 Hz \u66F4\u65B0\u3002\u9ED8\u8BA4\u9690\u85CF\u6587\u672C\u3002\u6B64\u9762\u677F\u4E0D\u63A7\u5236\u8BED\u97F3\u3002",
977
+ omitted: "\u5DF2\u7701\u7565\u5176\u4ED6\u9879\u76EE",
978
+ popupBlocked: "\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u8C03\u8BD5\u5668\u7A97\u53E3\u3002\u8BF7\u5141\u8BB8\u6B64\u7F51\u7AD9\u7684\u5F39\u51FA\u7A97\u53E3\uFF0C\u7136\u540E\u91CD\u8BD5\u3002",
979
+ refreshRate: "\u66F4\u65B0\u9891\u7387",
980
+ resume: "\u6062\u590D\u66F4\u65B0",
981
+ states: "\u5F53\u524D\u72B6\u6001",
982
+ title: "\u5B9E\u65F6\u8BED\u97F3\u8C03\u8BD5\u5668",
983
+ transitions: "\u6700\u8FD1\u7684\u72B6\u6001\u8F6C\u6362",
984
+ waiting: "\u6B63\u5728\u7B49\u5F85\u517C\u5BB9\u7684\u5B9E\u65F6\u8BED\u97F3\u8FD0\u884C\u65F6\u3002"
985
+ };
986
+ zh_default = Object.freeze(translation21);
987
+ }
988
+ });
989
+
990
+ // src/i18n/recordings/zh.ts
991
+ var translation22, zh_default2;
992
+ var init_zh2 = __esm({
993
+ "src/i18n/recordings/zh.ts"() {
994
+ translation22 = {
995
+ active: "\u6B63\u5728\u5F55\u5236",
996
+ allSources: "\u6240\u6709\u6765\u6E90",
997
+ assistantEnd: "\u52A9\u624B\u64AD\u653E\u7ED3\u675F",
998
+ assistantPause: "\u52A9\u624B\u64AD\u653E\u6682\u505C",
999
+ assistantResume: "\u52A9\u624B\u64AD\u653E\u6062\u590D",
1000
+ assistantStart: "\u52A9\u624B\u5F00\u59CB\u64AD\u653E",
1001
+ attempts: "\u8F6C\u5F55\u5386\u53F2",
1002
+ audio: "\u5F55\u97F3\u64AD\u653E",
1003
+ audioError: "\u65E0\u6CD5\u52A0\u8F7D\u6216\u64AD\u653E\u5F55\u97F3\u97F3\u9891\u3002",
1004
+ cancel: "\u53D6\u6D88",
1005
+ captureEnd: "\u91C7\u96C6\u7ED3\u675F",
1006
+ captureGated: "\u5DF2\u8BF7\u6C42\u6682\u505C\u9EA6\u514B\u98CE\u4EE5\u901A\u8FC7\u626C\u58F0\u5668\u64AD\u653E",
1007
+ captureStart: "\u91C7\u96C6\u5F00\u59CB",
1008
+ captured: "\u5DF2\u6355\u83B7\u97F3\u9891",
1009
+ completed: "\u5DF2\u5B8C\u6210",
1010
+ confirmDelete: "\u5220\u9664\u6574\u4E2A\u5F55\u97F3\uFF0C\u5305\u62EC\u97F3\u9891\u548C\u8F6C\u5F55\u5386\u53F2\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002\u5220\u9664\u6B63\u5728\u5F55\u5236\u7684\u4F1A\u8BDD\u8FD8\u4F1A\u4E22\u5F03\u540E\u7EED\u4FDD\u5B58\u7684\u97F3\u9891\u3002",
1011
+ date: "\u5F00\u59CB\u65F6\u95F4",
1012
+ delete: "\u5220\u9664\u6574\u4E2A\u4F1A\u8BDD",
1013
+ deleteError: "\u65E0\u6CD5\u5220\u9664\u5F55\u97F3\u3002",
1014
+ duration: "\u65F6\u957F",
1015
+ empty: "\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u5F55\u97F3\u4F1A\u8BDD\u3002",
1016
+ end: "\u7ED3\u675F",
1017
+ engine: "\u5F15\u64CE",
1018
+ error: "\u9519\u8BEF",
1019
+ eventTime: "\u4E8B\u4EF6\u65F6\u95F4",
1020
+ events: "\u52A9\u624B\u4E0E\u91C7\u96C6\u4E8B\u4EF6",
1021
+ eventsHelp: "\u6807\u8BB0\u663E\u793A\u5DF2\u91C7\u96C6\u97F3\u9891\u7684\u8FB9\u754C\u548C\u4E8B\u4EF6\u5B9E\u9645\u65F6\u95F4\u3002\u91C7\u96C6\u505C\u6B62\u540E\u7684\u4E8B\u4EF6\u53EF\u80FD\u5171\u7528\u6700\u7EC8\u8FB9\u754C\uFF1B\u4E0D\u4F1A\u5C06\u52A9\u624B\u97F3\u9891\u6DFB\u52A0\u5230\u5F55\u97F3\u3002",
1022
+ export: "\u5BFC\u51FA\u5B8C\u6574\u72EC\u7ACB JSON",
1023
+ exportError: "\u65E0\u6CD5\u5BFC\u51FA\u5F55\u97F3\u3002",
1024
+ failed: "\u5931\u8D25",
1025
+ help: "\u67E5\u770B\u5DF2\u4FDD\u5B58\u97F3\u9891\u3001\u8BED\u97F3/\u9759\u97F3\u8FB9\u754C\u548C\u8F6C\u5F55\u5C1D\u8BD5\u3002\u97F3\u9891\u548C\u6587\u672C\u53EF\u80FD\u654F\u611F\u3002\u64AD\u653E\u5728\u672C\u5730\u8FDB\u884C\uFF1B\u5BFC\u51FA\u5305\u542B\u97F3\u9891\u548C\u6587\u672C\u3002\u67E5\u770B\u4E0D\u4F1A\u66F4\u6539\u91C7\u96C6\uFF1B\u53EA\u6709\u660E\u786E\u5220\u9664\u64CD\u4F5C\u624D\u4F1A\u79FB\u9664\u5F55\u97F3\u3002",
1026
+ interrupted: "\u5DF2\u4E2D\u65AD",
1027
+ loadError: "\u65E0\u6CD5\u52A0\u8F7D\u5F55\u97F3\u4F1A\u8BDD\u3002\u8BF7\u5237\u65B0\u91CD\u8BD5\u3002",
1028
+ loading: "\u6B63\u5728\u52A0\u8F7D\u5F55\u97F3\u2026",
1029
+ memory: "\u4EC5\u5728\u5185\u5B58\u4E2D",
1030
+ microphone: "\u9EA6\u514B\u98CE",
1031
+ name: "\u4F1A\u8BDD\u540D\u79F0",
1032
+ nameError: "\u65E0\u6CD5\u4FDD\u5B58\u540D\u79F0\u3002\u8BF7\u5148\u52A0\u661F\u6807\uFF0C\u5E76\u4F7F\u7528\u4E0D\u8D85\u8FC7120\u4E2A\u5B57\u7B26\u7684\u5355\u884C\u540D\u79F0\u3002",
1033
+ noAttempts: "\u5C1A\u65E0\u8F6C\u5F55\u5C1D\u8BD5\u3002",
1034
+ open: "\u672A\u7ED3\u675F\u7247\u6BB5",
1035
+ pending: "\u5904\u7406\u4E2D",
1036
+ persistent: "\u5DF2\u4FDD\u5B58\u5230\u672C\u5730",
1037
+ pinConfirmed: "\u786E\u8BA4\u65F6\u95F4",
1038
+ pinDelay: "\u786E\u8BA4\u5EF6\u8FDF",
1039
+ pins: "\u8FB9\u754C\u6807\u8BB0",
1040
+ play: "\u64AD\u653E\u7247\u6BB5",
1041
+ playSession: "\u64AD\u653E\u5DF2\u4FDD\u5B58\u4F1A\u8BDD",
1042
+ refresh: "\u5237\u65B0\u5F55\u97F3",
1043
+ saveName: "\u4FDD\u5B58\u540D\u79F0",
1044
+ saved: "\u5DF2\u4FDD\u5B58\u97F3\u9891",
1045
+ search: "\u641C\u7D22\u7247\u6BB5\u8F6C\u5F55",
1046
+ searchEmpty: "\u6CA1\u6709\u5339\u914D\u7684\u5DF2\u8F6C\u5F55\u7247\u6BB5\u3002",
1047
+ segments: "\u7247\u6BB5",
1048
+ selectSession: "\u8BF7\u9009\u62E9\u5F55\u97F3\u4F1A\u8BDD\u3002",
1049
+ shared: "\u5171\u4EAB\u97F3\u9891",
1050
+ silence: "\u9759\u97F3",
1051
+ source: "\u6765\u6E90",
1052
+ sourceFilter: "\u7B5B\u9009\u6765\u6E90",
1053
+ speech: "\u8BED\u97F3",
1054
+ star: "\u65E0\u9650\u671F\u4FDD\u7559",
1055
+ starError: "\u65E0\u6CD5\u66F4\u6539\u5F55\u97F3\u4FDD\u62A4\u3002",
1056
+ starHelp: "\u5C06\u6B64\u5F55\u97F3\u6392\u9664\u5728\u81EA\u52A8\u6E05\u7406\u548C\u4FDD\u7559\u6570\u91CF\u7EDF\u8BA1\u4E4B\u5916\u3002\u4ECD\u53EF\u624B\u52A8\u5220\u9664\u3002\u8FD9\u4E0D\u4F1A\u66F4\u6539\u6D4F\u89C8\u5668\u5B58\u50A8\u6216\u9632\u9010\u51FA\u4FDD\u62A4\u3002",
1057
+ starred: "\u53D7\u4FDD\u62A4\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u6E05\u7406",
1058
+ start: "\u5F00\u59CB",
1059
+ state: "\u72B6\u6001",
1060
+ storageAudio: "\u5DF2\u5B58\u50A8\u97F3\u9891 (MB)",
1061
+ storageTotal: "\u5DF2\u5B58\u50A8\u97F3\u9891\u603B\u91CF (MB)",
1062
+ storageUnknown: "\u4E0D\u53EF\u7528",
1063
+ success: "\u6210\u529F",
1064
+ timeline: "\u8BED\u97F3 / \u9759\u97F3\u65F6\u95F4\u7EBF",
1065
+ title: "\u5F55\u97F3",
1066
+ unavailable: "\u5F55\u97F3\u670D\u52A1\u4E0D\u53EF\u7528\u3002\u8BF7\u5728\u517C\u5BB9\u7684\u5B9E\u65F6\u8BED\u97F3\u8BBE\u7F6E\u4E2D\u542F\u7528\u5F55\u97F3\u3002",
1067
+ unstar: "\u53D6\u6D88\u4FDD\u62A4",
1068
+ unstarHelp: "\u5141\u8BB8\u81EA\u52A8\u6E05\u7406\uFF0C\u5E76\u5C06\u6B64\u5F55\u97F3\u91CD\u65B0\u8BA1\u5165\u4FDD\u7559\u6570\u91CF\u3002\u4ECD\u53EF\u624B\u52A8\u5220\u9664\u3002\u6D4F\u89C8\u5668\u5B58\u50A8\u548C\u9632\u9010\u51FA\u4FDD\u62A4\u4FDD\u6301\u4E0D\u53D8\u3002",
1069
+ window: "\u65F6\u95F4\u8F74\u8303\u56F4",
1070
+ windowEnd: "\u8303\u56F4\u7ED3\u675F",
1071
+ windowReset: "\u663E\u793A\u5B8C\u6574\u4F1A\u8BDD",
1072
+ windowStart: "\u8303\u56F4\u5F00\u59CB"
1073
+ };
1074
+ zh_default2 = Object.freeze(translation22);
1075
+ }
1076
+ });
1077
+
1078
+ // src/i18n/runtimes/zh.ts
1079
+ var translation23, zh_default3;
1080
+ var init_zh3 = __esm({
1081
+ "src/i18n/runtimes/zh.ts"() {
1082
+ translation23 = {
1083
+ active: "\u6D3B\u52A8\u8BF7\u6C42",
1084
+ audio: "\u4E0A\u6B21\u97F3\u9891\u65F6\u957F",
1085
+ cache: "\u6A21\u578B\u6587\u4EF6\u7F13\u5B58",
1086
+ cancelled: "\u5DF2\u53D6\u6D88",
1087
+ completed: "\u5DF2\u5B8C\u6210\u8F6C\u5F55",
1088
+ device: "\u8BF7\u6C42\u7684\u6267\u884C\u63D0\u4F9B\u7A0B\u5E8F",
1089
+ error: "\u9519\u8BEF\u4EE3\u7801",
1090
+ events: "\u8FD0\u884C\u65F6\u4E8B\u4EF6\uFF08\u6700\u8FD1100\u6761\uFF09",
1091
+ failed: "\u5931\u8D25 / \u5DF2\u53D6\u6D88\u8F6C\u5F55",
1092
+ gpu: "WebGPU\u9002\u914D\u5668\u53EF\u7528",
1093
+ heap: "\u9875\u9762JavaScript\u5806\u4F30\u8BA1",
1094
+ help: "\u6A21\u578B/\u7F13\u5B58\u5927\u5C0F\u662F\u6587\u4EF6\u5B57\u8282\u6570\uFF0C\u4E0D\u662F\u5185\u5B58\u3002PCM\u4EC5\u7EDF\u8BA1\u6D3B\u52A8/\u6392\u961F\u7684\u8F93\u5165\u7F13\u51B2\u533A\u3002JavaScript\u5806\u662F\u975E\u6807\u51C6\u7684\u9875\u9762\u7EA7\u4F30\u8BA1\uFF0C\u4E0D\u5305\u542B\u5B8C\u6574\u7684worker/WASM/GPU\u5185\u5B58\u3002\u6B64\u5904\u65E0\u6CD5\u53EF\u9760\u6D4B\u91CF\u6A21\u578BRAM/\u663E\u5B58\u3002WebGPU\u521D\u59CB\u5316\u6210\u529F\u4E0D\u4EE3\u8868\u5168\u90E8\u7B97\u5B50\u90FD\u5728GPU\u6267\u884C\u3002\u4E8B\u4EF6\u662F\u63D2\u4EF6\u751F\u547D\u5468\u671F\u5143\u6570\u636E\uFF0C\u4E0D\u662F\u539F\u59CBONNX\u65E5\u5FD7\uFF1B\u4E0D\u4FDD\u7559\u97F3\u9891\u6216\u8F6C\u5F55\u3002",
1095
+ id: "Worker\u6807\u8BC6",
1096
+ inference: "\u4E0A\u6B21Worker\u63A8\u7406",
1097
+ load: "\u52A0\u8F7D\u5F80\u8FD4 / Worker",
1098
+ memory: "\u5185\u5B58\u4E0E\u5B58\u50A8",
1099
+ model: "\u6A21\u578B",
1100
+ modelBytes: "\u5B8C\u6574\u6A21\u578B\u4E0B\u8F7D",
1101
+ no: "\u5426",
1102
+ pcm: "\u5DF2\u7EDF\u8BA1\u8F93\u5165PCM",
1103
+ pending: "Worker\u5F85\u5904\u7406\u8BF7\u6C42",
1104
+ quantization: "\u7F16\u7801\u5668 / \u89E3\u7801\u5668\u7CBE\u5EA6",
1105
+ queue: "\u6392\u961F\u8F6C\u5F55",
1106
+ ram: "\u6A21\u578BRAM",
1107
+ ratio: "\u5904\u7406 / \u97F3\u9891\u6BD4\u7387",
1108
+ ready: "\u5C31\u7EEA",
1109
+ released: "\u5DF2\u91CA\u653E",
1110
+ revision: "\u56FA\u5B9A\u7248\u672C",
1111
+ started: "\u5DF2\u5F00\u59CB",
1112
+ status: "\u72B6\u6001",
1113
+ storage: "\u6B64\u6765\u6E90\u53EF\u7528\u5B58\u50A8",
1114
+ success: "\u6210\u529F",
1115
+ title: "\u8FD0\u884C\u65F6",
1116
+ unavailable: "\u4E0D\u53EF\u7528",
1117
+ versions: "ONNX Runtime / Transformers.js",
1118
+ vram: "\u6A21\u578B\u663E\u5B58",
1119
+ worker: "Worker\u6D3B\u52A8",
1120
+ yes: "\u662F"
1121
+ };
1122
+ zh_default3 = Object.freeze(translation23);
1123
+ }
1124
+ });
1125
+
1126
+ // src/i18n/zh.ts
1127
+ var zh_exports = {};
1128
+ __export(zh_exports, {
1129
+ default: () => zh_default4
1130
+ });
1131
+ var translation24, zh_default4;
1132
+ var init_zh4 = __esm({
1133
+ "src/i18n/zh.ts"() {
1134
+ init_zh();
1135
+ init_zh2();
1136
+ init_zh3();
1137
+ translation24 = { commons: zh_default, recordings: zh_default2, runtimes: zh_default3 };
1138
+ zh_default4 = Object.freeze(translation24);
1139
+ }
1140
+ });
1141
+
30
1142
  // src/apply.tsx
31
1143
  var apply_exports = {};
32
1144
  __export(apply_exports, {
@@ -34,7 +1146,7 @@ __export(apply_exports, {
34
1146
  inject: () => inject
35
1147
  });
36
1148
  module.exports = __toCommonJS(apply_exports);
37
- var import_react25 = __toESM(require("react"), 1);
1149
+ var import_react28 = __toESM(require("react"), 1);
38
1150
 
39
1151
  // ../live-voice/src/shared/design-system/buttons/IconButton.tsx
40
1152
  var import_react2 = __toESM(require("react"), 1);
@@ -263,7 +1375,7 @@ var import_react20 = __toESM(require("react"), 1);
263
1375
  var import_client = require("react-dom/client");
264
1376
 
265
1377
  // src/DebuggerPanel.tsx
266
- var import_react24 = __toESM(require("react"), 1);
1378
+ var import_react25 = __toESM(require("react"), 1);
267
1379
 
268
1380
  // ../live-voice/src/modules/core/diagnostics.ts
269
1381
  var DIAGNOSTIC_KEY = /* @__PURE__ */ Symbol.for("dsh-live-voice.diagnostics.v1");
@@ -398,7 +1510,213 @@ function StateTree({
398
1510
  }
399
1511
 
400
1512
  // src/RecordingPanel.tsx
1513
+ var import_react23 = __toESM(require("react"), 1);
1514
+
1515
+ // src/TimelineWindow.tsx
401
1516
  var import_react22 = __toESM(require("react"), 1);
1517
+ function TimelineWindow({ total, start, end, copy, format, onChange, onReset }) {
1518
+ const track = import_react22.default.useRef(null);
1519
+ const drag = import_react22.default.useRef(null);
1520
+ const stopDrag = () => {
1521
+ const current = drag.current;
1522
+ drag.current = null;
1523
+ if (current?.element.hasPointerCapture(current.pointer))
1524
+ current.element.releasePointerCapture(current.pointer);
1525
+ };
1526
+ import_react22.default.useEffect(() => {
1527
+ if (total <= 0) stopDrag();
1528
+ }, [total]);
1529
+ import_react22.default.useEffect(() => stopDrag, []);
1530
+ const change = (part, delta, initialStart = start, initialEnd = end) => {
1531
+ if (total <= 0) return;
1532
+ if (part === "start")
1533
+ onChange(Math.max(0, Math.min(initialEnd - 1, initialStart + delta)), initialEnd);
1534
+ else if (part === "end")
1535
+ onChange(initialStart, Math.min(total, Math.max(initialStart + 1, initialEnd + delta)));
1536
+ else {
1537
+ const offset = Math.max(-initialStart, Math.min(total - initialEnd, delta));
1538
+ onChange(initialStart + offset, initialEnd + offset);
1539
+ }
1540
+ };
1541
+ const begin = (event, part) => {
1542
+ if (total <= 0 || event.button !== 0 || drag.current) return;
1543
+ const width = track.current?.getBoundingClientRect().width ?? 0;
1544
+ if (width <= 0) return;
1545
+ event.preventDefault();
1546
+ event.currentTarget.focus();
1547
+ event.currentTarget.setPointerCapture(event.pointerId);
1548
+ drag.current = {
1549
+ pointer: event.pointerId,
1550
+ x: event.clientX,
1551
+ width,
1552
+ total,
1553
+ start,
1554
+ end,
1555
+ part,
1556
+ element: event.currentTarget
1557
+ };
1558
+ };
1559
+ const move = (event) => {
1560
+ const current = drag.current;
1561
+ if (!current || current.pointer !== event.pointerId) return;
1562
+ change(
1563
+ current.part,
1564
+ Math.round((event.clientX - current.x) * current.total / current.width),
1565
+ current.start,
1566
+ current.end
1567
+ );
1568
+ };
1569
+ const finish = (event) => {
1570
+ if (drag.current?.pointer !== event.pointerId) return;
1571
+ stopDrag();
1572
+ };
1573
+ const keyboard = (event, part) => {
1574
+ const step = Math.max(1, Math.round(total / (event.shiftKey ? 10 : 100)));
1575
+ const amount = {
1576
+ ArrowLeft: -step,
1577
+ ArrowDown: -step,
1578
+ ArrowRight: step,
1579
+ ArrowUp: step,
1580
+ PageDown: -step * 10,
1581
+ PageUp: step * 10
1582
+ }[event.key];
1583
+ let delta = amount;
1584
+ if (event.key === "Home") delta = part === "end" ? start + 1 - end : -start;
1585
+ if (event.key === "End") delta = part === "start" ? end - 1 - start : total - end;
1586
+ if (delta === void 0) return;
1587
+ event.preventDefault();
1588
+ change(part, delta);
1589
+ };
1590
+ const handlers = (part) => ({
1591
+ onPointerDown: (event) => begin(event, part),
1592
+ onPointerMove: move,
1593
+ onPointerUp: (event) => {
1594
+ move(event);
1595
+ finish(event);
1596
+ },
1597
+ onPointerCancel: finish,
1598
+ onLostPointerCapture: () => {
1599
+ drag.current = null;
1600
+ },
1601
+ onKeyDown: (event) => keyboard(event, part)
1602
+ });
1603
+ const percent = (value) => total > 0 ? value / total * 100 : 0;
1604
+ return /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-timeline-window", role: "group", "aria-label": copy.window }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-window-selector" }, /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-window-values" }, /* @__PURE__ */ import_react22.default.createElement("span", null, copy.windowStart, ": ", format(start)), /* @__PURE__ */ import_react22.default.createElement("span", null, copy.windowEnd, ": ", format(end))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-window-track", ref: track }, /* @__PURE__ */ import_react22.default.createElement(
1605
+ "button",
1606
+ {
1607
+ type: "button",
1608
+ role: "slider",
1609
+ className: "dlvd-window-selection",
1610
+ "aria-label": copy.window,
1611
+ "aria-valuemin": 0,
1612
+ "aria-valuemax": Math.max(0, total - (end - start)),
1613
+ "aria-valuenow": start,
1614
+ "aria-valuetext": format(start) + " \u2013 " + format(end),
1615
+ "aria-orientation": "horizontal",
1616
+ disabled: total <= 0,
1617
+ style: { left: percent(start) + "%", width: percent(end - start) + "%" },
1618
+ ...handlers("range")
1619
+ }
1620
+ ), /* @__PURE__ */ import_react22.default.createElement(
1621
+ "button",
1622
+ {
1623
+ type: "button",
1624
+ role: "slider",
1625
+ className: "dlvd-window-handle",
1626
+ "data-edge": "start",
1627
+ "aria-label": copy.windowStart,
1628
+ "aria-valuemin": 0,
1629
+ "aria-valuemax": Math.max(0, end - 1),
1630
+ "aria-valuenow": start,
1631
+ "aria-valuetext": format(start),
1632
+ "aria-orientation": "horizontal",
1633
+ disabled: total <= 0,
1634
+ style: { left: percent(start) + "%" },
1635
+ ...handlers("start")
1636
+ }
1637
+ ), /* @__PURE__ */ import_react22.default.createElement(
1638
+ "button",
1639
+ {
1640
+ type: "button",
1641
+ role: "slider",
1642
+ className: "dlvd-window-handle",
1643
+ "data-edge": "end",
1644
+ "aria-label": copy.windowEnd,
1645
+ "aria-valuemin": Math.min(total, start + 1),
1646
+ "aria-valuemax": total,
1647
+ "aria-valuenow": end,
1648
+ "aria-valuetext": format(end),
1649
+ "aria-orientation": "horizontal",
1650
+ disabled: total <= 0,
1651
+ style: { left: percent(end) + "%" },
1652
+ ...handlers("end")
1653
+ }
1654
+ ))), /* @__PURE__ */ import_react22.default.createElement(
1655
+ "button",
1656
+ {
1657
+ type: "button",
1658
+ className: "dlvd-window-reset",
1659
+ title: copy.windowReset,
1660
+ "aria-label": copy.windowReset,
1661
+ onClick: onReset
1662
+ },
1663
+ /* @__PURE__ */ import_react22.default.createElement(
1664
+ "svg",
1665
+ {
1666
+ width: "18",
1667
+ height: "18",
1668
+ viewBox: "0 0 24 24",
1669
+ fill: "none",
1670
+ stroke: "currentColor",
1671
+ strokeWidth: "1.7",
1672
+ strokeLinecap: "round",
1673
+ strokeLinejoin: "round",
1674
+ "aria-hidden": "true",
1675
+ focusable: "false"
1676
+ },
1677
+ /* @__PURE__ */ import_react22.default.createElement("path", { d: "M8 3H3v5m13-5h5v5M3 16v5h5m13-5v5h-5M8 8l-5-5m13 5 5-5M8 16l-5 5m13-5 5 5" })
1678
+ )
1679
+ ));
1680
+ }
1681
+
1682
+ // src/segmentSearch.ts
1683
+ var normalize = (text) => text.normalize("NFKD").replace(/\p{M}/gu, "").toLowerCase().replace(/[^\p{L}\p{N}]+/gu, " ").trim();
1684
+ function distance(a, b) {
1685
+ let row = Array.from({ length: b.length + 1 }, (_, i) => i);
1686
+ for (let i = 0; i < a.length; i++) {
1687
+ const next = [i + 1];
1688
+ for (let j = 0; j < b.length; j++)
1689
+ next.push(Math.min(next[j] + 1, row[j + 1] + 1, row[j] + (a[i] === b[j] ? 0 : 1)));
1690
+ row = next;
1691
+ }
1692
+ return row[b.length];
1693
+ }
1694
+ function searchSegments(segments, query) {
1695
+ if (!query.trim()) return segments;
1696
+ const needle = normalize(query.slice(0, 160));
1697
+ if (!needle) return [];
1698
+ const words = needle.split(" ");
1699
+ return segments.map((segment, index) => {
1700
+ const transcripts = segment.attempts.filter((a) => a.status === "success" && a.text?.trim()).map((a) => normalize(a.text));
1701
+ let score = Infinity;
1702
+ for (const text of transcripts) {
1703
+ const tokens = text.split(" ");
1704
+ if (text === needle) score = Math.min(score, 0);
1705
+ else if (text.includes(needle)) score = Math.min(score, 1);
1706
+ else if (words.every((word) => tokens.includes(word))) score = Math.min(score, 2);
1707
+ else if (words.every((word) => tokens.some((token) => token.includes(word))))
1708
+ score = Math.min(score, 3);
1709
+ else if (words.every(
1710
+ (word) => tokens.some((token) => {
1711
+ const limit = word.length < 4 ? 0 : word.length < 8 ? 1 : 2;
1712
+ return Math.abs(token.length - word.length) <= limit && distance(word, token) <= limit;
1713
+ })
1714
+ ))
1715
+ score = Math.min(score, 4);
1716
+ }
1717
+ return { segment, index, score };
1718
+ }).filter((hit) => Number.isFinite(hit.score)).sort((a, b) => a.score - b.score || a.index - b.index).map((hit) => hit.segment);
1719
+ }
402
1720
 
403
1721
  // ../live-voice/src/modules/recording/types.ts
404
1722
  var RECORDING_KEY = /* @__PURE__ */ Symbol.for("dsh-live-voice.recordings.v1");
@@ -523,23 +1841,24 @@ function createRecordingInspector(target, changed) {
523
1841
  }
524
1842
 
525
1843
  // src/RecordingPanel.tsx
1844
+ var megabytes = (bytes) => (bytes / 1e6).toFixed(3) + " MB";
526
1845
  function duration(samples, rate) {
527
1846
  const milliseconds = Math.max(0, Math.round(samples / Math.max(1, rate) * 1e3));
528
1847
  const seconds = Math.floor(milliseconds / 1e3);
529
1848
  return [Math.floor(seconds / 3600), Math.floor(seconds / 60) % 60, seconds % 60].map((n) => String(n).padStart(2, "0")).join(":") + "." + String(milliseconds % 1e3).padStart(3, "0");
530
1849
  }
531
1850
  var sourceKey = (session) => JSON.stringify([session.kind, session.sourceId]);
532
- var sourceName = (session, copy) => (session.kind === "microphone" ? copy.recordingMicrophone : copy.recordingShared) + " \xB7 " + (session.label || session.sourceId) + " \xB7 " + session.sourceId;
1851
+ var sourceName = (session, copy) => (session.kind === "microphone" ? copy.recordings.microphone : copy.recordings.shared) + " \xB7 " + (session.label || session.sourceId) + " \xB7 " + session.sourceId;
533
1852
  function stateName(session, copy) {
534
1853
  return {
535
- recording: copy.recordingActive,
536
- completed: copy.recordingCompleted,
537
- interrupted: copy.recordingInterrupted,
538
- failed: copy.recordingFailed
1854
+ recording: copy.recordings.active,
1855
+ completed: copy.recordings.completed,
1856
+ interrupted: copy.recordings.interrupted,
1857
+ failed: copy.recordings.failed
539
1858
  }[session.state];
540
1859
  }
541
1860
  function RecordingPanel({ copy, target }) {
542
- const [view, setView] = import_react22.default.useState({
1861
+ const [view, setView] = import_react23.default.useState({
543
1862
  service: null,
544
1863
  sessions: [],
545
1864
  selected: null,
@@ -547,9 +1866,9 @@ function RecordingPanel({ copy, target }) {
547
1866
  loading: true,
548
1867
  failed: false
549
1868
  });
550
- const inspector = import_react22.default.useRef(null);
551
- const [filter, setFilter] = import_react22.default.useState("");
552
- import_react22.default.useEffect(() => {
1869
+ const inspector = import_react23.default.useRef(null);
1870
+ const [filter, setFilter] = import_react23.default.useState("");
1871
+ import_react23.default.useEffect(() => {
553
1872
  const current = createRecordingInspector(target, setView);
554
1873
  inspector.current = current;
555
1874
  current.discover();
@@ -566,12 +1885,12 @@ function RecordingPanel({ copy, target }) {
566
1885
  ...new Map(view.sessions.map((session) => [sourceKey(session), session])).values()
567
1886
  ];
568
1887
  const visible = view.sessions.filter((session) => !filter || sourceKey(session) === filter).slice().sort((a, b) => b.startedAt.localeCompare(a.startedAt));
569
- import_react22.default.useEffect(() => {
1888
+ import_react23.default.useEffect(() => {
570
1889
  if (!view.loading && filter && visible.length && !visible.some((s) => s.id === view.selected?.id))
571
1890
  inspector.current?.select(visible[0].id);
572
1891
  }, [filter, view.selected?.id, view.loading, visible[0]?.id]);
573
1892
  const selected = view.selected && visible.some((s) => s.id === view.selected?.id) ? view.selected : null;
574
- return /* @__PURE__ */ import_react22.default.createElement("section", { className: "dlvd-recordings", "aria-label": copy.recordingTitle }, /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingHelp), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react22.default.createElement("label", null, copy.recordingSourceFilter, " ", /* @__PURE__ */ import_react22.default.createElement("select", { value: filter, onChange: (event) => setFilter(event.target.value) }, /* @__PURE__ */ import_react22.default.createElement("option", { value: "" }, copy.recordingAllSources), sources.map((session) => /* @__PURE__ */ import_react22.default.createElement("option", { key: sourceKey(session), value: sourceKey(session) }, sourceName(session, copy))))), /* @__PURE__ */ import_react22.default.createElement(
1893
+ return /* @__PURE__ */ import_react23.default.createElement("section", { className: "dlvd-recordings", "aria-label": copy.recordings.title }, /* @__PURE__ */ import_react23.default.createElement("p", null, copy.recordings.help), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react23.default.createElement("label", null, copy.recordings.sourceFilter, " ", /* @__PURE__ */ import_react23.default.createElement("select", { value: filter, onChange: (event) => setFilter(event.target.value) }, /* @__PURE__ */ import_react23.default.createElement("option", { value: "" }, copy.recordings.allSources), sources.map((session) => /* @__PURE__ */ import_react23.default.createElement("option", { key: sourceKey(session), value: sourceKey(session) }, sourceName(session, copy))))), /* @__PURE__ */ import_react23.default.createElement(
575
1894
  "button",
576
1895
  {
577
1896
  type: "button",
@@ -580,35 +1899,36 @@ function RecordingPanel({ copy, target }) {
580
1899
  inspector.current?.refresh();
581
1900
  }
582
1901
  },
583
- copy.recordingRefresh
584
- )), view.failed && /* @__PURE__ */ import_react22.default.createElement("p", { role: "alert" }, copy.recordingLoadError), !view.service ? /* @__PURE__ */ import_react22.default.createElement("p", { role: "status" }, copy.recordingUnavailable) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, view.loading && /* @__PURE__ */ import_react22.default.createElement("p", { role: "status" }, copy.recordingLoading), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-recording-columns" }, /* @__PURE__ */ import_react22.default.createElement(
1902
+ copy.recordings.refresh
1903
+ )), view.failed && /* @__PURE__ */ import_react23.default.createElement("p", { role: "alert" }, copy.recordings.loadError), !view.service ? /* @__PURE__ */ import_react23.default.createElement("p", { role: "status" }, copy.recordings.unavailable) : /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, view.loading && /* @__PURE__ */ import_react23.default.createElement("p", { role: "status" }, copy.recordings.loading), /* @__PURE__ */ import_react23.default.createElement("p", { className: "dlvd-audio-total" }, copy.recordings.storageTotal, ":", " ", view.sessions.every((s) => s.audioBytes !== void 0) ? megabytes(view.sessions.reduce((sum, s) => sum + (s.audioBytes ?? 0), 0)) : copy.recordings.storageUnknown), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-recording-columns" }, /* @__PURE__ */ import_react23.default.createElement(
585
1904
  "div",
586
1905
  {
587
1906
  className: "dlvd-session-list dlvd-scroll",
588
1907
  tabIndex: 0,
589
- "aria-label": copy.recordingTitle
1908
+ "aria-label": copy.recordings.title
590
1909
  },
591
- !visible.length && !view.loading && /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingEmpty),
592
- sources.filter((source) => !filter || sourceKey(source) === filter).map((source) => /* @__PURE__ */ import_react22.default.createElement("section", { key: sourceKey(source), "aria-label": sourceName(source, copy) }, /* @__PURE__ */ import_react22.default.createElement("h3", null, sourceName(source, copy)), /* @__PURE__ */ import_react22.default.createElement("table", null, /* @__PURE__ */ import_react22.default.createElement("thead", null, /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingDate), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingDuration), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingSaved))), /* @__PURE__ */ import_react22.default.createElement("tbody", null, visible.filter((session) => sourceKey(session) === sourceKey(source)).map((session) => /* @__PURE__ */ import_react22.default.createElement("tr", { key: session.id, "data-selected": session.id === selected?.id }, /* @__PURE__ */ import_react22.default.createElement("td", null, /* @__PURE__ */ import_react22.default.createElement(
1910
+ !visible.length && !view.loading && /* @__PURE__ */ import_react23.default.createElement("p", null, copy.recordings.empty),
1911
+ sources.filter((source) => !filter || sourceKey(source) === filter).map((source) => /* @__PURE__ */ import_react23.default.createElement("section", { key: sourceKey(source), "aria-label": sourceName(source, copy) }, /* @__PURE__ */ import_react23.default.createElement("h3", null, sourceName(source, copy)), /* @__PURE__ */ import_react23.default.createElement("table", null, /* @__PURE__ */ import_react23.default.createElement("thead", null, /* @__PURE__ */ import_react23.default.createElement("tr", null, /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.date), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.state), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.duration), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.saved))), /* @__PURE__ */ import_react23.default.createElement("tbody", null, visible.filter((session) => sourceKey(session) === sourceKey(source)).map((session) => /* @__PURE__ */ import_react23.default.createElement("tr", { key: session.id, "data-selected": session.id === selected?.id }, /* @__PURE__ */ import_react23.default.createElement("td", null, /* @__PURE__ */ import_react23.default.createElement(
593
1912
  "button",
594
1913
  {
595
1914
  type: "button",
596
1915
  "aria-pressed": session.id === selected?.id,
597
1916
  onClick: () => inspector.current?.select(session.id)
598
1917
  },
599
- session.starred && /* @__PURE__ */ import_react22.default.createElement(
1918
+ session.starred && /* @__PURE__ */ import_react23.default.createElement(
600
1919
  "span",
601
1920
  {
602
1921
  role: "img",
603
- "aria-label": copy.recordingStarred,
604
- title: copy.recordingStarHelp
1922
+ "aria-label": copy.recordings.starred,
1923
+ title: copy.recordings.starHelp
605
1924
  },
606
1925
  "\u2605"
607
1926
  ),
608
1927
  " ",
609
- /* @__PURE__ */ import_react22.default.createElement("time", { dateTime: session.startedAt }, new Date(session.startedAt).toLocaleString())
610
- )), /* @__PURE__ */ import_react22.default.createElement("td", null, stateName(session, copy)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(session.capturedSamples, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(session.savedSamples, session.sampleRate), /* @__PURE__ */ import_react22.default.createElement("br", null), session.storage === "indexeddb" || session.persistent ? copy.recordingPersistent : copy.recordingMemory)))))))
611
- ), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-recording-detail dlvd-scroll", tabIndex: 0 }, selected ? /* @__PURE__ */ import_react22.default.createElement(
1928
+ session.name && /* @__PURE__ */ import_react23.default.createElement("strong", null, session.name, /* @__PURE__ */ import_react23.default.createElement("br", null)),
1929
+ /* @__PURE__ */ import_react23.default.createElement("time", { dateTime: session.startedAt }, new Date(session.startedAt).toLocaleString())
1930
+ )), /* @__PURE__ */ import_react23.default.createElement("td", null, stateName(session, copy)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(session.capturedSamples, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(session.savedSamples, session.sampleRate), /* @__PURE__ */ import_react23.default.createElement("br", null), session.storage === "indexeddb" || session.persistent ? copy.recordings.persistent : copy.recordings.memory)))))))
1931
+ ), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-recording-detail dlvd-scroll", tabIndex: 0 }, selected ? /* @__PURE__ */ import_react23.default.createElement(
612
1932
  RecordingDetail,
613
1933
  {
614
1934
  key: selected.id,
@@ -618,7 +1938,7 @@ function RecordingPanel({ copy, target }) {
618
1938
  segments: view.segments,
619
1939
  refresh: () => inspector.current?.refresh()
620
1940
  }
621
- ) : /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingSelectSession)))));
1941
+ ) : /* @__PURE__ */ import_react23.default.createElement("p", null, copy.recordings.selectSession)))));
622
1942
  }
623
1943
  function RecordingDetail({
624
1944
  copy,
@@ -627,19 +1947,24 @@ function RecordingDetail({
627
1947
  segments,
628
1948
  refresh
629
1949
  }) {
630
- const container = import_react22.default.useRef(null);
631
- const audio = import_react22.default.useRef(null);
632
- const playback = import_react22.default.useRef(null);
633
- const download = import_react22.default.useRef(null);
634
- const generation = import_react22.default.useRef(0);
635
- const playGeneration = import_react22.default.useRef(0);
636
- const [error, setError] = import_react22.default.useState(null);
637
- const [playing, setPlaying] = import_react22.default.useState(false);
638
- const [exporting, setExporting] = import_react22.default.useState(false);
639
- const [deleting, setDeleting] = import_react22.default.useState(false);
640
- const [starring, setStarring] = import_react22.default.useState(false);
641
- const [confirmDelete, setConfirmDelete] = import_react22.default.useState(false);
642
- const [selectedSegment, setSelectedSegment] = import_react22.default.useState("");
1950
+ const container = import_react23.default.useRef(null);
1951
+ const audio = import_react23.default.useRef(null);
1952
+ const playback = import_react23.default.useRef(null);
1953
+ const download = import_react23.default.useRef(null);
1954
+ const generation = import_react23.default.useRef(0);
1955
+ const playGeneration = import_react23.default.useRef(0);
1956
+ const [error, setError] = import_react23.default.useState(null);
1957
+ const [playing, setPlaying] = import_react23.default.useState(false);
1958
+ const [exporting, setExporting] = import_react23.default.useState(false);
1959
+ const [deleting, setDeleting] = import_react23.default.useState(false);
1960
+ const [starring, setStarring] = import_react23.default.useState(false);
1961
+ const [confirmDelete, setConfirmDelete] = import_react23.default.useState(false);
1962
+ const [name, setName] = import_react23.default.useState(session.name ?? "");
1963
+ const [naming, setNaming] = import_react23.default.useState(false);
1964
+ import_react23.default.useEffect(() => {
1965
+ setName(session.name ?? "");
1966
+ }, [session.id, session.name, service]);
1967
+ const [selectedSegment, setSelectedSegment] = import_react23.default.useState("");
643
1968
  const clearPlayback = (player = audio.current) => {
644
1969
  ++playGeneration.current;
645
1970
  if (player?.hasAttribute("src")) {
@@ -654,7 +1979,7 @@ function RecordingDetail({
654
1979
  if (download.current) download.current.api.revokeObjectURL(download.current.url);
655
1980
  download.current = null;
656
1981
  };
657
- import_react22.default.useEffect(() => {
1982
+ import_react23.default.useEffect(() => {
658
1983
  setStarring(false);
659
1984
  const owner = container.current?.ownerDocument.defaultView;
660
1985
  const player = audio.current;
@@ -689,7 +2014,7 @@ function RecordingDetail({
689
2014
  } catch {
690
2015
  if (token === generation.current && request === playGeneration.current) {
691
2016
  clearPlayback();
692
- setError("recordingAudioError");
2017
+ setError("audioError");
693
2018
  setPlaying(false);
694
2019
  }
695
2020
  } finally {
@@ -721,7 +2046,7 @@ function RecordingDetail({
721
2046
  } catch {
722
2047
  if (token === generation.current) {
723
2048
  clearDownload();
724
- setError("recordingExportError");
2049
+ setError("exportError");
725
2050
  }
726
2051
  } finally {
727
2052
  if (token === generation.current) setExporting(false);
@@ -735,11 +2060,34 @@ function RecordingDetail({
735
2060
  await service.setStarred(session.id, !session.starred);
736
2061
  if (token === generation.current) refresh();
737
2062
  } catch {
738
- if (token === generation.current) setError("recordingStarError");
2063
+ if (token === generation.current) setError("starError");
739
2064
  } finally {
740
2065
  if (token === generation.current) setStarring(false);
741
2066
  }
742
2067
  };
2068
+ const saveName = async () => {
2069
+ if (!service.setName) return;
2070
+ const token = generation.current;
2071
+ setNaming(true);
2072
+ setError(null);
2073
+ try {
2074
+ await service.setName(session.id, name);
2075
+ if (token === generation.current) refresh();
2076
+ } catch {
2077
+ if (token === generation.current) setError("nameError");
2078
+ } finally {
2079
+ if (token === generation.current) setNaming(false);
2080
+ }
2081
+ };
2082
+ const eventName = (kind) => ({
2083
+ "assistant-start": copy.recordings.assistantStart,
2084
+ "assistant-end": copy.recordings.assistantEnd,
2085
+ "assistant-pause": copy.recordings.assistantPause,
2086
+ "assistant-resume": copy.recordings.assistantResume,
2087
+ "capture-gated": copy.recordings.captureGated,
2088
+ "capture-start": copy.recordings.captureStart,
2089
+ "capture-end": copy.recordings.captureEnd
2090
+ })[kind] ?? kind;
743
2091
  const removeSession = async () => {
744
2092
  const token = ++generation.current;
745
2093
  setExporting(false);
@@ -755,61 +2103,130 @@ function RecordingDetail({
755
2103
  refresh();
756
2104
  }
757
2105
  } catch {
758
- if (token === generation.current) setError("recordingDeleteError");
2106
+ if (token === generation.current) setError("deleteError");
759
2107
  } finally {
760
2108
  if (token === generation.current) setDeleting(false);
761
2109
  }
762
2110
  };
2111
+ const [search, setSearch] = import_react23.default.useState("");
2112
+ import_react23.default.useEffect(() => setSearch(""), [session.id, service]);
2113
+ const matchedSegments = import_react23.default.useMemo(() => searchSegments(segments, search), [segments, search]);
763
2114
  const length = Math.max(1, session.savedSamples);
764
- const segmentName = (segment) => (segment.kind === "speech" ? copy.recordingSpeech : copy.recordingSilence) + " \xB7 " + duration(segment.startSample, session.sampleRate) + " \u2014 " + duration(segment.endSample, session.sampleRate);
765
- return /* @__PURE__ */ import_react22.default.createElement("section", { ref: container, "aria-label": sourceName(session, copy) }, /* @__PURE__ */ import_react22.default.createElement("h3", null, sourceName(session, copy)), /* @__PURE__ */ import_react22.default.createElement("dl", { className: "dlvd-recording-meta" }, /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingDate), /* @__PURE__ */ import_react22.default.createElement("dd", null, new Date(session.startedAt).toLocaleString()), /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("dd", null, stateName(session, copy)), /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingCaptured), /* @__PURE__ */ import_react22.default.createElement("dd", null, duration(session.capturedSamples, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingSaved), /* @__PURE__ */ import_react22.default.createElement("dd", null, duration(session.savedSamples, session.sampleRate), " \xB7", session.storage === "indexeddb" || session.persistent ? copy.recordingPersistent : copy.recordingMemory), session.endedAt && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingEnd), /* @__PURE__ */ import_react22.default.createElement("dd", null, new Date(session.endedAt).toLocaleString()))), session.error && /* @__PURE__ */ import_react22.default.createElement("p", { role: "alert" }, copy.recordingError, ": ", session.error), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react22.default.createElement(
2115
+ const [windowStart, setWindowStart] = import_react23.default.useState(0);
2116
+ const [windowEnd, setWindowEnd] = import_react23.default.useState(null);
2117
+ import_react23.default.useEffect(() => {
2118
+ setWindowStart(0);
2119
+ setWindowEnd(null);
2120
+ }, [session.id, service]);
2121
+ const viewEnd = Math.max(1, Math.min(length, windowEnd ?? length));
2122
+ const viewStart = Math.max(0, Math.min(windowStart, viewEnd - 1));
2123
+ const viewLength = viewEnd - viewStart;
2124
+ const inWindow = (sample) => sample >= viewStart && sample <= viewEnd;
2125
+ const position = (sample) => (sample - viewStart) / viewLength * 100 + "%";
2126
+ const segmentName = (segment) => (segment.kind === "speech" ? copy.recordings.speech : copy.recordings.silence) + " \xB7 " + duration(segment.startSample, session.sampleRate) + " \u2014 " + duration(segment.endSample, session.sampleRate);
2127
+ return /* @__PURE__ */ import_react23.default.createElement("section", { ref: container, "aria-label": sourceName(session, copy) }, /* @__PURE__ */ import_react23.default.createElement("h3", null, session.name || sourceName(session, copy)), session.starred && service.setName && /* @__PURE__ */ import_react23.default.createElement(
2128
+ "form",
2129
+ {
2130
+ className: "dlvd-toolbar",
2131
+ onSubmit: (event) => {
2132
+ event.preventDefault();
2133
+ void saveName();
2134
+ }
2135
+ },
2136
+ /* @__PURE__ */ import_react23.default.createElement("label", null, copy.recordings.name, " ", /* @__PURE__ */ import_react23.default.createElement(
2137
+ "input",
2138
+ {
2139
+ value: name,
2140
+ maxLength: 120,
2141
+ disabled: naming || deleting,
2142
+ onInput: (event) => setName(event.currentTarget.value)
2143
+ }
2144
+ )),
2145
+ /* @__PURE__ */ import_react23.default.createElement(
2146
+ "button",
2147
+ {
2148
+ type: "submit",
2149
+ disabled: naming || deleting || starring || name === (session.name ?? "")
2150
+ },
2151
+ copy.recordings.saveName
2152
+ )
2153
+ ), /* @__PURE__ */ import_react23.default.createElement("dl", { className: "dlvd-recording-meta" }, /* @__PURE__ */ import_react23.default.createElement("dt", null, copy.recordings.date), /* @__PURE__ */ import_react23.default.createElement("dd", null, new Date(session.startedAt).toLocaleString()), /* @__PURE__ */ import_react23.default.createElement("dt", null, copy.recordings.state), /* @__PURE__ */ import_react23.default.createElement("dd", null, stateName(session, copy)), /* @__PURE__ */ import_react23.default.createElement("dt", null, copy.recordings.storageAudio), /* @__PURE__ */ import_react23.default.createElement("dd", null, session.audioBytes === void 0 ? copy.recordings.storageUnknown : megabytes(session.audioBytes)), /* @__PURE__ */ import_react23.default.createElement("dt", null, copy.recordings.captured), /* @__PURE__ */ import_react23.default.createElement("dd", null, duration(session.capturedSamples, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("dt", null, copy.recordings.saved), /* @__PURE__ */ import_react23.default.createElement("dd", null, duration(session.savedSamples, session.sampleRate), " \xB7", session.storage === "indexeddb" || session.persistent ? copy.recordings.persistent : copy.recordings.memory), session.endedAt && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("dt", null, copy.recordings.end), /* @__PURE__ */ import_react23.default.createElement("dd", null, new Date(session.endedAt).toLocaleString()))), session.error && /* @__PURE__ */ import_react23.default.createElement("p", { role: "alert" }, copy.recordings.error, ": ", session.error), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react23.default.createElement(
766
2154
  "button",
767
2155
  {
768
2156
  type: "button",
769
- "aria-label": session.starred ? copy.recordingUnstar : copy.recordingStar,
2157
+ "aria-label": session.starred ? copy.recordings.unstar : copy.recordings.star,
770
2158
  "aria-pressed": !!session.starred,
771
- title: session.starred ? copy.recordingUnstarHelp : copy.recordingStarHelp,
772
- disabled: starring || deleting,
2159
+ title: session.starred ? copy.recordings.unstarHelp : copy.recordings.starHelp,
2160
+ disabled: starring || deleting || naming,
773
2161
  onClick: () => void toggleStarred()
774
2162
  },
775
2163
  session.starred ? "\u2605" : "\u2606"
776
- ), /* @__PURE__ */ import_react22.default.createElement(
2164
+ ), /* @__PURE__ */ import_react23.default.createElement(
777
2165
  "button",
778
2166
  {
779
2167
  type: "button",
780
2168
  disabled: playing || deleting || !session.savedSamples,
781
2169
  onClick: () => void play()
782
2170
  },
783
- copy.recordingPlaySession
784
- ), /* @__PURE__ */ import_react22.default.createElement("button", { type: "button", disabled: exporting || deleting, onClick: () => void exportSession() }, copy.recordingExport), /* @__PURE__ */ import_react22.default.createElement(
2171
+ copy.recordings.playSession
2172
+ ), /* @__PURE__ */ import_react23.default.createElement("button", { type: "button", disabled: exporting || deleting, onClick: () => void exportSession() }, copy.recordings.export), /* @__PURE__ */ import_react23.default.createElement(
785
2173
  "button",
786
2174
  {
787
2175
  type: "button",
788
- disabled: deleting || starring,
2176
+ disabled: deleting || starring || naming,
789
2177
  onClick: () => setConfirmDelete(true)
790
2178
  },
791
- copy.recordingDelete
792
- )), confirmDelete && /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-delete-confirm", role: "group", "aria-label": copy.recordingConfirmDelete }, /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingConfirmDelete), /* @__PURE__ */ import_react22.default.createElement(
793
- "button",
2179
+ copy.recordings.delete
2180
+ )), confirmDelete && /* @__PURE__ */ import_react23.default.createElement(
2181
+ "div",
794
2182
  {
795
- type: "button",
796
- disabled: deleting || starring,
797
- onClick: () => void removeSession()
2183
+ className: "dlvd-delete-confirm",
2184
+ role: "group",
2185
+ "aria-label": copy.recordings.confirmDelete
798
2186
  },
799
- copy.recordingDelete
800
- ), " ", /* @__PURE__ */ import_react22.default.createElement("button", { type: "button", disabled: deleting, onClick: () => setConfirmDelete(false) }, copy.recordingCancel)), error && /* @__PURE__ */ import_react22.default.createElement("p", { role: "alert" }, copy[error]), /* @__PURE__ */ import_react22.default.createElement(
2187
+ /* @__PURE__ */ import_react23.default.createElement("p", null, copy.recordings.confirmDelete),
2188
+ /* @__PURE__ */ import_react23.default.createElement(
2189
+ "button",
2190
+ {
2191
+ type: "button",
2192
+ disabled: deleting || starring || naming,
2193
+ onClick: () => void removeSession()
2194
+ },
2195
+ copy.recordings.delete
2196
+ ),
2197
+ " ",
2198
+ /* @__PURE__ */ import_react23.default.createElement("button", { type: "button", disabled: deleting, onClick: () => setConfirmDelete(false) }, copy.recordings.cancel)
2199
+ ), error && /* @__PURE__ */ import_react23.default.createElement("p", { role: "alert" }, copy.recordings[error]), /* @__PURE__ */ import_react23.default.createElement(
801
2200
  "audio",
802
2201
  {
803
2202
  ref: audio,
804
2203
  controls: true,
805
2204
  preload: "none",
806
- "aria-label": copy.recordingAudio,
2205
+ "aria-label": copy.recordings.audio,
807
2206
  onError: () => {
808
2207
  clearPlayback();
809
- setError("recordingAudioError");
2208
+ setError("audioError");
810
2209
  }
811
2210
  }
812
- ), /* @__PURE__ */ import_react22.default.createElement("h4", null, copy.recordingTimeline), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-timeline", role: "group", "aria-label": copy.recordingTimeline }, segments.map((segment) => /* @__PURE__ */ import_react22.default.createElement(
2211
+ ), /* @__PURE__ */ import_react23.default.createElement("h4", null, copy.recordings.timeline), /* @__PURE__ */ import_react23.default.createElement(
2212
+ TimelineWindow,
2213
+ {
2214
+ key: session.id,
2215
+ total: session.savedSamples,
2216
+ start: viewStart,
2217
+ end: Math.min(viewEnd, session.savedSamples),
2218
+ copy: copy.recordings,
2219
+ format: (sample) => duration(sample, session.sampleRate),
2220
+ onChange: (start, end) => {
2221
+ setWindowStart(start);
2222
+ setWindowEnd(end >= length ? null : end);
2223
+ },
2224
+ onReset: () => {
2225
+ setWindowStart(0);
2226
+ setWindowEnd(null);
2227
+ }
2228
+ }
2229
+ ), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-timeline", role: "group", "aria-label": copy.recordings.timeline }, segments.filter((segment) => segment.endSample > viewStart && segment.startSample < viewEnd).map((segment) => /* @__PURE__ */ import_react23.default.createElement(
813
2230
  "button",
814
2231
  {
815
2232
  key: segment.id,
@@ -819,8 +2236,8 @@ function RecordingDetail({
819
2236
  title: segmentName(segment),
820
2237
  "aria-pressed": selectedSegment === segment.id,
821
2238
  style: {
822
- left: segment.startSample / length * 100 + "%",
823
- width: Math.max(0, segment.endSample - segment.startSample) / length * 100 + "%"
2239
+ left: position(Math.max(viewStart, segment.startSample)),
2240
+ width: (Math.min(viewEnd, segment.endSample) - Math.max(viewStart, segment.startSample)) / viewLength * 100 + "%"
824
2241
  },
825
2242
  onClick: () => {
826
2243
  clearPlayback();
@@ -828,62 +2245,85 @@ function RecordingDetail({
828
2245
  setSelectedSegment(segment.id);
829
2246
  }
830
2247
  }
831
- )), session.pins.map((pin) => /* @__PURE__ */ import_react22.default.createElement(
2248
+ )), (session.events ?? []).filter((event) => inWindow(event.atSample)).map((event, index) => /* @__PURE__ */ import_react23.default.createElement(
2249
+ "span",
2250
+ {
2251
+ key: event.id,
2252
+ className: "dlvd-event-pin",
2253
+ "data-event": event.kind,
2254
+ style: {
2255
+ left: position(event.atSample),
2256
+ top: index % 3 * 12
2257
+ },
2258
+ title: eventName(event.kind) + " \xB7 " + new Date(event.occurredAt).toLocaleString(),
2259
+ "aria-hidden": "true"
2260
+ },
2261
+ "\u25C6"
2262
+ )), session.pins.filter((pin) => inWindow(pin.atSample)).map((pin) => /* @__PURE__ */ import_react23.default.createElement(
832
2263
  "span",
833
2264
  {
834
2265
  key: pin.id,
835
2266
  className: "dlvd-pin",
836
2267
  "aria-hidden": "true",
837
- style: { left: Math.min(length, pin.atSample) / length * 100 + "%" },
838
- title: (pin.kind === "speech-start" ? copy.recordingSpeech : copy.recordingSilence) + " \xB7 " + duration(pin.atSample, session.sampleRate)
2268
+ style: { left: position(pin.atSample) },
2269
+ title: (pin.kind === "speech-start" ? copy.recordings.speech : copy.recordings.silence) + " \xB7 " + duration(pin.atSample, session.sampleRate)
2270
+ }
2271
+ ))), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-timeline-legend" }, /* @__PURE__ */ import_react23.default.createElement("span", { "data-kind": "speech" }, copy.recordings.speech), " \xB7 ", /* @__PURE__ */ import_react23.default.createElement("span", { "data-kind": "silence" }, copy.recordings.silence), " \xB7 ", duration(viewStart, session.sampleRate), " \u2013", " ", duration(Math.min(viewEnd, session.savedSamples), session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("h4", null, copy.recordings.events), /* @__PURE__ */ import_react23.default.createElement("p", null, copy.recordings.eventsHelp), /* @__PURE__ */ import_react23.default.createElement("table", { className: "dlvd-recording-events" }, /* @__PURE__ */ import_react23.default.createElement("thead", null, /* @__PURE__ */ import_react23.default.createElement("tr", null, /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.state), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.eventTime), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.captured))), /* @__PURE__ */ import_react23.default.createElement("tbody", null, (session.events ?? []).map((event) => /* @__PURE__ */ import_react23.default.createElement("tr", { key: event.id }, /* @__PURE__ */ import_react23.default.createElement("td", null, eventName(event.kind)), /* @__PURE__ */ import_react23.default.createElement("td", null, /* @__PURE__ */ import_react23.default.createElement("time", { dateTime: event.occurredAt }, new Date(event.occurredAt).toLocaleString(), ".", new Date(event.occurredAt).getMilliseconds().toString().padStart(3, "0"))), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(event.atSample, session.sampleRate)))))), /* @__PURE__ */ import_react23.default.createElement("h4", null, copy.recordings.segments), /* @__PURE__ */ import_react23.default.createElement("label", null, copy.recordings.search, /* @__PURE__ */ import_react23.default.createElement(
2272
+ "input",
2273
+ {
2274
+ type: "search",
2275
+ value: search,
2276
+ maxLength: 160,
2277
+ "aria-label": copy.recordings.search,
2278
+ onInput: (event) => setSearch(event.currentTarget.value)
839
2279
  }
840
- ))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-timeline-legend" }, /* @__PURE__ */ import_react22.default.createElement("span", { "data-kind": "speech" }, copy.recordingSpeech), " \xB7 ", /* @__PURE__ */ import_react22.default.createElement("span", { "data-kind": "silence" }, copy.recordingSilence), " \xB7 ", duration(session.savedSamples, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("h4", null, copy.recordingSegments), /* @__PURE__ */ import_react22.default.createElement("table", { className: "dlvd-segments" }, /* @__PURE__ */ import_react22.default.createElement("thead", null, /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingStart), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingEnd), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingDuration), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingAudio))), /* @__PURE__ */ import_react22.default.createElement("tbody", null, segments.map((segment) => /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, { key: segment.id }, /* @__PURE__ */ import_react22.default.createElement("tr", { "data-selected": selectedSegment === segment.id }, /* @__PURE__ */ import_react22.default.createElement("td", null, segment.kind === "speech" ? copy.recordingSpeech : copy.recordingSilence, segment.open && /* @__PURE__ */ import_react22.default.createElement("small", null, copy.recordingOpen)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(segment.startSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(segment.endSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(segment.endSample - segment.startSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, /* @__PURE__ */ import_react22.default.createElement(
2280
+ )), search.trim() && matchedSegments.length === 0 && /* @__PURE__ */ import_react23.default.createElement("p", { role: "status" }, copy.recordings.searchEmpty), /* @__PURE__ */ import_react23.default.createElement("table", { className: "dlvd-segments" }, /* @__PURE__ */ import_react23.default.createElement("thead", null, /* @__PURE__ */ import_react23.default.createElement("tr", null, /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.state), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.start), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.end), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.duration), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.audio))), /* @__PURE__ */ import_react23.default.createElement("tbody", null, matchedSegments.map((segment) => /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, { key: segment.id }, /* @__PURE__ */ import_react23.default.createElement("tr", { "data-selected": selectedSegment === segment.id }, /* @__PURE__ */ import_react23.default.createElement("td", null, segment.kind === "speech" ? copy.recordings.speech : copy.recordings.silence, segment.open && /* @__PURE__ */ import_react23.default.createElement("small", null, copy.recordings.open)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(segment.startSample, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(segment.endSample, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(segment.endSample - segment.startSample, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("td", null, /* @__PURE__ */ import_react23.default.createElement(
841
2281
  "button",
842
2282
  {
843
2283
  type: "button",
844
2284
  disabled: deleting || segment.endSample <= segment.startSample,
845
- "aria-label": copy.recordingPlay + " \xB7 " + segmentName(segment),
2285
+ "aria-label": copy.recordings.play + " \xB7 " + segmentName(segment),
846
2286
  onClick: () => void play(segment)
847
2287
  },
848
- copy.recordingPlay
849
- ))), segment.kind === "speech" && /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("td", { colSpan: 5 }, /* @__PURE__ */ import_react22.default.createElement("details", { open: selectedSegment === segment.id || void 0 }, /* @__PURE__ */ import_react22.default.createElement("summary", null, copy.recordingAttempts, " \xB7 ", segment.attempts.length), !segment.attempts.length && /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingNoAttempts), segment.attempts.map((attempt) => /* @__PURE__ */ import_react22.default.createElement("article", { className: "dlvd-attempt", key: attempt.id }, /* @__PURE__ */ import_react22.default.createElement("div", null, copy.recordingEngine, ": ", attempt.engine, " \xB7", {
850
- pending: copy.recordingPending,
851
- success: copy.recordingSuccess,
852
- error: copy.recordingError
853
- }[attempt.status]), /* @__PURE__ */ import_react22.default.createElement("time", { dateTime: attempt.createdAt }, new Date(attempt.createdAt).toLocaleString()), attempt.finishedAt && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, " ", "\u2014", " ", /* @__PURE__ */ import_react22.default.createElement("time", { dateTime: attempt.finishedAt }, new Date(attempt.finishedAt).toLocaleString())), /* @__PURE__ */ import_react22.default.createElement("div", null, duration(attempt.startSample, session.sampleRate), " \u2014", " ", duration(attempt.endSample, session.sampleRate)), attempt.text != null && /* @__PURE__ */ import_react22.default.createElement("p", { className: "dlvd-transcript" }, attempt.text), attempt.error && /* @__PURE__ */ import_react22.default.createElement("p", { className: "dlvd-attempt-error" }, copy.recordingError, ": ", attempt.error)))))))))), /* @__PURE__ */ import_react22.default.createElement("details", null, /* @__PURE__ */ import_react22.default.createElement("summary", null, copy.recordingPins, " \xB7 ", session.pins.length), /* @__PURE__ */ import_react22.default.createElement("table", null, /* @__PURE__ */ import_react22.default.createElement("thead", null, /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingStart), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingPinConfirmed), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingPinDelay))), /* @__PURE__ */ import_react22.default.createElement("tbody", null, session.pins.map((pin) => /* @__PURE__ */ import_react22.default.createElement("tr", { key: pin.id }, /* @__PURE__ */ import_react22.default.createElement("td", null, pin.kind === "speech-start" ? copy.recordingSpeech : copy.recordingSilence), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(pin.atSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(pin.confirmedAtSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(pin.delaySamples, session.sampleRate))))))));
2288
+ copy.recordings.play
2289
+ ))), segment.kind === "speech" && /* @__PURE__ */ import_react23.default.createElement("tr", null, /* @__PURE__ */ import_react23.default.createElement("td", { colSpan: 5 }, /* @__PURE__ */ import_react23.default.createElement("details", { open: !!search.trim() || selectedSegment === segment.id || void 0 }, /* @__PURE__ */ import_react23.default.createElement("summary", null, copy.recordings.attempts, " \xB7 ", segment.attempts.length), !segment.attempts.length && /* @__PURE__ */ import_react23.default.createElement("p", null, copy.recordings.noAttempts), segment.attempts.map((attempt) => /* @__PURE__ */ import_react23.default.createElement("article", { className: "dlvd-attempt", key: attempt.id }, /* @__PURE__ */ import_react23.default.createElement("div", null, copy.recordings.engine, ": ", attempt.engine, " \xB7", {
2290
+ pending: copy.recordings.pending,
2291
+ success: copy.recordings.success,
2292
+ error: copy.recordings.error
2293
+ }[attempt.status]), /* @__PURE__ */ import_react23.default.createElement("time", { dateTime: attempt.createdAt }, new Date(attempt.createdAt).toLocaleString()), attempt.finishedAt && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, " ", "\u2014", " ", /* @__PURE__ */ import_react23.default.createElement("time", { dateTime: attempt.finishedAt }, new Date(attempt.finishedAt).toLocaleString())), /* @__PURE__ */ import_react23.default.createElement("div", null, duration(attempt.startSample, session.sampleRate), " \u2014", " ", duration(attempt.endSample, session.sampleRate)), attempt.text != null && /* @__PURE__ */ import_react23.default.createElement("p", { className: "dlvd-transcript" }, attempt.text), attempt.error && /* @__PURE__ */ import_react23.default.createElement("p", { className: "dlvd-attempt-error" }, copy.recordings.error, ": ", attempt.error)))))))))), /* @__PURE__ */ import_react23.default.createElement("details", null, /* @__PURE__ */ import_react23.default.createElement("summary", null, copy.recordings.pins, " \xB7 ", session.pins.length), /* @__PURE__ */ import_react23.default.createElement("table", null, /* @__PURE__ */ import_react23.default.createElement("thead", null, /* @__PURE__ */ import_react23.default.createElement("tr", null, /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.state), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.start), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.pinConfirmed), /* @__PURE__ */ import_react23.default.createElement("th", { scope: "col" }, copy.recordings.pinDelay))), /* @__PURE__ */ import_react23.default.createElement("tbody", null, session.pins.map((pin) => /* @__PURE__ */ import_react23.default.createElement("tr", { key: pin.id }, /* @__PURE__ */ import_react23.default.createElement("td", null, pin.kind === "speech-start" ? copy.recordings.speech : copy.recordings.silence), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(pin.atSample, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(pin.confirmedAtSample, session.sampleRate)), /* @__PURE__ */ import_react23.default.createElement("td", null, duration(pin.delaySamples, session.sampleRate))))))));
854
2294
  }
855
2295
 
856
2296
  // src/RuntimePanel.tsx
857
- var import_react23 = __toESM(require("react"), 1);
2297
+ var import_react24 = __toESM(require("react"), 1);
858
2298
  function RuntimePanel({ data, copy }) {
859
- const unknown = copy.runtimeUnavailable;
2299
+ const unknown = copy.runtimes.unavailable;
860
2300
  const bytes = (n) => typeof n === "number" && Number.isFinite(n) ? (n / 1073741824).toFixed(3) + " GiB (" + Math.round(n).toLocaleString() + " B)" : unknown;
861
2301
  const ms = (n) => typeof n === "number" && Number.isFinite(n) ? Math.round(n).toLocaleString() + " ms" : unknown;
862
2302
  const status = (v) => ({
863
- loading: copy.recordingLoading,
864
- ready: copy.runtimeReady,
865
- error: copy.recordingError,
866
- downloaded: copy.runtimeReleased,
867
- absent: copy.runtimeReleased,
868
- started: copy.runtimeStarted,
869
- success: copy.runtimeSuccess,
870
- released: copy.runtimeReleased,
871
- cancelled: copy.runtimeCancelled
2303
+ loading: copy.recordings.loading,
2304
+ ready: copy.runtimes.ready,
2305
+ error: copy.recordings.error,
2306
+ downloaded: copy.runtimes.released,
2307
+ absent: copy.runtimes.released,
2308
+ started: copy.runtimes.started,
2309
+ success: copy.runtimes.success,
2310
+ released: copy.runtimes.released,
2311
+ cancelled: copy.runtimes.cancelled
872
2312
  })[v] ?? unknown;
873
- const row = (label, value) => /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, { key: label }, /* @__PURE__ */ import_react23.default.createElement("dt", null, label), /* @__PURE__ */ import_react23.default.createElement("dd", null, value));
874
- return /* @__PURE__ */ import_react23.default.createElement("section", { className: "dlvd-runtimes dlvd-scroll", tabIndex: 0, "aria-label": copy.runtimeTitle }, /* @__PURE__ */ import_react23.default.createElement("h3", null, copy.runtimeTitle, " ", /* @__PURE__ */ import_react23.default.createElement(Hint, { label: copy.runtimeTitle }, copy.runtimeHelp)), /* @__PURE__ */ import_react23.default.createElement("dl", { className: "dlvd-recording-meta" }, row(
875
- copy.runtimeVersions,
2313
+ const row = (label, value) => /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, { key: label }, /* @__PURE__ */ import_react24.default.createElement("dt", null, label), /* @__PURE__ */ import_react24.default.createElement("dd", null, value));
2314
+ return /* @__PURE__ */ import_react24.default.createElement("section", { className: "dlvd-runtimes dlvd-scroll", tabIndex: 0, "aria-label": copy.runtimes.title }, /* @__PURE__ */ import_react24.default.createElement("h3", null, copy.runtimes.title, " ", /* @__PURE__ */ import_react24.default.createElement(Hint, { label: copy.runtimes.title }, copy.runtimes.help)), /* @__PURE__ */ import_react24.default.createElement("dl", { className: "dlvd-recording-meta" }, row(
2315
+ copy.runtimes.versions,
876
2316
  (data.versions?.onnx ?? unknown) + " / " + (data.versions?.transformers ?? unknown)
877
- ), row(copy.runtimeId, data.runtimeId ?? unknown), row(
878
- copy.runtimeGpu,
879
- data.gpu === "available" ? copy.runtimeYes : data.gpu === "unavailable" ? copy.runtimeNo : unknown
880
- ), row(copy.runtimeStorage, bytes(data.storageAvailableBytes)), row(copy.runtimeHeap, bytes(data.pageJsHeapBytes)), row(copy.runtimeRam, unknown), row(copy.runtimeVram, unknown)), (data.models ?? []).map((model) => /* @__PURE__ */ import_react23.default.createElement("article", { className: "dlvd-runtime-card", key: model.key }, /* @__PURE__ */ import_react23.default.createElement("h3", null, model.name), /* @__PURE__ */ import_react23.default.createElement("dl", { className: "dlvd-recording-meta" }, row(copy.runtimeStatus, status(model.phase)), row(
881
- copy.runtimeDevice,
2317
+ ), row(copy.runtimes.id, data.runtimeId ?? unknown), row(
2318
+ copy.runtimes.gpu,
2319
+ data.gpu === "available" ? copy.runtimes.yes : data.gpu === "unavailable" ? copy.runtimes.no : unknown
2320
+ ), row(copy.runtimes.storage, bytes(data.storageAvailableBytes)), row(copy.runtimes.heap, bytes(data.pageJsHeapBytes)), row(copy.runtimes.ram, unknown), row(copy.runtimes.vram, unknown)), (data.models ?? []).map((model) => /* @__PURE__ */ import_react24.default.createElement("article", { className: "dlvd-runtime-card", key: model.key }, /* @__PURE__ */ import_react24.default.createElement("h3", null, model.name), /* @__PURE__ */ import_react24.default.createElement("dl", { className: "dlvd-recording-meta" }, row(copy.runtimes.status, status(model.phase)), row(
2321
+ copy.runtimes.device,
882
2322
  model.device === "webgpu" ? "WebGPU" : model.device === "wasm" ? "WebAssembly CPU" : unknown
883
- ), row(copy.runtimeWorker, model.workerActive ? copy.runtimeYes : copy.runtimeNo), row(copy.runtimeRevision, model.repository + " @ " + model.revision), row(copy.runtimeQuantization, model.encoderDtype + " / " + model.decoderDtype), row(copy.runtimeModelBytes, bytes(model.modelBytes)), row(copy.runtimeCache, bytes(model.cachedBytes)), row(copy.runtimePcm, bytes(model.pcmBytes)), row(copy.runtimeLoad, ms(model.loadMs) + " / " + ms(model.workerLoadMs)), row(copy.runtimeInference, ms(model.workerInferenceMs)), row(copy.runtimeAudio, ms(model.audioMs)), row(
884
- copy.runtimeRatio,
2323
+ ), row(copy.runtimes.worker, model.workerActive ? copy.runtimes.yes : copy.runtimes.no), row(copy.runtimes.revision, model.repository + " @ " + model.revision), row(copy.runtimes.quantization, model.encoderDtype + " / " + model.decoderDtype), row(copy.runtimes.modelBytes, bytes(model.modelBytes)), row(copy.runtimes.cache, bytes(model.cachedBytes)), row(copy.runtimes.pcm, bytes(model.pcmBytes)), row(copy.runtimes.load, ms(model.loadMs) + " / " + ms(model.workerLoadMs)), row(copy.runtimes.inference, ms(model.workerInferenceMs)), row(copy.runtimes.audio, ms(model.audioMs)), row(
2324
+ copy.runtimes.ratio,
885
2325
  model.workerInferenceMs != null && model.audioMs > 0 ? (model.workerInferenceMs / model.audioMs).toFixed(2) + "\xD7" : unknown
886
- ), row(copy.runtimeQueue, model.queued), row(copy.runtimeActive, model.active), row(copy.runtimePending, model.pendingRequests), row(copy.runtimeCompleted, model.completed), row(copy.runtimeFailed, model.failed)), model.error && /* @__PURE__ */ import_react23.default.createElement("p", { role: "alert" }, copy.runtimeError, ": ", /* @__PURE__ */ import_react23.default.createElement("code", null, model.error)))), /* @__PURE__ */ import_react23.default.createElement("h3", null, copy.runtimeEvents), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-history" }, !data.events?.length && /* @__PURE__ */ import_react23.default.createElement("p", null, copy.empty), [...data.events ?? []].reverse().map((event) => /* @__PURE__ */ import_react23.default.createElement("div", { key: event.sequence, "data-level": event.status === "error" ? "error" : "debug" }, /* @__PURE__ */ import_react23.default.createElement("time", null, new Date(event.timeMs).toLocaleTimeString()), " \xB7 ", event.model, " \xB7", " ", event.operation === "load" ? copy.runtimeLoad : event.operation === "worker" ? copy.runtimeWorker : copy.runtimeInference, " ", "\xB7 ", status(event.status), event.durationMs != null ? " \xB7 " + ms(event.durationMs) : "", event.code && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, " ", "\xB7 ", /* @__PURE__ */ import_react23.default.createElement("code", null, event.code))))));
2326
+ ), row(copy.runtimes.queue, model.queued), row(copy.runtimes.active, model.active), row(copy.runtimes.pending, model.pendingRequests), row(copy.runtimes.completed, model.completed), row(copy.runtimes.failed, model.failed)), model.error && /* @__PURE__ */ import_react24.default.createElement("p", { role: "alert" }, copy.runtimes.error, ": ", /* @__PURE__ */ import_react24.default.createElement("code", null, model.error)))), /* @__PURE__ */ import_react24.default.createElement("h3", null, copy.runtimes.events), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-history" }, !data.events?.length && /* @__PURE__ */ import_react24.default.createElement("p", null, copy.commons.empty), [...data.events ?? []].reverse().map((event) => /* @__PURE__ */ import_react24.default.createElement("div", { key: event.sequence, "data-level": event.status === "error" ? "error" : "debug" }, /* @__PURE__ */ import_react24.default.createElement("time", null, new Date(event.timeMs).toLocaleTimeString()), " \xB7 ", event.model, " \xB7", " ", event.operation === "load" ? copy.runtimes.load : event.operation === "worker" ? copy.runtimes.worker : copy.runtimes.inference, " ", "\xB7 ", status(event.status), event.durationMs != null ? " \xB7 " + ms(event.durationMs) : "", event.code && /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, null, " ", "\xB7 ", /* @__PURE__ */ import_react24.default.createElement("code", null, event.code))))));
887
2327
  }
888
2328
 
889
2329
  // src/DebuggerPanel.tsx
@@ -892,19 +2332,19 @@ function DebuggerPanel({
892
2332
  onClose,
893
2333
  target = window
894
2334
  }) {
895
- const [tab, setTab] = import_react24.default.useState("recordings");
896
- const tabsId = import_react24.default.useId();
897
- const [frozen, setFrozen] = import_react24.default.useState(false);
898
- const [refreshHz, setRefreshHz] = import_react24.default.useState(10);
899
- const updateRef = import_react24.default.useRef(null);
900
- const [content, setContent] = import_react24.default.useState(false);
901
- const [module2, setModule] = import_react24.default.useState("");
902
- const [view, setView] = import_react24.default.useState(null);
903
- const [failed, setFailed] = import_react24.default.useState(false);
904
- const [eventsPaused, setEventsPaused] = import_react24.default.useState(false);
905
- const pausedRef = import_react24.default.useRef(false);
906
- const inspectorRef = import_react24.default.useRef(null);
907
- import_react24.default.useEffect(() => {
2335
+ const [tab, setTab] = import_react25.default.useState("recordings");
2336
+ const tabsId = import_react25.default.useId();
2337
+ const [frozen, setFrozen] = import_react25.default.useState(false);
2338
+ const [refreshHz, setRefreshHz] = import_react25.default.useState(10);
2339
+ const updateRef = import_react25.default.useRef(null);
2340
+ const [content, setContent] = import_react25.default.useState(false);
2341
+ const [module2, setModule] = import_react25.default.useState("");
2342
+ const [view, setView] = import_react25.default.useState(null);
2343
+ const [failed, setFailed] = import_react25.default.useState(false);
2344
+ const [eventsPaused, setEventsPaused] = import_react25.default.useState(false);
2345
+ const pausedRef = import_react25.default.useRef(false);
2346
+ const inspectorRef = import_react25.default.useRef(null);
2347
+ import_react25.default.useEffect(() => {
908
2348
  if (frozen) return;
909
2349
  let inspector = null;
910
2350
  let source = null;
@@ -937,7 +2377,7 @@ function DebuggerPanel({
937
2377
  inspectorRef.current = null;
938
2378
  };
939
2379
  }, [frozen, content, target]);
940
- import_react24.default.useEffect(() => {
2380
+ import_react25.default.useEffect(() => {
941
2381
  if (frozen) return;
942
2382
  const timer = setInterval(() => updateRef.current?.(), 1e3 / refreshHz);
943
2383
  return () => clearInterval(timer);
@@ -946,10 +2386,10 @@ function DebuggerPanel({
946
2386
  const runtimeData = view?.state?.runtimes;
947
2387
  const hasRuntimes = !!runtimeData?.models?.length;
948
2388
  const tabs = hasRuntimes ? ["recordings", "states", "runtimes"] : ["recordings", "states"];
949
- import_react24.default.useEffect(() => {
2389
+ import_react25.default.useEffect(() => {
950
2390
  if (tab === "runtimes" && !hasRuntimes) setTab("states");
951
2391
  }, [tab, hasRuntimes]);
952
- return /* @__PURE__ */ import_react24.default.createElement("aside", { className: "dlvd-panel", "aria-label": copy.title }, /* @__PURE__ */ import_react24.default.createElement("header", null, /* @__PURE__ */ import_react24.default.createElement("strong", null, copy.title), /* @__PURE__ */ import_react24.default.createElement("span", null, refreshHz, " Hz"), /* @__PURE__ */ import_react24.default.createElement("button", { type: "button", onClick: onClose, "aria-label": copy.close }, "\xD7")), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-tabs", role: "tablist", "aria-label": copy.title }, tabs.map((name) => /* @__PURE__ */ import_react24.default.createElement(
2392
+ return /* @__PURE__ */ import_react25.default.createElement("aside", { className: "dlvd-panel", "aria-label": copy.commons.title }, /* @__PURE__ */ import_react25.default.createElement("header", null, /* @__PURE__ */ import_react25.default.createElement("strong", null, copy.commons.title), /* @__PURE__ */ import_react25.default.createElement("span", null, refreshHz, " Hz"), /* @__PURE__ */ import_react25.default.createElement("button", { type: "button", onClick: onClose, "aria-label": copy.commons.close }, "\xD7")), /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlvd-tabs", role: "tablist", "aria-label": copy.commons.title }, tabs.map((name) => /* @__PURE__ */ import_react25.default.createElement(
953
2393
  "button",
954
2394
  {
955
2395
  type: "button",
@@ -970,8 +2410,8 @@ function DebuggerPanel({
970
2410
  }
971
2411
  }
972
2412
  },
973
- name === "recordings" ? copy.recordingTitle : name === "runtimes" ? copy.runtimeTitle : copy.states
974
- ))), /* @__PURE__ */ import_react24.default.createElement(
2413
+ name === "recordings" ? copy.recordings.title : name === "runtimes" ? copy.runtimes.title : copy.commons.states
2414
+ ))), /* @__PURE__ */ import_react25.default.createElement(
975
2415
  "div",
976
2416
  {
977
2417
  className: "dlvd-tab-panel",
@@ -980,8 +2420,8 @@ function DebuggerPanel({
980
2420
  "aria-labelledby": tabsId + "-recordings-tab",
981
2421
  hidden: tab !== "recordings"
982
2422
  },
983
- tab === "recordings" && /* @__PURE__ */ import_react24.default.createElement(RecordingPanel, { copy, target })
984
- ), hasRuntimes && /* @__PURE__ */ import_react24.default.createElement(
2423
+ tab === "recordings" && /* @__PURE__ */ import_react25.default.createElement(RecordingPanel, { copy, target })
2424
+ ), hasRuntimes && /* @__PURE__ */ import_react25.default.createElement(
985
2425
  "div",
986
2426
  {
987
2427
  className: "dlvd-tab-panel",
@@ -990,8 +2430,8 @@ function DebuggerPanel({
990
2430
  "aria-labelledby": tabsId + "-runtimes-tab",
991
2431
  hidden: tab !== "runtimes"
992
2432
  },
993
- tab === "runtimes" && /* @__PURE__ */ import_react24.default.createElement(RuntimePanel, { data: runtimeData, copy })
994
- ), /* @__PURE__ */ import_react24.default.createElement(
2433
+ tab === "runtimes" && /* @__PURE__ */ import_react25.default.createElement(RuntimePanel, { data: runtimeData, copy })
2434
+ ), /* @__PURE__ */ import_react25.default.createElement(
995
2435
  "div",
996
2436
  {
997
2437
  className: "dlvd-tab-panel",
@@ -1000,15 +2440,15 @@ function DebuggerPanel({
1000
2440
  "aria-labelledby": tabsId + "-states-tab",
1001
2441
  hidden: tab !== "states"
1002
2442
  },
1003
- /* @__PURE__ */ import_react24.default.createElement("p", null, copy.help),
1004
- /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react24.default.createElement("label", null, copy.refreshRate, /* @__PURE__ */ import_react24.default.createElement(
2443
+ /* @__PURE__ */ import_react25.default.createElement("p", null, copy.commons.help),
2444
+ /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react25.default.createElement("label", null, copy.commons.refreshRate, /* @__PURE__ */ import_react25.default.createElement(
1005
2445
  "select",
1006
2446
  {
1007
2447
  value: refreshHz,
1008
2448
  onChange: (event) => setRefreshHz(Number(event.target.value))
1009
2449
  },
1010
- [1, 2, 5, 10, 20].map((hz) => /* @__PURE__ */ import_react24.default.createElement("option", { key: hz, value: hz }, hz, " Hz"))
1011
- )), /* @__PURE__ */ import_react24.default.createElement("button", { type: "button", onClick: () => setFrozen(!frozen) }, frozen ? copy.resume : copy.freeze), /* @__PURE__ */ import_react24.default.createElement("label", null, /* @__PURE__ */ import_react24.default.createElement(
2450
+ [1, 2, 5, 10, 20].map((hz) => /* @__PURE__ */ import_react25.default.createElement("option", { key: hz, value: hz }, hz, " Hz"))
2451
+ )), /* @__PURE__ */ import_react25.default.createElement("button", { type: "button", onClick: () => setFrozen(!frozen) }, frozen ? copy.commons.resume : copy.commons.freeze), /* @__PURE__ */ import_react25.default.createElement("label", null, /* @__PURE__ */ import_react25.default.createElement(
1012
2452
  "input",
1013
2453
  {
1014
2454
  type: "checkbox",
@@ -1019,8 +2459,8 @@ function DebuggerPanel({
1019
2459
  setContent(event.target.checked);
1020
2460
  }
1021
2461
  }
1022
- ), copy.content)),
1023
- failed ? /* @__PURE__ */ import_react24.default.createElement("p", { role: "alert" }, copy.error) : !view ? /* @__PURE__ */ import_react24.default.createElement("p", { role: "status" }, copy.waiting) : /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-columns" }, /* @__PURE__ */ import_react24.default.createElement("section", { className: "dlvd-state-pane", "aria-label": copy.states }, /* @__PURE__ */ import_react24.default.createElement("h3", null, copy.states), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-scroll", tabIndex: 0 }, /* @__PURE__ */ import_react24.default.createElement(StateTree, { name: "context", value: view.state, omitted: copy.omitted }))), /* @__PURE__ */ import_react24.default.createElement("section", { className: "dlvd-event-pane", "aria-label": copy.transitions }, /* @__PURE__ */ import_react24.default.createElement("h3", null, copy.transitions), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react24.default.createElement(
2462
+ ), copy.commons.content)),
2463
+ failed ? /* @__PURE__ */ import_react25.default.createElement("p", { role: "alert" }, copy.commons.error) : !view ? /* @__PURE__ */ import_react25.default.createElement("p", { role: "status" }, copy.commons.waiting) : /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlvd-columns" }, /* @__PURE__ */ import_react25.default.createElement("section", { className: "dlvd-state-pane", "aria-label": copy.commons.states }, /* @__PURE__ */ import_react25.default.createElement("h3", null, copy.commons.states), /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlvd-scroll", tabIndex: 0 }, /* @__PURE__ */ import_react25.default.createElement(StateTree, { name: "context", value: view.state, omitted: copy.commons.omitted }))), /* @__PURE__ */ import_react25.default.createElement("section", { className: "dlvd-event-pane", "aria-label": copy.commons.transitions }, /* @__PURE__ */ import_react25.default.createElement("h3", null, copy.commons.transitions), /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react25.default.createElement(
1024
2464
  "button",
1025
2465
  {
1026
2466
  type: "button",
@@ -1032,8 +2472,8 @@ function DebuggerPanel({
1032
2472
  setEventsPaused(paused);
1033
2473
  }
1034
2474
  },
1035
- eventsPaused ? copy.eventsResume : copy.eventsPause
1036
- ), /* @__PURE__ */ import_react24.default.createElement(
2475
+ eventsPaused ? copy.commons.eventsResume : copy.commons.eventsPause
2476
+ ), /* @__PURE__ */ import_react25.default.createElement(
1037
2477
  "button",
1038
2478
  {
1039
2479
  type: "button",
@@ -1042,726 +2482,176 @@ function DebuggerPanel({
1042
2482
  setView((current) => current ? { ...current, transitions: [] } : current);
1043
2483
  }
1044
2484
  },
1045
- copy.eventsClear
1046
- )), /* @__PURE__ */ import_react24.default.createElement("label", null, copy.filter, /* @__PURE__ */ import_react24.default.createElement("select", { value: module2, onChange: (event) => setModule(event.target.value) }, /* @__PURE__ */ import_react24.default.createElement("option", { value: "" }, copy.all), modules.map((name) => /* @__PURE__ */ import_react24.default.createElement("option", { key: name }, name)))), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-history dlvd-scroll", tabIndex: 0 }, view.transitions.filter((entry) => !module2 || entry.module === module2).slice().reverse().map((entry) => /* @__PURE__ */ import_react24.default.createElement("details", { key: entry.sequence, "data-level": entry.level }, /* @__PURE__ */ import_react24.default.createElement("summary", null, /* @__PURE__ */ import_react24.default.createElement("small", null, new Date(entry.timeMs).toLocaleTimeString()), " ", /* @__PURE__ */ import_react24.default.createElement("code", null, entry.sessionId, " / ", entry.module)), /* @__PURE__ */ import_react24.default.createElement(StateTree, { name: "before", value: entry.before, omitted: copy.omitted }), /* @__PURE__ */ import_react24.default.createElement(StateTree, { name: "after", value: entry.after, omitted: copy.omitted }))), !view.transitions.length && /* @__PURE__ */ import_react24.default.createElement("p", null, copy.empty))))
2485
+ copy.commons.eventsClear
2486
+ )), /* @__PURE__ */ import_react25.default.createElement("label", null, copy.commons.filter, /* @__PURE__ */ import_react25.default.createElement("select", { value: module2, onChange: (event) => setModule(event.target.value) }, /* @__PURE__ */ import_react25.default.createElement("option", { value: "" }, copy.commons.all), modules.map((name) => /* @__PURE__ */ import_react25.default.createElement("option", { key: name }, name)))), /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlvd-history dlvd-scroll", tabIndex: 0 }, view.transitions.filter((entry) => !module2 || entry.module === module2).slice().reverse().map((entry) => /* @__PURE__ */ import_react25.default.createElement("details", { key: entry.sequence, "data-level": entry.level }, /* @__PURE__ */ import_react25.default.createElement("summary", null, /* @__PURE__ */ import_react25.default.createElement("small", null, new Date(entry.timeMs).toLocaleTimeString()), " ", /* @__PURE__ */ import_react25.default.createElement("code", null, entry.sessionId, " / ", entry.module)), /* @__PURE__ */ import_react25.default.createElement(
2487
+ StateTree,
2488
+ {
2489
+ name: "before",
2490
+ value: entry.before,
2491
+ omitted: copy.commons.omitted
2492
+ }
2493
+ ), /* @__PURE__ */ import_react25.default.createElement(StateTree, { name: "after", value: entry.after, omitted: copy.commons.omitted }))), !view.transitions.length && /* @__PURE__ */ import_react25.default.createElement("p", null, copy.commons.empty))))
1047
2494
  ));
1048
2495
  }
1049
2496
 
1050
- // src/locales.ts
1051
- var namespace = "dsh-live-voice-debugger";
1052
- var dictionaries = {
1053
- en: {
1054
- activate: "Open debugger in a separate window",
1055
- all: "All modules",
1056
- close: "Close debugger",
1057
- content: "Inspect text content (sensitive)",
1058
- developer: "Developer",
1059
- diagnostics: "Diagnostics",
1060
- empty: "No transitions recorded yet.",
1061
- error: "Diagnostic source failed.",
1062
- eventsClear: "Clear events",
1063
- eventsPause: "Pause events",
1064
- eventsResume: "Resume events",
1065
- filter: "Filter modules",
1066
- freeze: "Freeze view",
1067
- help: "Read-only state tree updated at 10 Hz. Text is hidden by default. This panel does not control voice.",
1068
- omitted: "Additional items omitted",
1069
- popupBlocked: "The browser blocked the debugger window. Allow popups for this site and try again.",
1070
- recordingActive: "Recording",
1071
- recordingAllSources: "All sources",
1072
- recordingAttempts: "Transcription history",
1073
- recordingAudio: "Recording playback",
1074
- recordingAudioError: "Unable to load or play recording audio.",
1075
- recordingCancel: "Cancel",
1076
- recordingCaptured: "Captured audio",
1077
- recordingCompleted: "Completed",
1078
- recordingConfirmDelete: "Delete this entire recording, including its audio and transcription history? This cannot be undone. Deleting an active recording also discards its future saved audio.",
1079
- recordingDate: "Started",
1080
- recordingDelete: "Delete entire session",
1081
- recordingDeleteError: "Unable to delete the recording.",
1082
- recordingDuration: "Duration",
1083
- recordingEmpty: "No recording sessions match this filter.",
1084
- recordingEnd: "End",
1085
- recordingEngine: "Engine",
1086
- recordingError: "Error",
1087
- recordingExport: "Export self-contained JSON",
1088
- recordingExportError: "Unable to export the recording.",
1089
- recordingFailed: "Failed",
1090
- recordingHelp: "Inspect saved audio, speech/silence boundaries and transcription attempts. Audio and transcripts may be sensitive. Playback is local; export includes audio and text. Inspection never changes capture; only explicit deletion removes recordings.",
1091
- recordingInterrupted: "Interrupted",
1092
- recordingLoadError: "Unable to load recording sessions. Try refreshing.",
1093
- recordingLoading: "Loading recordings\u2026",
1094
- recordingMemory: "Memory only",
1095
- recordingMicrophone: "Microphone",
1096
- recordingNoAttempts: "No transcription attempts yet.",
1097
- recordingOpen: "Open segment",
1098
- recordingPending: "Pending",
1099
- recordingPersistent: "Saved locally",
1100
- recordingPinConfirmed: "Confirmed at",
1101
- recordingPinDelay: "Confirmation delay",
1102
- recordingPins: "Boundary pins",
1103
- recordingPlay: "Play segment",
1104
- recordingPlaySession: "Play saved session",
1105
- recordingRefresh: "Refresh recordings",
1106
- recordingSaved: "Saved audio",
1107
- recordingSegments: "Segments",
1108
- recordingSelectSession: "Select a recording session.",
1109
- recordingShared: "Shared audio",
1110
- recordingSilence: "Silence",
1111
- recordingSource: "Source",
1112
- recordingSourceFilter: "Filter sources",
1113
- recordingSpeech: "Speech",
1114
- recordingStar: "Keep indefinitely",
1115
- recordingStarError: "Unable to change recording protection.",
1116
- recordingStarHelp: "Exclude this recording from automatic cleanup and the retention count. Manual deletion is still allowed. This does not change browser storage or eviction protection.",
1117
- recordingStarred: "Protected from automatic cleanup",
1118
- recordingStart: "Start",
1119
- recordingState: "State",
1120
- recordingSuccess: "Success",
1121
- recordingTimeline: "Speech / silence timeline",
1122
- recordingTitle: "Recordings",
1123
- recordingUnavailable: "Recording service unavailable. Enable recording in Live Voice settings with a compatible runtime.",
1124
- recordingUnstar: "Remove protection",
1125
- recordingUnstarHelp: "Allow automatic cleanup and include this recording in the retention count again. Manual deletion is still allowed. Browser storage and eviction protection are unchanged.",
1126
- refreshRate: "Refresh rate",
1127
- resume: "Resume updates",
1128
- runtimeActive: "Active requests",
1129
- runtimeAudio: "Last audio duration",
1130
- runtimeCache: "Cached model files",
1131
- runtimeCancelled: "Cancelled",
1132
- runtimeCompleted: "Completed transcriptions",
1133
- runtimeDevice: "Requested execution provider",
1134
- runtimeError: "Error code",
1135
- runtimeEvents: "Runtime events (last 100)",
1136
- runtimeFailed: "Failed / cancelled transcriptions",
1137
- runtimeGpu: "WebGPU adapter available",
1138
- runtimeHeap: "Page JavaScript heap estimate",
1139
- runtimeHelp: "Model/cache sizes are file bytes, not RAM. PCM counts only queued/active input buffers. Page JavaScript heap, when available, is a non-standard page-wide estimate and excludes complete worker/WASM/GPU memory. Model RAM and VRAM cannot be reliably measured here. WebGPU initialization does not prove every graph operator ran on GPU. Events are plugin lifecycle metadata, not raw ONNX logs; no audio or transcripts are retained.",
1140
- runtimeId: "Worker identity",
1141
- runtimeInference: "Last worker inference",
1142
- runtimeLoad: "Load round trip / worker",
1143
- runtimeMemory: "Memory and storage",
1144
- runtimeModel: "Model",
1145
- runtimeModelBytes: "Complete model download",
1146
- runtimeNo: "No",
1147
- runtimePcm: "Accounted input PCM",
1148
- runtimePending: "Pending worker requests",
1149
- runtimeQuantization: "Encoder / decoder precision",
1150
- runtimeQueue: "Queued transcriptions",
1151
- runtimeRam: "Model RAM",
1152
- runtimeRatio: "Processing / audio ratio",
1153
- runtimeReady: "Ready",
1154
- runtimeReleased: "Released",
1155
- runtimeRevision: "Pinned revision",
1156
- runtimeStarted: "Started",
1157
- runtimeStatus: "Status",
1158
- runtimeStorage: "Available origin storage",
1159
- runtimeSuccess: "Success",
1160
- runtimeTitle: "Runtimes",
1161
- runtimeUnavailable: "Unavailable",
1162
- runtimeVersions: "ONNX Runtime / Transformers.js",
1163
- runtimeVram: "Model VRAM",
1164
- runtimeWorker: "Worker active",
1165
- runtimeYes: "Yes",
1166
- states: "Current states",
1167
- title: "Live Voice Debugger",
1168
- transitions: "Recent state transitions",
1169
- waiting: "Waiting for a compatible Live Voice runtime."
1170
- },
2497
+ // src/i18n/catalogs.ts
2498
+ init_en4();
2499
+ init_es4();
2500
+ init_fr4();
2501
+ init_hi4();
2502
+ init_pt_BR4();
2503
+ init_zh4();
2504
+ var dictionaries = Object.freeze({ en: en_default4, es: es_default4, fr: fr_default4, hi: hi_default4, "pt-BR": pt_BR_default4, zh: zh_default4 });
2505
+ var Langs = {
2506
+ en: { name: "English", short: "en", locale: "en", lang: () => Promise.resolve().then(() => (init_en4(), en_exports)) },
2507
+ es: { name: "Espa\xF1ol", short: "es", locale: "es", lang: () => Promise.resolve().then(() => (init_es4(), es_exports)) },
2508
+ fr: { name: "Fran\xE7ais", short: "fr", locale: "fr", lang: () => Promise.resolve().then(() => (init_fr4(), fr_exports)) },
2509
+ hi: { name: "\u0939\u093F\u0928\u094D\u0926\u0940", short: "hi", locale: "hi", lang: () => Promise.resolve().then(() => (init_hi4(), hi_exports)) },
1171
2510
  "pt-BR": {
1172
- activate: "Abrir debugger em janela separada",
1173
- all: "Todos os m\xF3dulos",
1174
- close: "Fechar debugger",
1175
- content: "Inspecionar conte\xFAdo de texto (sens\xEDvel)",
1176
- developer: "Desenvolvedor",
1177
- diagnostics: "Diagn\xF3stico",
1178
- empty: "Nenhuma transi\xE7\xE3o registrada ainda.",
1179
- error: "A fonte de diagn\xF3stico falhou.",
1180
- eventsClear: "Limpar eventos",
1181
- eventsPause: "Pausar eventos",
1182
- eventsResume: "Retomar eventos",
1183
- filter: "Filtrar m\xF3dulos",
1184
- freeze: "Congelar visualiza\xE7\xE3o",
1185
- help: "\xC1rvore de estados somente leitura atualizada a 10 Hz. Texto oculto por padr\xE3o. Este painel n\xE3o controla a voz.",
1186
- omitted: "Itens adicionais omitidos",
1187
- popupBlocked: "O navegador bloqueou a janela do debugger. Permita pop-ups neste site e tente novamente.",
1188
- recordingActive: "Gravando",
1189
- recordingAllSources: "Todas as fontes",
1190
- recordingAttempts: "Hist\xF3rico de transcri\xE7\xE3o",
1191
- recordingAudio: "Reprodu\xE7\xE3o da grava\xE7\xE3o",
1192
- recordingAudioError: "N\xE3o foi poss\xEDvel carregar ou reproduzir o \xE1udio.",
1193
- recordingCancel: "Cancelar",
1194
- recordingCaptured: "\xC1udio capturado",
1195
- recordingCompleted: "Conclu\xEDda",
1196
- recordingConfirmDelete: "Excluir esta grava\xE7\xE3o inteira, incluindo \xE1udio e hist\xF3rico de transcri\xE7\xE3o? N\xE3o \xE9 poss\xEDvel desfazer. Excluir uma grava\xE7\xE3o ativa tamb\xE9m descarta o \xE1udio salvo futuro.",
1197
- recordingDate: "In\xEDcio",
1198
- recordingDelete: "Excluir sess\xE3o inteira",
1199
- recordingDeleteError: "N\xE3o foi poss\xEDvel excluir a grava\xE7\xE3o.",
1200
- recordingDuration: "Dura\xE7\xE3o",
1201
- recordingEmpty: "Nenhuma grava\xE7\xE3o corresponde ao filtro.",
1202
- recordingEnd: "Fim",
1203
- recordingEngine: "Motor",
1204
- recordingError: "Erro",
1205
- recordingExport: "Exportar JSON completo",
1206
- recordingExportError: "N\xE3o foi poss\xEDvel exportar a grava\xE7\xE3o.",
1207
- recordingFailed: "Falhou",
1208
- recordingHelp: "Inspecione \xE1udio salvo, limites de fala/sil\xEAncio e tentativas de transcri\xE7\xE3o. \xC1udio e texto podem ser sens\xEDveis. Reprodu\xE7\xE3o local; a exporta\xE7\xE3o inclui \xE1udio e texto. Inspecionar n\xE3o altera a captura; apenas a exclus\xE3o expl\xEDcita remove grava\xE7\xF5es.",
1209
- recordingInterrupted: "Interrompida",
1210
- recordingLoadError: "N\xE3o foi poss\xEDvel carregar as grava\xE7\xF5es. Tente atualizar.",
1211
- recordingLoading: "Carregando grava\xE7\xF5es\u2026",
1212
- recordingMemory: "Somente na mem\xF3ria",
1213
- recordingMicrophone: "Microfone",
1214
- recordingNoAttempts: "Nenhuma tentativa de transcri\xE7\xE3o ainda.",
1215
- recordingOpen: "Segmento aberto",
1216
- recordingPending: "Pendente",
1217
- recordingPersistent: "Salva localmente",
1218
- recordingPinConfirmed: "Confirmado em",
1219
- recordingPinDelay: "Atraso de confirma\xE7\xE3o",
1220
- recordingPins: "Marcadores de limite",
1221
- recordingPlay: "Reproduzir segmento",
1222
- recordingPlaySession: "Reproduzir sess\xE3o salva",
1223
- recordingRefresh: "Atualizar grava\xE7\xF5es",
1224
- recordingSaved: "\xC1udio salvo",
1225
- recordingSegments: "Segmentos",
1226
- recordingSelectSession: "Selecione uma sess\xE3o de grava\xE7\xE3o.",
1227
- recordingShared: "\xC1udio compartilhado",
1228
- recordingSilence: "Sil\xEAncio",
1229
- recordingSource: "Fonte",
1230
- recordingSourceFilter: "Filtrar fontes",
1231
- recordingSpeech: "Fala",
1232
- recordingStar: "Manter por tempo indeterminado",
1233
- recordingStarError: "N\xE3o foi poss\xEDvel alterar a prote\xE7\xE3o da grava\xE7\xE3o.",
1234
- recordingStarHelp: "Exclui esta grava\xE7\xE3o da limpeza autom\xE1tica e da contagem de reten\xE7\xE3o. A exclus\xE3o manual continua permitida. N\xE3o altera o armazenamento nem a prote\xE7\xE3o contra remo\xE7\xE3o pelo navegador.",
1235
- recordingStarred: "Protegida da limpeza autom\xE1tica",
1236
- recordingStart: "In\xEDcio",
1237
- recordingState: "Estado",
1238
- recordingSuccess: "Sucesso",
1239
- recordingTimeline: "Linha do tempo de fala / sil\xEAncio",
1240
- recordingTitle: "Grava\xE7\xF5es",
1241
- recordingUnavailable: "Servi\xE7o de grava\xE7\xE3o indispon\xEDvel. Ative a grava\xE7\xE3o nas configura\xE7\xF5es da Voz ao Vivo com um runtime compat\xEDvel.",
1242
- recordingUnstar: "Remover prote\xE7\xE3o",
1243
- recordingUnstarHelp: "Permite a limpeza autom\xE1tica e inclui novamente esta grava\xE7\xE3o na contagem de reten\xE7\xE3o. A exclus\xE3o manual continua permitida. O armazenamento e a prote\xE7\xE3o contra remo\xE7\xE3o pelo navegador n\xE3o mudam.",
1244
- refreshRate: "Frequ\xEAncia de atualiza\xE7\xE3o",
1245
- resume: "Retomar atualiza\xE7\xF5es",
1246
- runtimeActive: "Requisi\xE7\xF5es ativas",
1247
- runtimeAudio: "Dura\xE7\xE3o do \xFAltimo \xE1udio",
1248
- runtimeCache: "Arquivos do modelo em cache",
1249
- runtimeCancelled: "Cancelado",
1250
- runtimeCompleted: "Transcri\xE7\xF5es conclu\xEDdas",
1251
- runtimeDevice: "Provedor de execu\xE7\xE3o solicitado",
1252
- runtimeError: "C\xF3digo do erro",
1253
- runtimeEvents: "Eventos do runtime (\xFAltimos 100)",
1254
- runtimeFailed: "Transcri\xE7\xF5es com falha / canceladas",
1255
- runtimeGpu: "Adaptador WebGPU dispon\xEDvel",
1256
- runtimeHeap: "Estimativa do heap JavaScript da p\xE1gina",
1257
- runtimeHelp: "O tamanho do modelo/cache \xE9 de arquivos, n\xE3o RAM. PCM conta apenas buffers de entrada ativos/na fila. O heap JavaScript, quando dispon\xEDvel, \xE9 uma estimativa n\xE3o padronizada da p\xE1gina e n\xE3o inclui toda a mem\xF3ria dos workers/WASM/GPU. N\xE3o \xE9 poss\xEDvel medir com confian\xE7a a RAM/VRAM do modelo aqui. Inicializar WebGPU n\xE3o prova que todos os operadores rodaram na GPU. Os eventos s\xE3o metadados do ciclo de vida do plugin, n\xE3o logs brutos do ONNX; n\xE3o guardam \xE1udio nem transcri\xE7\xF5es.",
1258
- runtimeId: "Identidade do worker",
1259
- runtimeInference: "\xDAltima infer\xEAncia no worker",
1260
- runtimeLoad: "Carregamento ida e volta / worker",
1261
- runtimeMemory: "Mem\xF3ria e armazenamento",
1262
- runtimeModel: "Modelo",
1263
- runtimeModelBytes: "Download completo do modelo",
1264
- runtimeNo: "N\xE3o",
1265
- runtimePcm: "PCM de entrada contabilizado",
1266
- runtimePending: "Requisi\xE7\xF5es pendentes no worker",
1267
- runtimeQuantization: "Precis\xE3o do encoder / decoder",
1268
- runtimeQueue: "Transcri\xE7\xF5es na fila",
1269
- runtimeRam: "RAM do modelo",
1270
- runtimeRatio: "Rela\xE7\xE3o processamento / \xE1udio",
1271
- runtimeReady: "Pronto",
1272
- runtimeReleased: "Liberado",
1273
- runtimeRevision: "Revis\xE3o fixada",
1274
- runtimeStarted: "Iniciado",
1275
- runtimeStatus: "Estado",
1276
- runtimeStorage: "Armazenamento dispon\xEDvel nesta origem",
1277
- runtimeSuccess: "Sucesso",
1278
- runtimeTitle: "Runtimes",
1279
- runtimeUnavailable: "Indispon\xEDvel",
1280
- runtimeVersions: "ONNX Runtime / Transformers.js",
1281
- runtimeVram: "VRAM do modelo",
1282
- runtimeWorker: "Worker ativo",
1283
- runtimeYes: "Sim",
1284
- states: "Estados atuais",
1285
- title: "Depurador da Voz ao Vivo",
1286
- transitions: "Transi\xE7\xF5es de estado recentes",
1287
- waiting: "Aguardando um runtime da Voz ao Vivo compat\xEDvel."
1288
- },
1289
- es: {
1290
- activate: "Abrir depurador en una ventana separada",
1291
- all: "Todos los m\xF3dulos",
1292
- close: "Cerrar depurador",
1293
- content: "Inspeccionar contenido de texto (sensible)",
1294
- developer: "Desarrollador",
1295
- diagnostics: "Diagn\xF3stico",
1296
- empty: "Todav\xEDa no hay transiciones registradas.",
1297
- error: "La fuente de diagn\xF3stico fall\xF3.",
1298
- eventsClear: "Borrar eventos",
1299
- eventsPause: "Pausar eventos",
1300
- eventsResume: "Reanudar eventos",
1301
- filter: "Filtrar m\xF3dulos",
1302
- freeze: "Congelar vista",
1303
- help: "\xC1rbol de estados de solo lectura actualizado a 10 Hz. Texto oculto por defecto. Este panel no controla la voz.",
1304
- omitted: "Elementos adicionales omitidos",
1305
- popupBlocked: "El navegador bloque\xF3 la ventana del depurador. Permita ventanas emergentes en este sitio e int\xE9ntelo de nuevo.",
1306
- recordingActive: "Grabando",
1307
- recordingAllSources: "Todas las fuentes",
1308
- recordingAttempts: "Historial de transcripci\xF3n",
1309
- recordingAudio: "Reproducci\xF3n de la grabaci\xF3n",
1310
- recordingAudioError: "No se pudo cargar o reproducir el audio.",
1311
- recordingCancel: "Cancelar",
1312
- recordingCaptured: "Audio capturado",
1313
- recordingCompleted: "Completada",
1314
- recordingConfirmDelete: "\xBFEliminar toda esta grabaci\xF3n, incluido el audio y el historial de transcripci\xF3n? No se puede deshacer. Eliminar una grabaci\xF3n activa tambi\xE9n descarta su audio guardado futuro.",
1315
- recordingDate: "Inicio",
1316
- recordingDelete: "Eliminar sesi\xF3n completa",
1317
- recordingDeleteError: "No se pudo eliminar la grabaci\xF3n.",
1318
- recordingDuration: "Duraci\xF3n",
1319
- recordingEmpty: "Ninguna grabaci\xF3n coincide con el filtro.",
1320
- recordingEnd: "Fin",
1321
- recordingEngine: "Motor",
1322
- recordingError: "Error",
1323
- recordingExport: "Exportar JSON completo",
1324
- recordingExportError: "No se pudo exportar la grabaci\xF3n.",
1325
- recordingFailed: "Fallida",
1326
- recordingHelp: "Inspeccione audio guardado, l\xEDmites de voz/silencio e intentos de transcripci\xF3n. Audio y texto pueden ser sensibles. La reproducci\xF3n es local; la exportaci\xF3n incluye audio y texto. Inspeccionar no cambia la captura; solo la eliminaci\xF3n expl\xEDcita borra grabaciones.",
1327
- recordingInterrupted: "Interrumpida",
1328
- recordingLoadError: "No se pudieron cargar las grabaciones. Intente actualizar.",
1329
- recordingLoading: "Cargando grabaciones\u2026",
1330
- recordingMemory: "Solo en memoria",
1331
- recordingMicrophone: "Micr\xF3fono",
1332
- recordingNoAttempts: "Todav\xEDa no hay intentos de transcripci\xF3n.",
1333
- recordingOpen: "Segmento abierto",
1334
- recordingPending: "Pendiente",
1335
- recordingPersistent: "Guardada localmente",
1336
- recordingPinConfirmed: "Confirmado en",
1337
- recordingPinDelay: "Demora de confirmaci\xF3n",
1338
- recordingPins: "Marcadores de l\xEDmite",
1339
- recordingPlay: "Reproducir segmento",
1340
- recordingPlaySession: "Reproducir sesi\xF3n guardada",
1341
- recordingRefresh: "Actualizar grabaciones",
1342
- recordingSaved: "Audio guardado",
1343
- recordingSegments: "Segmentos",
1344
- recordingSelectSession: "Seleccione una sesi\xF3n de grabaci\xF3n.",
1345
- recordingShared: "Audio compartido",
1346
- recordingSilence: "Silencio",
1347
- recordingSource: "Fuente",
1348
- recordingSourceFilter: "Filtrar fuentes",
1349
- recordingSpeech: "Voz",
1350
- recordingStar: "Conservar indefinidamente",
1351
- recordingStarError: "No se pudo cambiar la protecci\xF3n de la grabaci\xF3n.",
1352
- recordingStarHelp: "Excluye esta grabaci\xF3n de la limpieza autom\xE1tica y del recuento de retenci\xF3n. La eliminaci\xF3n manual sigue permitida. No cambia el almacenamiento ni la protecci\xF3n contra eliminaci\xF3n del navegador.",
1353
- recordingStarred: "Protegida de la limpieza autom\xE1tica",
1354
- recordingStart: "Inicio",
1355
- recordingState: "Estado",
1356
- recordingSuccess: "\xC9xito",
1357
- recordingTimeline: "Cronolog\xEDa de voz / silencio",
1358
- recordingTitle: "Grabaciones",
1359
- recordingUnavailable: "Servicio de grabaci\xF3n no disponible. Active la grabaci\xF3n en los ajustes de Voz en vivo con un runtime compatible.",
1360
- recordingUnstar: "Quitar protecci\xF3n",
1361
- recordingUnstarHelp: "Permite la limpieza autom\xE1tica e incluye de nuevo esta grabaci\xF3n en el recuento de retenci\xF3n. La eliminaci\xF3n manual sigue permitida. El almacenamiento y la protecci\xF3n contra eliminaci\xF3n del navegador no cambian.",
1362
- refreshRate: "Frecuencia de actualizaci\xF3n",
1363
- resume: "Reanudar actualizaciones",
1364
- runtimeActive: "Solicitudes activas",
1365
- runtimeAudio: "Duraci\xF3n del \xFAltimo audio",
1366
- runtimeCache: "Archivos del modelo en cach\xE9",
1367
- runtimeCancelled: "Cancelado",
1368
- runtimeCompleted: "Transcripciones completadas",
1369
- runtimeDevice: "Proveedor de ejecuci\xF3n solicitado",
1370
- runtimeError: "C\xF3digo de error",
1371
- runtimeEvents: "Eventos del runtime (\xFAltimos 100)",
1372
- runtimeFailed: "Transcripciones fallidas / canceladas",
1373
- runtimeGpu: "Adaptador WebGPU disponible",
1374
- runtimeHeap: "Estimaci\xF3n del heap JavaScript de la p\xE1gina",
1375
- runtimeHelp: "El tama\xF1o del modelo/cach\xE9 corresponde a archivos, no a RAM. PCM cuenta solo los b\xFAferes de entrada activos/en cola. El heap JavaScript es una estimaci\xF3n no est\xE1ndar de toda la p\xE1gina y no incluye toda la memoria de workers/WASM/GPU. La RAM/VRAM del modelo no se puede medir de forma fiable aqu\xED. Inicializar WebGPU no prueba que todos los operadores usen la GPU. Los eventos son metadatos del plugin, no logs brutos de ONNX; no guardan audio ni transcripciones.",
1376
- runtimeId: "Identidad del worker",
1377
- runtimeInference: "\xDAltima inferencia en el worker",
1378
- runtimeLoad: "Carga ida y vuelta / worker",
1379
- runtimeMemory: "Memoria y almacenamiento",
1380
- runtimeModel: "Modelo",
1381
- runtimeModelBytes: "Descarga completa del modelo",
1382
- runtimeNo: "No",
1383
- runtimePcm: "PCM de entrada contabilizado",
1384
- runtimePending: "Solicitudes pendientes del worker",
1385
- runtimeQuantization: "Precisi\xF3n del encoder / decoder",
1386
- runtimeQueue: "Transcripciones en cola",
1387
- runtimeRam: "RAM del modelo",
1388
- runtimeRatio: "Relaci\xF3n procesamiento / audio",
1389
- runtimeReady: "Listo",
1390
- runtimeReleased: "Liberado",
1391
- runtimeRevision: "Revisi\xF3n fijada",
1392
- runtimeStarted: "Iniciado",
1393
- runtimeStatus: "Estado",
1394
- runtimeStorage: "Almacenamiento disponible de este origen",
1395
- runtimeSuccess: "\xC9xito",
1396
- runtimeTitle: "Runtimes",
1397
- runtimeUnavailable: "No disponible",
1398
- runtimeVersions: "ONNX Runtime / Transformers.js",
1399
- runtimeVram: "VRAM del modelo",
1400
- runtimeWorker: "Worker activo",
1401
- runtimeYes: "S\xED",
1402
- states: "Estados actuales",
1403
- title: "Depurador de Voz en vivo",
1404
- transitions: "Transiciones de estado recientes",
1405
- waiting: "Esperando un runtime de Voz en vivo compatible."
1406
- },
1407
- fr: {
1408
- activate: "Ouvrir le d\xE9bogueur dans une fen\xEAtre s\xE9par\xE9e",
1409
- all: "Tous les modules",
1410
- close: "Fermer le d\xE9bogueur",
1411
- content: "Inspecter le texte (sensible)",
1412
- developer: "D\xE9veloppeur",
1413
- diagnostics: "Diagnostic",
1414
- empty: "Aucune transition enregistr\xE9e.",
1415
- error: "La source de diagnostic a \xE9chou\xE9.",
1416
- eventsClear: "Effacer les \xE9v\xE9nements",
1417
- eventsPause: "Suspendre les \xE9v\xE9nements",
1418
- eventsResume: "Reprendre les \xE9v\xE9nements",
1419
- filter: "Filtrer les modules",
1420
- freeze: "Figer la vue",
1421
- help: "Arbre des \xE9tats en lecture seule actualis\xE9 \xE0 10 Hz. Texte masqu\xE9 par d\xE9faut. Ce panneau ne contr\xF4le pas la voix.",
1422
- omitted: "\xC9l\xE9ments suppl\xE9mentaires masqu\xE9s",
1423
- popupBlocked: "Le navigateur a bloqu\xE9 la fen\xEAtre du d\xE9bogueur. Autorisez les fen\xEAtres contextuelles pour ce site et r\xE9essayez.",
1424
- recordingActive: "Enregistrement",
1425
- recordingAllSources: "Toutes les sources",
1426
- recordingAttempts: "Historique des transcriptions",
1427
- recordingAudio: "Lecture de l\u2019enregistrement",
1428
- recordingAudioError: "Impossible de charger ou lire l\u2019audio.",
1429
- recordingCancel: "Annuler",
1430
- recordingCaptured: "Audio captur\xE9",
1431
- recordingCompleted: "Termin\xE9",
1432
- recordingConfirmDelete: "Supprimer cet enregistrement entier, y compris son audio et son historique de transcription ? Cette action est irr\xE9versible. Supprimer un enregistrement actif supprime aussi son futur audio enregistr\xE9.",
1433
- recordingDate: "D\xE9but",
1434
- recordingDelete: "Supprimer toute la session",
1435
- recordingDeleteError: "Impossible de supprimer l\u2019enregistrement.",
1436
- recordingDuration: "Dur\xE9e",
1437
- recordingEmpty: "Aucun enregistrement ne correspond au filtre.",
1438
- recordingEnd: "Fin",
1439
- recordingEngine: "Moteur",
1440
- recordingError: "Erreur",
1441
- recordingExport: "Exporter le JSON autonome",
1442
- recordingExportError: "Impossible d\u2019exporter l\u2019enregistrement.",
1443
- recordingFailed: "\xC9chec",
1444
- recordingHelp: "Inspectez l\u2019audio sauvegard\xE9, les limites parole/silence et les tentatives de transcription. Audio et texte peuvent \xEAtre sensibles. Lecture locale ; l\u2019export contient l\u2019audio et le texte. L\u2019inspection ne change pas la capture ; seule une suppression explicite efface les enregistrements.",
1445
- recordingInterrupted: "Interrompu",
1446
- recordingLoadError: "Impossible de charger les enregistrements. Actualisez la liste.",
1447
- recordingLoading: "Chargement des enregistrements\u2026",
1448
- recordingMemory: "En m\xE9moire uniquement",
1449
- recordingMicrophone: "Microphone",
1450
- recordingNoAttempts: "Aucune tentative de transcription.",
1451
- recordingOpen: "Segment ouvert",
1452
- recordingPending: "En attente",
1453
- recordingPersistent: "Sauvegard\xE9 localement",
1454
- recordingPinConfirmed: "Confirm\xE9 \xE0",
1455
- recordingPinDelay: "D\xE9lai de confirmation",
1456
- recordingPins: "Marqueurs de limite",
1457
- recordingPlay: "Lire le segment",
1458
- recordingPlaySession: "Lire la session sauvegard\xE9e",
1459
- recordingRefresh: "Actualiser les enregistrements",
1460
- recordingSaved: "Audio sauvegard\xE9",
1461
- recordingSegments: "Segments",
1462
- recordingSelectSession: "S\xE9lectionnez une session d\u2019enregistrement.",
1463
- recordingShared: "Audio partag\xE9",
1464
- recordingSilence: "Silence",
1465
- recordingSource: "Source",
1466
- recordingSourceFilter: "Filtrer les sources",
1467
- recordingSpeech: "Parole",
1468
- recordingStar: "Conserver ind\xE9finiment",
1469
- recordingStarError: "Impossible de modifier la protection de l\u2019enregistrement.",
1470
- recordingStarHelp: "Exclut cet enregistrement du nettoyage automatique et du nombre d\u2019enregistrements \xE0 conserver. La suppression manuelle reste autoris\xE9e. Le stockage et la protection contre l\u2019\xE9viction par le navigateur ne changent pas.",
1471
- recordingStarred: "Prot\xE9g\xE9 du nettoyage automatique",
1472
- recordingStart: "D\xE9but",
1473
- recordingState: "\xC9tat",
1474
- recordingSuccess: "R\xE9ussite",
1475
- recordingTimeline: "Chronologie parole / silence",
1476
- recordingTitle: "Enregistrements",
1477
- recordingUnavailable: "Service d\u2019enregistrement indisponible. Activez l\u2019enregistrement dans les param\xE8tres de Voix en direct avec un runtime compatible.",
1478
- recordingUnstar: "Retirer la protection",
1479
- recordingUnstarHelp: "Autorise le nettoyage automatique et compte \xE0 nouveau cet enregistrement parmi ceux \xE0 conserver. La suppression manuelle reste autoris\xE9e. Le stockage et la protection contre l\u2019\xE9viction par le navigateur ne changent pas.",
1480
- refreshRate: "Fr\xE9quence de mise \xE0 jour",
1481
- resume: "Reprendre les mises \xE0 jour",
1482
- runtimeActive: "Requ\xEAtes actives",
1483
- runtimeAudio: "Dur\xE9e du dernier audio",
1484
- runtimeCache: "Fichiers du mod\xE8le en cache",
1485
- runtimeCancelled: "Annul\xE9",
1486
- runtimeCompleted: "Transcriptions termin\xE9es",
1487
- runtimeDevice: "Fournisseur d\u2019ex\xE9cution demand\xE9",
1488
- runtimeError: "Code d\u2019erreur",
1489
- runtimeEvents: "\xC9v\xE9nements du runtime (100 derniers)",
1490
- runtimeFailed: "Transcriptions \xE9chou\xE9es / annul\xE9es",
1491
- runtimeGpu: "Adaptateur WebGPU disponible",
1492
- runtimeHeap: "Estimation du tas JavaScript de la page",
1493
- runtimeHelp: "La taille du mod\xE8le/cache mesure les fichiers, pas la RAM. PCM compte seulement les buffers d\u2019entr\xE9e actifs/en attente. Le tas JavaScript est une estimation non standard de la page et exclut une partie de la m\xE9moire workers/WASM/GPU. La RAM/VRAM du mod\xE8le ne peut pas \xEAtre mesur\xE9e fiablement ici. Initialiser WebGPU ne prouve pas que tous les op\xE9rateurs utilisent le GPU. Les \xE9v\xE9nements sont des m\xE9tadonn\xE9es du plugin, pas des logs ONNX bruts ; aucun audio ni transcription conserv\xE9s.",
1494
- runtimeId: "Identit\xE9 du worker",
1495
- runtimeInference: "Derni\xE8re inf\xE9rence du worker",
1496
- runtimeLoad: "Chargement aller-retour / worker",
1497
- runtimeMemory: "M\xE9moire et stockage",
1498
- runtimeModel: "Mod\xE8le",
1499
- runtimeModelBytes: "T\xE9l\xE9chargement complet du mod\xE8le",
1500
- runtimeNo: "Non",
1501
- runtimePcm: "PCM d\u2019entr\xE9e comptabilis\xE9",
1502
- runtimePending: "Requ\xEAtes du worker en attente",
1503
- runtimeQuantization: "Pr\xE9cision encoder / decoder",
1504
- runtimeQueue: "Transcriptions en attente",
1505
- runtimeRam: "RAM du mod\xE8le",
1506
- runtimeRatio: "Rapport traitement / audio",
1507
- runtimeReady: "Pr\xEAt",
1508
- runtimeReleased: "Lib\xE9r\xE9",
1509
- runtimeRevision: "R\xE9vision fix\xE9e",
1510
- runtimeStarted: "D\xE9marr\xE9",
1511
- runtimeStatus: "\xC9tat",
1512
- runtimeStorage: "Stockage disponible pour cette origine",
1513
- runtimeSuccess: "Succ\xE8s",
1514
- runtimeTitle: "Runtimes",
1515
- runtimeUnavailable: "Indisponible",
1516
- runtimeVersions: "ONNX Runtime / Transformers.js",
1517
- runtimeVram: "VRAM du mod\xE8le",
1518
- runtimeWorker: "Worker actif",
1519
- runtimeYes: "Oui",
1520
- states: "\xC9tats actuels",
1521
- title: "D\xE9bogueur Voix en direct",
1522
- transitions: "Transitions r\xE9centes des \xE9tats",
1523
- waiting: "En attente d\u2019un runtime Voix en direct compatible."
2511
+ name: "Portugu\xEAs (Brasil)",
2512
+ short: "pt-BR",
2513
+ locale: "pt-BR",
2514
+ lang: () => Promise.resolve().then(() => (init_pt_BR4(), pt_BR_exports))
1524
2515
  },
1525
- hi: {
1526
- activate: "\u0921\u0940\u092C\u0917\u0930 \u0905\u0932\u0917 \u0935\u093F\u0902\u0921\u094B \u092E\u0947\u0902 \u0916\u094B\u0932\u0947\u0902",
1527
- all: "\u0938\u092D\u0940 \u092E\u0949\u0921\u094D\u092F\u0942\u0932",
1528
- close: "\u0921\u0940\u092C\u0917\u0930 \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
1529
- content: "\u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0938\u093E\u092E\u0917\u094D\u0930\u0940 \u0926\u0947\u0916\u0947\u0902 (\u0938\u0902\u0935\u0947\u0926\u0928\u0936\u0940\u0932)",
1530
- developer: "\u0921\u0947\u0935\u0932\u092A\u0930",
1531
- diagnostics: "\u0928\u093F\u0926\u093E\u0928",
1532
- empty: "\u0905\u092D\u0940 \u0915\u094B\u0908 \u091F\u094D\u0930\u093E\u0902\u091C\u093C\u093F\u0936\u0928 \u0926\u0930\u094D\u091C \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
1533
- error: "\u0921\u093E\u092F\u0917\u094D\u0928\u094B\u0938\u094D\u091F\u093F\u0915 \u0938\u094D\u0930\u094B\u0924 \u0935\u093F\u092B\u0932 \u0939\u0941\u0906\u0964",
1534
- eventsClear: "\u0907\u0935\u0947\u0902\u091F \u0938\u093E\u092B\u093C \u0915\u0930\u0947\u0902",
1535
- eventsPause: "\u0907\u0935\u0947\u0902\u091F \u0930\u094B\u0915\u0947\u0902",
1536
- eventsResume: "\u0907\u0935\u0947\u0902\u091F \u092B\u093F\u0930 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
1537
- filter: "\u092E\u0949\u0921\u094D\u092F\u0942\u0932 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0915\u0930\u0947\u0902",
1538
- freeze: "\u0926\u0943\u0936\u094D\u092F \u0930\u094B\u0915\u0947\u0902",
1539
- help: "\u0915\u0947\u0935\u0932 \u092A\u0922\u093C\u0928\u0947 \u0935\u093E\u0932\u093E \u0938\u094D\u091F\u0947\u091F \u091F\u094D\u0930\u0940 10 Hz \u092A\u0930 \u0905\u092A\u0921\u0947\u091F \u0939\u094B\u0924\u093E \u0939\u0948\u0964 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F \u0930\u0942\u092A \u0938\u0947 \u091B\u093F\u092A\u093E \u0939\u0948\u0964 \u092F\u0939 \u092A\u0948\u0928\u0932 \u0935\u0949\u0907\u0938 \u0915\u094B \u0928\u093F\u092F\u0902\u0924\u094D\u0930\u093F\u0924 \u0928\u0939\u0940\u0902 \u0915\u0930\u0924\u093E\u0964",
1540
- omitted: "\u0905\u0924\u093F\u0930\u093F\u0915\u094D\u0924 \u0906\u0907\u091F\u092E \u091B\u093F\u092A\u093E\u090F \u0917\u090F",
1541
- popupBlocked: "\u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0928\u0947 \u0921\u0940\u092C\u0917\u0930 \u0935\u093F\u0902\u0921\u094B \u092C\u094D\u0932\u0949\u0915 \u0915\u0930 \u0926\u0940\u0964 \u0907\u0938 \u0938\u093E\u0907\u091F \u0915\u0947 \u0932\u093F\u090F \u092A\u0949\u092A-\u0905\u092A \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
1542
- recordingActive: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u091C\u093E\u0930\u0940",
1543
- recordingAllSources: "\u0938\u092D\u0940 \u0938\u094D\u0930\u094B\u0924",
1544
- recordingAttempts: "\u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0907\u0924\u093F\u0939\u093E\u0938",
1545
- recordingAudio: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092A\u094D\u0932\u0947\u092C\u0948\u0915",
1546
- recordingAudioError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0911\u0921\u093F\u092F\u094B \u0932\u094B\u0921 \u092F\u093E \u091A\u0932\u093E\u092F\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964",
1547
- recordingCancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
1548
- recordingCaptured: "\u0915\u0948\u092A\u094D\u091A\u0930 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0911\u0921\u093F\u092F\u094B",
1549
- recordingCompleted: "\u092A\u0942\u0930\u094D\u0923",
1550
- recordingConfirmDelete: "\u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0907\u0924\u093F\u0939\u093E\u0938 \u0938\u0939\u093F\u0924 \u092F\u0939 \u092A\u0942\u0930\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u090F\u0901? \u0907\u0938\u0947 \u0935\u093E\u092A\u0938 \u0928\u0939\u0940\u0902 \u0932\u093E\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E\u0964 \u0938\u0915\u094D\u0930\u093F\u092F \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0928\u0947 \u092A\u0930 \u0906\u0917\u0947 \u0938\u0939\u0947\u091C\u093E \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u093E \u0911\u0921\u093F\u092F\u094B \u092D\u0940 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
1551
- recordingDate: "\u0936\u0941\u0930\u0941\u0906\u0924",
1552
- recordingDelete: "\u092A\u0942\u0930\u0940 \u0938\u0924\u094D\u0930 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u090F\u0901",
1553
- recordingDeleteError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0908 \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u0940\u0964",
1554
- recordingDuration: "\u0905\u0935\u0927\u093F",
1555
- recordingEmpty: "\u0907\u0938 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0938\u0947 \u092E\u0947\u0932 \u0916\u093E\u0924\u0940 \u0915\u094B\u0908 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
1556
- recordingEnd: "\u0905\u0902\u0924",
1557
- recordingEngine: "\u0907\u0902\u091C\u0928",
1558
- recordingError: "\u0924\u094D\u0930\u0941\u091F\u093F",
1559
- recordingExport: "\u0938\u094D\u0935\u092F\u0902\u092A\u0942\u0930\u094D\u0923 JSON \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u0915\u0930\u0947\u0902",
1560
- recordingExportError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091C\u093E \u0938\u0915\u0940\u0964",
1561
- recordingFailed: "\u0935\u093F\u092B\u0932",
1562
- recordingHelp: "\u0938\u0939\u0947\u091C\u093E \u0911\u0921\u093F\u092F\u094B, \u0906\u0935\u093E\u091C\u093C/\u092E\u094C\u0928 \u0938\u0940\u092E\u093E\u090F\u0901 \u0914\u0930 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u092A\u094D\u0930\u092F\u093E\u0938 \u0926\u0947\u0916\u0947\u0902\u0964 \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0938\u0902\u0935\u0947\u0926\u0928\u0936\u0940\u0932 \u0939\u094B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0939\u0948; \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u092E\u0947\u0902 \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0936\u093E\u092E\u093F\u0932 \u0939\u0948\u0902\u0964 \u0928\u093F\u0930\u0940\u0915\u094D\u0937\u0923 \u0915\u0948\u092A\u094D\u091A\u0930 \u0928\u0939\u0940\u0902 \u092C\u0926\u0932\u0924\u093E; \u0915\u0947\u0935\u0932 \u0938\u094D\u092A\u0937\u094D\u091F \u0939\u091F\u093E\u0928\u0947 \u0915\u0940 \u0915\u093E\u0930\u094D\u0930\u0935\u093E\u0908 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0924\u0940 \u0939\u0948\u0964",
1563
- recordingInterrupted: "\u092C\u093E\u0927\u093F\u0924",
1564
- recordingLoadError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0924\u094D\u0930 \u0932\u094B\u0921 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0947\u0964 \u0930\u0940\u092B\u093C\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902\u0964",
1565
- recordingLoading: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0932\u094B\u0921 \u0939\u094B \u0930\u0939\u0940 \u0939\u0948\u0902\u2026",
1566
- recordingMemory: "\u0915\u0947\u0935\u0932 \u092E\u0947\u092E\u094B\u0930\u0940 \u092E\u0947\u0902",
1567
- recordingMicrophone: "\u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928",
1568
- recordingNoAttempts: "\u0905\u092D\u0940 \u0915\u094B\u0908 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u092A\u094D\u0930\u092F\u093E\u0938 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
1569
- recordingOpen: "\u0916\u0941\u0932\u093E \u0916\u0902\u0921",
1570
- recordingPending: "\u0932\u0902\u092C\u093F\u0924",
1571
- recordingPersistent: "\u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0930\u0942\u092A \u0938\u0947 \u0938\u0939\u0947\u091C\u093E",
1572
- recordingPinConfirmed: "\u092A\u0941\u0937\u094D\u091F\u093F \u0938\u092E\u092F",
1573
- recordingPinDelay: "\u092A\u0941\u0937\u094D\u091F\u093F \u092E\u0947\u0902 \u0935\u093F\u0932\u0902\u092C",
1574
- recordingPins: "\u0938\u0940\u092E\u093E \u091A\u093F\u0939\u094D\u0928",
1575
- recordingPlay: "\u0916\u0902\u0921 \u091A\u0932\u093E\u090F\u0901",
1576
- recordingPlaySession: "\u0938\u0939\u0947\u091C\u093E \u0938\u0924\u094D\u0930 \u091A\u0932\u093E\u090F\u0901",
1577
- recordingRefresh: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0930\u0940\u092B\u093C\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902",
1578
- recordingSaved: "\u0938\u0939\u0947\u091C\u093E \u0911\u0921\u093F\u092F\u094B",
1579
- recordingSegments: "\u0916\u0902\u0921",
1580
- recordingSelectSession: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0924\u094D\u0930 \u091A\u0941\u0928\u0947\u0902\u0964",
1581
- recordingShared: "\u0938\u093E\u091D\u093E \u0911\u0921\u093F\u092F\u094B",
1582
- recordingSilence: "\u092E\u094C\u0928",
1583
- recordingSource: "\u0938\u094D\u0930\u094B\u0924",
1584
- recordingSourceFilter: "\u0938\u094D\u0930\u094B\u0924 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0915\u0930\u0947\u0902",
1585
- recordingSpeech: "\u0906\u0935\u093E\u091C\u093C",
1586
- recordingStar: "\u0905\u0928\u093F\u0936\u094D\u091A\u093F\u0924 \u0915\u093E\u0932 \u0924\u0915 \u0930\u0916\u0947\u0902",
1587
- recordingStarError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092C\u0926\u0932\u0940 \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u0940\u0964",
1588
- recordingStarHelp: "\u0907\u0938 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u094B \u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0914\u0930 \u0930\u0916\u0940 \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0917\u093F\u0928\u0924\u0940 \u0938\u0947 \u092C\u093E\u0939\u0930 \u0930\u0916\u0947\u0902\u0964 \u092E\u0948\u0928\u094D\u092F\u0941\u0905\u0932 \u0930\u0942\u092A \u0938\u0947 \u0939\u091F\u093E\u0928\u093E \u0905\u092C \u092D\u0940 \u0938\u0902\u092D\u0935 \u0939\u0948\u0964 \u0907\u0938\u0938\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u0947 \u0938\u094D\u091F\u094B\u0930\u0947\u091C \u092F\u093E \u0928\u093F\u0937\u094D\u0915\u093E\u0938\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092E\u0947\u0902 \u092C\u0926\u0932\u093E\u0935 \u0928\u0939\u0940\u0902 \u0939\u094B\u0924\u093E\u0964",
1589
- recordingStarred: "\u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0938\u0947 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924",
1590
- recordingStart: "\u0936\u0941\u0930\u0941\u0906\u0924",
1591
- recordingState: "\u0938\u094D\u0925\u093F\u0924\u093F",
1592
- recordingSuccess: "\u0938\u092B\u0932",
1593
- recordingTimeline: "\u0906\u0935\u093E\u091C\u093C / \u092E\u094C\u0928 \u0938\u092E\u092F\u0930\u0947\u0916\u093E",
1594
- recordingTitle: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917",
1595
- recordingUnavailable: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0947\u0935\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0902\u0917\u0924 \u0930\u0928\u091F\u093E\u0907\u092E \u0915\u0947 \u0938\u093E\u0925 \u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 \u092E\u0947\u0902 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u091A\u093E\u0932\u0942 \u0915\u0930\u0947\u0902\u0964",
1596
- recordingUnstar: "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0939\u091F\u093E\u090F\u0901",
1597
- recordingUnstarHelp: "\u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u0907\u0938 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u094B \u092B\u093F\u0930 \u0938\u0947 \u0930\u0916\u0940 \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0917\u093F\u0928\u0924\u0940 \u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0915\u0930\u0947\u0902\u0964 \u092E\u0948\u0928\u094D\u092F\u0941\u0905\u0932 \u0930\u0942\u092A \u0938\u0947 \u0939\u091F\u093E\u0928\u093E \u0905\u092C \u092D\u0940 \u0938\u0902\u092D\u0935 \u0939\u0948\u0964 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u093E \u0938\u094D\u091F\u094B\u0930\u0947\u091C \u0914\u0930 \u0928\u093F\u0937\u094D\u0915\u093E\u0938\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0928\u0939\u0940\u0902 \u092C\u0926\u0932\u0924\u0947\u0964",
1598
- refreshRate: "\u0905\u092A\u0921\u0947\u091F \u0906\u0935\u0943\u0924\u094D\u0924\u093F",
1599
- resume: "\u0905\u092A\u0921\u0947\u091F \u092B\u093F\u0930 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
1600
- runtimeActive: "\u0938\u0915\u094D\u0930\u093F\u092F \u0905\u0928\u0941\u0930\u094B\u0927",
1601
- runtimeAudio: "\u092A\u093F\u091B\u0932\u0947 \u0911\u0921\u093F\u092F\u094B \u0915\u0940 \u0905\u0935\u0927\u093F",
1602
- runtimeCache: "\u0915\u0948\u0936 \u0915\u0940 \u0917\u0908 \u092E\u0949\u0921\u0932 \u092B\u093C\u093E\u0907\u0932\u0947\u0902",
1603
- runtimeCancelled: "\u0930\u0926\u094D\u0926",
1604
- runtimeCompleted: "\u092A\u0942\u0930\u0940 \u0939\u0941\u0908 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
1605
- runtimeDevice: "\u0905\u0928\u0941\u0930\u094B\u0927\u093F\u0924 \u0928\u093F\u0937\u094D\u092A\u093E\u0926\u0928 \u092A\u094D\u0930\u0926\u093E\u0924\u093E",
1606
- runtimeError: "\u0924\u094D\u0930\u0941\u091F\u093F \u0915\u094B\u0921",
1607
- runtimeEvents: "\u0930\u0928\u091F\u093E\u0907\u092E \u0918\u091F\u0928\u093E\u090F\u0901 (\u092A\u093F\u091B\u0932\u0940 100)",
1608
- runtimeFailed: "\u0935\u093F\u092B\u0932 / \u0930\u0926\u094D\u0926 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
1609
- runtimeGpu: "WebGPU \u090F\u0921\u093E\u092A\u094D\u091F\u0930 \u0909\u092A\u0932\u092C\u094D\u0927",
1610
- runtimeHeap: "\u092A\u0947\u091C JavaScript \u0939\u0940\u092A \u0915\u093E \u0905\u0928\u0941\u092E\u093E\u0928",
1611
- runtimeHelp: "\u092E\u0949\u0921\u0932/\u0915\u0948\u0936 \u0915\u093E \u0906\u0915\u093E\u0930 \u092B\u093C\u093E\u0907\u0932\u094B\u0902 \u0915\u093E \u0939\u0948, RAM \u0915\u093E \u0928\u0939\u0940\u0902\u0964 PCM \u0915\u0947\u0935\u0932 \u0938\u0915\u094D\u0930\u093F\u092F/\u0915\u0924\u093E\u0930\u092C\u0926\u094D\u0927 \u0907\u0928\u092A\u0941\u091F \u092C\u092B\u093C\u0930 \u0917\u093F\u0928\u0924\u093E \u0939\u0948\u0964 JavaScript \u0939\u0940\u092A \u092A\u0942\u0930\u0947 \u092A\u0947\u091C \u0915\u093E \u0917\u0948\u0930-\u092E\u093E\u0928\u0915 \u0905\u0928\u0941\u092E\u093E\u0928 \u0939\u0948 \u0914\u0930 \u092A\u0942\u0930\u0940 worker/WASM/GPU \u092E\u0947\u092E\u094B\u0930\u0940 \u0928\u0939\u0940\u0902 \u092E\u093E\u092A\u0924\u093E\u0964 \u092E\u0949\u0921\u0932 RAM/VRAM \u092F\u0939\u093E\u0901 \u092D\u0930\u094B\u0938\u0947\u092E\u0902\u0926 \u0924\u0930\u0940\u0915\u0947 \u0938\u0947 \u0928\u0939\u0940\u0902 \u092E\u093E\u092A\u0940 \u091C\u093E \u0938\u0915\u0924\u0940\u0964 WebGPU \u0936\u0941\u0930\u0942 \u0939\u094B\u0928\u0947 \u0915\u093E \u092E\u0924\u0932\u092C \u0938\u092D\u0940 \u0911\u092A\u0930\u0947\u091F\u0930 GPU \u092A\u0930 \u091A\u0932\u0947, \u092F\u0939 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0918\u091F\u0928\u093E\u090F\u0901 \u092A\u094D\u0932\u0917\u0907\u0928 \u091C\u0940\u0935\u0928\u091A\u0915\u094D\u0930 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0939\u0948\u0902, \u0915\u091A\u094D\u091A\u0947 ONNX \u0932\u0949\u0917 \u0928\u0939\u0940\u0902; \u0911\u0921\u093F\u092F\u094B \u092F\u093E \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0928\u0939\u0940\u0902 \u0930\u0916\u0924\u0947\u0964",
1612
- runtimeId: "\u0935\u0930\u094D\u0915\u0930 \u092A\u0939\u091A\u093E\u0928",
1613
- runtimeInference: "\u0935\u0930\u094D\u0915\u0930 \u0915\u093E \u092A\u093F\u091B\u0932\u093E \u0907\u0928\u094D\u092B\u093C\u0930\u0947\u0902\u0938",
1614
- runtimeLoad: "\u0932\u094B\u0921 \u0930\u093E\u0909\u0902\u0921 \u091F\u094D\u0930\u093F\u092A / \u0935\u0930\u094D\u0915\u0930",
1615
- runtimeMemory: "\u092E\u0947\u092E\u094B\u0930\u0940 \u0914\u0930 \u0938\u094D\u091F\u094B\u0930\u0947\u091C",
1616
- runtimeModel: "\u092E\u0949\u0921\u0932",
1617
- runtimeModelBytes: "\u092A\u0942\u0930\u093E \u092E\u0949\u0921\u0932 \u0921\u093E\u0909\u0928\u0932\u094B\u0921",
1618
- runtimeNo: "\u0928\u0939\u0940\u0902",
1619
- runtimePcm: "\u0917\u093F\u0928\u093E \u0917\u092F\u093E \u0907\u0928\u092A\u0941\u091F PCM",
1620
- runtimePending: "\u0932\u0902\u092C\u093F\u0924 \u0935\u0930\u094D\u0915\u0930 \u0905\u0928\u0941\u0930\u094B\u0927",
1621
- runtimeQuantization: "\u090F\u0928\u0915\u094B\u0921\u0930 / \u0921\u093F\u0915\u094B\u0921\u0930 \u092A\u0930\u093F\u0936\u0941\u0926\u094D\u0927\u0924\u093E",
1622
- runtimeQueue: "\u0915\u0924\u093E\u0930\u092C\u0926\u094D\u0927 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
1623
- runtimeRam: "\u092E\u0949\u0921\u0932 RAM",
1624
- runtimeRatio: "\u092A\u094D\u0930\u0938\u0902\u0938\u094D\u0915\u0930\u0923 / \u0911\u0921\u093F\u092F\u094B \u0905\u0928\u0941\u092A\u093E\u0924",
1625
- runtimeReady: "\u0924\u0948\u092F\u093E\u0930",
1626
- runtimeReleased: "\u092E\u0941\u0915\u094D\u0924",
1627
- runtimeRevision: "\u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0930\u093F\u0935\u093F\u091C\u093C\u0928",
1628
- runtimeStarted: "\u0936\u0941\u0930\u0942",
1629
- runtimeStatus: "\u0938\u094D\u0925\u093F\u0924\u093F",
1630
- runtimeStorage: "\u0907\u0938 \u0913\u0930\u093F\u091C\u093F\u0928 \u0915\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0938\u094D\u091F\u094B\u0930\u0947\u091C",
1631
- runtimeSuccess: "\u0938\u092B\u0932",
1632
- runtimeTitle: "\u0930\u0928\u091F\u093E\u0907\u092E",
1633
- runtimeUnavailable: "\u0905\u0928\u0941\u092A\u0932\u092C\u094D\u0927",
1634
- runtimeVersions: "ONNX Runtime / Transformers.js",
1635
- runtimeVram: "\u092E\u0949\u0921\u0932 VRAM",
1636
- runtimeWorker: "\u0935\u0930\u094D\u0915\u0930 \u0938\u0915\u094D\u0930\u093F\u092F",
1637
- runtimeYes: "\u0939\u093E\u0901",
1638
- states: "\u0935\u0930\u094D\u0924\u092E\u093E\u0928 \u0938\u094D\u0925\u093F\u0924\u093F\u092F\u093E\u0901",
1639
- title: "\u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0921\u0940\u092C\u0917\u0930",
1640
- transitions: "\u0939\u093E\u0932 \u0915\u0947 \u0938\u094D\u091F\u0947\u091F \u091F\u094D\u0930\u093E\u0902\u091C\u093C\u093F\u0936\u0928",
1641
- waiting: "\u0938\u0902\u0917\u0924 \u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0930\u0928\u091F\u093E\u0907\u092E \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948\u0964"
1642
- },
1643
- zh: {
1644
- activate: "\u5728\u72EC\u7ACB\u7A97\u53E3\u4E2D\u6253\u5F00\u8C03\u8BD5\u5668",
1645
- all: "\u6240\u6709\u6A21\u5757",
1646
- close: "\u5173\u95ED\u8C03\u8BD5\u5668",
1647
- content: "\u67E5\u770B\u6587\u672C\u5185\u5BB9\uFF08\u654F\u611F\uFF09",
1648
- developer: "\u5F00\u53D1\u8005",
1649
- diagnostics: "\u8BCA\u65AD",
1650
- empty: "\u5C1A\u672A\u8BB0\u5F55\u72B6\u6001\u8F6C\u6362\u3002",
1651
- error: "\u8BCA\u65AD\u6570\u636E\u6E90\u5931\u8D25\u3002",
1652
- eventsClear: "\u6E05\u9664\u4E8B\u4EF6",
1653
- eventsPause: "\u6682\u505C\u4E8B\u4EF6",
1654
- eventsResume: "\u6062\u590D\u4E8B\u4EF6",
1655
- filter: "\u7B5B\u9009\u6A21\u5757",
1656
- freeze: "\u51BB\u7ED3\u89C6\u56FE",
1657
- help: "\u53EA\u8BFB\u72B6\u6001\u6811\u4EE5 10 Hz \u66F4\u65B0\u3002\u9ED8\u8BA4\u9690\u85CF\u6587\u672C\u3002\u6B64\u9762\u677F\u4E0D\u63A7\u5236\u8BED\u97F3\u3002",
1658
- omitted: "\u5DF2\u7701\u7565\u5176\u4ED6\u9879\u76EE",
1659
- popupBlocked: "\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u8C03\u8BD5\u5668\u7A97\u53E3\u3002\u8BF7\u5141\u8BB8\u6B64\u7F51\u7AD9\u7684\u5F39\u51FA\u7A97\u53E3\uFF0C\u7136\u540E\u91CD\u8BD5\u3002",
1660
- recordingActive: "\u6B63\u5728\u5F55\u5236",
1661
- recordingAllSources: "\u6240\u6709\u6765\u6E90",
1662
- recordingAttempts: "\u8F6C\u5F55\u5386\u53F2",
1663
- recordingAudio: "\u5F55\u97F3\u64AD\u653E",
1664
- recordingAudioError: "\u65E0\u6CD5\u52A0\u8F7D\u6216\u64AD\u653E\u5F55\u97F3\u97F3\u9891\u3002",
1665
- recordingCancel: "\u53D6\u6D88",
1666
- recordingCaptured: "\u5DF2\u6355\u83B7\u97F3\u9891",
1667
- recordingCompleted: "\u5DF2\u5B8C\u6210",
1668
- recordingConfirmDelete: "\u5220\u9664\u6574\u4E2A\u5F55\u97F3\uFF0C\u5305\u62EC\u97F3\u9891\u548C\u8F6C\u5F55\u5386\u53F2\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002\u5220\u9664\u6B63\u5728\u5F55\u5236\u7684\u4F1A\u8BDD\u8FD8\u4F1A\u4E22\u5F03\u540E\u7EED\u4FDD\u5B58\u7684\u97F3\u9891\u3002",
1669
- recordingDate: "\u5F00\u59CB\u65F6\u95F4",
1670
- recordingDelete: "\u5220\u9664\u6574\u4E2A\u4F1A\u8BDD",
1671
- recordingDeleteError: "\u65E0\u6CD5\u5220\u9664\u5F55\u97F3\u3002",
1672
- recordingDuration: "\u65F6\u957F",
1673
- recordingEmpty: "\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u5F55\u97F3\u4F1A\u8BDD\u3002",
1674
- recordingEnd: "\u7ED3\u675F",
1675
- recordingEngine: "\u5F15\u64CE",
1676
- recordingError: "\u9519\u8BEF",
1677
- recordingExport: "\u5BFC\u51FA\u5B8C\u6574\u72EC\u7ACB JSON",
1678
- recordingExportError: "\u65E0\u6CD5\u5BFC\u51FA\u5F55\u97F3\u3002",
1679
- recordingFailed: "\u5931\u8D25",
1680
- recordingHelp: "\u67E5\u770B\u5DF2\u4FDD\u5B58\u97F3\u9891\u3001\u8BED\u97F3/\u9759\u97F3\u8FB9\u754C\u548C\u8F6C\u5F55\u5C1D\u8BD5\u3002\u97F3\u9891\u548C\u6587\u672C\u53EF\u80FD\u654F\u611F\u3002\u64AD\u653E\u5728\u672C\u5730\u8FDB\u884C\uFF1B\u5BFC\u51FA\u5305\u542B\u97F3\u9891\u548C\u6587\u672C\u3002\u67E5\u770B\u4E0D\u4F1A\u66F4\u6539\u91C7\u96C6\uFF1B\u53EA\u6709\u660E\u786E\u5220\u9664\u64CD\u4F5C\u624D\u4F1A\u79FB\u9664\u5F55\u97F3\u3002",
1681
- recordingInterrupted: "\u5DF2\u4E2D\u65AD",
1682
- recordingLoadError: "\u65E0\u6CD5\u52A0\u8F7D\u5F55\u97F3\u4F1A\u8BDD\u3002\u8BF7\u5237\u65B0\u91CD\u8BD5\u3002",
1683
- recordingLoading: "\u6B63\u5728\u52A0\u8F7D\u5F55\u97F3\u2026",
1684
- recordingMemory: "\u4EC5\u5728\u5185\u5B58\u4E2D",
1685
- recordingMicrophone: "\u9EA6\u514B\u98CE",
1686
- recordingNoAttempts: "\u5C1A\u65E0\u8F6C\u5F55\u5C1D\u8BD5\u3002",
1687
- recordingOpen: "\u672A\u7ED3\u675F\u7247\u6BB5",
1688
- recordingPending: "\u5904\u7406\u4E2D",
1689
- recordingPersistent: "\u5DF2\u4FDD\u5B58\u5230\u672C\u5730",
1690
- recordingPinConfirmed: "\u786E\u8BA4\u65F6\u95F4",
1691
- recordingPinDelay: "\u786E\u8BA4\u5EF6\u8FDF",
1692
- recordingPins: "\u8FB9\u754C\u6807\u8BB0",
1693
- recordingPlay: "\u64AD\u653E\u7247\u6BB5",
1694
- recordingPlaySession: "\u64AD\u653E\u5DF2\u4FDD\u5B58\u4F1A\u8BDD",
1695
- recordingRefresh: "\u5237\u65B0\u5F55\u97F3",
1696
- recordingSaved: "\u5DF2\u4FDD\u5B58\u97F3\u9891",
1697
- recordingSegments: "\u7247\u6BB5",
1698
- recordingSelectSession: "\u8BF7\u9009\u62E9\u5F55\u97F3\u4F1A\u8BDD\u3002",
1699
- recordingShared: "\u5171\u4EAB\u97F3\u9891",
1700
- recordingSilence: "\u9759\u97F3",
1701
- recordingSource: "\u6765\u6E90",
1702
- recordingSourceFilter: "\u7B5B\u9009\u6765\u6E90",
1703
- recordingSpeech: "\u8BED\u97F3",
1704
- recordingStar: "\u65E0\u9650\u671F\u4FDD\u7559",
1705
- recordingStarError: "\u65E0\u6CD5\u66F4\u6539\u5F55\u97F3\u4FDD\u62A4\u3002",
1706
- recordingStarHelp: "\u5C06\u6B64\u5F55\u97F3\u6392\u9664\u5728\u81EA\u52A8\u6E05\u7406\u548C\u4FDD\u7559\u6570\u91CF\u7EDF\u8BA1\u4E4B\u5916\u3002\u4ECD\u53EF\u624B\u52A8\u5220\u9664\u3002\u8FD9\u4E0D\u4F1A\u66F4\u6539\u6D4F\u89C8\u5668\u5B58\u50A8\u6216\u9632\u9010\u51FA\u4FDD\u62A4\u3002",
1707
- recordingStarred: "\u53D7\u4FDD\u62A4\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u6E05\u7406",
1708
- recordingStart: "\u5F00\u59CB",
1709
- recordingState: "\u72B6\u6001",
1710
- recordingSuccess: "\u6210\u529F",
1711
- recordingTimeline: "\u8BED\u97F3 / \u9759\u97F3\u65F6\u95F4\u7EBF",
1712
- recordingTitle: "\u5F55\u97F3",
1713
- recordingUnavailable: "\u5F55\u97F3\u670D\u52A1\u4E0D\u53EF\u7528\u3002\u8BF7\u5728\u517C\u5BB9\u7684\u5B9E\u65F6\u8BED\u97F3\u8BBE\u7F6E\u4E2D\u542F\u7528\u5F55\u97F3\u3002",
1714
- recordingUnstar: "\u53D6\u6D88\u4FDD\u62A4",
1715
- recordingUnstarHelp: "\u5141\u8BB8\u81EA\u52A8\u6E05\u7406\uFF0C\u5E76\u5C06\u6B64\u5F55\u97F3\u91CD\u65B0\u8BA1\u5165\u4FDD\u7559\u6570\u91CF\u3002\u4ECD\u53EF\u624B\u52A8\u5220\u9664\u3002\u6D4F\u89C8\u5668\u5B58\u50A8\u548C\u9632\u9010\u51FA\u4FDD\u62A4\u4FDD\u6301\u4E0D\u53D8\u3002",
1716
- refreshRate: "\u66F4\u65B0\u9891\u7387",
1717
- resume: "\u6062\u590D\u66F4\u65B0",
1718
- runtimeActive: "\u6D3B\u52A8\u8BF7\u6C42",
1719
- runtimeAudio: "\u4E0A\u6B21\u97F3\u9891\u65F6\u957F",
1720
- runtimeCache: "\u6A21\u578B\u6587\u4EF6\u7F13\u5B58",
1721
- runtimeCancelled: "\u5DF2\u53D6\u6D88",
1722
- runtimeCompleted: "\u5DF2\u5B8C\u6210\u8F6C\u5F55",
1723
- runtimeDevice: "\u8BF7\u6C42\u7684\u6267\u884C\u63D0\u4F9B\u7A0B\u5E8F",
1724
- runtimeError: "\u9519\u8BEF\u4EE3\u7801",
1725
- runtimeEvents: "\u8FD0\u884C\u65F6\u4E8B\u4EF6\uFF08\u6700\u8FD1100\u6761\uFF09",
1726
- runtimeFailed: "\u5931\u8D25 / \u5DF2\u53D6\u6D88\u8F6C\u5F55",
1727
- runtimeGpu: "WebGPU\u9002\u914D\u5668\u53EF\u7528",
1728
- runtimeHeap: "\u9875\u9762JavaScript\u5806\u4F30\u8BA1",
1729
- runtimeHelp: "\u6A21\u578B/\u7F13\u5B58\u5927\u5C0F\u662F\u6587\u4EF6\u5B57\u8282\u6570\uFF0C\u4E0D\u662F\u5185\u5B58\u3002PCM\u4EC5\u7EDF\u8BA1\u6D3B\u52A8/\u6392\u961F\u7684\u8F93\u5165\u7F13\u51B2\u533A\u3002JavaScript\u5806\u662F\u975E\u6807\u51C6\u7684\u9875\u9762\u7EA7\u4F30\u8BA1\uFF0C\u4E0D\u5305\u542B\u5B8C\u6574\u7684worker/WASM/GPU\u5185\u5B58\u3002\u6B64\u5904\u65E0\u6CD5\u53EF\u9760\u6D4B\u91CF\u6A21\u578BRAM/\u663E\u5B58\u3002WebGPU\u521D\u59CB\u5316\u6210\u529F\u4E0D\u4EE3\u8868\u5168\u90E8\u7B97\u5B50\u90FD\u5728GPU\u6267\u884C\u3002\u4E8B\u4EF6\u662F\u63D2\u4EF6\u751F\u547D\u5468\u671F\u5143\u6570\u636E\uFF0C\u4E0D\u662F\u539F\u59CBONNX\u65E5\u5FD7\uFF1B\u4E0D\u4FDD\u7559\u97F3\u9891\u6216\u8F6C\u5F55\u3002",
1730
- runtimeId: "Worker\u6807\u8BC6",
1731
- runtimeInference: "\u4E0A\u6B21Worker\u63A8\u7406",
1732
- runtimeLoad: "\u52A0\u8F7D\u5F80\u8FD4 / Worker",
1733
- runtimeMemory: "\u5185\u5B58\u4E0E\u5B58\u50A8",
1734
- runtimeModel: "\u6A21\u578B",
1735
- runtimeModelBytes: "\u5B8C\u6574\u6A21\u578B\u4E0B\u8F7D",
1736
- runtimeNo: "\u5426",
1737
- runtimePcm: "\u5DF2\u7EDF\u8BA1\u8F93\u5165PCM",
1738
- runtimePending: "Worker\u5F85\u5904\u7406\u8BF7\u6C42",
1739
- runtimeQuantization: "\u7F16\u7801\u5668 / \u89E3\u7801\u5668\u7CBE\u5EA6",
1740
- runtimeQueue: "\u6392\u961F\u8F6C\u5F55",
1741
- runtimeRam: "\u6A21\u578BRAM",
1742
- runtimeRatio: "\u5904\u7406 / \u97F3\u9891\u6BD4\u7387",
1743
- runtimeReady: "\u5C31\u7EEA",
1744
- runtimeReleased: "\u5DF2\u91CA\u653E",
1745
- runtimeRevision: "\u56FA\u5B9A\u7248\u672C",
1746
- runtimeStarted: "\u5DF2\u5F00\u59CB",
1747
- runtimeStatus: "\u72B6\u6001",
1748
- runtimeStorage: "\u6B64\u6765\u6E90\u53EF\u7528\u5B58\u50A8",
1749
- runtimeSuccess: "\u6210\u529F",
1750
- runtimeTitle: "\u8FD0\u884C\u65F6",
1751
- runtimeUnavailable: "\u4E0D\u53EF\u7528",
1752
- runtimeVersions: "ONNX Runtime / Transformers.js",
1753
- runtimeVram: "\u6A21\u578B\u663E\u5B58",
1754
- runtimeWorker: "Worker\u6D3B\u52A8",
1755
- runtimeYes: "\u662F",
1756
- states: "\u5F53\u524D\u72B6\u6001",
1757
- title: "\u5B9E\u65F6\u8BED\u97F3\u8C03\u8BD5\u5668",
1758
- transitions: "\u6700\u8FD1\u7684\u72B6\u6001\u8F6C\u6362",
1759
- waiting: "\u6B63\u5728\u7B49\u5F85\u517C\u5BB9\u7684\u5B9E\u65F6\u8BED\u97F3\u8FD0\u884C\u65F6\u3002"
1760
- }
2516
+ zh: { name: "\u7B80\u4F53\u4E2D\u6587", short: "zh", locale: "zh", lang: () => Promise.resolve().then(() => (init_zh4(), zh_exports)) }
1761
2517
  };
2518
+ function normalizeDebuggerLocale(locale) {
2519
+ if (locale && Object.hasOwn(dictionaries, locale)) return locale;
2520
+ const base = locale?.split("-")[0];
2521
+ return base && Object.hasOwn(dictionaries, base) ? base : "en";
2522
+ }
2523
+
2524
+ // node_modules/.pnpm/@wads.dev+i18n-react@0.0.1-alpha.0_react@19.3.0_typescript@7.0.2/node_modules/@wads.dev/i18n-react/dist/index.js
2525
+ var import_react26 = require("react");
2526
+
2527
+ // node_modules/.pnpm/@wads.dev+i18n-ts@0.0.1-alpha.0_typescript@7.0.2/node_modules/@wads.dev/i18n-ts/dist/runtime/language.js
2528
+ function detectLanguage() {
2529
+ if (typeof navigator !== "undefined" && typeof navigator.language === "string")
2530
+ return navigator.language;
2531
+ if (typeof Intl !== "undefined")
2532
+ return Intl.DateTimeFormat().resolvedOptions().locale;
2533
+ return void 0;
2534
+ }
2535
+ async function loadLanguage(availableLangs, defaultLang, language) {
2536
+ if (!language || !availableLangs[language]) {
2537
+ const browserLang = (detectLanguage() || "").replace("-", "").toLowerCase();
2538
+ const languageKeys = Object.keys(availableLangs).map((key) => key.toLowerCase());
2539
+ language = languageKeys.find((key) => key === browserLang) || languageKeys.find((key) => browserLang.startsWith(key)) || defaultLang;
2540
+ }
2541
+ const info = availableLangs[language];
2542
+ const lang = typeof info.lang === "function" ? await info.lang().then(({ default: loadedLang }) => loadedLang) : info.lang;
2543
+ return { ...info, lang: deepFreeze(lang) };
2544
+ }
2545
+ function deepFreeze(value) {
2546
+ Object.freeze(value);
2547
+ Object.getOwnPropertyNames(value).forEach((property) => {
2548
+ const nestedValue = value[property];
2549
+ if (nestedValue && (typeof nestedValue === "object" || typeof nestedValue === "function") && !Object.isFrozen(nestedValue)) {
2550
+ deepFreeze(nestedValue);
2551
+ }
2552
+ });
2553
+ return value;
2554
+ }
2555
+
2556
+ // node_modules/.pnpm/@wads.dev+i18n-react@0.0.1-alpha.0_react@19.3.0_typescript@7.0.2/node_modules/@wads.dev/i18n-react/dist/index.js
2557
+ function createTranslationRuntime({ availableLangs, defaultLang, onLanguageLoaded }) {
2558
+ const context = (0, import_react26.createContext)({});
2559
+ function useTranslation(selector) {
2560
+ const value = (0, import_react26.useContext)(context);
2561
+ if (!value.current)
2562
+ throw new Error("useTranslation must be used within TranslationProvider.");
2563
+ return { ...value, scoped: selector ? selector(value.current.lang) : value.current.lang };
2564
+ }
2565
+ function TranslationProvider({ children }) {
2566
+ const [saved, setSaved] = (0, import_react26.useState)();
2567
+ const [language, setCurrentLanguage] = (0, import_react26.useState)();
2568
+ function setLanguage(nextLanguage, save) {
2569
+ if (save)
2570
+ setSaved(nextLanguage);
2571
+ }
2572
+ (0, import_react26.useEffect)(() => {
2573
+ void loadLanguage(availableLangs, defaultLang, saved).then((loadedLanguage) => {
2574
+ setCurrentLanguage(loadedLanguage);
2575
+ onLanguageLoaded?.(loadedLanguage);
2576
+ });
2577
+ }, [saved]);
2578
+ if (!language)
2579
+ return null;
2580
+ return (0, import_react26.createElement)(context.Provider, { value: { setLanguage, available: availableLangs, current: language, saved } }, children);
2581
+ }
2582
+ return { TranslationProvider, useTranslation };
2583
+ }
2584
+
2585
+ // src/i18n/runtime.tsx
2586
+ var {
2587
+ TranslationProvider: DebuggerTranslationProvider,
2588
+ useTranslation: useDebuggerLanguage
2589
+ } = createTranslationRuntime({
2590
+ availableLangs: Langs,
2591
+ defaultLang: "en"
2592
+ });
2593
+
2594
+ // src/i18n/DshLanguageBoundary.tsx
2595
+ var import_react27 = __toESM(require("react"), 1);
2596
+ var fallback = Object.freeze({ active: "en", revision: 0 });
2597
+ function DshLanguageBoundary({ locale, children }) {
2598
+ const { current, setLanguage } = useDebuggerLanguage();
2599
+ const subscribe = import_react27.default.useCallback(
2600
+ (listener) => locale?.subscribe?.(listener) ?? (() => {
2601
+ }),
2602
+ [locale]
2603
+ );
2604
+ const snapshot = import_react27.default.useCallback(() => locale?.getSnapshot?.() ?? fallback, [locale]);
2605
+ const state = import_react27.default.useSyncExternalStore(subscribe, snapshot, snapshot);
2606
+ const expected = normalizeDebuggerLocale(state.active);
2607
+ import_react27.default.useEffect(() => {
2608
+ if (current.locale !== expected) setLanguage(expected, true);
2609
+ }, [current.locale, expected, setLanguage]);
2610
+ const initialized = import_react27.default.useRef(false);
2611
+ if (current.locale === expected) initialized.current = true;
2612
+ return initialized.current ? children : null;
2613
+ }
2614
+ function withDebuggerLanguage(Component, locale) {
2615
+ function Localized(props) {
2616
+ return /* @__PURE__ */ import_react27.default.createElement(DebuggerTranslationProvider, null, /* @__PURE__ */ import_react27.default.createElement(DshLanguageBoundary, { locale }, /* @__PURE__ */ import_react27.default.createElement(Component, { ...props })));
2617
+ }
2618
+ Localized.displayName = "DebuggerLanguage(" + (Component.displayName || Component.name || "Component") + ")";
2619
+ return Localized;
2620
+ }
2621
+
2622
+ // src/i18n/registerDshLocales.ts
2623
+ var namespace = "dsh-live-voice-debugger";
2624
+ function registerDshLocales(ctx) {
2625
+ const registered = new Set(
2626
+ (ctx.locale.getSnapshot?.().locales ?? []).map(
2627
+ (locale) => locale.id.toLowerCase()
2628
+ )
2629
+ );
2630
+ for (const [id, language] of Object.entries(Langs)) {
2631
+ if (!registered.has(id.toLowerCase())) {
2632
+ ctx.effect(
2633
+ () => ctx.locale.addLanguage({ id, label: language.name, fallback: "en" }),
2634
+ namespace + ": " + id + " language"
2635
+ );
2636
+ registered.add(id.toLowerCase());
2637
+ }
2638
+ }
2639
+ for (const [locale, tree] of Object.entries(dictionaries)) {
2640
+ const dictionary = Object.fromEntries(
2641
+ Object.entries(tree).flatMap(
2642
+ ([group, entries]) => Object.entries(entries).map(([key, value]) => [group + "." + key, value])
2643
+ )
2644
+ );
2645
+ ctx.effect(() => ctx.locale.register(namespace, locale, dictionary), namespace + ": " + locale);
2646
+ }
2647
+ return ctx.locale.bind(namespace);
2648
+ }
1762
2649
 
1763
2650
  // src/styles.ts
1764
2651
  var styles = `
2652
+ .dlvd-timeline-window{display:flex;gap:12px;align-items:center}.dlvd-window-selector{flex:1;min-width:0;padding:0 10px}.dlvd-window-values{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;font-variant-numeric:tabular-nums}.dlvd-window-track{position:relative;height:32px;touch-action:none;user-select:none}.dlvd-window-track:before{content:"";position:absolute;left:0;right:0;top:14px;height:4px;border-radius:4px;background:var(--dsw-alias-border-l2,#ffffff40)}.dlvd-panel .dlvd-window-selection{position:absolute;top:11px;height:10px;min-width:1px;padding:0;border:0;border-radius:4px;background:var(--dsw-alias-state-business-primary,#7aaaff);cursor:grab;touch-action:none}.dlvd-panel .dlvd-window-selection:active{cursor:grabbing}.dlvd-panel .dlvd-window-handle{position:absolute;top:0;width:20px;height:32px;transform:translateX(-50%);padding:0;border:0;border-radius:4px;background:transparent;cursor:ew-resize;touch-action:none;z-index:1}.dlvd-window-handle:before{content:"";position:absolute;width:12px;height:12px;left:4px;top:10px;border-radius:50%;background:var(--dsw-alias-label-primary,#f9fafb);box-shadow:0 0 0 1px #0004}.dlvd-panel .dlvd-window-reset{display:inline-flex;align-items:center;justify-content:center;padding:6px;flex:none}.dlvd-window-track button:disabled{cursor:default}
2653
+ .dlvd-event-pin{position:absolute;transform:translateX(-100%);color:#ffbd66;font-size:14px;line-height:14px;pointer-events:none;z-index:1}.dlvd-event-pin[data-event=capture-gated]{color:#f88888}.dlvd-recordings input{font:inherit;background:var(--dsw-alias-bg-layer-1,#232324);color:inherit;border:1px solid var(--dsw-alias-border-l2,#ffffff1f);border-radius:6px;padding:5px;max-width:100%;box-sizing:border-box}
2654
+
1765
2655
  .dlvd-runtimes{overflow-wrap:anywhere}.dlvd-runtimes h3{margin:8px 0}.dlvd-runtime-card{border-top:1px solid var(--dsw-alias-border-l2,#ffffff1f);padding:12px 0}.dlvd-runtimes .dlvd-history>div{border-bottom:1px solid var(--dsw-alias-border-l1,#ffffff0f);padding:6px 0}.dlvd-tabs{flex-wrap:wrap}
1766
2656
 
1767
2657
  .dlvd-columns{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;flex:1;min-height:0;overflow:hidden}.dlvd-state-pane,.dlvd-event-pane{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden}.dlvd-event-pane{border-left:1px solid var(--dsw-alias-border-l1, #ffffff0f);padding-left:16px}.dlvd-columns h3{margin:0 0 10px}.dlvd-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;padding-right:8px}.dlvd-scroll:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary, #7aaaff);outline-offset:-2px}.dlvd-history summary{overflow-wrap:anywhere}.dlvd-panel>header,.dlvd-panel>p,.dlvd-panel>.dlvd-toolbar{flex-shrink:0}
@@ -1817,13 +2707,7 @@ function apply(ctx) {
1817
2707
  const notify = () => {
1818
2708
  for (const listener of listeners) listener();
1819
2709
  };
1820
- for (const [locale, dictionary] of Object.entries(dictionaries)) {
1821
- ctx.effect(() => ctx.locale.register(namespace, locale, dictionary), namespace + ": " + locale);
1822
- }
1823
- const t = ctx.locale.bind(namespace);
1824
- const copy = () => Object.fromEntries(Object.keys(dictionaries.en).map((key) => [key, t(key)]));
1825
- const localeSubscribe = (listener) => ctx.locale.subscribe(listener);
1826
- const localeSnapshot = () => ctx.locale.getSnapshot();
2710
+ const t = registerDshLocales(ctx);
1827
2711
  const close = () => {
1828
2712
  if (closedTimer !== null) clearInterval(closedTimer);
1829
2713
  closedTimer = null;
@@ -1837,12 +2721,11 @@ function apply(ctx) {
1837
2721
  notify();
1838
2722
  };
1839
2723
  function Host() {
1840
- import_react25.default.useSyncExternalStore(localeSubscribe, localeSnapshot);
1841
- const labels = copy();
1842
- import_react25.default.useEffect(() => {
1843
- if (popup && !popup.closed) popup.document.title = labels.title;
1844
- }, [labels.title]);
1845
- return /* @__PURE__ */ import_react25.default.createElement(DebuggerPanel, { copy: labels, target: window, onClose: () => queueMicrotask(close) });
2724
+ const { scoped: labels } = useDebuggerLanguage();
2725
+ import_react28.default.useEffect(() => {
2726
+ if (popup && !popup.closed) popup.document.title = labels.commons.title;
2727
+ }, [labels.commons.title]);
2728
+ return /* @__PURE__ */ import_react28.default.createElement(DebuggerPanel, { copy: labels, target: window, onClose: () => queueMicrotask(close) });
1846
2729
  }
1847
2730
  const open = () => {
1848
2731
  if (popup && !popup.closed) {
@@ -1865,7 +2748,7 @@ function apply(ctx) {
1865
2748
  }
1866
2749
  popup = candidate;
1867
2750
  const doc = candidate.document;
1868
- doc.title = copy().title;
2751
+ doc.title = t("commons.title");
1869
2752
  doc.body.replaceChildren();
1870
2753
  doc.body.className = "dlvd-window";
1871
2754
  syncDebuggerTheme(window, doc);
@@ -1876,7 +2759,7 @@ function apply(ctx) {
1876
2759
  container.dataset.plugin = namespace;
1877
2760
  doc.body.appendChild(container);
1878
2761
  root = (0, import_client.createRoot)(container);
1879
- root.render(/* @__PURE__ */ import_react25.default.createElement(Host, null));
2762
+ root.render(/* @__PURE__ */ import_react28.default.createElement(LocalizedHost, null));
1880
2763
  enabled = true;
1881
2764
  closedTimer = setInterval(() => {
1882
2765
  if (popup?.closed) close();
@@ -1891,16 +2774,17 @@ function apply(ctx) {
1891
2774
  }
1892
2775
  };
1893
2776
  function Settings() {
1894
- const failed = import_react25.default.useSyncExternalStore(subscribe, () => blocked);
1895
- import_react25.default.useSyncExternalStore(localeSubscribe, localeSnapshot);
1896
- const labels = copy();
1897
- return /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlv-diagnostics-launcher" }, /* @__PURE__ */ import_react25.default.createElement("button", { type: "button", className: "dlv-diagnostics-button", onClick: open }, /* @__PURE__ */ import_react25.default.createElement(Icon, { name: "bug" }), labels.diagnostics), /* @__PURE__ */ import_react25.default.createElement(Hint, { label: labels.diagnostics }, labels.activate), failed && /* @__PURE__ */ import_react25.default.createElement("p", { role: "alert" }, labels.popupBlocked));
2777
+ const failed = import_react28.default.useSyncExternalStore(subscribe, () => blocked);
2778
+ const { scoped: labels } = useDebuggerLanguage();
2779
+ return /* @__PURE__ */ import_react28.default.createElement("div", { className: "dlv-diagnostics-launcher" }, /* @__PURE__ */ import_react28.default.createElement("button", { type: "button", className: "dlv-diagnostics-button", onClick: open }, /* @__PURE__ */ import_react28.default.createElement(Icon, { name: "bug" }), labels.commons.diagnostics), /* @__PURE__ */ import_react28.default.createElement(Hint, { label: labels.commons.diagnostics }, labels.commons.activate), failed && /* @__PURE__ */ import_react28.default.createElement("p", { role: "alert" }, labels.commons.popupBlocked));
1898
2780
  }
2781
+ const LocalizedHost = withDebuggerLanguage(Host, ctx.locale);
2782
+ const LocalizedSettings = withDebuggerLanguage(Settings, ctx.locale);
1899
2783
  ctx.effect(
1900
2784
  () => publishDeveloperExtension(window, {
1901
2785
  version: 1,
1902
- label: () => t("developer"),
1903
- component: Settings
2786
+ label: () => t("commons.developer"),
2787
+ component: LocalizedSettings
1904
2788
  }),
1905
2789
  namespace + ": Developer tab"
1906
2790
  );