/** * 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', '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_finished': 'Terminés', 'transfers.cancel_one': 'Annuler {name}', 'transfers.pause': 'Suspendre', 'transfers.resume': 'Reprendre', 'transfers.paused': 'En pause', '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 ).', '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', };