-
Notifications
You must be signed in to change notification settings - Fork 4.5k
Expand file tree
/
Copy pathindex.ts
More file actions
989 lines (988 loc) · 55.5 KB
/
Copy pathindex.ts
File metadata and controls
989 lines (988 loc) · 55.5 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
import type { TranslationShape } from '../en-US';
export const frFR = {
common: {
search: "Recherche...",
create: "Créer",
new: "Nouveau",
cancel: "Annuler",
delete: "Supprimer",
edit: "Modifier",
theme: "Thème",
signOut: "Se déconnecter",
noMatches: "Aucun résultat trouvé",
tryDifferentSearch: "Essayez d'utiliser un terme de recherche différent.",
light: "Clair",
dark: "Sombre",
system: "Système",
loading: "Chargement...",
note: "Note",
insight: "Aperçu",
newSource: "Nouvelle Source",
newNotebook: "Nouveau Carnet",
newPodcast: "Nouveau Podcast",
language: "Langue",
english: "English",
chinese: "简体中文",
japanese: "日本語",
french: "Français",
russian: "Русский",
bengali: "বাংলা",
catalan: "Català",
spanish: "Español",
german: "Deutsch",
polish: "Polski",
turkish: "Türkçe",
source: "Source",
notebook: "Carnet",
podcast: "Podcast",
quickActions: "Actions rapides",
quickActionsDesc: "Navigation, recherche, poser une question, thème",
appName: "Open Notebook",
add: "Ajouter",
remove: "Retirer",
confirm: "Confirmer",
warning: "Avertissement",
error: "Erreur",
success: "Succès",
model: "Modèle",
back: "Retour",
next: "Suivant",
done: "Terminé",
processing: "Traitement...",
creating: "Création...",
linked: "Lié",
adding: "Ajout en cours...",
addSelected: "Ajouter la sélection",
customModel: "Modèle personnalisé",
failed: "échec",
current: "Actuel",
save: "Enregistrer",
writeNote: "Écrire une note",
batchMode: "Mode par lot",
optional: "Optionnel",
type: "Type",
title: "Titre",
created: "Créé à {{time}}",
updated: "Mis à jour à {{time}}",
actions: "Actions",
noResults: "Aucun résultat",
references: "Références",
refreshPage: "Veuillez essayer de rafraîchir la page",
refresh: "Rafraîchir",
aiGenerated: "Généré par IA",
human: "Humain",
unknown: "Inconnu",
notes: "Notes",
chat: "Chat",
deleteForever: "Supprimer définitivement",
connectionError: "Erreur de connexion",
unableToConnect: "Impossible de se connecter au serveur API",
retryConnection: "Réessayer la connexion",
diagnosticInfo: "Informations de diagnostic",
version: "Version",
built: "Compilé le",
apiUrl: "URL de l'API",
frontendUrl: "URL du Frontend",
checkConsoleLogs: "Vérifiez la console du navigateur pour les logs détaillés (cherchez les messages 🔧 [Config])",
yes: "Oui",
no: "Non",
saving: "Enregistrement...",
description: "Description",
saveToNote: "Enregistrer dans la note",
copyToClipboard: "Copier dans le presse-papiers",
close: "Fermer",
insights: "Analyses",
progress: "Progression",
deleting: "Suppression...",
created_label: "Créé",
updated_label: "Mis à jour",
download: "Télécharger",
saveChanges: "Enregistrer les modifications",
name: "Nom",
default: "Par défaut",
nameRequired: "Le nom est requis",
modelConfiguration: "Configuration du modèle",
resetToDefault: "Réinitialiser",
reasoning: "Raisonnement",
searchTerms: "Termes de recherche",
strategy: "Stratégie",
individualAnswers: "Réponses individuelles ({{count}})",
finalAnswer: "Réponse finale",
notebookLabel: "Carnet : {{name}}",
itemNotFound: "Ce {{type}} est introuvable",
contentUnavailable: {
notFoundTitle: "Ce contenu n'existe plus",
notFoundDescription: "Il a peut-être été supprimé. Les références dans les anciens messages peuvent pointer vers du contenu qui a depuis été supprimé.",
errorTitle: "Impossible de charger ce contenu",
errorDescription: "Une erreur s'est produite lors du chargement. Veuillez réessayer.",
},
accessibility: {
transformationViews: "Vues de transformation",
searchKB: "Interroger ou fouiller votre base de connaissances",
enterQuestion: "Entrez votre question pour interroger la base de connaissances",
enterSearch: "Entrez votre recherche",
searchKBBtn: "Rechercher dans la base de connaissances",
podcastViews: "Vues podcast",
ytVideo: "Vidéo YouTube",
askResponse: "Réponse à la question",
searchNotebooks: "Rechercher dans les carnets",
},
url: "URL",
errorDetails: "Détails de l'erreur",
editTransformation: "Modifier la transformation",
retry: "Réessayer",
traditionalChinese: "繁體中文",
portuguese: "Português",
completed: "terminé",
saveSuccess: "Enregistré avec succès",
contextModes: {
off: "Non inclus dans le chat",
insights: "Analyses uniquement",
full: "Contenu complet",
clickToCycle: "Cliquez pour faire défiler",
},
clickToEdit: "Cliquez pour modifier",
},
apiErrors: {
notebookNotFound: "Carnet introuvable",
sourceNotFound: "Source introuvable",
transformationNotFound: "Transformation introuvable",
fileUploadFailed: "Échec du téléchargement du fichier",
urlRequired: "L'URL est requise pour le type lien",
contentRequired: "Le contenu est requis pour le type texte",
invalidSourceType: "Type de source invalide",
processingFailed: "Échec du traitement",
failedToQueue: "Échec de la mise en file d'attente du traitement",
invalidSortBy: "Le champ de tri doit être type, title, created, updated, insights_count ou embedded",
invalidSortOrder: "L'ordre de tri doit être 'asc' ou 'desc'",
accessDenied: "Accès au fichier refusé",
fileNotFoundOnServer: "Fichier introuvable sur le serveur",
searchFailed: "La recherche a échoué",
askFailed: "La demande a échoué",
pleaseEnterQuestion: "Veuillez entrer une question",
pleaseConfigureModels: "Veuillez configurer tous les modèles requis",
failedToCreateSession: "Échec de la création de la session",
failedToUpdateSession: "Échec de la mise à jour de la session",
failedToDeleteSession: "Échec de la suppression de la session",
failedToSendMessage: "Échec de l'envoi du message",
unauthorized: "Accès non autorisé, veuillez vérifier votre mot de passe",
invalidPassword: "Mot de passe invalide",
embeddingModelRequired: "Cette fonctionnalité nécessite un modèle d'embedding. Veuillez en configurer un dans la section Modèles.",
strategyModelNotFound: "Modèle de stratégie introuvable",
answerModelNotFound: "Modèle de réponse introuvable",
finalAnswerModelNotFound: "Modèle de réponse finale introuvable",
noAnswerGenerated: "Aucune réponse n'a pu être générée",
genericError: "Une erreur inattendue est survenue",
},
connectionErrors: {
apiTitle: "Impossible de se connecter au serveur API",
apiDesc: "Le serveur API de Open Notebook est injoignable",
dbTitle: "Échec de la connexion à la base de données",
dbDesc: "Le serveur API fonctionne, mais la base de données n'est pas accessible",
troubleshooting: "Cela signifie généralement :",
apiUnreachable1: "Le serveur API n'est pas lancé",
apiUnreachable2: "Le serveur API fonctionne sur une adresse différente",
apiUnreachable3: "Problèmes de connectivité réseau",
dbFailed1: "SurrealDB n'est pas lancé",
dbFailed2: "Les paramètres de connexion à la base de données sont incorrects",
dbFailed3: "Problèmes réseau entre l'API et la base de données",
quickFixes: "Solutions rapides :",
setApiUrl: "Définissez la variable d'environnement API_URL :",
checkSurreal: "Vérifiez si SurrealDB est lancé :",
seeDocumentation: "Pour des instructions de configuration détaillées, consultez :",
docLink: "Documentation de Open Notebook",
showTechnical: "Afficher les détails techniques",
attemptedUrl: "URL tentée",
message: "Message",
technicalDetails: "Détails techniques",
stackTrace: "Trace de la pile (Stack Trace)",
retryLabel: "Réessayer la connexion",
retryHint: "Appuyez sur R ou cliquez sur le bouton pour réessayer",
dockerLabel: "Pour Docker",
localDevLabel: "Pour le développement local",
},
auth: {
loginTitle: "Open Notebook",
loginDesc: "Entrez votre mot de passe pour accéder à l'application",
passwordPlaceholder: "Mot de passe",
signingIn: "Connexion...",
signIn: "Se connecter",
connectErrorHint: "Impossible de se connecter au serveur. Veuillez vérifier si l'API est lancée.",
},
navigation: {
collect: "Collecter",
process: "Traiter",
create: "Créer",
manage: "Gérer",
sources: "Sources",
notebooks: "Carnets",
askAndSearch: "Demander et rechercher",
podcasts: "Podcasts",
models: "Modèles",
transformations: "Transformations",
transformation: "Transformation",
settings: "Paramètres",
advanced: "Avancé",
nav: "Navigation",
language: "Changer de langue",
theme: "Thème",
ask: "Demander",
},
notebooks: {
title: "Carnets",
newNotebook: "Nouveau Carnet",
searchPlaceholder: "Rechercher des carnets...",
archived: "Archivé",
archive: "Archiver",
unarchive: "Désarchiver",
deleteNotebook: "Supprimer le carnet",
deleteNotebookDesc: "Êtes-vous sûr de vouloir supprimer \"{{name}}\" ? Cette action est irréversible.",
deleteNotebookLoading: "Chargement de l'aperçu de suppression...",
deleteNotebookNotes: "{{count}} note(s) seront supprimées définitivement.",
deleteNotebookNoNotes: "Aucune note à supprimer.",
deleteNotebookExclusiveSources: "{{count}} source(s) existent uniquement dans ce carnet.",
deleteNotebookSharedSources: "{{count}} source(s) sont partagées avec d'autres carnets et seront déliées.",
deleteNotebookNoSources: "Aucune source dans ce carnet.",
deleteExclusiveSourcesLabel: "Supprimer les sources exclusives",
keepExclusiveSourcesLabel: "Délier et les conserver",
activeNotebooks: "Carnets actifs",
archivedNotebooks: "Carnets archivés",
tileView: "Vue en mosaïque",
listView: "Vue en liste",
notFound: "Carnet introuvable",
notFoundDesc: "Le carnet demandé n'existe pas.",
updated: "Mis à jour",
namePlaceholder: "Nom du carnet",
addDescription: "Ajouter une description...",
noNotesYet: "Aucune note pour le moment",
deleteNote: "Supprimer la note",
deleteNoteConfirm: "Êtes-vous sûr de vouloir supprimer cette note ? Cette action est irréversible.",
noteCreatedSuccess: "Note créée avec succès",
failedToCreateNote: "Échec de la création de la note",
noteUpdatedSuccess: "Note mise à jour avec succès",
failedToUpdateNote: "Échec de la mise à jour de la note",
noteDeletedSuccess: "Note supprimée avec succès",
failedToDeleteNote: "Échec de la suppression de la note",
createNew: "Créer un nouveau carnet",
createNewDesc: "Entrez un nom et une description facultative pour commencer.",
descPlaceholder: "Ajoutez plus d'informations sur ce carnet ici...",
createSuccess: "Carnet créé avec succès",
updateSuccess: "Carnet mis à jour avec succès",
deleteSuccess: "Carnet supprimé avec succès",
recentlyViewed: "Consultés récemment",
toggleRecentlyViewed: "Afficher/masquer les éléments récents",
recentlyViewedNotebook: "Carnet",
recentlyViewedSource: "Source",
lastViewed: "Consulté {{time}}",
},
sources: {
newSource: "Nouvelle Source",
bulkContext: "Contexte",
includeAllInContext: "Tout inclure dans le contexte",
includeAllInsights: "Tout inclure (aperçus uniquement)",
includeAllFull: "Tout inclure (contenu complet)",
excludeAllFromContext: "Tout exclure du contexte",
title: "Sources",
add: "Ajouter une source",
addNew: "Ajouter une nouvelle source",
addExisting: "Ajouter une source existante",
delete: "Supprimer la source",
statusPreparing: "Préparation",
statusQueued: "En attente",
statusProcessing: "Traitement",
statusCompleted: "Terminé",
statusFailed: "Échec",
statusPreparingDesc: "Préparation au traitement",
statusQueuedDesc: "En attente de traitement",
statusProcessingDesc: "En cours de traitement",
statusCompletedDesc: "Traitée avec succès",
statusFailedDesc: "Échec du traitement",
failedToLoad: "Échec du chargement des sources",
allSourcesDesc: "Affichez toutes vos sources ici. Vous pouvez en ajouter de nouvelles ou gérer les existantes.",
allSources: "Toutes les sources",
insights: "Aperçus",
yes: "Oui",
no: "Non",
loadingMore: "Chargement...",
noSourcesYet: "Aucune source pour le moment",
allSourcesDescShort: "Affichez toutes vos sources ici.",
cannotSaveNoteNoNotebook: "Impossible d'enregistrer la note : ID du carnet non disponible",
createFirstSource: "Ajoutez votre première source pour commencer à bâtir votre base de connaissances.",
deleteSourceConfirm: "Êtes-vous sûr de vouloir supprimer cette source ?",
deleteConfirm: "Êtes-vous sûr de vouloir supprimer cet élément ?",
deleteConfirmWithTitle: "Êtes-vous sûr de vouloir supprimer \"{{title}}\" ?",
deleteSuccess: "Source supprimée avec succès. Note : Pour supprimer le fichier du stockage, vous devez activer l'option \"supprimer le fichier\" dans la page des paramètres.",
failedToDelete: "Échec de la suppression de la source",
sourceQueued: "Source mise en attente",
sourceQueuedDesc: "Source soumise pour traitement en arrière-plan. Vous pouvez suivre la progression dans la liste des sources.",
sourceAddedSuccess: "Source ajoutée avec succès",
failedToAddSource: "Échec de l'ajout de la source",
sourceUpdatedSuccess: "Source mise à jour avec succès",
failedToUpdateSource: "Échec de la mise à jour de la source",
sourceDeletedSuccess: "Source supprimée avec succès",
failedToDeleteSource: "Échec de la suppression de la source",
fileUploadedSuccess: "Fichier téléchargé avec succès",
failedToUploadFile: "Échec du téléchargement du fichier",
sourceRequeued: "Nouvelle tentative de traitement mise en attente",
sourceRequeuedDesc: "La source a été remise en file d'attente pour traitement.",
failedToRetry: "Échec de la tentative",
sourcesAddedToNotebook: "{{count}} source(s) ajoutée(s) au carnet",
failedToAddSourcesToNotebook: "Échec de l'ajout des sources au carnet",
partialAddSuccess: "{{success}} source(s) ajoutée(s), {{failed}} échouée(s)",
sourceRemovedFromNotebook: "Source retirée du carnet avec succès",
failedToRemoveSourceFromNotebook: "Échec du retrait de la source du carnet",
removeConfirm: "Êtes-vous sûr de vouloir retirer cet élément du carnet ?",
checking: "Vérification...",
untitledSource: "Source sans titre",
maxItems: "max {{count}}",
insightsCount: "{{count}} aperçus",
details: "Détails",
detailsTitle: "Détails de la source",
content: "Contenu",
metadata: "Métadonnées",
type: {
link: "Lien",
file: "Fichier",
text: "Texte",
},
id: "ID de la source",
topics: "Sujets",
embedded: "Indexé (Embedded)",
notEmbedded: "Non indexé",
embedContent: "Indexer le contenu",
embedding: "Indexation en cours...",
alreadyEmbedded: "Déjà indexé",
downloadFile: "Télécharger le fichier",
fileUnavailable: "Fichier indisponible",
preparing: "Préparation...",
generateNewInsight: "Générer un nouvel aperçu",
selectTransformation: "Sélectionner une transformation...",
noInsightsYet: "Aucun aperçu pour le moment",
createFirstInsight: "Créez votre premier aperçu en utilisant une transformation ci-dessus",
viewInsight: "Voir l'aperçu",
deleteInsight: "Supprimer l'aperçu",
deleteInsightConfirm: "Êtes-vous sûr de vouloir supprimer cet aperçu ? Cette action est irréversible.",
insightGenerationStarted: "Génération de l'aperçu lancée. Il apparaîtra sous peu.",
editNote: "Modifier la note",
createNote: "Créer une note",
addTitle: "Ajouter un titre...",
untitledNote: "Note sans titre",
writeNotePlaceholder: "Écrivez le contenu de votre note ici...",
saveNote: "Enregistrer la note",
createNoteBtn: "Créer la note",
createFirstNote: "Créez votre première note pour capturer des idées et des observations.",
urlLabel: "URL(s) *",
fileLabel: "Fichier(s) *",
textContentLabel: "Contenu textuel *",
enterUrlsPlaceholder: "Entrez les URL, une par ligne\nhttps://exemple.com/article1\nhttps://exemple.com/article2",
batchUrlHint: "Collez plusieurs URL (une par ligne) pour une importation groupée",
invalidUrlsDetected: "URL invalides détectées :",
lineLabel: "Ligne {{line}}",
fixInvalidUrls: "Veuillez corriger ou supprimer les URL invalides pour continuer",
selectMultipleFilesHint: "Sélectionnez plusieurs fichiers pour une importation groupée. Supportés : Documents (PDF, DOC, DOCX, PPT, XLS, EPUB, TXT, MD), Média (MP4, MP3, WAV, M4A), Images (JPG, PNG), Archives (ZIP)",
selectedFiles: "Fichiers sélectionnés :",
textPlaceholder: "Collez ou tapez votre contenu ici...",
htmlDetected: "Contenu HTML détecté. Il sera converti en Markdown après traitement.",
titlePlaceholder: "Donnez un titre descriptif à votre source",
batchTitlesAuto: "Les titres seront générés automatiquement pour chaque source.",
batchCommonSettings: "Les mêmes carnets et transformations seront appliqués à tous les éléments.",
urlsCount: "{{count}} URL(s)",
filesCount: "{{count}} fichier(s)",
addSource: "Ajouter la source",
notEmbeddedAlert: "Contenu non indexé",
notEmbeddedDesc: "Ce contenu n'a pas été indexé pour la recherche vectorielle. L'indexation permet des capacités de recherche avancées et une meilleure découverte de contenu.",
openOnYoutube: "Ouvrir sur YouTube",
urlCopied: "URL copiée dans le presse-papiers",
viewSource: "Voir la source",
noInsightSelected: "Aucun aperçu sélectionné",
sourceInsight: "Aperçu de la source",
manageNotebooks: "Gérer les carnets",
manageNotebooksDesc: "Gérer quels carnets contiennent cette source",
noNotebooksAvailable: "Aucun carnet disponible",
removeFromNotebook: "Retirer du carnet",
retryProcessing: "Réessayer le traitement",
refreshContent: "Actualiser le contenu",
deleteSource: "Supprimer la source",
retry: "Réessayer",
addExistingTitle: "Ajouter des sources existantes",
addExistingDesc: "Sélectionnez des sources existantes parmi tous vos carnets pour les ajouter au carnet actuel.",
searchPlaceholder: "Rechercher des sources par nom ou URL...",
noNotebooksFound: "Aucun carnet trouvé.",
showingFirst100: "Affichage des 100 premières sources. Utilisez la recherche pour en trouver des spécifiques.",
selectedCount: "{{count}} sources sélectionnées",
added: "Ajouté le {{date}}",
addUrl: "Ajouter une URL",
uploadFile: "Télécharger un fichier",
enterText: "Saisir du texte",
processDescription: "Le contenu sera traité et analysé par l'IA.",
processingFiles: "Traitement de vos fichiers...",
titleRequired: "Un titre est requis pour le contenu textuel",
titleGenerated: "Si laissé vide, un titre sera généré à partir du contenu",
batchCount: "{{count}} {{type}} seront traités",
enableEmbedding: "Activer l'indexation pour la recherche",
embeddingDesc: "Permet à cette source d'être trouvée dans les recherches vectorielles et les requêtes IA",
embeddingAlways: "Indexation activée automatiquement",
embeddingAlwaysDesc: "Vos paramètres sont configurés pour toujours indexer le contenu pour la recherche vectorielle.",
embeddingNever: "Indexation désactivée",
embeddingNeverDesc: "Vos paramètres sont configurés pour ignorer l'indexation. La recherche vectorielle ne sera pas disponible pour cette source.",
changeInSettings: "Vous pouvez modifier cela dans les Paramètres",
noContent: "Aucun contenu disponible",
insightsDesc: "Aperçus générés par l'analyse du modèle",
uploadedFile: "Fichier téléchargé",
fileUnavailableDesc: "Ce fichier est actuellement indisponible pour des raisons liées au système de stockage.",
batchSuccess: "{{count}} source(s) créée(s) avec succès",
batchFailed: "Échec de la création des {{count}} sources",
batchPartial: "{{success}} réussies, {{failed}} échouées",
submittingSource: "Soumission de la source pour traitement...",
processingBatchSources: "Traitement de {{count}} sources. Cela peut prendre quelques instants.",
processingSource: "Votre source est en cours de traitement. Cela peut prendre quelques instants.",
maxFilesAllowed: "Maximum {{count}} fichiers autorisés par lot",
},
chat: {
sessions: "Sessions",
sessionTitlePlaceholder: "Saisissez un titre ici...",
noSessions: "Aucune session de chat pour le moment",
deleteSession: "Supprimer la session",
deleteSessionDesc: "Êtes-vous sûr de vouloir supprimer cette session de chat ? Cette action est irréversible.",
sendPlaceholder: "Posez n'importe quelle question sur vos sources...",
sessionsTitle: "Sessions de Chat",
chatWith: "Discuter avec {{name}}",
startConversation: "Commencer une conversation sur ce {{type}}",
askQuestions: "Posez des questions pour mieux comprendre le contenu",
pressToSend: "Appuyez sur {{key}} pour envoyer",
model: "Modèle",
createToStart: "Créez une session pour commencer.",
chatWithNotebook: "Discuter avec le Carnet",
unableToLoadChat: "Impossible de charger le chat",
noDescription: "Aucune description",
startByCreating: "Commencez par créer votre premier carnet pour organiser vos recherches.",
messagesCount: "{{count}} messages",
sessionCreated: "Session de chat créée",
sessionUpdated: "Session mise à jour",
sessionDeleted: "Session supprimée",
stop: "Arrêter",
},
searchPage: {
askAndSearch: "Poser une question et Rechercher",
chooseAMode: "Choisir un mode",
askBeta: "Demander (bêta)",
search: "Recherche",
askYourKb: "Interroger votre base de connaissances (bêta)",
askYourKbDesc: "Le LLM répondra à votre requête en se basant sur les documents de votre base de connaissances.",
question: "Question",
enterQuestionPlaceholder: "Entrez votre question...",
pressToSubmit: "Appuyez sur Cmd/Ctrl+Entrée pour envoyer",
noEmbeddingModel: "Vous ne pouvez pas utiliser cette fonctionnalité car aucun modèle d'embedding n'est sélectionné. Veuillez en configurer un dans la page Modèles.",
usingCustomModels: "Utilisation de modèles personnalisés",
usingDefaultModels: "Utilisation des modèles par défaut",
advanced: "Avancé",
strategy: "Stratégie",
answer: "Réponse",
final: "Final",
ask: "Demander",
processing: "Traitement...",
saveToNotebooks: "Enregistrer dans les Carnets",
searchDesc: "Recherchez des mots-clés ou des concepts spécifiques dans votre base de connaissances",
enterSearchPlaceholder: "Entrez votre recherche...",
pressToSearch: "Appuyez sur Entrée pour rechercher",
searchCoverageText: "La recherche textuelle trouve les titres et contenus des sources, les aperçus, ainsi que les titres et contenus des notes.",
searchCoverageVector: "La recherche vectorielle trouve le contenu des sources, les aperçus et le contenu des notes par similarité sémantique. Les titres ne sont pas pris en compte.",
searchType: "Type de recherche",
vectorSearchWarning: "La recherche vectorielle nécessite un modèle d'embedding. Seule la recherche textuelle est disponible.",
textSearch: "Recherche textuelle",
vectorSearch: "Recherche vectorielle",
searchIn: "Rechercher dans",
searchSources: "Rechercher dans les Sources",
searchNotes: "Rechercher dans les Notes",
scopeNotebooks: "Carnets",
scopeAllNotebooks: "Tous les carnets",
scopeNotebooksSelected: "{{count}} sélectionné(s)",
scopeClear: "Effacer",
scopeHint: "Ne cochez rien pour rechercher dans toute la base de connaissances.",
scopeNoNotebooks: "Aucun carnet pour le moment.",
resultsFound: "{{count}} résultats trouvés",
matches: "Correspondances ({{count}})",
noResultsFor: "Aucun résultat trouvé pour “{{query}}”",
notSet: "Non défini",
saveToNotebook: "Enregistrer dans le Carnet",
saveSuccess: "Enregistré avec succès dans le carnet",
saveError: "Échec de l'enregistrement dans le carnet",
selectNotebook: "Sélectionner un carnet",
searchAndAsk: "Rechercher & Demander",
searchResultsFor: "Résultats de recherche pour “{{query}}”",
askAbout: "Poser une question sur “{{query}}”",
orSearchKb: "Ou rechercher dans votre base de connaissances",
saving: "Enregistrement...",
advancedModelTitle: "Sélection de modèle avancée",
advancedModelDesc: "Choisissez des modèles spécifiques pour chaque étape du processus de demande",
strategyModel: "Modèle de stratégie",
answerModel: "Modèle de réponse",
finalAnswerModel: "Modèle de réponse finale",
selectStrategyPlaceholder: "Sélectionner le modèle de stratégie",
selectAnswerPlaceholder: "Sélectionner le modèle de réponse",
selectFinalPlaceholder: "Sélectionner le modèle final",
saveChanges: "Enregistrer les modifications",
processingQuestion: "Traitement de votre question...",
},
podcasts: {
generateEpisode: "Générer un épisode de podcast",
generateEpisodeDesc: "Sélectionnez le contenu à inclure et configurez les détails de l'épisode avant de générer un nouvel épisode de podcast.",
content: "Contenu",
contentDesc: "Choisissez les carnets, sources et notes à inclure dans cet épisode.",
itemsSelected: "{{count}} éléments sélectionnés",
tokens: "{{value}} tokens",
chars: "{{value}} caractères",
loadingNotebooks: "Chargement des carnets...",
noNotebooksFoundInPodcasts: "Aucun carnet trouvé. Créez un carnet et ajoutez du contenu avant de générer un podcast.",
noContentSelected: "Aucun contenu sélectionné",
summary: "Résumé",
fullContent: "Contenu complet",
untitledSource: "Source sans titre",
untitledNote: "Note sans titre",
episodeSettings: "Paramètres de l'épisode",
episodeProfile: "Profil de l'épisode",
episodeProfilePlaceholder: "Sélectionnez un profil d'épisode",
episodeName: "Nom de l'épisode",
episodeNamePlaceholder: "ex: L'IA et le futur du travail",
additionalInstructions: "Instructions supplémentaires",
instructionsPlaceholder: "Tout conseil supplémentaire à ajouter au briefing de l'épisode...",
generating: "Génération...",
generate: "Générer",
hostPlaceholder: "Hôte {{number}}",
profileRequired: "Profil d'épisode requis",
profileRequiredDesc: "Sélectionnez un profil d'épisode avant de générer un podcast.",
nameRequired: "Nom de l'épisode requis",
nameRequiredDesc: "Fournissez un nom pour l'épisode.",
addContext: "Ajouter du contexte",
addContextDesc: "Sélectionnez au moins une source ou une note à inclure dans l'épisode.",
generationFailed: "Échec de la génération du podcast",
speakerProfileMissing: "Profil de voix manquant",
speakerProfileMissingDesc: "Ce profil d'épisode référence un profil de voix qui n'existe plus. Modifiez le profil et sélectionnez un profil de voix.",
speakerProfile: "Profil de l'intervenant",
usesSpeakerProfile: "Utilise le profil de l'intervenant",
sources: "Sources",
notes: "Notes",
noSources: "Aucune source disponible dans ce carnet.",
noNotes: "Aucune note disponible dans ce carnet.",
selectMode: "Sélectionner le mode",
buildContextFailed: "Échec de la construction du contexte. Veuillez vérifier vos sélections.",
podcastTaskStarted: "Tâche de podcast démarrée",
loadingProfiles: "Chargement des profils d'épisode...",
noProfilesFound: "Aucun profil d'épisode trouvé. Créez un profil d'épisode avant de générer un podcast.",
listTitle: "Podcasts",
listDesc: "Suivez les épisodes générés et gérez les profils réutilisables.",
chooseAView: "Choisir une vue",
episodesTab: "Épisodes",
templatesTab: "Profils",
overviewTitle: "Aperçu des épisodes",
overviewDesc: "Surveillez les tâches de génération de podcast et consultez les artefacts finaux.",
generateBtn: "Générer un podcast",
total: "Total",
processingLabel: "En cours",
completedLabel: "Terminé",
failedLabel: "Échoué",
pendingLabel: "En attente",
loadErrorTitle: "Échec du chargement des épisodes",
loadErrorDesc: "Nous n'avons pas pu récupérer les derniers épisodes. Réessayez dans un instant.",
loadingEpisodes: "Chargement des épisodes…",
noEpisodesYet: "Aucun épisode de podcast pour le moment. Générez votre premier depuis le carnet ou les interfaces de chat.",
statusRunningTitle: "En cours de traitement",
statusRunningDesc: "Épisodes dont les ressources sont activement en cours de génération.",
statusPendingTitle: "En file d'attente / En attente",
statusPendingDesc: "Épisodes soumis en attente de traitement.",
statusCompletedTitle: "Épisodes terminés",
statusCompletedDesc: "Prêts à être consultés, téléchargés ou publiés.",
statusFailedTitle: "Épisodes échoués",
statusFailedDesc: "Épisodes ayant rencontré des problèmes lors de la génération.",
templatesWorkspaceTitle: "Espace de travail des profils",
templatesWorkspaceDesc: "Créez des configurations d'épisodes et d'intervenants réutilisables pour une production rapide.",
howTemplatesPowerTitle: "Comment les profils propulsent la génération",
howTemplatesPowerDesc: "Les profils divisent le flux de travail en deux blocs réutilisables. Mélangez-les à chaque génération d'épisode.",
episodeProfilesSetFormat: "Les profils d'épisode définissent le format",
episodeProfilesList1: "Définissez le nombre de segments et le déroulement de l'histoire",
episodeProfilesList2: "Choisissez les modèles de langue pour le briefing, le plan et l'écriture du script",
episodeProfilesList3: "Enregistrez des briefings par défaut pour un ton cohérent",
speakerProfilesBringVoices: "Les profils d'intervenants donnent vie aux voix",
speakerProfilesList1: "Choisissez le fournisseur de synthèse vocale (TTS) et le modèle",
speakerProfilesList2: "Capturez la personnalité, l'histoire et les notes de prononciation par intervenant",
speakerProfilesList3: "Réutilisez les mêmes voix d'hôtes ou d'invités sur différents formats",
recommendedWorkflow: "Flux de travail recommandé",
workflowStep1: "Créez des profils d'intervenants pour chaque voix nécessaire",
workflowStep2: "Créez des profils d'épisodes qui référencent ces intervenants par leur nom",
workflowStep3: "Générez des podcasts en sélectionnant le profil d'épisode adapté",
workflowHint: "Les profils d'épisode référencent les intervenants par nom ; commencer par les voix évite les oublis d'attribution plus tard.",
failedToLoadTemplates: "Échec du chargement des profils",
failedToLoadTemplatesDesc: "Vérifiez que l'API fonctionne et réessayez. Certaines sections peuvent être incomplètes.",
loadingTemplates: "Chargement des profils…",
speakerProfilesTitle: "Profils d'intervenants",
speakerProfilesDesc: "Configurez les voix et personnalités pour les épisodes générés.",
createSpeaker: "Créer un intervenant",
noSpeakerProfiles: "Aucun profil d'intervenant. Créez-en un pour activer les profils d'épisodes.",
noDescription: "Aucune description fournie.",
usedByCount_one: "Utilisé par 1 épisode",
usedByCount_other: "Utilisé par {{count}} épisodes",
usedByCount: "Utilisé par {{count}} épisodes",
unused: "Inutilisé",
voiceId: "ID de la voix",
backstory: "Histoire (Backstory)",
personality: "Personnalité",
edit: "Modifier",
duplicate: "Dupliquer",
deleteSpeakerProfileTitle: "Supprimer le profil de l'intervenant ?",
deleteSpeakerProfileDesc: "La suppression de “{{name}}” est irréversible.",
deleteSpeakerDisabledHint: "Retirez cet intervenant des profils d'épisode avant de le supprimer.",
deleting: "Suppression…",
episodeProfilesTitle: "Profils d'épisode",
episodeProfilesDesc: "Définissez des paramètres de génération réutilisables pour vos émissions.",
createProfile: "Créer un profil",
createSpeakerFirst: "Créez un profil d'intervenant avant d'ajouter un profil d'épisode.",
noEpisodeProfiles: "Aucun profil d'épisode. Créez-en un pour lancer la génération de podcasts.",
speakerCreated: "Intervenant créé",
speakerCreatedDesc: "L'intervenant \"{{name}}\" a été ajouté avec succès.",
failedToCreateSpeaker: "Échec de la création du profil d'intervenant",
speakerUpdated: "Intervenant mis à jour",
speakerUpdatedDesc: "L'intervenant \"{{name}}\" a été mis à jour avec succès.",
failedToUpdateSpeaker: "Échec de la mise à jour du profil d'intervenant",
speakerDeleted: "Intervenant supprimé",
speakerDeletedDesc: "L'intervenant \"{{name}}\" a été retiré avec succès.",
failedToDeleteSpeaker: "Échec de la suppression du profil d'intervenant",
speakerDuplicated: "Intervenant dupliqué",
speakerDuplicatedDesc: "L'intervenant \"{{name}}\" a été dupliqué avec succès.",
failedToDuplicateSpeaker: "Échec de la duplication du profil d'intervenant",
generationStarted: "Génération démarrée",
generationStartedDesc: "La génération du podcast a été mise en file d'attente.",
failedToStartGeneration: "Échec du démarrage de la génération",
tryAgainMoment: "Veuillez réessayer dans un instant.",
deleteProfileTitle: "Supprimer le profil ?",
deleteProfileDesc: "Ceci supprimera “{{name}}”. Les épisodes existants conservent leurs données, mais les nouveaux ne pourront plus utiliser cette configuration.",
profileCreated: "Profil créé",
profileCreatedDesc: "Le profil d'épisode \"{{name}}\" a été créé avec succès.",
failedToCreateProfile: "Échec de la création du profil",
profileUpdated: "Profil mis à jour",
profileUpdatedDesc: "Le profil d'épisode \"{{name}}\" a été mis à jour avec succès.",
failedToUpdateProfile: "Échec de la mise à jour du profil",
profileDeleted: "Profil supprimé",
profileDeletedDesc: "Le profil d'épisode \"{{name}}\" a été retiré avec succès.",
failedToDeleteProfile: "Échec de la suppression du profil",
failedToDeleteProfileDesc: "Impossible de retirer le profil d'épisode.",
profileDuplicated: "Profil dupliqué",
profileDuplicatedDesc: "Le profil d'épisode \"{{name}}\" a été dupliqué avec succès.",
failedToDuplicateProfile: "Échec de la duplication du profil",
episodeDeleted: "Épisode supprimé",
episodeDeletedDesc: "L'épisode a été supprimé avec succès.",
failedToDeleteEpisode: "Échec de la suppression de l'épisode",
failedToDeleteSpeakerDesc: "Impossible de retirer le profil de l'intervenant.",
outlineModel: "Modèle de plan",
transcriptModel: "Modèle de transcription",
segments: "Segments",
maxTokens: "Jetons de sortie maximum",
maxTokensPlaceholder: "Laisser vide pour les valeurs par défaut",
maxTokensHelp: "Facultatif. Limite le nombre de jetons que chaque étape de génération peut produire — le plan et la transcription complète —, ce n'est pas une limite par tour de parole ni par conversation. Laisser vide pour utiliser les valeurs par défaut intégrées (3000 pour le plan, 5000 pour la transcription). Augmentez-la pour des épisodes plus longs ; une valeur trop basse peut tronquer la transcription.",
defaultBriefingTitle: "Briefing par défaut",
created: "Créé à {{time}}",
details: "Détails",
summaryTab: "Résumé",
outlineTab: "Plan",
transcriptTab: "Transcription",
briefing: "Briefing",
noOutline: "Aucun plan disponible.",
noTranscript: "Aucune transcription disponible.",
deleteEpisodeTitle: "Supprimer l'épisode ?",
deleteEpisodeDesc: "Ceci supprimera définitivement “{{name}}” et son fichier audio.",
audioUnavailable: "Audio indisponible",
segment: "Segment",
speaker: "Intervenant",
profile: "Profil",
link: "Lien",
file: "Fichier",
embedded: "Indexé",
notEmbedded: "Non indexé",
noSpeakerProfilesAvailable: "Aucun profil d'intervenant disponible",
editEpisodeProfile: "Modifier le profil d'épisode",
createEpisodeProfile: "Créer un profil d'épisode",
episodeProfileFormDesc: "Définissez comment les épisodes doivent être générés et quelle configuration d'intervenants ils utilisent par défaut.",
noSpeakerProfilesDesc: "Créez un profil d'intervenant avant de configurer un profil d'épisode.",
profileName: "Nom du profil",
profileNamePlaceholder: "ex: Discussion tech",
descriptionPlaceholder: "Bref résumé de l'usage de ce profil",
speakerConfig: "Configuration des intervenants",
selectSpeakerProfile: "Sélectionnez un profil d'intervenant",
outlineGeneration: "Génération du plan",
transcriptGeneration: "Génération de la transcription",
defaultBriefingPlaceholder: "Décrivez la structure, le ton et les objectifs pour ce format d'épisode",
editSpeakerProfile: "Modifier le profil de l'intervenant",
createSpeakerProfile: "Créer un profil d'intervenant",
speakerProfileFormDesc: "Configurez les paramètres de synthèse vocale et définissez jusqu'à quatre intervenants.",
speakers: "Intervenants",
speakersDesc: "Configurez entre un et quatre intervenants pour ce profil.",
addSpeaker: "Ajouter un intervenant",
speakerNumber: "Intervenant {{number}}",
backstoryPlaceholder: "Courte biographie ou contexte de l'intervenant",
personalityPlaceholder: "Décrivez le style et le ton",
outlineModelRequired: "Le modèle du plan est requis",
transcriptModelRequired: "Le modèle de transcription est requis",
defaultBriefingRequired: "Le briefing par défaut est requis",
segmentsInteger: "Doit être un nombre entier",
segmentsMin: "Au moins 3 segments",
segmentsMax: "20 segments maximum",
maxTokensInteger: "Doit être un nombre entier",
maxTokensPositive: "Doit être un nombre entier positif",
voiceIdRequired: "L'ID de la voix est requis",
backstoryRequired: "L'histoire (backstory) est requise",
personalityRequired: "La personnalité est requise",
speakerCountMin: "Au moins un intervenant est requis",
speakerCountMax: "Vous pouvez configurer jusqu'à 4 intervenants",
delete: "Supprimer",
failedToDelete: "Échec de la suppression du podcast",
retry: "Réessayer",
retrying: "Nouvelle tentative…",
retryStarted: "Nouvelle tentative lancée",
retryStartedDesc: "Un nouveau travail de génération de podcast a été soumis.",
failedToRetry: "Échec de la nouvelle tentative",
errorDetails: "Détails de l'erreur",
language: "Langue",
languagePlaceholder: "Sélectionnez une langue (optionnel)",
podcastLanguage: "Langue du podcast",
selectOutlineModel: "Sélectionnez le modèle de plan",
selectTranscriptModel: "Sélectionnez le modèle de transcription",
voiceModel: "Modèle vocal",
voiceModelRequired: "Le modèle vocal est requis",
selectVoiceModel: "Sélectionnez le modèle vocal",
perSpeakerTtsOverride: "Remplacement TTS par intervenant (optionnel)",
useProfileDefault: "Utiliser le profil par défaut",
setupRequired: "Configuration requise",
setupRequiredDesc: "Certains profils n'ont pas encore de modèles configurés. Modifiez-les pour sélectionner des modèles avant de générer des podcasts.",
notConfigured: "Non configuré",
},
settings: {
contentProcessing: "Traitement du contenu",
contentProcessingDesc: "Configurez la manière dont les documents et les URL sont traités",
docEngine: "Moteur de traitement de documents",
docEnginePlaceholder: "Sélectionnez un moteur de traitement de documents",
urlEngine: "Moteur de traitement d'URL",
urlEnginePlaceholder: "Sélectionnez un moteur de traitement d'URL",
autoRecommended: "Auto (Recommandé)",
simple: "Simple",
docling: "Docling",
helpMeChoose: "Aidez-moi à choisir",
docHelp: "· Docling est un peu plus lent mais plus précis, surtout si les documents contiennent des tableaux et des images. · Simple extraira tout le contenu du document sans le formater. · Auto (recommandé) essaiera de traiter via Docling et se rabattra sur Simple par défaut.",
firecrawl: "Firecrawl",
jina: "Jina",
crawl4ai: "Crawl4AI",
enableDoclingHint: "Docling est facultatif. Activez-le avec OPEN_NOTEBOOK_ENABLE_DOCLING=true — il s'installe au premier démarrage (téléchargement volumineux).",
enableCrawl4aiHint: "Crawl4AI local est facultatif. Activez-le avec OPEN_NOTEBOOK_ENABLE_CRAWL4AI=true (s'installe au premier démarrage), ou définissez CRAWL4AI_API_URL pour utiliser un serveur distant.",
urlHelp: "· Firecrawl est un service payant (avec un niveau gratuit), et très puissant. · Jina est également une bonne option et dispose aussi d'un niveau gratuit. · Crawl4AI affiche les pages JavaScript localement (ou via un serveur Crawl4AI lorsque CRAWL4AI_API_URL est défini), sans clé API. · Simple utilisera une extraction HTTP basique et manquera du contenu sur les sites basés sur Javascript. · Auto (recommandé) essaiera Firecrawl, puis Jina, puis Crawl4AI, et se rabattra enfin sur Simple.",
embeddingAndSearch: "Indexation (Embedding) et Recherche",
embeddingAndSearchDesc: "Configurez les options de recherche et d'indexation",
defaultEmbeddingOption: "Option d'indexation par défaut",
embeddingOptionPlaceholder: "Sélectionnez une option d'indexation",
ask: "Demander",
always: "Toujours",
never: "Jamais",
embeddingHelp: "L'indexation du contenu facilite sa recherche par vous et vos agents IA. Si vous utilisez un modèle d'embedding local (Ollama, par exemple), vous n'avez pas à vous soucier du coût et pouvez tout indexer.",
fileManagement: "Gestion des fichiers",
fileManagementDesc: "Configurez les options de manipulation et de stockage des fichiers",
autoDeleteFiles: "Suppression automatique des fichiers",
ocrEnabled: "Activer l'OCR",
ocrHelp: "Extrait le texte des PDF numérisés et des images avec le moteur Docling. Traitement plus lent.",
formulasEnabled: "Extraire les formules",
formulasHelp: "Extrait les formules mathématiques sous forme de balisage structuré avec le moteur Docling. Augmente le temps de traitement.",
visionEnabled: "Décrire les images et les graphiques",
visionHelp: "Utilise un modèle de vision pour décrire les images et extraire les données des graphiques avec le moteur Docling. Nettement plus lent et peut appeler un modèle de vision.",
autoDeletePlaceholder: "Sélectionnez une option de suppression automatique",
filesHelp: "Une fois vos fichiers téléchargés et traités, ils ne sont plus nécessaires. La plupart des utilisateurs devraient autoriser Open Notebook à supprimer automatiquement les fichiers du dossier de téléchargement.",
loadFailed: "Échec du chargement des paramètres",
},
advanced: {
title: "Outils Avancés",
desc: "Outils et utilitaires avancés pour les utilisateurs expérimentés",
systemInfo: "Infos Système",
rebuildEmbeddings: "Reconstruire les index (Embeddings)",
rebuildEmbeddingsDesc: "Reconstruire l'index de recherche vectorielle pour toutes les sources",
currentVersion: "Version actuelle",
latestVersion: "Dernière version",
status: "État",
updateAvailable: "Version {{version}} disponible",
updateAvailableDesc: "Une nouvelle version de Open Notebook est disponible.",
upToDate: "À jour",
unknown: "Inconnu",
viewOnGithub: "Voir sur GitHub",
updateCheckFailed: "Impossible de vérifier les mises à jour. GitHub est peut-être injoignable.",
rebuild: {
mode: "Mode de reconstruction",
existing: "Existant",
all: "Tout",
existingDesc: "Ré-indexer uniquement les éléments qui ont déjà des embeddings (plus rapide, utile lors d'un changement de modèle)",
allDesc: "Ré-indexer les éléments existants + créer des embeddings pour les éléments qui n'en ont pas (plus lent, complet)",
include: "Inclure dans la reconstruction",
selectOneError: "Veuillez sélectionner au moins un type d'élément à reconstruire",
starting: "Démarrage de la reconstruction...",
startBtn: "🚀 Lancer la reconstruction",
queued: "En attente",
running: "En cours...",
completed: "Terminé !",
failed: "Échoué",
leavePageHint: "Vous pouvez quitter cette page, car l'opération s'exécute en arrière-plan",
startNew: "Lancer une nouvelle reconstruction",
itemsProcessed: "{{processed}}/{{total}} éléments ({{percent}}%)",
failedItems: "{{count}} éléments n'ont pas pu être traités",
time: "Temps",
whenToRebuild: "Quand dois-je reconstruire les embeddings ?",
whenToRebuildAns: "Vous devriez reconstruire lors d'un changement de modèle, d'une mise à jour de version, pour corriger une corruption de données ou après des imports massifs.",
howLong: "Combien de temps dure la reconstruction ?",
howLongAns: "Le temps de traitement dépend du nombre d'éléments, de la vitesse du modèle et des limites de débit de l'API. Les modèles locaux sont généralement très rapides.",
isSafe: "Est-il sûr de reconstruire pendant l'utilisation de l'application ?",
isSafeAns: "Oui, la reconstruction est sûre ! Elle ne supprime pas le contenu, remplace seulement les embeddings et gère les erreurs proprement.",
},
},
transformations: {
title: "Transformations",
desc: "Les transformations sont des prompts utilisés par le LLM pour traiter une source et extraire des aperçus, des résumés, etc.",
workspace: "Choisissez un espace de travail",
playground: "Bac à sable (Playground)",
defaultPrompt: "Prompt de transformation par défaut",
defaultPromptDesc: "Ceci sera ajouté à tous vos prompts de transformation",
defaultPromptPlaceholder: "Entrez vos instructions de transformation par défaut...",
listTitle: "Transformations personnalisées",
createNew: "Créer une nouvelle",
inputLabel: "Texte d'entrée",
inputPlaceholder: "Entrez du texte à transformer...",
outputLabel: "Sortie",
runTest: "Exécuter la transformation",
running: "Exécution...",
selectToStart: "Sélectionnez une transformation pour commencer",
name: "Nom",
namePlaceholder: "Identifiant unique, ex: points_cles",
titlePlaceholder: "Titre affiché, par défaut le nom",
promptPlaceholder: "Écrivez le prompt qui alimentera cette transformation...",
descriptionPlaceholder: "Décrivez ce que fait cette transformation.",
suggestDefault: "Suggérer par défaut sur les nouvelles sources",
promptHint: "Les prompts doivent être rédigés en pensant au contenu de la source. Vous pouvez demander au modèle de résumer, d'extraire des analyses ou de produire des sorties structurées comme des tableaux.",
createSuccess: "Transformation créée avec succès",
updateSuccess: "Transformation mise à jour avec succès",
deleteSuccess: "Transformation supprimée avec succès",
noTransformations: "Aucune transformation pour le moment",
createOne: "Créez une transformation pour commencer",
selectModel: "Sélectionnez un modèle",
deleteConfirm: "Êtes-vous sûr de vouloir supprimer cette transformation ?",
model: "Modèle",
systemPrompt: "Prompt Système",
overrideModelDesc: "Remplacer le modèle par défaut pour cette session de chat. Laissez vide pour utiliser le modèle par défaut du système.",
sessionUseReplacement: "Cette session utilisera {{name}} au lieu du modèle par défaut.",
systemDefault: "Défaut Système",
},
models: {
embedding: "Modèles d'Embedding",
tts: "Synthèse vocale (TTS)",
stt: "Transcription vocale (STT)",
apiKey: "Clé API",
deleteSuccess: "Modèle supprimé avec succès",
saveSuccess: "Modèle enregistré avec succès",
noModels: "Aucun modèle",
discoverModels: "Découvrir les modèles",
noModelsFound: "Aucun modèle trouvé pour ce fournisseur",
modelType: "Type de modèle",
modelTypeHint: "Sélectionnez le type de modèles que vous souhaitez ajouter. Si vous avez besoin de types différents, ajoutez-les par lots séparés.",
deleteModel: "Supprimer le modèle",
defaultAssignments: "Attributions des modèles par défaut",
defaultAssignmentsDesc: "Configurez quels modèles utiliser pour les différents usages d'Open Notebook",
missingRequiredModels: "Modèles requis manquants : {{models}}. Open Notebook pourrait ne pas fonctionner correctement sans eux.",
selectModelPlaceholder: "Sélectionnez un modèle",
noneOption: "Aucun",
noneFallbackToChat: "Utiliser le repli (chat par défaut)",
usingChatModelHint: "Utilisation du modèle de chat ({{model}})",
ttsUnsetHint: "Non défini — génération audio indisponible tant qu'il n'est pas configuré",
sttUnsetHint: "Non défini — transcription indisponible tant qu'elle n'est pas configurée",
requiredModelPlaceholder: "⚠️ Requis - Sélectionnez un modèle",
chatModelLabel: "Modèle de Chat",
chatModelDesc: "Utilisé pour les conversations",
transformationModelLabel: "Modèle de Transformation",
transformationModelDesc: "Utilisé pour les résumés, les aperçus et les transformations",
toolsModelLabel: "Modèle d'Outils",
toolsModelDesc: "Utilisé pour l'appel de fonctions (OpenAI ou Anthropic recommandé)",
largeContextModelLabel: "Modèle à large contexte",
largeContextModelDesc: "Utilisé pour le traitement de documents volumineux (Gemini recommandé)",
embeddingModelLabel: "Modèle d'Embedding",
embeddingModelDesc: "Utilisé pour la recherche sémantique et les index vectoriels",
ttsModelLabel: "Modèle de Synthèse Vocale (TTS)",
ttsModelDesc: "Utilisé pour la génération de podcasts",
sttModelLabel: "Modèle de Transcription Vocale (STT)",
sttModelDesc: "Utilisé pour la transcription audio",
embeddingChangeTitle: "Changement de modèle d'embedding",
embeddingChangeConfirm: "Vous êtes sur le point de changer votre modèle d'embedding de {{from}} à {{to}}.",
rebuildRequired: "Important : Reconstruction requise",
rebuildReason: "Changer votre modèle d'embedding nécessite de reconstruire tous les index existants pour maintenir la cohérence. Sans cela, vos recherches pourraient retourner des résultats incorrects ou incomplets.",
whatHappensNext: "Que se passe-t-il ensuite :",
step1: "Votre modèle d'embedding par défaut sera mis à jour",
step2: "Les embeddings existants resteront inchangés jusqu'à la reconstruction",
step3: "Le nouveau contenu utilisera le nouveau modèle d'embedding",
step4: "Vous devriez reconstruire les index dès que possible",
proceedToRebuildPrompt: "Souhaitez-vous aller sur la page Avancé pour lancer la reconstruction maintenant ?",
changeModelOnly: "Changer le modèle uniquement",
changeAndRebuild: "Changer & Aller à la reconstruction",
autoAssign: "Attribution automatique des défauts",
autoAssigning: "Attribution en cours...",
autoAssignSuccess: "{{count}} modèles par défaut attribués automatiquement",
autoAssignNoModels: "Aucun modèle disponible à attribuer. Veuillez d'abord synchroniser les modèles.",
autoAssignAlreadySet: "Tous les modèles par défaut sont déjà configurés",
testModel: "Tester le modèle",
testModelSuccess: "Test du modèle réussi",
testModelFailed: "Test du modèle échoué",
searchOrAddModel: "Rechercher ou saisir un nom de modèle...",
addCustomModel: "Ajouter \"{{name}}\"",
},
apiKeys: {
title: "Modèles",
description: "Connectez vos fournisseurs d'IA et stockez leurs identifiants en toute sécurité.",
encryptionRequired: "Clé de chiffrement non configurée",
encryptionRequiredDescription: "Définissez la variable d'environnement OPEN_NOTEBOOK_ENCRYPTION_KEY avec une chaîne secrète pour activer le stockage des clés API dans la base de données.",
configured: "Configuré",
notConfigured: "Non configuré",
providersLoadFailed: "Échec du chargement des fournisseurs",
providersLoadFailedDescription: "Vérifiez que l'API est en cours d'exécution et réessayez.",
migrationAvailable: "Variables d'environnement détectées",
migrationDescription: "{{count}} clé(s) API sont configurées via des variables d'environnement et peuvent être migrées vers la base de données pour une gestion plus facile.",
migrateToDatabase: "Migrer vers la base de données",
migrating: "Migration en cours...",
migrationSuccess: "{{count}} clé(s) API migrée(s) avec succès",
migrationErrors: "{{count}} clé(s) n'ont pas pu être migrée(s)",
migrationNothingToMigrate: "Toutes les clés sont déjà dans la base de données",
learnMore: "Apprenez à connecter des fournisseurs d'IA →",
testConnection: "Tester la connexion",
testSuccess: "Connexion réussie",
testFailed: "Échec du test de connexion",
syncModels: "Synchroniser les modèles",
syncSuccess: "{{discovered}} modèles découverts, {{new}} nouveaux ajoutés",
syncNoNew: "{{count}} modèles découverts, tous déjà enregistrés",
syncFailed: "Échec de la synchronisation des modèles",
getApiKey: "Obtenir une clé API",
vertexProject: "ID du projet GCP",
vertexLocation: "Région",
vertexCredentials: "Chemin du JSON du compte de service",
addConfig: "Ajouter une configuration",
editConfig: "Modifier la configuration",
deleteConfig: "Supprimer la configuration",
configName: "Nom de la configuration",
configNameHint: "Un nom descriptif pour cette configuration (ex : « Production », « Développement »)",
baseUrl: "URL de base",
baseUrlOverrideHint: "Ne modifiez ceci que si vous devez remplacer le point d'accès API par défaut du fournisseur.",
openAICompatibleBaseUrlHint: "Incluez le chemin de version de l'API requis par votre serveur. Pour LM Studio dans Docker, utilisez http://host.docker.internal:1234/v1.",
numCtx: "Fenêtre de Contexte (num_ctx)",
numCtxHint: "Fenêtre de contexte maximale pour les modèles Ollama. Laissez vide pour utiliser la valeur par défaut (8192). N'augmentez que si votre matériel peut gérer une fenêtre plus grande.",
deleteConfigConfirm: "Êtes-vous sûr de vouloir supprimer « {{name}} » ? Cette action est irréversible.",
configSaveSuccess: "Configuration enregistrée avec succès",
configUpdateSuccess: "Configuration mise à jour avec succès",
configDeleteSuccess: "Configuration supprimée avec succès",
apiKeyEditHint: "Laissez vide pour conserver la clé API existante",
decryptionError: "Erreur de déchiffrement",
decryptionErrorDescription: "La clé API de cette configuration n'a pas pu être déchiffrée. La clé de chiffrement a peut-être changé. Supprimez cette configuration et recréez-la avec la bonne clé.",
},
setupBanner: {
encryptionRequired: "Clé de chiffrement non configurée",
encryptionRequiredDescription: "Définissez la variable d'environnement OPEN_NOTEBOOK_ENCRYPTION_KEY pour activer le stockage sécurisé des identifiants.",
migrationAvailable: "Migration des clés API disponible",
migrationDescription: "{{count}} fournisseur(s) ont des clés API définies via des variables d'environnement. Migrez-les vers la base de données pour une gestion plus facile.",
goToSettings: "Aller aux paramètres",
viewDocs: "Voir la documentation",
},
} satisfies TranslationShape;