aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js
blob: ea3f60e6ecc92a3bbe5c98f12b7bb8e0eb77095f (plain) (blame)
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
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
/**
 * French — translated from locales/en.js.
 *
 * Register: formal (vouvoiement).
 * `hub`, `node` and `GEK` are left in English: they name the CLI
 * (`meshbay-node`), node.toml and the docs, which are English throughout.
 */

export default {
  // Nav
  'nav.toggle_menu': 'Afficher le menu',
  'nav.light_mode': 'Thème clair',
  'nav.dark_mode': 'Thème sombre',
  'nav.logout': 'Déconnexion',
  'nav.login': 'Connexion',
  'nav.minimize_tray': 'Réduire dans la zone de notification',
  'tray.show': 'Afficher MeshBay',
  'tray.quit': 'Quitter',
  'tray.start_node': 'Démarrer le nœud',
  'tray.stop_node': 'Arrêter le nœud',

  // Sidebar
  'sidebar.my_groups': 'Mes groupes',
  'sidebar.no_groups': 'Aucun groupe pour le moment',
  'sidebar.discover': 'Découvrir',
  'sidebar.public_groups': 'Groupes publics',

  // Login
  'login.title': 'Connexion',
  'login.username': "Nom d'utilisateur",
  'login.password': 'Mot de passe',
  'login.submit': 'Se connecter',
  'login.loading': 'Connexion en cours...',
  'login.no_account': 'Pas encore de compte ?',
  'login.register_link': 'Créer un compte',
  'login.forgot': 'Phrase secrète oubliée ?',
  'reset.title': 'Réinitialiser la phrase secrète',
  'reset.request_intro': 'Saisissez votre nom d’utilisateur et l’e-mail du compte. S’ils correspondent, un code de réinitialisation est envoyé à cette adresse.',
  'reset.send_code': 'Envoyer le code',
  'reset.form_intro': 'Saisissez le code reçu par e-mail et choisissez une nouvelle phrase secrète. Si vous avez votre clé de récupération, ajoutez-la pour rétablir aussi l’accès à vos groupes.',
  'reset.code': 'Code de réinitialisation',
  'reset.recovery_key': 'Clé de récupération (facultatif)',
  'reset.recovery_key_hint': 'Laissez vide si vous ne l’avez pas. Sans elle, votre connexion est rétablie, mais chaque groupe devra être rejoint.',
  'reset.new_pass': 'Nouvelle phrase secrète',
  'reset.new_pass_repeat': 'Répéter la nouvelle phrase secrète',
  'reset.submit': 'Réinitialiser la phrase secrète',
  'reset.working': 'Restauration de vos identités de groupe…',
  'reset.signin_restored': 'Votre connexion a été rétablie.',
  'reset.groups_restored': 'Vos identités de groupe ont été restaurées sur chaque nœud joignable.',
  'reset.no_recovery': 'Vos identités de groupe n’ont pas été restaurées. Pour chaque groupe, demandez à son opérateur de vous désépingler et de vous envoyer un nouveau code d’invitation, puis rejoignez-le.',
  'reset.needs_operator': 'Ces groupes nécessitent encore une action — demandez à chaque opérateur de vous désépingler et de vous envoyer un nouveau code :',
  'reset.go_app': 'Aller à l’application',
  'reset.back_to_login': 'Retour à la connexion',
  'reset.err_unsupported': 'La réinitialisation de la phrase secrète nécessite le module de chiffrement du navigateur, indisponible ici.',

  // Register
  'register.title': 'Créer un compte',
  'register.username': "Nom d'utilisateur",
  'register.email': 'Adresse e-mail',
  'register.password': 'Phrase secrète (12 caractères minimum)',
  'register.confirm': 'Confirmer le mot de passe',
  'register.submit': 'Créer le compte',
  'register.loading': 'Création du compte...',
  'register.has_account': 'Vous avez déjà un compte ?',
  'register.login_link': 'Se connecter',
  'register.recovery_title': 'Enregistrez votre clé de récupération',
  'register.recovery_intro': "Cette clé restaure vos identités de groupe si vous oubliez un jour votre phrase secrète. Conservez-la dans un gestionnaire de mots de passe ou en lieu sûr.",
  'register.recovery_copy': 'Copier',
  'register.recovery_copied': 'Copié',
  'register.recovery_warning': "Si vous perdez à la fois votre phrase secrète et cette clé, vos fichiers restent sur leurs nœuds mais vous rejoignez chaque groupe avec une nouvelle identité.",
  'register.recovery_saved': "J'ai enregistré ma clé de récupération en lieu sûr.",
  'register.recovery_continue': 'Continuer',
  'register.recovery_email_opt': 'M’envoyer aussi cette clé de récupération par e-mail comme sauvegarde',
  'register.recovery_emailed': 'Une copie a également été envoyée à votre adresse e-mail, dans le même message que votre code de vérification.',
  'register.recovery_not_emailed': 'Elle n’a pas été envoyée par e-mail. Enregistrez-la maintenant — c’est la seule fois où elle est affichée.',
  'register.success_title': 'Vérifiez votre e-mail',
  'register.success_msg': 'Un code de vérification a été envoyé à votre adresse e-mail. Saisissez-le ci-dessous pour activer votre compte.',
  'register.go_login': 'Aller à la connexion',
  'register.code_placeholder': 'Code de vérification',
  'register.verify_btn': 'Vérifier',
  'register.verifying': 'Vérification...',
  'register.verified_title': 'E-mail vérifié',
  'register.verified_msg': 'Votre compte est actif. Vous pouvez maintenant vous connecter.',
  'register.resend': 'Renvoyer le code',
  'register.resend_sent': 'Un nouveau code a été envoyé.',
  'login.pending_verification': 'Votre e-mail n\'est pas encore vérifié. Consultez votre boîte de réception pour le code de vérification.',
  'login.verify_link': 'Vérifier l\'e-mail',
  'register.err_mismatch': 'Les mots de passe ne correspondent pas',
  'register.err_min_len': {
    one: 'Utilisez au moins {n} caractère',
    other: 'Utilisez au moins {n} caractères',
  },
  'register.err_too_weak': 'Trop facile à deviner. Votre phrase secrète est ce qui '
    + 'protège vos clés là où elles sont stockées — quelques mots sans rapport entre '
    + 'eux font très bien l’affaire.',
  'register.strength': 'Robustesse : environ {bits} bits. Elle protège la copie de '
    + 'vos clés conservée sur les nodes que vous rejoignez, cela vaut donc la peine '
    + 'de la soigner.',
  'captcha.required': 'Veuillez compléter le captcha.',
  'captcha.failed': 'Vérification du captcha échouée — veuillez réessayer.',

  // Home
  'home.welcome': 'Bienvenue sur MeshBay',
  'home.no_groups': "Vous n'êtes membre d'aucun groupe pour le moment.",
  'home.browse_prefix': 'Parcourez les ',
  'home.browse_link': 'groupes publics',
  'home.browse_suffix': " ou demandez à l'administrateur d'un groupe de vous inviter.",
  'home.invite_only': "Demandez à l'administrateur d'un groupe de vous inviter.",
  'home.my_groups': 'Mes groupes',

  // Explore
  'explore.title': 'Groupes publics',
  'explore.search': 'Rechercher un groupe...',
  'explore.loading': 'Chargement...',
  'explore.empty': 'Aucun groupe public disponible.',
  'explore.create_group': 'Créer un groupe',
  'explore.join': 'Rejoindre',
  'explore.member': 'Membre',
  'explore.disabled': "Ce hub n'a pas de groupes publics.",

  // Group page
  'group.default_name': 'Groupe',
  'group.tab_files': 'Fichiers',
  'group.tab_chat': 'Discussion',
  'group.tab_video': 'Vidéos',
  'group.tab_music': 'Musique',
  'group.tab_photos': 'Photos',
  'group.tab_helloworld': 'HelloWorld',
  'helloworld.greeting': 'Bonjour, monde !',
  'helloworld.no_directory': 'Aucun dossier choisi. Choisissez-en un dans les réglages.',
  'helloworld.counted': '{n} fichier(s)',
  'settings_app.helloworld_directory_label': 'Dossier',
  'settings_app.helloworld_directory_hint': 'Le dossier que cette application de référence liste. Elle existe pour montrer qu\'ajouter une application ne demande rien de plus que ses deux fichiers.',
  'group.tab_members': 'Membres',
  'group.tab_settings': "Paramètres",
  'members.danger_leave_hint': "Vous perdrez l’accès aux fichiers et à la discussion de ce groupe.",
  'members.uploads_title': "Envois de fichiers",
  'members.uploads_on': "Les membres peuvent ajouter des fichiers",
  'members.uploads_off': "Vous seul pouvez ajouter des fichiers",
  'members.uploads_disable': "Désactiver",
  'members.uploads_enable': "Activer",
  'members.uploads_hint': "S’applique à tout le monde sauf vous. C’est le nœud qui refuse l’envoi : il ne s’agit pas de masquer un bouton.",
  'members.apps_title': "Applications",
  'members.apps_hint': "Les parties de ce groupe visibles par les membres. Au moins une doit rester activée.",
  'members.apps_need_one': "Au moins une application doit rester activée.",
  'members.danger_delete_hint': "Le groupe disparaît pour tous ses membres. C’est irréversible.",
  'group.filter': 'Filtrer les fichiers...',
  'group.refresh_index': 'Actualiser la liste',
  'group.col_name': 'Nom',
  'group.col_size': 'Taille',
  'group.col_type': 'Type',
  'group.col_date': 'Date',
  'group.empty_filter': 'Aucun fichier ne correspond au filtre',
  'group.empty_dir': 'Ce dossier est vide',
  'group.download': 'Télécharger',
  'group.play': 'Lire',
  'group.offline_title': "Aucun node n'est actuellement en ligne pour ce groupe.",
  'group.offline_hint': 'Les fichiers apparaîtront dès qu’un node hébergeant ce '
    + 'groupe se connectera.',
  'group.upload': 'Envoyer',
  'group.mkdir': 'Nouveau dossier',
  'group.mkdir_prompt': 'Nom du nouveau dossier',
  'group.mkdir_offline': 'Non connecté au nœud.',
  'group.download_offline': 'Pas de connexion au node — le téléchargement ne peut pas démarrer. La reconnexion est automatique, réessayez dans un instant.',
  'group.download_write_stalled': 'L\'écriture du fichier sur le disque s\'est arrêtée ({seconds} s sans progression). Le téléchargement a été interrompu plutôt que laissé en suspens ; réessayez.',
  'device.add_title': 'Ce navigateur n’est pas encore lié à ce nœud',
  'device.add_hint': 'Votre compte est connu ici, mais ce navigateur détient une autre clé. Approuvez-le depuis un appareil déjà lié — sans passer par l’opérateur.',
  'device.add_btn': 'Obtenir un code de liaison',
  'device.add_show': 'Saisissez ce code sur un appareil déjà lié à ce nœud, dans l’heure :',
  'device.mine_title': 'Vos appareils sur ce nœud',
  'device.mine_hint': 'Chaque navigateur ou client que vous utilisez ici détient sa propre clé. Ils sont distincts de vos appareils sur les autres nœuds.',
  'device.mine_empty': 'Aucun appareil lié ici pour le moment.',
  'device.this_one': 'celui-ci',
  'device.revoke': 'Retirer',
  'device.revoke_confirm': 'Retirer cet appareil ? Il perdra l’accès à ce nœud jusqu’à une nouvelle liaison.',
  'device.approve_hint': 'Vous liez un nouvel appareil ? Saisissez le code qu’il affiche.',
  'device.approve_btn': 'Approuver',
  'device.approved': 'Appareil lié.',
  'group.root_unavailable': '(indisponible — le disque est déconnecté)',
  'group.root_ejected': '(éjecté)',
  'group.root_writable': 'Lecture/Écriture',
  'group.root_eject': 'Éjecter',
  'group.root_plug': 'Reconnecter',
  'group.view': 'Afficher',
  'group.delete': 'Supprimer',
  'group.delete_confirm': 'Supprimer {name} ?',
  'group.delete_group': 'Supprimer le groupe',
  'group.delete_group_confirm': 'Supprimer définitivement « {name} » et en retirer '
    + 'tous les membres ? Les fichiers présents sur le node sont conservés.',
  'group.err_transport': 'Module de transport non chargé',

  // Status
  'status.idle': 'Inactif',
  'status.discovering': 'Recherche de nodes...',
  'status.connecting': 'Connexion…',
  'status.connecting_short': 'Connexion…',
  'status.fetching': "Récupération de l'index...",
  'status.files': {
    one: '{n} fichier',
    other: '{n} fichiers',
  },
  'status.offline': 'Aucun node en ligne',
  'status.error': 'Échec de la connexion',

  // Chat
  'chat.empty': 'Aucun message pour le moment. Lancez la conversation !',
  'chat.placeholder': 'Écrivez un message...',
  'chat.send': 'Envoyer',
  'chat.attach': 'Joindre un fichier',
  'chat.attach_read_only': 'Aucun répertoire partagé en écriture — pièces jointes désactivées',

  // Video player
  'video.loading': 'Chargement de {name}...',
  'video.buffering': 'Mise en mémoire tampon...',
  'video.resumed_at': "Reprise à {time}",
  'video.from_start': "Reprendre depuis le début",
  'video.close': 'Fermer (Échap)',
  'preview.pdf_fallback': 'Ce navigateur n’affichera pas le PDF directement. '
    + 'Téléchargez-le plutôt — il a été déchiffré ici dans les deux cas.',
  'preview.too_large': 'Ce fichier fait {size}, plus que cette page ne peut garder en mémoire ({limit}). Téléchargez-le plutôt — un téléchargement est écrit directement sur le disque.',
  'download.too_large_for_memory': '« {name} » fait {size}. Ce navigateur ne peut enregistrer un fichier de cette taille qu\'en l\'écrivant au fil de l\'eau sur le disque, ce qu\'il ne peut pas faire ici — il devrait garder le fichier entier en mémoire. Rechargez la page et réessayez ; si cela ne suffit pas, utilisez l\'application de bureau.',
  'group.upload_indexing': 'indexation…',
  'video.err_transport': 'Transport non connecté',
  'video.err_mse': 'Codec non pris en charge pour la diffusion : {codec}',
  'video.mode_poster': 'Affiches',
  'video.mode_flat': 'Liste à plat',
  'video.filter_all': 'Tous',
  'video.filter_movies': 'Films',
  'video.filter_series': 'Séries',
  'video.empty': 'Aucune vidéo trouvée.',
  'video.no_root_configured': "Aucun dossier racine des Vidéos n'est encore défini pour ce groupe — un opérateur peut en choisir un dans les Paramètres.",
  'music.no_root_configured': 'Aucun dossier racine de Musique n\'est encore défini pour ce groupe — un opérateur peut en choisir un dans les Paramètres.',
  'video.director': 'Réalisateur',
  'video.specials': 'Bonus',
  'video.season_n': 'Saison {n}',
  'video.episode_n': 'Épisode {n}',
  'video.n_episodes': {
    one: '{n} épisode',
    other: '{n} épisodes',
  },
  'video.fix_match': 'Corriger la correspondance…',
  'video.search_title': 'Corriger la correspondance TMDB',
  'video.search_placeholder': 'Rechercher sur TMDB…',
  'video.search_button': 'Rechercher',
  'video.search_no_results': 'Aucune correspondance trouvée.',
  'video.search_apply_hint': 'S’applique à tous les fichiers actuellement regroupés sous ce titre.',
  'video.search_apply_hint_movie': 'Ne s’applique qu’à ce fichier.',
  'video.source_file': 'Fichier : {name}',
  'video.no_match': 'Aucune correspondance TMDB fiable — nom de fichier affiché.',
  'video.rematch_one': 'Relancer la recherche',
  'video.read_more': 'Lire la suite',
  'video.read_less': 'Réduire',

  // Musique
  'music.mode_grid': 'Albums',
  'music.mode_flat': 'Liste à plat',
  'music.empty': 'Aucune musique trouvée.',
  'music.unknown_album': 'Album inconnu',
  'music.various': 'Divers',
  'music.play_all': 'Tout lire',
  'music.n_tracks': {
    one: '{n} piste',
    other: '{n} pistes',
  },
  'music.err_transport': 'Transport non connecté',
  'music.err_playback': 'Erreur de lecture',
  'music.err_transcode': 'Échec de la conversion du format',
  'music.player_play': 'Lecture',
  'music.player_pause': 'Pause',
  'music.player_prev': 'Précédent',
  'music.player_next': 'Suivant',
  'music.player_shuffle': 'Lecture aléatoire',
  'music.player_repeat_off': 'Répétition désactivée',
  'music.player_repeat_all': 'Tout répéter',
  'music.player_repeat_one': 'Répéter le morceau',
  'music.player_volume': 'Volume',
  'music.player_close': 'Fermer le lecteur',
  'music.player_queue': 'File en cours',
  'music.queue_title': 'En cours de lecture',

  // Photos
  'photo.empty': 'Aucune photo trouvée.',
  'photo.no_roots_configured': "Aucun dossier racine des Photos n'est encore défini pour ce groupe — un opérateur peut en choisir dans les Paramètres.",
  'photo.root_album': '(niveau racine)',
  'photo.n_photos': {
    one: '{n} photo',
    other: '{n} photos',
  },
  'photo.back': 'Retour',
  'photo.prev': 'Précédent (←)',
  'photo.next': 'Suivant (→)',
  'photo.zip_album': "Télécharger l'album en zip",
  'photo.zoom_in': 'Zoomer',
  'photo.zoom_out': 'Dézoomer',
  'photo.zoom_fit_title': 'Ajuster à la fenêtre',
  'photo.zoom_fit_label': 'Ajusté',
  'photo.zoom_100': 'Taille réelle (100 %)',

  // LAN cast
  'cast.start': 'Diffuser sur un appareil',
  'cast.stop': 'Arrêter la diffusion',
  'cast.copy_url': "Copier l'URL du flux",
  'cast.copied': 'URL copiée',
  'cast.scanning': "Recherche d'appareils…",
  'cast.no_devices': 'Aucun appareil trouvé',

  // Settings
  'settings.title': 'Paramètres',
  'settings.coming_soon': 'Bientôt disponible.',
  'settings.downloads': 'Téléchargements',
  'settings.dl_auto': 'Enregistrer automatiquement',
  'settings.dl_auto_hint': 'Les fichiers vont directement dans le dossier choisi '
    + 'ci-dessous, sans boîte de dialogue. Télécharger vingt fichiers en dépose vingt.',
  'settings.dl_ask': 'Demander à chaque fois',
  'settings.dl_ask_hint': 'Une boîte de dialogue « Enregistrer sous » par fichier — '
    + 'un par fichier, y compris lorsque vous téléchargez une sélection.',
  'settings.dl_folder': 'Dossier : {name}',
  'settings.dl_no_folder': 'Aucun dossier choisi — les téléchargements vont là où '
    + 'votre navigateur les place, et ne peuvent pas être suspendus',
  'settings.dl_choose': 'Choisir un dossier',
  'settings.dl_change': 'Changer',
  'settings.dl_forget': 'Oublier',

  'settings.profile': 'Profil',
  'settings.username': "Nom d'utilisateur",
  'settings.email': 'E-mail',
  'settings.email_save': 'Enregistrer',
  'settings.email_saved': 'E-mail mis à jour',
  'settings.email_code_sent': 'Un code de vérification a été envoyé à votre nouvelle adresse e-mail.',
  'settings.email_code_placeholder': 'Code de vérification',
  'settings.email_verify_btn': 'Vérifier',
  'settings.email_verifying': 'Vérification...',
  'settings.email_verified': 'Adresse e-mail modifiée avec succès.',
  'settings.notif_global_disable': 'Désactiver toutes les notifications',
  'settings.notif_global_hint': 'Quand activé, aucune notification n\x27est créée pour aucun groupe.',
  'settings.defaults': 'Valeurs par défaut',
  'settings.default_tab': 'Onglet par défaut',
  'settings.default_tab_hint': 'L\'onglet qui s\'ouvre en premier quand vous entrez dans un groupe.',
  'settings.music_keep_screen_on': 'Garder l\'écran allumé pendant l\'écoute',
  'settings.music_keep_screen_on_hint': 'Empêche le téléphone de se verrouiller automatiquement pendant qu\'un morceau joue.',
  'settings.node_pins': 'Identités des nodes',
  'settings.node_pins_hint': "La clé d'identité de chaque node est mémorisée lors de "
    + 'la première connexion. Si elle change, la connexion est refusée — ce qui n’est '
    + 'normal que lorsqu’un opérateur réinstalle un node. Vérifiez auprès de lui '
    + 'avant d’effacer.',
  'settings.node_pins_count': {
    one: '{n} épinglée',
    other: '{n} épinglées',
  },
  'settings.node_pins_clear': 'Effacer les identités épinglées',
  'settings.passphrase': 'Phrase secrète',
  'settings.passphrase_hint': "Change la phrase secrète de ce compte. Vos clés d'identité sont re-chiffrées sur chaque groupe dont le nœud est en ligne ; un groupe dont le nœud est hors ligne devra être rejoint ensuite.",
  'settings.passphrase_change': 'Changer la phrase secrète',
  'settings.passphrase_current': 'Phrase secrète actuelle',
  'settings.passphrase_new': 'Nouvelle phrase secrète',
  'settings.passphrase_new_repeat': 'Répéter la nouvelle phrase secrète',
  'settings.continue': 'Continuer',
  'settings.done': 'Terminé',
  'settings.passphrase_confirm_intro': "Vos clés d'identité vont être re-chiffrées maintenant sur chaque groupe dont le nœud est joignable :",
  'settings.passphrase_reachable': 'Mis à jour maintenant',
  'settings.passphrase_unreachable': 'Injoignable',
  'settings.passphrase_fallback_note': "Pour un groupe injoignable, demandez à son opérateur de vous désépingler et de vous envoyer un nouveau code d'invitation, puis rejoignez-le. Vos fichiers et messages ne sont pas perdus.",
  'settings.passphrase_confirm_btn': 'Changer',
  'settings.passphrase_working': 'Re-chiffrement de vos clés…',
  'settings.passphrase_done': 'Phrase secrète changée.',
  'settings.passphrase_needs_operator': 'Ces groupes nécessitent encore une action — demandez à chaque opérateur de vous désépingler et de vous envoyer un nouveau code :',
  'settings.pw_too_short': 'La nouvelle phrase secrète doit comporter au moins 12 caractères.',
  'settings.pw_mismatch': 'Les deux nouvelles phrases secrètes ne correspondent pas.',
  'settings.pw_same': "La nouvelle phrase secrète doit être différente de l'actuelle.",
  'settings.pw_wrong_current': "La phrase secrète actuelle est incorrecte. Rien n'a été changé.",
  'settings.recovery': 'Clé de récupération',
  'settings.recovery_hint': "Ajoute à chaque groupe une copie de votre identité chiffrée avec votre clé de récupération. À faire une fois dans chaque navigateur que vous utilisez ; sans cela, une phrase secrète perdue oblige à rejoindre chaque groupe à la main.",
  'settings.recovery_loaded': 'Chargée dans ce navigateur — les nouveaux groupes sont couverts automatiquement.',
  'settings.recovery_open': 'Saisir la clé de récupération',
  'settings.recovery_input_ph': 'Collez votre clé de récupération',
  'settings.recovery_submit': 'Ajouter les copies de secours',
  'settings.recovery_working': 'Mise à jour de vos groupes…',
  'settings.recovery_done': 'Vos groupes ont maintenant une copie de récupération.',
  'settings.recovery_partial': 'Ces groupes n’ont pas pu être joints. Ouvrez-les plus tard, ou relancez l’opération :',
  'settings.recovery_need_relogin': 'Veuillez vous déconnecter puis vous reconnecter, et réessayer.',
  'settings.danger': 'Supprimer le compte',
  'settings.delete_hint': 'Supprime votre compte, vos adhésions aux groupes et vos '
    + 'notifications du hub, et libère votre nom d’utilisateur. Cela n’atteint pas '
    + 'ce qui se trouve sur les nodes : les fichiers que vous avez envoyés restent là '
    + 'où leur opérateur les conserve, et chaque node garde l’identité qu’il a '
    + 'épinglée pour vous jusqu’à ce que son opérateur la retire. Les journaux de '
    + 'connexion sont conservés un an, comme la loi l’exige.',
  'settings.delete_account': 'Supprimer mon compte',
  'settings.delete_confirm': 'Saisissez votre phrase secrète pour confirmer. '
    + 'Cette action est irréversible.',
  'settings.delete_confirm_btn': 'Supprimer définitivement',
  'settings.cancel': 'Annuler',
  'settings.appearance': 'Apparence',
  'settings.theme': 'Thème',
  'settings.theme_light': 'Clair',
  'settings.theme_dark': 'Sombre',
  'settings.theme_system': 'Système',
  'settings.language': 'Langue',
  'settings.about': 'À propos',
  'firstrun.title': 'Quel hub ?',
  'firstrun.hint': 'Un hub détient votre compte et vous met en relation avec les nœuds. Il ne voit ni vos fichiers, ni vos messages, ni vos clés.',
  'firstrun.btn': 'Continuer',
  'firstrun.checking': 'Vérification…',
  'firstrun.note': 'Il n’y a volontairement pas de valeur par défaut : cette application ne fait confiance à un hub que pour son API, jamais pour l’interface, qui est livrée avec l’application.',
  'device.this_device': 'Cet appareil',
  'settings.keys_heading': 'Clés sur cet appareil',
  'settings.hub_heading': 'Hub',
  'settings.hub_current': 'Actuellement',
  'settings.hub_hint': 'Changer cette adresse vous déconnecte et redémarre la fenêtre.',
  'settings.hub_change': 'Changer',
  'settings.keys_where': 'Protégées par',
  'settings.keys_unprotected': 'Aucun trousseau système ne fonctionne : vos clés sont chiffrées avec une clé qui n’est pas secrète. Quiconque peut lire les fichiers de cette machine peut les lire. Démarrez un trousseau, ou considérez cet appareil comme non fiable.',
  'settings.keys_unavailable': 'Ce système n’offre aucun stockage de clés, donc cet appareil ne peut pas être mémorisé — votre phrase secrète vous sera redemandée à chaque fois. C’est le comportement sûr : rien n’a été stocké sans protection.',
  'settings.version': 'Version',
  'settings.protocol': 'Protocole',
  'settings.role': 'Rôle',
  'settings.groups': 'Notifications de groupe',
  'settings.notifications': 'Notifications',
  'settings.node_key': 'Associer un node',
  'settings.node_key_desc': 'Si vous exploitez un node MeshBay, collez ici sa clé '
    + 'publique Ed25519 pour l’associer à votre compte. Vous trouverez cette clé '
    + 'dans le tableau de bord d’administration de votre node.',
  'settings.node_key_placeholder': 'Collez la clé publique Ed25519 du node (base64)',
  'settings.node_key_submit': 'Associer le node',
  'settings.node_key_success': 'Node associé avec succès',
  'settings.node_key_current': 'Clé du node associé',

  // Sidebar
  'sidebar.create_group': 'Créer un groupe',
  'sidebar.settings': 'Paramètres',
  'sidebar.admin': 'Administration',

  // User menu
  'usermenu.language': 'Langue',
  'usermenu.settings': 'Paramètres',
  'usermenu.theme_light': 'Thème clair',
  'usermenu.theme_dark': 'Thème sombre',
  'usermenu.logout': 'Déconnexion',

  // Admin panel
  'admin.title': 'Administration',
  'admin.tab_stats': 'Statistiques',
  'admin.tab_users': 'Utilisateurs',
  'admin.tab_groups': 'Groupes',
  'admin.tab_nodes': 'Nodes',
  'admin.tab_logs': 'Journaux',
  'admin.col_observed_ip': 'Vu depuis',
  'admin.col_hint': 'Adresse annoncée',
  'admin.col_last_seen': 'Dernière annonce',
  'admin.node_online': 'en ligne',
  'admin.node_offline': 'hors ligne',
  'admin.no_nodes': 'Aucun node enregistré',
  'admin.nodes_hint': '« Vu depuis » est l’adresse d’où l’annonce nous est '
    + 'parvenue, sur une requête signée avec la clé du node — c’est celle sur '
    + 'laquelle s’appuyer pour répondre à une réquisition. L’adresse annoncée est '
    + 'celle que le node croit être la sienne, apprise d’un serveur STUN puis '
    + 'transmise ; elle sert à joindre le node et ne prouve rien.',
  'admin.tab_blocklist': 'Liste de blocage',
  'admin.tab_general': "Général",
  'admin.general_groups_heading': "Groupes",
  'admin.allow_public_groups_label': "Autoriser les membres à créer des groupes publics",
  'admin.allow_public_groups_hint': "Désactivé, les nouveaux groupes ne peuvent être que privés et sur invitation. Les groupes publics existants ne sont pas affectés — suspendez-les un par un depuis l'onglet Groupes.",
  'admin.settings_readonly': "Seul un administrateur peut modifier ces paramètres.",

  // Admin stats
  'admin.stat_users': 'Utilisateurs',
  'admin.stat_groups': 'Groupes',
  'admin.stat_nodes': 'Nodes',
  'admin.stat_online': 'Nodes en ligne',

  // Admin users
  'admin.users_search': 'Rechercher un utilisateur...',
  'admin.col_username': "Nom d'utilisateur",
  'admin.col_role': 'Rôle',
  'admin.col_status': 'Statut',
  'admin.col_created': 'Création',
  'admin.col_actions': 'Actions',
  'admin.col_email': 'E-mail',
  'admin.col_groups': 'Groupes',
  'admin.no_users': 'Aucun utilisateur trouvé',
  'admin.btn_suspend': 'Suspendre',
  'admin.btn_unsuspend': 'Réactiver',
  'admin.btn_revoke': "Révoquer",
  'admin.revoke_group_confirm': "Révoquer le groupe « {group} » ? Une révocation signée est envoyée à chaque node qui l'héberge, et c'est irréversible depuis cette page. Suspends-le plutôt si tu veux seulement le mettre en pause.",
  'admin.btn_details': 'Détails',
  'admin.btn_delete': 'Supprimer',
  'admin.delete_confirm': 'Supprimer le compte « {user} » ? Cette action est '
    + 'irréversible. Les fichiers qu’il a envoyés restent sur les nodes qui les '
    + 'hébergent, et chaque node conserve l’identité qu’il a épinglée jusqu’à ce '
    + 'que son opérateur la retire. La suspension est l’option réversible.',
  'admin.user_detail': "Détails de l'utilisateur",
  'admin.btn_close': 'Fermer',
  'admin.self_note': '(vous)',

  // Admin groups
  'admin.col_name': 'Nom',
  'admin.col_visibility': 'Visibilité',
  'admin.col_members': 'Membres',
  'admin.no_groups': 'Aucun groupe trouvé',

  // Admin logs
  'admin.col_time': 'Horodatage',
  'admin.col_event': 'Événement',
  'admin.col_user': 'Utilisateur',
  'admin.col_ip': 'IP',
  'admin.col_detail': 'Détail',
  'admin.filter_all': 'Tous les événements',
  'admin.no_logs': 'Aucun journal trouvé',
  'admin.btn_load_more': 'Charger plus',

  // Admin blocklist
  'admin.col_hash': 'Empreinte',
  'admin.col_reason': 'Motif',
  'admin.col_date': 'Date',
  'admin.col_added_by': 'Ajoutée par',
  'admin.no_blocked': 'Aucune empreinte bloquée',
  'admin.add_hash': 'Ajouter une empreinte à la liste de blocage',
  'admin.hash_placeholder': 'empreinte blake3 (64 caractères hexadécimaux)',
  'admin.reason_placeholder': 'Motif',
  'admin.btn_block': 'Bloquer',
  'admin.btn_unblock': 'Débloquer',

  // Notifications
  // Create group
  'create_group.title': 'Créer un groupe',
  'create_group.name': 'Nom du groupe',
  'create_group.name_placeholder': 'ex. Photos de famille, Documents du projet...',
  'create_group.join_policy': "Politique d'adhésion",
  'create_group.invite': 'Sur invitation',
  'create_group.invite_desc': "Les membres doivent être invités par un administrateur. Le groupe n’est pas listé publiquement.",
  'create_group.open': 'Ouvert (tout le monde peut rejoindre)',
  'create_group.open_desc': "Listé dans les groupes publics — n’importe qui peut le trouver et le rejoindre sans approbation.",
  'create_group.description': 'Description',
  'create_group.description_hint': 'De quoi parle ce groupe ? (facultatif)',
  'create_group.submit': 'Créer',
  'create_group.hint': 'Un groupe a besoin d’un node pour héberger les fichiers. '
    + 'Vous pouvez créer le groupe maintenant et connecter un node plus tard.',
  'create_group.creating': 'Création...',

  // Members
  'members.col_role': 'Rôle',
  'members.group_role': 'Rôle dans le groupe',
  'members.admin': 'Administrateur',
  'members.group_admin': 'Administrateur du groupe',
  'members.owner': 'Propriétaire',
  'members.member': 'Membre',
  'members.invite_title': 'Inviter un membre',
  'members.username_placeholder': "Nom d'utilisateur",
  'members.invite_btn': 'Inviter',
  'members.invite_needs_pairing': 'Les invitations sont signées avec la clé que ce '
    + 'node a épinglée pour votre navigateur : appairez-le ci-dessous avant '
    + 'd’inviter qui que ce soit.',
  'members.invite_ask_operator': 'Seul l’opérateur du node qui héberge ce groupe '
    + 'peut inviter, depuis un navigateur appairé avec lui.',
  'members.remove': 'Retirer',
  'members.remove_confirm': 'Retirer {user} de ce groupe ? Son compte, ses autres '
    + 'groupes et les fichiers qu’il a envoyés ne sont pas affectés.',
  'members.remove_hint': 'Retirer quelqu’un lui ôte son adhésion et empêche le node '
    + 'de lui remettre la clé du groupe. Cela ne supprime pas son compte, et cela ne '
    + 'reprend pas la clé qu’il détient déjà — faites-la tourner sur le node '
    + '(meshbay-node gek-init) si cela compte.',
  'members.pair_title': 'Appairer ce navigateur avec votre node',
  'members.pair_hint': 'Votre node n’accepte les actions d’opérateur — invitations, '
    + 'suppression de fichiers — que depuis un navigateur avec lequel il a été '
    + 'appairé. Lancez `meshbay-node operator pair` sur le node et saisissez le code '
    + 'ici. Le code ne transite jamais par le hub.',
  'members.pair_btn': 'Appairer',
  'members.pair_success': 'Ce navigateur est désormais appairé avec le node.',
  'members.invite_code_ready': "Code d’invitation pour {user} :",
  'members.invite_email_sent': "Un e-mail avec le code a été envoyé à ce membre.",
  'members.invite_email_failed': "Impossible d’envoyer l’e-mail — partagez le code manuellement.",
  'members.invite_code_hint': "Vous pouvez aussi transmettre ce code par un autre canal (ex. SMS). "
    + "La personne le saisit la première fois qu’elle ouvre ce groupe.",
  'transfers.title': 'Transferts',
  'transfers.clear': 'Effacer les terminés',
  'transfers.cancel': 'Annuler',
  'transfers.open': 'Ouvrir',
  'transfers.done': 'Terminé',
  'transfers.cancelled': 'Annulé',
  'transfers.preparing': 'Préparation…',
  'transfers.waiting_own_slots': 'En attente — vos slots sont occupés',
  'transfers.waiting_node': 'En attente — {n} devant',
  'transfers.summary': '{running} en cours · {waiting} en attente',
  'transfers.group_running': 'En cours',
  'transfers.group_waiting': 'En attente',
  'transfers.group_paused': 'En pause',
  'transfers.group_finished': 'Terminés',
  'transfers.cancel_one': 'Annuler {name}',
  'transfers.pause': 'Suspendre',
  'transfers.resume': 'Reprendre',
  'transfers.paused': 'En pause',
  'transfers.not_pausable': 'Non suspendable — choisissez un dossier de téléchargement dans les Réglages pour l\'activer',
  'transfers.pause_one': 'Suspendre {name}',
  'transfers.resume_one': 'Reprendre {name}',
  'transfers.eta_seconds': '{n} s restantes',
  'transfers.eta_minutes': '{n} min restantes',
  'transfers.eta_hours': '{n} h restantes',
  'transfers.failed': 'Échec',
  'group.select': 'Sélectionner',
  'group.select_done': 'Terminé',
  'group.actions': 'Actions ({n})',
  'group.download_n': 'Télécharger ({n})',
  'group.download_zip_n': 'Télécharger les dossiers en zip ({n})',
  'group.delete_n': 'Supprimer ({n})',
  'group.delete_n_confirm': {
    one: 'Supprimer {n} élément ? {names}',
    other: 'Supprimer {n} éléments ? {names}',
  },
  'group.download_zip': {
    one: 'Télécharger en zip ({n} fichier)',
    other: 'Télécharger en zip ({n} fichiers)',
  },
  'group.zip_empty': 'Ce dossier ne contient rien à télécharger.',
  'group.zip_no_stream': 'Ce navigateur ne sait pas écrire un téléchargement '
    + 'directement sur le disque : {name} ({size}) doit donc être assemblé en mémoire '
    + 'au préalable. Sur une archive volumineuse, cela peut échouer. Continuer ?',
  'group.zip_too_large': '« {name} » fait {size}, or un dossier ne peut être téléchargé en zip '
    + 'que jusqu’à {limit}. Prenez un sous-dossier à la fois, ou les fichiers un par un.',
  'group.rmdir': 'Supprimer le dossier',
  'group.rmdir_confirm': 'Supprimer le dossier « {name} » ? Il doit être vide.',
  'group.rmdir_not_empty': 'Ce dossier n’est pas vide. Supprimez d’abord ce qu’il '
    + 'contient — rien ici ne supprime des fichiers que vous ne voyez pas.',
  'group.desc_edit': 'Modifier la description',
  'group.desc_add': 'Ajouter une description',
  'group.desc_save': 'Enregistrer',
  'group.desc_cancel': 'Annuler',
  'group.desc_placeholder': 'À quoi sert ce groupe — les membres le voient sur leur '
    + 'page d’accueil.',
  'group.join_code_title': 'Ce node doit vous reconnaître',
  'group.join_code_hint': 'Demandez son code à usage unique à la personne qui vous a '
    + 'invité, et saisissez-le ici. Ensuite, ce navigateur est reconnu et la question '
    + 'ne vous sera plus posée.',
  'group.join_code_btn': 'Rejoindre',
  'group.pass_title': 'Saisissez votre phrase secrète',
  'group.pass_hint': 'Ce navigateur n’a pas encore déverrouillé vos clés. Saisissez votre phrase secrète une fois pour ouvrir vos groupes ici.',
  'group.pass_btn': 'Déverrouiller',

  'notif.purge': 'Tout effacer',
  'notif.title': 'Notifications',
  'notif.empty': 'Aucune notification',
  'notif.mark_all_read': 'Tout marquer comme lu',

  // Sidebar
  'sidebar.search': 'Rechercher des fichiers',

  // Status

  // Search
  'search.placeholder': 'Rechercher dans tous les groupes...',
  'search.no_results': 'Aucun fichier ne correspond à votre recherche.',
  'search.col_group': 'Groupe',
  'search.result_count': {
    one: '{n} fichier trouvé',
    other: '{n} fichiers trouvés',
  },
  'search.hint': 'Saisissez un terme pour rechercher dans tous vos groupes.',
  'search.indexing': 'Indexation de {done} / {total} groupes…',
  'search.unreachable': { one: '{n} groupe injoignable', other: '{n} groupes injoignables' },
  'search.n_sources': { one: '{n} source', other: '{n} sources' },
  'search.view_files': 'Fichiers',
  'search.view_videos': 'Vidéos',
  'search.view_music': 'Musique',
  'search.view_photos': 'Photos',
  'search.connecting': 'Connexion aux groupes…',

  // Presence, chat paging, leaving a group, the profile page
  'presence.online': 'Un node servant ce groupe est en ligne',
  'presence.offline': 'Aucun node joignable pour ce groupe',
  'presence.unknown': 'Pas encore vérifié',
  'presence.indexing': 'Indexation en cours — {pct} %',
  'chat.load_older': 'Charger {n} messages plus anciens',
  'chat.start_of_history': 'Début de la conversation',
  'chat.today': 'Aujourd’hui',
  'chat.yesterday': 'Hier',
  'chat.unread': 'Nouveaux messages',
  'chat.jump_latest': 'Aller au plus récent',
  'chat.jump_new': 'Nouveaux messages',
  'chat.unreadable': 'Ce message n\'a pas pu être lu',
  'chat.unreadable_signature': 'Message non vérifié — la signature ne correspond pas à l\'expéditeur',
  'chat.unreadable_epoch': 'Écrit avant que cet appareil puisse lire cette conversation',
  'chat.unreadable_keys': 'Clés de discussion indisponibles — reconnectez-vous pour lire ceci',
  'chat.unreadable_decrypt': 'Ce message n\'a pas pu être déchiffré',
  'chat.unreadable_envelope': 'Ce message est arrivé incomplet',
  'chat.unreadable_format': 'Ce message nécessite une version plus récente de MeshBay',
  'chat.key_changed': 'Ce compte utilise une clé que vous n\'avez jamais vue',
  'chat.key_changed_hint': 'Le nœud affirme que ce message vient de ce compte, mais sa clé d\'appareil n\'est pas une de celles que vous avez acceptées et rien ne l\'a signée. Ce peut être un nouvel appareil ajouté ailleurs — ou le nœud qui nomme la mauvaise personne.',
  'chat.encrypted_needs_newer': 'Cette conversation est chiffrée et ce client ne peut pas la lire — mettez MeshBay à jour',
  'chat.encrypted_cannot_send': 'Cette conversation est chiffrée et cet appareil ne peut pas encore y écrire',
  'group.leave': 'Quitter le groupe',
  'group.leave_confirm': 'Quitter « {name} » ? Vous perdrez l’accès à ses fichiers et à sa discussion. Les fichiers que vous avez envoyés restent sur le node, et celui-ci conserve l’identité qu’il a épinglée pour vous jusqu’à ce que son opérateur la retire.',
  'group.mute': 'Couper les notifications',
  'group.unmute': 'Réactiver les notifications',
  'profile.title': 'Profil',
  'usermenu.profile': 'Profil',

  // First-run setup wizard
  'setup.welcome_title': 'Bienvenue sur MeshBay',
  'setup.welcome_message': 'Votre node héberge vos fichiers — chiffrés, sur votre machine. Démarrons-le et créons votre premier groupe.',
  'setup.node_detected': 'Node local détecté et en fonctionnement.',
  'setup.node_not_running': 'Votre node est installé mais ne tourne pas.',
  'setup.node_start': 'Démarrer le node',
  'setup.node_starting': 'Démarrage du node…',
  'setup.node_started': 'Node démarré.',
  'setup.node_not_installed': 'meshbay-node n\'est pas installé sur cette machine.',
  'setup.node_install_hint': 'Installez-le avec votre gestionnaire de paquets, puis revenez ici.',
  'setup.skip': 'Passer — créer un groupe sans node local',
  'setup.create_group': 'Créer votre premier groupe',
  'setup.dismiss': 'Passer la configuration',

  // Group
  'group.retry': 'Réessayer',

  // Sidebar
  'sidebar.node': 'Node',

  // Node admin
  'node.title': 'Node',
  'node.service_checking': 'Vérification du service du nœud…',
  'node.service_not_installed': 'Non installé en tant que service',
  'node.service_state_active': 'En cours d’exécution',
  'node.service_state_inactive': 'Arrêté',
  'node.service_state_failed': 'Échec',
  'node.service_state_activating': 'Démarrage…',
  'node.service_state_deactivating': 'Arrêt en cours…',
  'node.service_state_unknown': 'Inconnu',
  'node.service_start': 'Démarrer',
  'node.service_starting': 'Démarrage…',
  'node.service_stop': 'Arrêter',
  'node.service_stopping': 'Arrêt…',
  'node.service_restart': 'Redémarrer',
  'node.service_restarting': 'Redémarrage…',
  'node.service_mode_hint': 'Fonctionne comme service en arrière-plan — démarre au boot, avant l\'ouverture de session.',
  'node.startup_mode_label': 'Démarrer automatiquement :',
  'node.startup_mode_off': 'Désactivé (démarrage manuel)',
  'node.startup_mode_signin': 'À l\'ouverture de session',
  'node.startup_mode_service': 'Comme service en arrière-plan (démarre au boot)',
  'node.startup_mode_updating': 'Changement de mode — vérifiez une invite d\'administrateur…',
  'node.startup_mode_service_unavailable_hint': 'Le mode service en arrière-plan nécessite une version installée. Pour un test local, exécutez "meshbay-node service install" depuis un PowerShell administrateur.',
  'node.not_operator': 'Impossible de joindre votre node. Vérifiez qu\'il est en cours d\'exécution.',
  'node.offline': 'Node hors ligne',
  'node.retry': 'Réessayer',
  'node.pair_needed': "Aucun opérateur appairé. Entrez un code d'appairage pour activer les opérations d'administration (invitations, suppression de fichiers).",
  'node.pair_code_placeholder': "Code d'appairage",
  'node.pair_button': 'Appairer ce navigateur',
  'node.pair_success': 'Appairage réussi.',
  'node.reload': 'Recharger la configuration',
  'node.reloaded': 'Configuration rechargée. Les modifications de répertoires sur les groupes existants sont maintenant actives.',
  'node.restart_needed': 'Après l\'ajout : initialisez la clé de groupe (meshbay-node gek-init --group <name>).',
  'node.no_groups': 'Aucun groupe configuré sur ce node.',
  'node.stale': 'absent du hub',
  'node.settings': 'Paramètres du node',
  'node.settings_edit_hint': 'Les modifications sont appliquées immédiatement et sauvegardées dans node.toml.',
  'node.settings_save': 'Enregistrer',
  'node.settings_saving': 'Enregistrement…',
  'node.settings_saved': 'Paramètres enregistrés.',
  'node.setting_invite_ttl': 'Durée des invitations',
  'node.setting_pair_ttl': 'Durée du code d\'appairage',
  'node.setting_device_ttl': 'Durée des demandes d\'appareil',
  'node.setting_max_streams': 'Flux vidéo simultanés max',
  'node.setting_max_downloads': 'Téléchargements simultanés max',
  'node.setting_max_uploads': 'Téléversements simultanés max',
  'node.setting_transcode': 'Transcoder les vidéos incompatibles',
  'node.setting_unit_hours': 'heures',
  'node.setting_unit_minutes': 'min',
  'node.setting_on': 'Activé',
  'node.setting_off': 'Désactivé',
  'node.unavailable': 'indisponible',
  'node.files': {
    one: '1 fichier',
    other: '{n} fichiers',
  },
  'node.peers': {
    one: '1 pair',
    other: '{n} pairs',
  },
  'node.roots': 'Répertoires',
  'node.add_root': 'Ajouter un répertoire',
  'node.remove_root': 'Retirer',
  'node.root_no_signing_key': 'Aucune clé de signature disponible — appairez d\'abord cet appareil avec le nœud',
  'node.root_no_route': 'Aucune route vers le nœud — connectez-vous à lui, ou utilisez l\'application sur la machine qui l\'héberge',
  'node.root_remove_last': 'Un groupe a besoin d\'au moins un répertoire',
  'node.root_path_hint': 'Le chemin tel que le nœud le voit, sur la machine qui héberge ce groupe.',
  'node.root_path_placeholder': '/home/user/Media',
  'node.root_path': 'Chemin',
  'node.root_added': 'Répertoire ajouté.',
  'node.root_remove_confirm': 'Retirer « {name} » de ce groupe ?',
  'node.root_removed': 'Répertoire retiré. Un redémarrage est recommandé pour mettre à jour l\'index.',
  'node.directory': 'Répertoire',
  'node.root_rw': 'Écriture',
  'node.root_ro': 'lecture seule',
  'node.removable': 'Amovible',
  'node.attach_group': 'Ajouter un groupe',
  'node.attach_pick': 'Groupe à héberger',
  'node.attach_dir': 'Répertoire partagé',
  'node.attach_upload_dir': 'Répertoire d\'upload',
  'node.attach_upload_label': 'Répertoire d\'upload (pour les fichiers envoyés et les pièces jointes du chat)',
  'node.attached': 'Groupe ajouté et chargé. Lancez meshbay-node gek-init --group {name} si ce n\'est pas encore fait.',
  'node.detach_group': 'Retirer le groupe',
  'node.detach_confirm': 'Retirer « {name} » de ce node ?',
  'node.detached': 'Groupe retiré.',
  'node.gek': 'Clé de groupe',
  'node.no_gek': 'Pas de clé de groupe',
  'node.gek_init_hint': 'Aucune clé de groupe pour l\'instant. Lancez GEK init depuis la ligne de commande pour en créer une.',
  'node.gek_public_hint': 'La rotation de clé n\'est pas disponible pour les groupes publics.',
  'node.gek_rotate': 'Rotation de la clé de groupe',
  'node.gek_rotate_confirm': 'Effectuer la rotation de la clé de groupe ? Les membres connectés recevront la nouvelle clé automatiquement. Le contenu déjà téléchargé n\'est pas affecté.',
  'node.gek_rotated': 'Clé de groupe renouvelée.',
  'node.roster': 'Registre',
  'node.roster_load': 'Charger le registre',
  'node.roster_empty': 'Aucun membre enregistré pour l\'instant.',
  'node.roster_user': 'Utilisateur',
  'node.roster_role': 'Rôle',
  'node.roster_status': 'Statut',
  'node.roster_via': 'Enregistré via',
  'node.roster_invites': {
    one: '1 invitation en attente',
    other: '{n} invitations en attente',
  },
  'node.unpin': 'Retirer l\'identité',
  'node.unpin_confirm': 'Retirer l\'identité de « {name} » ? Cette personne devra se ré-apparier.',
  'node.unpin_done': 'Identité retirée.',
  'node.denylist': 'Liste de blocage',
  'node.denylist_load': 'Charger la liste de blocage',
  'node.denylist_empty': 'La liste de blocage est vide.',
  'node.denylist_count': {
    one: '1 entrée',
    other: '{n} entrées',
  },
  'node.denylist_remove': 'Retirer',
  'node.denylist_clear_all': 'Tout effacer',
  'node.denylist_clear_confirm': 'Retirer « {subject} » de la liste de blocage ?',
  'node.denylist_cleared': 'Entrée retirée de la liste de blocage.',

  // Node settings
  'settings_node.detach_failed_continue': 'Impossible de détacher le groupe du node. Supprimer quand même sur le hub ?',
  'settings_node.roots': 'Répertoires partagés',
  'settings_node.scan_title': 'Analyse',
  'settings_node.scan_hint': 'À quelle fréquence le node revérifie ses répertoires à la recherche de changements manqués, et combien de temps il attend après une modification avant d\'indexer un fichier.',
  'settings_node.scan_reconcile_label': 'Intervalle de revérification (minutes)',
  'settings_node.scan_debounce_label': 'Attente après un changement (secondes)',
  'settings_node.scan_save': 'Enregistrer',
  'settings_node.scan_saving': 'Enregistrement…',
  'settings_node.scan_saved': 'Enregistré.',
  'settings_node.tmdb_title': 'Métadonnées TMDB',
  'settings_node.tmdb_hint': "Permet à l'application Vidéos d'afficher affiches, résumés et distribution depuis TMDB. Désactivé signifie navigation par vignettes uniquement, sans aucune requête vers un tiers.",
  'settings_node.tmdb_enabled': 'Activé',
  'settings_node.tmdb_disabled': 'Désactivé',
  'settings_node.tmdb_token_label': "Jeton d'API personnalisé (facultatif)",
  'settings_node.tmdb_token_placeholder': 'Laisser vide pour utiliser le jeton fourni par défaut',
  'settings_node.tmdb_token_customized': 'Un jeton personnalisé est défini.',
  'settings_node.tmdb_token_default': 'Utilise le jeton fourni par défaut.',
  'settings_node.tmdb_save': 'Enregistrer',
  'settings_node.tmdb_language_label': 'Langue',
  'settings_node.tmdb_language_hint': "S'applique à tout le monde — un cache partagé, pas une requête par personne.",
  'settings_node.video_root_title': 'Dossier racine des Vidéos',
  'settings_node.video_root_hint': "Quel dossier (ou sous-dossier) sert de point d'entrée à l'application Vidéos pour ce groupe. Rien ne s'affiche dans Vidéos, et aucune recherche TMDB n'est effectuée, tant qu'aucun n'est choisi.",
  'settings_node.video_root_none': '— aucun choisi —',
  'settings_node.musicbrainz_title': 'Métadonnées MusicBrainz',
  'settings_node.musicbrainz_hint': "Permet à l'app Musique d'afficher les pochettes et les noms canoniques depuis MusicBrainz quand un morceau n'a pas de pochette intégrée utilisable. Désactivé signifie une navigation par tags/nom de fichier uniquement, sans requête vers un tiers.",
  'settings_node.musicbrainz_enabled': 'Activé',
  'settings_node.musicbrainz_disabled': 'Désactivé',
  'settings_node.video_root_save': 'Enregistrer',
  'settings_node.video_root_change_confirm': "Changer la racine des Vidéos remplace ce que chaque membre voit dans l'onglet Vidéos. Continuer ?",

  'settings_node.audio_root_title': 'Dossier racine de la Musique',
  'settings_node.audio_root_hint': 'Quel dossier (ou sous-dossier) sert de point d\'entrée à l\'application Musique pour ce groupe. Rien ne s\'affiche dans Musique, et aucune lecture de tags/pochettes n\'est effectuée, tant qu\'aucun n\'est choisi.',
  'settings_node.audio_root_none': '— aucun choisi —',
  'settings_node.audio_root_save': 'Enregistrer',
  'settings_node.audio_root_change_confirm': 'Changer la racine de la Musique remplace ce que chaque membre voit dans l\'onglet Musique. Continuer ?',
  'settings_node.photo_roots_title': 'Dossiers racines des Photos',
  'settings_node.photo_roots_hint': 'Quel(s) dossier(s) l\'application Photos traite comme points d\'entrée pour ce groupe — une photothèque est souvent répartie sur plusieurs dossiers, donc plusieurs peuvent être choisis. Rien ne s\'affiche dans Photos tant qu\'aucun n\'est ajouté.',
  'settings_node.photo_roots_none': '— aucun choisi —',
  'settings_node.photo_roots_add_placeholder': 'Ajouter un dossier…',
  'settings_node.photo_roots_add': 'Ajouter',
  'settings_node.photo_roots_remove': 'Retirer',
  'settings_node.photo_roots_save': 'Enregistrer',
  'settings_node.shared_directories_title': 'Répertoires partagés',
  'settings_node.shared_directories_hint': 'Dossiers partagés avec ce groupe. Activez lecture-écriture pour autoriser les envois, marquez comme amovible pour les disques externes.',
  'folder_tree.title_single': 'Choisir un dossier',
  'folder_tree.title_multi': 'Choisir des dossiers',
  'folder_tree.choose': 'Choisir…',
  'folder_tree.remove': 'Retirer',
  'folder_tree.add': 'Ajouter un dossier…',
  'folder_tree.confirm': 'Utiliser',
  'folder_tree.expand': 'Déplier',
  'folder_tree.collapse': 'Replier',
  'folder_tree.nothing_selected': 'Rien de sélectionné',
  'folder_tree.empty': 'Ce groupe n\'a pas encore de répertoire partagé.',
  'folder_tree.writable_only': 'Seuls les répertoires en lecture-écriture sont proposés ici — des fichiers y sont écrits.',
  'folder_tree.no_writable_root': 'Ce groupe n\'a aucun répertoire en écriture. Activez d\'abord lecture-écriture dans Répertoires partagés.',
  'folder_tree.read_only_blocked': 'Lecture seule — écriture impossible',
  'settings_app.save': 'Enregistrer',
  'settings_app.saving': 'Enregistrement…',
  'settings_app.disabled_hint': 'Activez cette application pour la configurer.',
  'settings_app.video_directories_label': 'Dossiers vidéo',
  'settings_app.video_directories_hint': 'Où vivent les films et séries de ce groupe. Rien en dehors n\'apparaît dans l\'onglet Vidéos.',
  'settings_app.music_directories_label': 'Dossiers musique',
  'settings_app.music_directories_hint': 'Où vivent les albums de ce groupe. Rien en dehors n\'apparaît dans l\'onglet Musique.',
  'settings_app.photo_directories_label': 'Dossiers photo',
  'settings_app.photo_directories_hint': 'Où vivent les albums de ce groupe. Rien en dehors n\'apparaît dans l\'onglet Photos.',
  'settings_app.chat_directory_label': 'Dossier des pièces jointes',
  'settings_app.chat_directory_hint': 'Où sont écrits les fichiers envoyés dans le chat. Doit être un répertoire en lecture-écriture.',
  'settings_app.chat_no_writable_root': 'Ce groupe n\'a aucun répertoire en écriture : les pièces jointes sont désactivées.',
  'settings_app.chat_link_preview_label': 'Aperçus des liens',
  'settings_app.chat_link_preview_hint': 'Quand un membre poste un lien, le nœud récupère le titre et l\'image de la page. C\'est une requête depuis votre machine vers un site choisi par quelqu\'un d\'autre.',
  'settings_app.chat_encrypted_always': 'La discussion de ce groupe est toujours chiffrée. Cela ne peut pas être désactivé.',
  'settings_app.chat_rotate_epoch': 'Faire tourner la clé de discussion',
  'settings_app.chat_rotate_epoch_hint': 'Les membres continuent de lire tout l\'historique. Quiconque a été retiré du groupe ne peut plus lire ce qui sera écrit. Retirer un membre ou un appareil le fait déjà tout seul.',
  'settings_app.tmdb_token_prompt': 'Créez un compte TMDB pour générer votre propre clé d\'API.',
  'settings_app.tmdb_token_link': 'Obtenir une clé',
  'settings_node.roots_offline_hint': 'Non connecté au nœud — les changements passent par le nœud local et prennent effet à son prochain rechargement.',
  'settings_node.roots_node_too_old': 'Ce nœud est plus ancien que cette page : il peut afficher ses répertoires mais pas les modifier ici. Mettez-le à jour, ou utilisez les commandes meshbay-node root.',
  'settings_node.app_node_too_old': 'Ce nœud est plus ancien que cette page et n\'a pas encore de réglage pour cette application. Mettez-le à jour pour la configurer ici.',
  'settings_node.directories_title': 'Répertoires des applications',
  'settings_node.directories_hint': 'Quel(s) dossier(s) partagés les applications Vidéos, Musique et Photos utilisent comme leur(s) propre(s) point(s) d\'entrée.',

  // Create group wizard
  'wizard.title': 'Créer un groupe',
  'wizard.detecting': 'Détection du node local…',
  'wizard.node_not_found': 'Aucun node local détecté. Vérifiez que meshbay-node est en cours d\'exécution.',
  'wizard.node_offline_warning': 'Le node ne tourne pas. Le groupe sera créé sur le hub uniquement. Vous pourrez connecter le node plus tard depuis la page Node.',
  'wizard.retry': 'Réessayer',
  'wizard.wrong_account': "Le node tourne mais le nom d'utilisateur configuré ne correspond pas à votre compte. Vérifiez hub.username dans node.toml.",
  'wizard.skip_node': 'Continuer sans node',
  'wizard.directories': 'Répertoires partagés',
  'wizard.directories_hint': 'Choisissez les répertoires que ce groupe partagera. Au moins un est requis.',
  'wizard.add_directory': 'Ajouter un répertoire',
  'wizard.remove': 'Retirer',
  'wizard.set_upload': 'Définir comme cible d\'upload',
  'wizard.upload_target': 'cible d\'upload',
  'wizard.create_and_setup': 'Créer et configurer',
  'wizard.create_hub_only': 'Créer sur le hub uniquement',
  'wizard.setting_up': 'Configuration de votre groupe…',
  'wizard.step_create_hub': 'Création du groupe sur le hub',
  'wizard.step_attach': 'Rattachement au node',
  'wizard.step_apps': 'Choix des applications',
  'wizard.step_add_roots': 'Ajout des répertoires',
  'wizard.step_gek': 'Initialisation de la clé de chiffrement',
  'wizard.step_pair': 'Mise en place de l\'appariement',
  'wizard.step_index': 'Indexation des fichiers',
  'wizard.indexing_progress': 'Indexation… {pct} %',
  'wizard.indexing_current_dir': 'Analyse : {dir}',
  'wizard.done_title': 'Groupe créé',
  'wizard.done_message': 'Votre groupe est prêt — votre node l\'héberge et le chiffrement est configuré. Invitez maintenant des membres depuis l\'onglet Paramètres.',
  'wizard.go_to_group': 'Aller au groupe',
  'wizard.finish_later': 'Terminer la configuration plus tard',
  'node.stun_servers': 'STUN Servers',
  'node.stun_hint': 'Servers used for WebRTC NAT traversal (ICE candidate gathering).',
  'node.stun_add': 'Add',
  'node.stun_add_placeholder': 'stun:host:port',
  'node.stun_remove': 'Remove',
  'node.stun_move_up': 'Move up',
  'node.stun_move_down': 'Move down',
  'node.stun_save': 'Save',
  'node.stun_saving': 'Saving…',
  'node.stun_saved': 'STUN servers saved.',
  'node.stun_reset': 'Reset to defaults',
  'node.stun_empty': 'No STUN servers configured. NAT traversal will not work.',
  'node.stun_duplicate': 'This server is already in the list.',
  'node.stun_invalid': 'STUN URL must start with stun:',
  'node.ice_interfaces': 'ICE Interfaces',
  'node.ice_auto_hint': 'Auto mode — virtual and VPN interfaces (Tailscale, Docker, libvirt, etc.) are excluded automatically.',
  'node.ice_manual_hint': 'Manual mode — only the listed interfaces are used for ICE candidate gathering.',
  'node.ice_add': 'Add',
  'node.ice_add_placeholder': 'e.g. eth0, wlp0s20f3',
  'node.ice_remove': 'Remove',
  'node.ice_save': 'Save',
  'node.ice_saving': 'Saving…',
  'node.ice_saved': 'ICE interfaces saved.',
  'node.ice_reset_auto': 'Switch to auto',
  'node.ice_duplicate': 'This interface is already in the list.',
  'node.overview': 'Overview',
  'node.overview_version': 'Version',
  'node.overview_node_id': 'Node ID',
  'node.overview_quic_port': 'QUIC port',
  'node.overview_hub': 'Hub',
  'node.node_roster': 'Node roster',
  'node.node_roster_hint': 'Every identity this node recognises, across all groups.',
  'node.roster_scope': 'Scope',
  'node.roster_scope_node': 'node-wide',
  'node.peers_title': 'Connected peers',
  'node.peers_empty': 'No peers connected.',
  'node.peers_user': 'User',
  'node.peers_ip': 'IP',
  'node.peers_group': 'Group',
  'node.peers_state': 'State',
  'node.audit_title': 'Audit log',
  'node.audit_all_events': 'All events',
  'node.audit_empty': 'No audit entries.',
  'node.audit_time': 'Time',
  'node.audit_event': 'Event',
  'node.audit_user': 'User',
  'node.audit_ip': 'IP',
  'node.audit_group': 'Group',
  'node.audit_detail': 'Detail',
  'node.maintenance': 'Maintenance',
  'node.maintenance_cache': 'Index cache: {n} path(s) remembered.',
  'node.maintenance_prune': 'Prune stale entries',
  'node.maintenance_pruned': 'Pruned {n} stale cache entries.',
  'node.loading': 'Loading…',
  'node.audit_export': 'Export CSV',
  'node.audit_exporting': 'Exporting…',
  'node.audit_prev': 'Previous',
  'node.audit_next': 'Next',
  'node.audit_page': 'Page {n}',
  'node.audit_exported': 'Exported {n} entries.',
  'node.unlink_title': 'Unlink from hub',
  'node.unlink_hint': 'Stops the hub from brokering connections to this node and listing it for group members. Your groups, keys, roster and files are untouched — the node keeps serving anyone who reaches it directly. Re-link any time from the group wizard or your profile.',
  'node.unlink_button': 'Unlink this node',
  'node.unlink_confirm': 'Unlink this node from the hub? The hub will stop routing members to it. Group data on disk is not affected.',
  'node.unlink_done': 'Node unlinked from the hub. It may take a moment for the hub connection to drop.',
  'node.tab_overview': 'Overview',
  'node.tab_groups': 'Groups',
  'node.tab_roster': 'Roster',
  'node.tab_peers': 'Peers',
  'node.tab_audit': 'Audit',
  'node.tab_settings': 'Settings',
};