-
Notifications
You must be signed in to change notification settings - Fork 4.5k
Expand file tree
/
Copy pathindex.ts
More file actions
990 lines (989 loc) · 53.4 KB
/
Copy pathindex.ts
File metadata and controls
990 lines (989 loc) · 53.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
import type { TranslationShape } from '../en-US';
export const esES = {
common: {
search: "Buscar...",
create: "Nuevo",
new: "Nuevo",
cancel: "Cancelar",
delete: "Eliminar",
edit: "Editar",
theme: "Tema",
signOut: "Cerrar sesión",
noMatches: "No se encontraron coincidencias",
tryDifferentSearch: "Intenta usar un término de búsqueda diferente.",
light: "Claro",
dark: "Oscuro",
system: "Sistema",
loading: "Cargando...",
note: "Nota",
insight: "Análisis",
newSource: "Nueva fuente",
newNotebook: "Nuevo cuaderno",
newPodcast: "Nuevo podcast",
language: "Idioma",
english: "English",
chinese: "简体中文",
japanese: "日本語",
french: "Français",
russian: "Русский",
bengali: "বাংলা",
catalan: "Català",
spanish: "Español",
german: "Deutsch",
polish: "Polski",
turkish: "Türkçe",
source: "Fuente",
notebook: "Cuaderno",
podcast: "Podcast",
quickActions: "Acciones rápidas",
quickActionsDesc: "Navegación, búsqueda, preguntar, tema",
appName: "Open Notebook",
add: "Agregar",
remove: "Quitar",
confirm: "Confirmar",
warning: "Advertencia",
error: "Error",
success: "Éxito",
model: "Modelo",
back: "Atrás",
next: "Siguiente",
done: "Listo",
processing: "Procesando...",
creating: "Creando...",
linked: "Vinculado",
adding: "Agregando...",
addSelected: "Agregar seleccionados",
customModel: "Modelo personalizado",
failed: "fallido",
current: "Actual",
save: "Guardar",
writeNote: "Escribir nota",
batchMode: "Modo por lotes",
optional: "Opcional",
type: "Tipo",
title: "Título",
created: "Creado {{time}}",
updated: "Actualizado {{time}}",
actions: "Acciones",
noResults: "Sin resultados",
references: "Referencias",
refreshPage: "Por favor, intenta recargar la página",
refresh: "Recargar",
aiGenerated: "Generado por IA",
human: "Humano",
unknown: "Desconocido",
notes: "Notas",
chat: "Chat",
deleteForever: "Eliminar permanentemente",
connectionError: "Error de conexión",
unableToConnect: "No se puede conectar al servidor API",
retryConnection: "Reintentar conexión",
diagnosticInfo: "Información de diagnóstico",
version: "Versión",
built: "Compilación",
apiUrl: "URL de la API",
frontendUrl: "URL del frontend",
checkConsoleLogs: "Revisa la consola del navegador para logs detallados (busca mensajes 🔧 [Config])",
yes: "Sí",
no: "No",
saving: "Guardando...",
description: "Descripción",
saveToNote: "Guardar en nota",
copyToClipboard: "Copiar al portapapeles",
close: "Cerrar",
insights: "Análisis",
progress: "Progreso",
deleting: "Eliminando...",
created_label: "Creado",
updated_label: "Actualizado",
download: "Descargar",
saveChanges: "Guardar cambios",
name: "Nombre",
default: "Predeterminado",
nameRequired: "El nombre es obligatorio",
modelConfiguration: "Configuración del modelo",
resetToDefault: "Restablecer valores predeterminados",
reasoning: "Razonamiento",
searchTerms: "Términos de búsqueda",
strategy: "Estrategia",
individualAnswers: "Respuestas individuales ({{count}})",
finalAnswer: "Respuesta final",
notebookLabel: "Cuaderno: {{name}}",
itemNotFound: "No se pudo encontrar este {{type}}",
contentUnavailable: {
notFoundTitle: "Este contenido ya no existe",
notFoundDescription: "Puede que haya sido eliminado. Las referencias en mensajes antiguos pueden apuntar a contenido que ya fue eliminado.",
errorTitle: "No se pudo cargar este contenido",
errorDescription: "Algo salió mal al cargarlo. Inténtalo de nuevo.",
},
accessibility: {
transformationViews: "Vistas de transformación",
searchKB: "Pregunta o busca en tu base de conocimiento",
enterQuestion: "Escribe tu pregunta para consultar la base de conocimiento",
enterSearch: "Escribe tu búsqueda",
searchKBBtn: "Buscar en la base de conocimiento",
podcastViews: "Vistas de podcast",
ytVideo: "Video de YouTube",
askResponse: "Respuesta de consulta",
searchNotebooks: "Buscar cuadernos",
},
url: "URL",
errorDetails: "Detalles del error",
editTransformation: "Editar transformación",
retry: "Reintentar",
traditionalChinese: "繁體中文",
portuguese: "Português",
completed: "completado",
saveSuccess: "Guardado exitosamente",
contextModes: {
off: "No incluido en el chat",
insights: "Solo análisis",
full: "Contenido completo",
clickToCycle: "Clic para cambiar",
},
clickToEdit: "Clic para editar",
},
apiErrors: {
notebookNotFound: "Cuaderno no encontrado",
sourceNotFound: "Fuente no encontrada",
transformationNotFound: "Transformación no encontrada",
fileUploadFailed: "Error al subir el archivo",
urlRequired: "La URL es obligatoria para el tipo enlace",
contentRequired: "El contenido es obligatorio para el tipo texto",
invalidSourceType: "Tipo de fuente inválido",
processingFailed: "El procesamiento falló",
failedToQueue: "Error al poner en cola el procesamiento",
invalidSortBy: "El campo de ordenamiento debe ser type, title, created, updated, insights_count o embedded",
invalidSortOrder: "El orden debe ser 'asc' o 'desc'",
accessDenied: "Acceso al archivo denegado",
fileNotFoundOnServer: "Archivo no encontrado en el servidor",
searchFailed: "La búsqueda falló",
askFailed: "La consulta falló",
pleaseEnterQuestion: "Por favor, escribe una pregunta",
pleaseConfigureModels: "Por favor, configura todos los modelos requeridos",
failedToCreateSession: "Error al crear la sesión",
failedToUpdateSession: "Error al actualizar la sesión",
failedToDeleteSession: "Error al eliminar la sesión",
failedToSendMessage: "Error al enviar el mensaje",
unauthorized: "Acceso no autorizado, por favor verifica tu contraseña",
invalidPassword: "Contraseña inválida",
embeddingModelRequired: "Esta función requiere un modelo de embedding. Por favor, configura uno en la sección de Modelos.",
strategyModelNotFound: "Modelo de estrategia no encontrado",
answerModelNotFound: "Modelo de respuesta no encontrado",
finalAnswerModelNotFound: "Modelo de respuesta final no encontrado",
noAnswerGenerated: "No se pudo generar una respuesta",
genericError: "Ocurrió un error inesperado",
},
connectionErrors: {
apiTitle: "No se puede conectar al servidor API",
apiDesc: "No se pudo alcanzar el servidor API de Open Notebook",
dbTitle: "Error de conexión a la base de datos",
dbDesc: "El servidor API está funcionando, pero la base de datos no es accesible",
troubleshooting: "Esto generalmente significa:",
apiUnreachable1: "El servidor API no está ejecutándose",
apiUnreachable2: "El servidor API está en una dirección diferente",
apiUnreachable3: "Problemas de conectividad de red",
dbFailed1: "SurrealDB no está ejecutándose",
dbFailed2: "La configuración de conexión a la base de datos es incorrecta",
dbFailed3: "Problemas de red entre la API y la base de datos",
quickFixes: "Soluciones rápidas:",
setApiUrl: "Establece la variable de entorno API_URL:",
checkSurreal: "Verifica si SurrealDB está funcionando:",
seeDocumentation: "Para instrucciones detalladas de configuración, consulta:",
docLink: "Documentación de Open Notebook",
showTechnical: "Mostrar detalles técnicos",
attemptedUrl: "URL intentada",
message: "Mensaje",
technicalDetails: "Detalles técnicos",
stackTrace: "Traza de error",
retryLabel: "Reintentar conexión",
retryHint: "Presiona R o haz clic en el botón para reintentar",
dockerLabel: "Para Docker",
localDevLabel: "Para desarrollo local",
},
auth: {
loginTitle: "Open Notebook",
loginDesc: "Ingresa tu contraseña para acceder a la aplicación",
passwordPlaceholder: "Contraseña",
signingIn: "Iniciando sesión...",
signIn: "Iniciar sesión",
connectErrorHint: "No se puede conectar al servidor. Por favor, verifica si la API está funcionando.",
},
navigation: {
collect: "Recopilar",
process: "Procesar",
create: "Crear",
manage: "Gestionar",
sources: "Fuentes",
notebooks: "Cuadernos",
askAndSearch: "Preguntar y buscar",
podcasts: "Podcasts",
models: "Modelos",
transformations: "Transformaciones",
transformation: "Transformación",
settings: "Configuración",
advanced: "Avanzado",
nav: "Navegación",
language: "Cambiar idioma",
theme: "Tema",
ask: "Preguntar",
},
notebooks: {
title: "Cuadernos",
newNotebook: "Nuevo cuaderno",
searchPlaceholder: "Buscar cuadernos...",
archived: "Archivado",
archive: "Archivar",
unarchive: "Desarchivar",
deleteNotebook: "Eliminar cuaderno",
deleteNotebookDesc: "¿Estás seguro de que quieres eliminar \"{{name}}\"? Esta acción no se puede deshacer.",
deleteNotebookLoading: "Cargando vista previa de eliminación...",
deleteNotebookNotes: "{{count}} nota(s) serán eliminadas permanentemente.",
deleteNotebookNoNotes: "No hay notas que eliminar.",
deleteNotebookExclusiveSources: "{{count}} fuente(s) existen solo en este cuaderno.",
deleteNotebookSharedSources: "{{count}} fuente(s) son compartidas con otros cuadernos y serán desvinculadas.",
deleteNotebookNoSources: "No hay fuentes en este cuaderno.",
deleteExclusiveSourcesLabel: "Eliminar fuentes exclusivas",
keepExclusiveSourcesLabel: "Desvincular y conservarlas",
activeNotebooks: "Cuadernos activos",
archivedNotebooks: "Cuadernos archivados",
tileView: "Vista de mosaico",
listView: "Vista de lista",
notFound: "Cuaderno no encontrado",
notFoundDesc: "El cuaderno solicitado no existe.",
updated: "Actualizado",
namePlaceholder: "Nombre del cuaderno",
addDescription: "Agregar descripción...",
noNotesYet: "Aún no hay notas",
deleteNote: "Eliminar nota",
deleteNoteConfirm: "¿Estás seguro de que quieres eliminar esta nota? Esta acción no se puede deshacer.",
noteCreatedSuccess: "Nota creada exitosamente",
failedToCreateNote: "Error al crear la nota",
noteUpdatedSuccess: "Nota actualizada exitosamente",
failedToUpdateNote: "Error al actualizar la nota",
noteDeletedSuccess: "Nota eliminada exitosamente",
failedToDeleteNote: "Error al eliminar la nota",
createNew: "Crear nuevo cuaderno",
createNewDesc: "Ingresa un nombre y una descripción opcional para comenzar.",
descPlaceholder: "Agrega más información sobre este cuaderno aquí...",
createSuccess: "Cuaderno creado exitosamente",
updateSuccess: "Cuaderno actualizado exitosamente",
deleteSuccess: "Cuaderno eliminado exitosamente",
recentlyViewed: "Vistos recientemente",
toggleRecentlyViewed: "Alternar vistos recientemente",
recentlyViewedNotebook: "Cuaderno",
recentlyViewedSource: "Fuente",
lastViewed: "Visto {{time}}",
},
sources: {
newSource: "Nueva fuente",
bulkContext: "Contexto",
includeAllInContext: "Incluir todas en el contexto",
includeAllInsights: "Incluir todas (solo insights)",
includeAllFull: "Incluir todas (contenido completo)",
excludeAllFromContext: "Excluir todas del contexto",
title: "Fuentes",
add: "Agregar fuente",
addNew: "Agregar nueva fuente",
addExisting: "Agregar fuente existente",
delete: "Eliminar fuente",
statusPreparing: "Preparando",
statusQueued: "En cola",
statusProcessing: "Procesando",
statusCompleted: "Completado",
statusFailed: "Fallido",
statusPreparingDesc: "Preparando para procesar",
statusQueuedDesc: "Esperando ser procesado",
statusProcessingDesc: "Siendo procesado",
statusCompletedDesc: "Procesado exitosamente",
statusFailedDesc: "El procesamiento falló",
failedToLoad: "Error al cargar las fuentes",
allSourcesDesc: "Ve todas tus fuentes aquí. Puedes agregar nuevas fuentes o gestionar las existentes.",
allSources: "Todas las fuentes",
insights: "Análisis",
yes: "Sí",
no: "No",
loadingMore: "Cargando más...",
noSourcesYet: "Aún no hay fuentes",
allSourcesDescShort: "Ve todas tus fuentes aquí.",
cannotSaveNoteNoNotebook: "No se puede guardar la nota: ID de cuaderno no disponible",
createFirstSource: "Agrega tu primera fuente para comenzar a construir tu base de conocimiento.",
deleteSourceConfirm: "¿Estás seguro de que quieres eliminar esta fuente?",
deleteConfirm: "¿Estás seguro de que quieres eliminar esto?",
deleteConfirmWithTitle: "¿Estás seguro de que quieres eliminar \"{{title}}\"?",
deleteSuccess: "Fuente eliminada exitosamente. Nota: Para eliminar el archivo del almacenamiento, debes habilitar la opción \"eliminar archivo\" en la página de configuración.",
failedToDelete: "Error al eliminar la fuente",
sourceQueued: "Fuente en cola",
sourceQueuedDesc: "Fuente enviada para procesamiento en segundo plano. Puedes monitorear el progreso en la lista de fuentes.",
sourceAddedSuccess: "Fuente agregada exitosamente",
failedToAddSource: "Error al agregar la fuente",
sourceUpdatedSuccess: "Fuente actualizada exitosamente",
failedToUpdateSource: "Error al actualizar la fuente",
sourceDeletedSuccess: "Fuente eliminada exitosamente",
failedToDeleteSource: "Error al eliminar la fuente",
fileUploadedSuccess: "Archivo subido exitosamente",
failedToUploadFile: "Error al subir el archivo",
sourceRequeued: "Reintento de fuente en cola",
sourceRequeuedDesc: "La fuente ha sido puesta de nuevo en cola para procesamiento.",
failedToRetry: "Error en el reintento",
sourcesAddedToNotebook: "{{count}} fuente(s) agregadas al cuaderno",
failedToAddSourcesToNotebook: "Error al agregar fuentes al cuaderno",
partialAddSuccess: "{{success}} fuente(s) agregadas, {{failed}} fallaron",
sourceRemovedFromNotebook: "Fuente eliminada del cuaderno exitosamente",
failedToRemoveSourceFromNotebook: "Error al eliminar la fuente del cuaderno",
removeConfirm: "¿Estás seguro de que quieres quitar esto del cuaderno?",
checking: "Verificando...",
untitledSource: "Fuente sin título",
maxItems: "máx. {{count}}",
insightsCount: "{{count}} análisis",
details: "Detalles",
detailsTitle: "Detalles de la fuente",
content: "Contenido",
metadata: "Metadatos",
type: {
link: "Enlace",
file: "Archivo",
text: "Texto",
},
id: "ID de fuente",
topics: "Temas",
embedded: "Embebido",
notEmbedded: "No embebido",
embedContent: "Embeber contenido",
embedding: "Embebiendo...",
alreadyEmbedded: "Ya embebido",
downloadFile: "Descargar archivo",
fileUnavailable: "Archivo no disponible",
preparing: "Preparando...",
generateNewInsight: "Generar nuevo análisis",
selectTransformation: "Selecciona una transformación...",
noInsightsYet: "Aún no hay análisis",
createFirstInsight: "Crea tu primer análisis usando una transformación de arriba",
viewInsight: "Ver análisis",
deleteInsight: "Eliminar análisis",
deleteInsightConfirm: "¿Estás seguro de que quieres eliminar este análisis? Esta acción no se puede deshacer.",
insightGenerationStarted: "Generación de análisis iniciada. Aparecerá en breve.",
editNote: "Editar nota",
createNote: "Crear nota",
addTitle: "Agregar un título...",
untitledNote: "Nota sin título",
writeNotePlaceholder: "Escribe el contenido de tu nota aquí...",
saveNote: "Guardar nota",
createNoteBtn: "Crear nota",
createFirstNote: "Crea tu primera nota para capturar ideas y observaciones.",
urlLabel: "URL(s) *",
fileLabel: "Archivo(s) *",
textContentLabel: "Contenido de texto *",
enterUrlsPlaceholder: "Ingresa URLs, una por línea\nhttps://ejemplo.com/articulo1\nhttps://ejemplo.com/articulo2",
batchUrlHint: "Pega múltiples URLs (una por línea) para importar por lotes",
invalidUrlsDetected: "URLs inválidas detectadas:",
lineLabel: "Línea {{line}}",
fixInvalidUrls: "Por favor, corrige o elimina las URLs inválidas para continuar",
selectMultipleFilesHint: "Selecciona múltiples archivos para importar por lotes. Soportados: Documentos (PDF, DOC, DOCX, PPT, XLS, EPUB, TXT, MD), Multimedia (MP4, MP3, WAV, M4A), Imágenes (JPG, PNG), Archivos comprimidos (ZIP)",
selectedFiles: "Archivos seleccionados:",
textPlaceholder: "Pega o escribe tu contenido aquí...",
htmlDetected: "Contenido HTML detectado. Se convertirá a Markdown después del procesamiento.",
titlePlaceholder: "Dale a tu fuente un título descriptivo",
batchTitlesAuto: "Los títulos se generarán automáticamente para cada fuente.",
batchCommonSettings: "Los mismos cuadernos y transformaciones se aplicarán a todos los elementos.",
urlsCount: "{{count}} URL(s)",
filesCount: "{{count}} archivo(s)",
addSource: "Agregar fuente",
notEmbeddedAlert: "Contenido no embebido",
notEmbeddedDesc: "Este contenido no ha sido embebido para búsqueda vectorial. El embedding permite capacidades de búsqueda avanzada y mejor descubrimiento de contenido.",
openOnYoutube: "Abrir en YouTube",
urlCopied: "URL copiada al portapapeles",
viewSource: "Ver fuente",
noInsightSelected: "Ningún análisis seleccionado",
sourceInsight: "Análisis de fuente",
manageNotebooks: "Gestionar cuadernos",
manageNotebooksDesc: "Gestiona qué cuadernos contienen esta fuente",
noNotebooksAvailable: "No hay cuadernos disponibles",
removeFromNotebook: "Quitar del cuaderno",
retryProcessing: "Reintentar procesamiento",
refreshContent: "Actualizar contenido",
deleteSource: "Eliminar fuente",
retry: "Reintentar",
addExistingTitle: "Agregar fuentes existentes",
addExistingDesc: "Selecciona fuentes existentes de todos tus cuadernos para agregar al actual.",
searchPlaceholder: "Buscar fuentes por nombre o URL...",
noNotebooksFound: "No se encontraron cuadernos.",
showingFirst100: "Mostrando las primeras 100 fuentes. Usa la búsqueda para encontrar una específica.",
selectedCount: "{{count}} fuentes seleccionadas",
added: "Agregado el {{date}}",
addUrl: "Agregar URL",
uploadFile: "Subir archivo",
enterText: "Ingresar texto",
processDescription: "El contenido será procesado y analizado por IA.",
processingFiles: "Procesando tus archivos...",
titleRequired: "Se requiere un título para el contenido de texto",
titleGenerated: "Si se deja vacío, se generará un título a partir del contenido",
batchCount: "{{count}} {{type}} serán procesados",
enableEmbedding: "Habilitar embedding para búsqueda",
embeddingDesc: "Permite que esta fuente sea encontrada en búsquedas vectoriales y consultas de IA",
embeddingAlways: "Embedding habilitado automáticamente",
embeddingAlwaysDesc: "Tu configuración está establecida para siempre embeber contenido para búsqueda vectorial.",
embeddingNever: "Embedding deshabilitado",
embeddingNeverDesc: "Tu configuración está establecida para omitir el embedding. La búsqueda vectorial no estará disponible para esta fuente.",
changeInSettings: "Puedes cambiar esto en Configuración",
noContent: "No hay contenido disponible",
insightsDesc: "Análisis generados a partir del análisis del modelo",
uploadedFile: "Archivo subido",
fileUnavailableDesc: "Este archivo no está disponible actualmente por razones del sistema de almacenamiento.",
batchSuccess: "{{count}} fuente(s) creadas exitosamente",
batchFailed: "Error al crear las {{count}} fuentes",
batchPartial: "{{success}} exitosas, {{failed}} fallidas",
submittingSource: "Enviando fuente para procesamiento...",
processingBatchSources: "Procesando {{count}} fuentes. Esto puede tomar unos momentos.",
processingSource: "Tu fuente está siendo procesada. Esto puede tomar unos momentos.",
maxFilesAllowed: "Máximo {{count}} archivos permitidos por lote",
},
chat: {
sessions: "Sesiones",
sessionTitlePlaceholder: "Escribe un título aquí...",
noSessions: "Aún no hay sesiones de chat",
deleteSession: "Eliminar sesión",
deleteSessionDesc: "¿Estás seguro de que quieres eliminar esta sesión de chat? Esta acción no se puede deshacer.",
sendPlaceholder: "Pregunta cualquier cosa sobre tus fuentes...",
sessionsTitle: "Sesiones de chat",
chatWith: "Chat con {{name}}",
startConversation: "Inicia una conversación sobre este {{type}}",
askQuestions: "Haz preguntas para entender mejor el contenido",
pressToSend: "Presiona {{key}} para enviar",
model: "Modelo",
createToStart: "Crea una sesión para comenzar.",
chatWithNotebook: "Chat con cuaderno",
unableToLoadChat: "No se pudo cargar el chat",
noDescription: "Sin descripción",
startByCreating: "Comienza creando tu primer cuaderno para organizar tu investigación.",
messagesCount: "{{count}} mensajes",
sessionCreated: "Sesión de chat creada",
sessionUpdated: "Sesión actualizada",
sessionDeleted: "Sesión eliminada",
stop: "Detener",
},
searchPage: {
askAndSearch: "Preguntar y buscar",
chooseAMode: "Elige un modo",
askBeta: "Preguntar (beta)",
search: "Buscar",
askYourKb: "Pregunta a tu base de conocimiento (beta)",
askYourKbDesc: "El LLM responderá tu consulta basándose en los documentos de tu base de conocimiento.",
question: "Pregunta",
enterQuestionPlaceholder: "Escribe tu pregunta...",
pressToSubmit: "Presiona Cmd/Ctrl+Enter para enviar",
noEmbeddingModel: "No puedes usar esta función porque no tienes un modelo de embedding seleccionado. Por favor, configura uno en la página de Modelos.",
usingCustomModels: "Usando modelos personalizados",
usingDefaultModels: "Usando modelos predeterminados",
advanced: "Avanzado",
strategy: "Estrategia",
answer: "Respuesta",
final: "Final",
ask: "Preguntar",
processing: "Procesando...",
saveToNotebooks: "Guardar en cuadernos",
searchDesc: "Busca en tu base de conocimiento palabras clave o conceptos específicos",
enterSearchPlaceholder: "Escribe tu búsqueda...",
pressToSearch: "Presiona Enter para buscar",
searchCoverageText: "La búsqueda de texto encuentra títulos y contenido de fuentes, análisis, y títulos y contenido de notas.",
searchCoverageVector: "La búsqueda vectorial encuentra contenido de fuentes, análisis y contenido de notas por similitud semántica. Los títulos no se comparan.",
searchType: "Tipo de búsqueda",
vectorSearchWarning: "La búsqueda vectorial requiere un modelo de embedding. Solo la búsqueda de texto está disponible.",
textSearch: "Búsqueda de texto",
vectorSearch: "Búsqueda vectorial",
searchIn: "Buscar en",
searchSources: "Buscar fuentes",
searchNotes: "Buscar notas",
scopeNotebooks: "Cuadernos",
scopeAllNotebooks: "Todos los cuadernos",
scopeNotebooksSelected: "{{count}} seleccionado(s)",
scopeClear: "Limpiar",
scopeHint: "Deja todo sin marcar para buscar en toda la base de conocimiento.",
scopeNoNotebooks: "Aún no hay cuadernos.",
resultsFound: "{{count}} resultados encontrados",
matches: "Coincidencias ({{count}})",
noResultsFor: "No se encontraron resultados para \"{{query}}\"",
notSet: "No configurado",
saveToNotebook: "Guardar en cuaderno",
saveSuccess: "Guardado exitosamente en el cuaderno",
saveError: "Error al guardar en el cuaderno",
selectNotebook: "Seleccionar cuaderno",
searchAndAsk: "Buscar y preguntar",
searchResultsFor: "Resultados de búsqueda para \"{{query}}\"",
askAbout: "Preguntar sobre \"{{query}}\"",
orSearchKb: "O busca en tu base de conocimiento",
saving: "Guardando...",
advancedModelTitle: "Selección avanzada de modelos",
advancedModelDesc: "Elige modelos específicos para cada etapa del proceso de consulta",
strategyModel: "Modelo de estrategia",
answerModel: "Modelo de respuesta",
finalAnswerModel: "Modelo de respuesta final",
selectStrategyPlaceholder: "Seleccionar modelo de estrategia",
selectAnswerPlaceholder: "Seleccionar modelo de respuesta",
selectFinalPlaceholder: "Seleccionar modelo de respuesta final",
saveChanges: "Guardar cambios",
processingQuestion: "Procesando tu pregunta...",
},
podcasts: {
generateEpisode: "Generar episodio de podcast",
generateEpisodeDesc: "Selecciona el contenido a incluir y configura los detalles del episodio antes de generar un nuevo episodio de podcast.",
content: "Contenido",
contentDesc: "Elige cuadernos, fuentes y notas para incluir en este episodio.",
itemsSelected: "{{count}} elementos seleccionados",
tokens: "{{value}} tokens",
chars: "{{value}} caracteres",
loadingNotebooks: "Cargando cuadernos...",
noNotebooksFoundInPodcasts: "No se encontraron cuadernos. Crea un cuaderno y agrega contenido antes de generar un podcast.",
noContentSelected: "No se seleccionó contenido",
summary: "Resumen",
fullContent: "Contenido completo",
untitledSource: "Fuente sin título",
untitledNote: "Nota sin título",
episodeSettings: "Configuración del episodio",
episodeProfile: "Perfil del episodio",
episodeProfilePlaceholder: "Selecciona un perfil de episodio",
episodeName: "Nombre del episodio",
episodeNamePlaceholder: "ej., IA y el futuro del trabajo",
additionalInstructions: "Instrucciones adicionales",
instructionsPlaceholder: "Cualquier consejo adicional para agregar al briefing del episodio...",
generating: "Generando...",
generate: "Generar",
hostPlaceholder: "Presentador {{number}}",
profileRequired: "Perfil de episodio requerido",
profileRequiredDesc: "Selecciona un perfil de episodio antes de generar un podcast.",
nameRequired: "Nombre del episodio requerido",
nameRequiredDesc: "Proporciona un nombre para el episodio.",
addContext: "Agregar contexto",
addContextDesc: "Selecciona al menos una fuente o nota para incluir en el episodio.",
generationFailed: "La generación del podcast falló",
speakerProfileMissing: "Falta el perfil de voces",
speakerProfileMissingDesc: "Este perfil de episodio hace referencia a un perfil de voces que ya no existe. Edita el perfil y selecciona un perfil de voces.",
speakerProfile: "Perfil de locutor",
usesSpeakerProfile: "Usa perfil de locutor",
sources: "Fuentes",
notes: "Notas",
noSources: "No hay fuentes disponibles en este cuaderno.",
noNotes: "No hay notas disponibles en este cuaderno.",
selectMode: "Seleccionar modo",
buildContextFailed: "Error al construir el contexto. Por favor, revisa tus selecciones.",
podcastTaskStarted: "Tarea de podcast iniciada",
loadingProfiles: "Cargando perfiles de episodio...",
noProfilesFound: "No se encontraron perfiles de episodio. Crea un perfil de episodio antes de generar un podcast.",
listTitle: "Podcasts",
listDesc: "Lleva un registro de los episodios generados y gestiona perfiles reutilizables.",
chooseAView: "Elige una vista",
episodesTab: "Episodios",
templatesTab: "Perfiles",
overviewTitle: "Vista general de episodios",
overviewDesc: "Monitorea los trabajos de generación de podcasts y revisa los artefactos finales.",
generateBtn: "Generar podcast",
total: "Total",
processingLabel: "Procesando",
completedLabel: "Completados",
failedLabel: "Fallidos",
pendingLabel: "Pendientes",
loadErrorTitle: "Error al cargar episodios",
loadErrorDesc: "No pudimos obtener los episodios más recientes. Intenta de nuevo en un momento.",
loadingEpisodes: "Cargando episodios…",
noEpisodesYet: "Aún no hay episodios de podcast. Genera tu primero desde las interfaces de chat de cuadernos o fuentes.",
statusRunningTitle: "Procesando actualmente",
statusRunningDesc: "Episodios que están generando activos activamente.",
statusPendingTitle: "En cola / Pendientes",
statusPendingDesc: "Episodios enviados esperando a comenzar el procesamiento.",
statusCompletedTitle: "Episodios completados",
statusCompletedDesc: "Listos para revisar, descargar o publicar.",
statusFailedTitle: "Episodios fallidos",
statusFailedDesc: "Episodios que encontraron problemas durante la generación.",
templatesWorkspaceTitle: "Espacio de trabajo de perfiles",
templatesWorkspaceDesc: "Construye configuraciones reutilizables de episodios y locutores para producción rápida de podcasts.",
howTemplatesPowerTitle: "Cómo los perfiles impulsan la generación de podcasts",
howTemplatesPowerDesc: "Los perfiles dividen el flujo de trabajo del podcast en dos bloques reutilizables. Mézclalos y combínalos cuando generes un nuevo episodio.",
episodeProfilesSetFormat: "Los perfiles de episodio establecen el formato",
episodeProfilesList1: "Definen el número de segmentos y cómo fluye la historia",
episodeProfilesList2: "Eligen los modelos de lenguaje usados para briefing, esquema y escritura del guion",
episodeProfilesList3: "Almacenan briefings predeterminados para que cada episodio comience con un tono consistente",
speakerProfilesBringVoices: "Los perfiles de locutor dan vida a las voces",
speakerProfilesList1: "Eligen el proveedor y modelo de texto a voz",
speakerProfilesList2: "Capturan personalidad, historia y notas de pronunciación por locutor",
speakerProfilesList3: "Reutiliza las mismas voces de presentador o invitado en diferentes formatos de episodio",
recommendedWorkflow: "Flujo de trabajo recomendado",
workflowStep1: "Crea perfiles de locutor para cada voz que necesites",
workflowStep2: "Construye perfiles de episodio que referencien a esos locutores por nombre",
workflowStep3: "Genera podcasts seleccionando el perfil de episodio que se ajuste a la historia",
workflowHint: "Los perfiles de episodio referencian perfiles de locutor por nombre, así que empezar con los locutores evita asignaciones de voz faltantes después.",
failedToLoadTemplates: "Error al cargar los datos de perfiles",
failedToLoadTemplatesDesc: "Asegúrate de que la API esté funcionando e intenta de nuevo. Algunas secciones pueden estar incompletas.",
loadingTemplates: "Cargando perfiles…",
speakerProfilesTitle: "Perfiles de locutor",
speakerProfilesDesc: "Configura voces y personalidades para los episodios generados.",
createSpeaker: "Crear locutor",
noSpeakerProfiles: "Aún no hay perfiles de locutor. Crea uno para hacer disponibles los perfiles de episodio.",
noDescription: "No se proporcionó descripción.",
usedByCount_one: "Usado por 1 episodio",
usedByCount_other: "Usado por {{count}} episodios",
usedByCount: "Usado por {{count}} episodios",
unused: "Sin usar",
voiceId: "ID de voz",
backstory: "Historia",
personality: "Personalidad",
edit: "Editar",
duplicate: "Duplicar",
deleteSpeakerProfileTitle: "¿Eliminar perfil de locutor?",
deleteSpeakerProfileDesc: "Eliminar \"{{name}}\" no se puede deshacer.",
deleteSpeakerDisabledHint: "Quita este locutor de los perfiles de episodio antes de eliminarlo.",
deleting: "Eliminando…",
episodeProfilesTitle: "Perfiles de episodio",
episodeProfilesDesc: "Define configuraciones reutilizables de generación para tus programas.",
createProfile: "Crear perfil",
createSpeakerFirst: "Crea un perfil de locutor antes de agregar un perfil de episodio.",
noEpisodeProfiles: "Aún no hay perfiles de episodio. Crea uno para iniciar la generación de podcasts.",
speakerCreated: "Locutor creado",
speakerCreatedDesc: "El locutor \"{{name}}\" ha sido agregado exitosamente.",
failedToCreateSpeaker: "Error al crear el perfil de locutor",
speakerUpdated: "Locutor actualizado",
speakerUpdatedDesc: "El locutor \"{{name}}\" ha sido actualizado exitosamente.",
failedToUpdateSpeaker: "Error al actualizar el perfil de locutor",
speakerDeleted: "Locutor eliminado",
speakerDeletedDesc: "El locutor \"{{name}}\" ha sido eliminado exitosamente.",
failedToDeleteSpeaker: "Error al eliminar el perfil de locutor",
speakerDuplicated: "Locutor duplicado",
speakerDuplicatedDesc: "El locutor \"{{name}}\" ha sido duplicado exitosamente.",
failedToDuplicateSpeaker: "Error al duplicar el perfil de locutor",
generationStarted: "Generación iniciada",
generationStartedDesc: "La generación del podcast ha sido puesta en cola.",
failedToStartGeneration: "Error al iniciar la generación",
tryAgainMoment: "Por favor, intenta de nuevo en un momento.",
deleteProfileTitle: "¿Eliminar perfil?",
deleteProfileDesc: "Esto eliminará \"{{name}}\". Los episodios existentes conservan sus datos, pero los nuevos ya no usarán esta configuración.",
profileCreated: "Perfil creado",
profileCreatedDesc: "El perfil de episodio \"{{name}}\" ha sido creado exitosamente.",
failedToCreateProfile: "Error al crear el perfil",
profileUpdated: "Perfil actualizado",
profileUpdatedDesc: "El perfil de episodio \"{{name}}\" ha sido actualizado exitosamente.",
failedToUpdateProfile: "Error al actualizar el perfil",
profileDeleted: "Perfil eliminado",
profileDeletedDesc: "El perfil de episodio \"{{name}}\" ha sido eliminado exitosamente.",
failedToDeleteProfile: "Error al eliminar el perfil",
failedToDeleteProfileDesc: "Error al eliminar el perfil de episodio.",
profileDuplicated: "Perfil duplicado",
profileDuplicatedDesc: "El perfil de episodio \"{{name}}\" ha sido duplicado exitosamente.",
failedToDuplicateProfile: "Error al duplicar el perfil",
episodeDeleted: "Episodio eliminado",
episodeDeletedDesc: "El episodio ha sido eliminado exitosamente.",
failedToDeleteEpisode: "Error al eliminar el episodio",
failedToDeleteSpeakerDesc: "Error al eliminar el perfil de locutor.",
outlineModel: "Modelo de esquema",
transcriptModel: "Modelo de transcripción",
segments: "Segmentos",
maxTokens: "Tokens máximos de salida",
maxTokensPlaceholder: "Déjalo en blanco para usar los valores predeterminados",
maxTokensHelp: "Opcional. Limita cuántos tokens puede generar cada paso de generación — el esquema y la transcripción completa —, no es un límite por turno ni por conversación. Déjalo en blanco para usar los valores predeterminados integrados (3000 para el esquema, 5000 para la transcripción). Auméntalo para episodios más largos; un valor demasiado bajo puede cortar la transcripción.",
defaultBriefingTitle: "Briefing predeterminado",
created: "Creado el {{time}}",
details: "Detalles",
summaryTab: "Resumen",
outlineTab: "Esquema",
transcriptTab: "Transcripción",
briefing: "Briefing",
noOutline: "No hay esquema disponible.",
noTranscript: "No hay transcripción disponible.",
deleteEpisodeTitle: "¿Eliminar episodio?",
deleteEpisodeDesc: "Esto eliminará \"{{name}}\" y su archivo de audio permanentemente.",
audioUnavailable: "Audio no disponible",
segment: "Segmento",
speaker: "Locutor",
profile: "Perfil",
link: "Enlace",
file: "Archivo",
embedded: "Embebido",
notEmbedded: "No embebido",
noSpeakerProfilesAvailable: "No hay perfiles de locutor disponibles",
editEpisodeProfile: "Editar perfil de episodio",
createEpisodeProfile: "Crear perfil de episodio",
episodeProfileFormDesc: "Define cómo se deben generar los episodios y qué configuración de locutor usan por defecto.",
noSpeakerProfilesDesc: "Crea un perfil de locutor antes de configurar un perfil de episodio.",
profileName: "Nombre del perfil",
profileNamePlaceholder: "ej., Discusión tecnológica",
descriptionPlaceholder: "Breve resumen de cuándo usar este perfil",
speakerConfig: "Configuración de locutor",
selectSpeakerProfile: "Seleccionar un perfil de locutor",
outlineGeneration: "Generación de esquema",
transcriptGeneration: "Generación de transcripción",
defaultBriefingPlaceholder: "Describe la estructura, tono y objetivos para este formato de episodio",
editSpeakerProfile: "Editar perfil de locutor",
createSpeakerProfile: "Crear perfil de locutor",
speakerProfileFormDesc: "Configura los ajustes de texto a voz y define hasta cuatro locutores.",
speakers: "Locutores",
speakersDesc: "Configura entre una y cuatro voces para este perfil.",
addSpeaker: "Agregar locutor",
speakerNumber: "Locutor {{number}}",
backstoryPlaceholder: "Breve biografía o contexto del locutor",
personalityPlaceholder: "Describe el estilo y tono",
outlineModelRequired: "El modelo de esquema es obligatorio",
transcriptModelRequired: "El modelo de transcripción es obligatorio",
defaultBriefingRequired: "El briefing predeterminado es obligatorio",
segmentsInteger: "Debe ser un número entero",
segmentsMin: "Al menos 3 segmentos",
segmentsMax: "Máximo 20 segmentos",
maxTokensInteger: "Debe ser un número entero",
maxTokensPositive: "Debe ser un número entero positivo",
voiceIdRequired: "El ID de voz es obligatorio",
backstoryRequired: "La historia es obligatoria",
personalityRequired: "La personalidad es obligatoria",
speakerCountMin: "Se requiere al menos un locutor",
speakerCountMax: "Puedes configurar hasta 4 locutores",
delete: "Eliminar",
failedToDelete: "Error al eliminar el podcast",
retry: "Reintentar",
retrying: "Reintentando…",
retryStarted: "Reintento iniciado",
retryStartedDesc: "Se ha enviado un nuevo trabajo de generación de podcast.",
failedToRetry: "Error al reintentar el episodio",
errorDetails: "Detalles del error",
language: "Idioma",
languagePlaceholder: "Selecciona un idioma (opcional)",
podcastLanguage: "Idioma del podcast",
selectOutlineModel: "Seleccionar modelo de esquema",
selectTranscriptModel: "Seleccionar modelo de transcripción",
voiceModel: "Modelo de voz",
voiceModelRequired: "El modelo de voz es obligatorio",
selectVoiceModel: "Seleccionar modelo de voz",
perSpeakerTtsOverride: "Anulación de TTS por locutor (opcional)",
useProfileDefault: "Usar predeterminado del perfil",
setupRequired: "Configuración requerida",
setupRequiredDesc:
"Algunos perfiles aún no tienen modelos configurados. Edítalos para seleccionar modelos antes de generar podcasts.",
notConfigured: "No configurado",
},
settings: {
contentProcessing: "Procesamiento de contenido",
contentProcessingDesc: "Configura cómo se procesan los documentos y URLs",
docEngine: "Motor de procesamiento de documentos",
docEnginePlaceholder: "Selecciona motor de procesamiento de documentos",
urlEngine: "Motor de procesamiento de URLs",
urlEnginePlaceholder: "Selecciona motor de procesamiento de URLs",
autoRecommended: "Auto (Recomendado)",
simple: "Simple",
docling: "Docling",
helpMeChoose: "Ayúdame a elegir",
docHelp: "· Docling es un poco más lento pero más preciso, especialmente si los documentos contienen tablas e imágenes. · Simple extraerá cualquier contenido del documento sin formatearlo. · Auto (recomendado) intentará procesar con Docling y por defecto usará Simple.",
firecrawl: "Firecrawl",
jina: "Jina",
crawl4ai: "Crawl4AI",
enableDoclingHint: "Docling es opcional. Actívalo con OPEN_NOTEBOOK_ENABLE_DOCLING=true — se instala en el primer arranque (descarga grande).",
enableCrawl4aiHint: "Crawl4AI local es opcional. Actívalo con OPEN_NOTEBOOK_ENABLE_CRAWL4AI=true (se instala en el primer arranque), o define CRAWL4AI_API_URL para usar un servidor remoto.",
urlHelp: "· Firecrawl es un servicio de pago (con un nivel gratuito), y muy potente. · Jina es una buena opción también y tiene un nivel gratuito. · Crawl4AI renderiza páginas JavaScript localmente (o mediante un servidor Crawl4AI cuando se define CRAWL4AI_API_URL), sin clave de API. · Simple usará extracción HTTP básica y perderá contenido en sitios web basados en JavaScript. · Auto (recomendado) intentará usar Firecrawl, luego Jina, luego Crawl4AI, y finalmente Simple.",
embeddingAndSearch: "Embedding y búsqueda",
embeddingAndSearchDesc: "Configura las opciones de búsqueda y embedding",
defaultEmbeddingOption: "Opción de embedding predeterminada",
embeddingOptionPlaceholder: "Selecciona opción de embedding",
ask: "Preguntar",
always: "Siempre",
never: "Nunca",
embeddingHelp: "Embeber el contenido facilitará encontrarlo por ti y por tus agentes de IA. Si estás usando un modelo de embedding local (Ollama, por ejemplo), no deberías preocuparte por el costo y simplemente embeber todo.",
fileManagement: "Gestión de archivos",
fileManagementDesc: "Configura las opciones de manejo y almacenamiento de archivos",
autoDeleteFiles: "Eliminar archivos automáticamente",
ocrEnabled: "Activar OCR",
ocrHelp: "Extrae texto de PDF escaneados e imágenes al usar el motor Docling. Más lento de procesar.",
formulasEnabled: "Extraer fórmulas",
formulasHelp: "Extrae fórmulas matemáticas como marcado estructurado al usar el motor Docling. Aumenta el tiempo de procesamiento.",
visionEnabled: "Describir imágenes y gráficos",
visionHelp: "Usa un modelo de visión para describir imágenes y extraer datos de gráficos al usar el motor Docling. Significativamente más lento y puede llamar a un modelo de visión.",
autoDeletePlaceholder: "Selecciona opción de eliminación automática",
filesHelp: "Una vez que tus archivos se suben y procesan, ya no son necesarios. La mayoría de los usuarios deberían permitir que Open Notebook elimine los archivos subidos de la carpeta de carga automáticamente.",
loadFailed: "Error al cargar la configuración",
},
advanced: {
title: "Herramientas avanzadas",
desc: "Herramientas avanzadas y utilidades para usuarios expertos",
systemInfo: "Información del sistema",
rebuildEmbeddings: "Reconstruir embeddings",
rebuildEmbeddingsDesc: "Reconstruir el índice de búsqueda vectorial para todas las fuentes",
currentVersion: "Versión actual",
latestVersion: "Última versión",
status: "Estado",
updateAvailable: "Versión {{version}} disponible",
updateAvailableDesc: "Una nueva versión de Open Notebook está disponible.",
upToDate: "Actualizado",
unknown: "Desconocido",
viewOnGithub: "Ver en GitHub",
updateCheckFailed: "No se pudo verificar actualizaciones. GitHub puede no ser accesible.",
rebuild: {
mode: "Modo de reconstrucción",
existing: "Existentes",
all: "Todos",
existingDesc: "Re-embeber solo elementos que ya tienen embeddings (más rápido, para cambio de modelo)",
allDesc: "Re-embeber elementos existentes + crear embeddings para elementos sin ninguno (más lento, completo)",
include: "Incluir en la reconstrucción",
selectOneError: "Por favor, selecciona al menos un tipo de elemento para reconstruir",
starting: "Iniciando reconstrucción...",
startBtn: "🚀 Iniciar reconstrucción",
queued: "En cola",
running: "Enviando trabajos...",
completed: "¡Trabajos enviados!",
failed: "Fallido",
leavePageHint: "Puedes salir de esta página ya que se ejecutará en segundo plano",
startNew: "Iniciar nueva reconstrucción",
itemsProcessed: "{{processed}}/{{total}} trabajos enviados ({{percent}}%)",
failedItems: "{{count}} trabajos fallaron al enviarse",
time: "Tiempo",
whenToRebuild: "¿Cuándo debo reconstruir los embeddings?",
whenToRebuildAns: "Debes reconstruir al cambiar modelos, actualizar versiones, corregir corrupción o después de importaciones masivas.",
howLong: "¿Cuánto tiempo tarda la reconstrucción?",
howLongAns: "El tiempo de procesamiento depende de la cantidad de elementos, velocidad del modelo y límites de la API. Los modelos locales suelen ser muy rápidos.",
isSafe: "¿Es seguro reconstruir mientras uso la aplicación?",
isSafeAns: "Sí, la reconstrucción es segura. No elimina contenido, solo reemplaza embeddings, y maneja errores de forma controlada.",
},
},
transformations: {
title: "Transformaciones",
desc: "Las transformaciones son prompts que el LLM usará para procesar una fuente y extraer análisis, resúmenes, etc.",
workspace: "Elige un espacio de trabajo",
playground: "Laboratorio",
defaultPrompt: "Prompt de transformación predeterminado",
defaultPromptDesc: "Esto se agregará a todos tus prompts de transformación",
defaultPromptPlaceholder: "Ingresa tus instrucciones de transformación predeterminadas...",
listTitle: "Transformaciones personalizadas",
createNew: "Crear nueva",
inputLabel: "Texto de entrada",
inputPlaceholder: "Ingresa algo de texto para transformar...",
outputLabel: "Resultado",
runTest: "Ejecutar transformación",
running: "Ejecutando...",
selectToStart: "Selecciona una transformación para comenzar",
name: "Nombre",
namePlaceholder: "Identificador único, ej. temas_clave",
titlePlaceholder: "Título mostrado, por defecto usa el nombre",
promptPlaceholder: "Escribe el prompt que impulsará esta transformación...",
descriptionPlaceholder: "Describe qué hace esta transformación.",
suggestDefault: "Sugerir por defecto en nuevas fuentes",
promptHint: "Los prompts deben escribirse pensando en el contenido de la fuente. Puedes pedirle al modelo que resuma, extraiga análisis o produzca resultados estructurados como tablas.",
createSuccess: "Transformación creada exitosamente",
updateSuccess: "Transformación actualizada exitosamente",
deleteSuccess: "Transformación eliminada exitosamente",
noTransformations: "Aún no hay transformaciones",
createOne: "Crea una transformación para comenzar",
selectModel: "Seleccionar un modelo",
deleteConfirm: "¿Estás seguro de que quieres eliminar esta transformación?",
model: "Modelo",
systemPrompt: "Prompt del sistema",
overrideModelDesc: "Anula el modelo predeterminado para esta sesión de chat. Déjalo vacío para usar el predeterminado del sistema.",
sessionUseReplacement: "Esta sesión usará {{name}} en lugar del modelo predeterminado.",
systemDefault: "Predeterminado del sistema",
},
models: {
embedding: "Modelos de embedding",
tts: "Texto a voz (TTS)",
stt: "Voz a texto (STT)",
apiKey: "Clave API",
deleteSuccess: "Modelo eliminado exitosamente",
saveSuccess: "Modelo guardado exitosamente",
noModels: "Sin modelos",
discoverModels: "Descubrir modelos",
noModelsFound: "No se encontraron modelos de este proveedor",
modelType: "Tipo de modelo",
modelTypeHint: "Selecciona el tipo para los modelos que quieres agregar. Si necesitas tipos diferentes, agrégalos en lotes separados.",
deleteModel: "Eliminar modelo",
defaultAssignments: "Asignaciones de modelos predeterminados",
defaultAssignmentsDesc: "Configura qué modelos usar para diferentes propósitos en Open Notebook",
missingRequiredModels: "Faltan modelos requeridos: {{models}}. Open Notebook puede no funcionar correctamente sin estos.",
selectModelPlaceholder: "Seleccionar un modelo",
noneOption: "Ninguno",
noneFallbackToChat: "Usar alternativa (chat predeterminado)",
usingChatModelHint: "Usando el modelo de chat ({{model}})",
ttsUnsetHint: "Sin configurar — generación de audio no disponible hasta configurarlo",
sttUnsetHint: "Sin configurar — transcripción no disponible hasta configurarlo",
requiredModelPlaceholder: "⚠️ Requerido - Seleccionar un modelo",
chatModelLabel: "Modelo de chat",
chatModelDesc: "Usado para conversaciones de chat",
transformationModelLabel: "Modelo de transformación",
transformationModelDesc: "Usado para resúmenes, análisis y transformaciones",
toolsModelLabel: "Modelo de herramientas",
toolsModelDesc: "Usado para llamadas a funciones - Se recomienda OpenAI o Anthropic",
largeContextModelLabel: "Modelo de contexto largo",
largeContextModelDesc: "Usado para procesar documentos grandes - Se recomienda Gemini",
embeddingModelLabel: "Modelo de embedding",
embeddingModelDesc: "Usado para búsqueda semántica y embeddings vectoriales",
ttsModelLabel: "Modelo de texto a voz",
ttsModelDesc: "Usado para generación de podcasts",
sttModelLabel: "Modelo de voz a texto",
sttModelDesc: "Usado para transcripción de audio",
embeddingChangeTitle: "Cambio de modelo de embedding",
embeddingChangeConfirm: "Estás a punto de cambiar tu modelo de embedding de {{from}} a {{to}}.",
rebuildRequired: "Importante: Reconstrucción requerida",
rebuildReason: "Cambiar tu modelo de embedding requiere reconstruir todos los embeddings existentes para mantener la consistencia. Sin reconstruir, tus búsquedas pueden devolver resultados incorrectos o incompletos.",
whatHappensNext: "Qué pasa después:",
step1: "Tu modelo de embedding predeterminado será actualizado",
step2: "Los embeddings existentes permanecerán sin cambios hasta la reconstrucción",
step3: "El nuevo contenido usará el nuevo modelo de embedding",
step4: "Deberías reconstruir los embeddings lo antes posible",
proceedToRebuildPrompt: "¿Te gustaría ir a la página Avanzado para iniciar la reconstrucción ahora?",
changeModelOnly: "Solo cambiar modelo",
changeAndRebuild: "Cambiar e ir a reconstruir",
autoAssign: "Auto-asignar predeterminados",
autoAssigning: "Asignando...",
autoAssignSuccess: "{{count}} modelos predeterminados asignados automáticamente",
autoAssignNoModels: "No hay modelos disponibles para asignar. Por favor, sincroniza modelos primero.",
autoAssignAlreadySet: "Todos los modelos predeterminados ya están configurados",
testModel: "Probar modelo",
testModelSuccess: "Prueba de modelo exitosa",
testModelFailed: "Prueba de modelo fallida",
searchOrAddModel: "Buscar o escribir nombre del modelo...",
addCustomModel: "Agregar \"{{name}}\"",
},
apiKeys: {
title: "Modelos",
description: "Conecta tus proveedores de IA y guarda sus credenciales de forma segura.",
encryptionRequired: "Clave de encriptación no configurada",
encryptionRequiredDescription: "Establece la variable de entorno OPEN_NOTEBOOK_ENCRYPTION_KEY con cualquier cadena secreta para habilitar el almacenamiento de claves API en la base de datos.",
configured: "Configurado",
notConfigured: "No configurado",
providersLoadFailed: "Error al cargar los proveedores",
providersLoadFailedDescription: "Asegúrate de que la API esté en ejecución y vuelve a intentarlo.",
migrationAvailable: "Variables de entorno detectadas",
migrationDescription: "{{count}} clave(s) API están configuradas vía variables de entorno y pueden migrarse a la base de datos para una gestión más fácil.",
migrateToDatabase: "Migrar a la base de datos",
migrating: "Migrando...",
migrationSuccess: "{{count}} clave(s) API migradas exitosamente",
migrationErrors: "{{count}} clave(s) fallaron al migrar",
migrationNothingToMigrate: "Todas las claves ya están en la base de datos",
learnMore: "Aprende a conectar proveedores de IA →",
testConnection: "Probar conexión",
testSuccess: "Conexión exitosa",
testFailed: "La prueba de conexión falló",
syncModels: "Sincronizar modelos",
syncSuccess: "Se descubrieron {{discovered}} modelos, se agregaron {{new}} nuevos",
syncNoNew: "Se descubrieron {{count}} modelos, todos ya registrados",
syncFailed: "Error al sincronizar modelos",
getApiKey: "Obtener clave API",
vertexProject: "ID de proyecto GCP",
vertexLocation: "Región",
vertexCredentials: "Ruta del JSON de cuenta de servicio",
addConfig: "Agregar configuración",
editConfig: "Editar configuración",
deleteConfig: "Eliminar configuración",
configName: "Nombre de la configuración",
configNameHint: "Un nombre descriptivo para esta configuración (ej., 'Producción', 'Desarrollo')",
baseUrl: "URL base",
baseUrlOverrideHint: "Solo cambia esto si necesitas anular el endpoint API predeterminado del proveedor.",
openAICompatibleBaseUrlHint: "Incluye la ruta de la versión de la API que requiere el servidor. Para LM Studio en Docker, usa http://host.docker.internal:1234/v1.",
numCtx: "Ventana de Contexto (num_ctx)",
numCtxHint: "Ventana de contexto máxima para modelos Ollama. Déjalo vacío para usar el valor predeterminado (8192). Auméntalo solo si tu hardware admite una ventana mayor.",
deleteConfigConfirm: "¿Estás seguro de que quieres eliminar '{{name}}'? Esto no se puede deshacer.",
configSaveSuccess: "Configuración guardada exitosamente",
configUpdateSuccess: "Configuración actualizada exitosamente",
configDeleteSuccess: "Configuración eliminada exitosamente",
apiKeyEditHint: "Deja en blanco para mantener la clave API existente",
decryptionError: "Error de desencriptación",
decryptionErrorDescription: "La clave API de esta credencial no pudo ser desencriptada. La clave de encriptación puede haber cambiado. Elimina esta credencial y créala de nuevo con la clave correcta.",
},
setupBanner: {
encryptionRequired: "Clave de encriptación no configurada",
encryptionRequiredDescription: "Establece la variable de entorno OPEN_NOTEBOOK_ENCRYPTION_KEY para habilitar el almacenamiento seguro de credenciales.",
migrationAvailable: "Migración de claves API disponible",
migrationDescription: "{{count}} proveedor(es) tienen claves API configuradas vía variables de entorno. Mígralas a la base de datos para una gestión más fácil.",
goToSettings: "Ir a configuración",
viewDocs: "Ver documentación",
},
} satisfies TranslationShape;