diff options
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js')
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js new file mode 100644 index 0000000..845e7ce --- /dev/null +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js @@ -0,0 +1,407 @@ +/** + * 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', + + // 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', + + // 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.success_title': 'Compte créé', + 'register.success_msg': 'Vous pouvez maintenant vous connecter avec vos identifiants.', + 'register.go_login': 'Aller à la connexion', + '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.', + + // 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.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', + + // Group page + 'group.default_name': 'Groupe', + 'group.tab_files': 'Fichiers', + 'group.tab_chat': 'Discussion', + 'group.tab_members': 'Membres', + 'group.filter': 'Filtrer les fichiers...', + '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.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 via WebRTC...', + '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', + + // Video player + 'video.loading': 'Chargement de {name}...', + 'video.buffering': 'Mise en mémoire tampon...', + '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.', + 'group.upload_indexing': 'indexation…', + 'video.err_transport': 'Transport non connecté', + 'video.err_mse': 'Codec non pris en charge pour la diffusion : {codec}', + + // 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.dl_path_note': 'On ne peut pas indiquer un chemin à une page web, il n’y ' + + 'a donc rien à saisir ici : votre navigateur donne accès au dossier que vous ' + + 'désignez, et MeshBay n’écrit jamais ailleurs qu’à l’intérieur. Une ' + + 'confirmation peut vous être demandée une fois par session.', + 'settings.dl_unsupported': 'Ce navigateur ne sait pas écrire dans un dossier de ' + + 'votre choix (pas de File System Access API) ; les téléchargements vont donc ' + + 'dans son propre dossier de téléchargement. Chrome et Edge permettent d’en ' + + 'choisir un.', + 'settings.profile': 'Profil', + 'settings.username': "Nom d'utilisateur", + '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.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', + '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 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_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.visibility': 'Visibilité', + 'create_group.private': 'Privé', + 'create_group.private_desc': 'Seuls les membres invités voient les fichiers et y accèdent', + 'create_group.public': 'Public', + 'create_group.public_desc': 'Tout le monde peut découvrir et parcourir ce groupe', + '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', + 'create_group.open': 'Ouvert (tout le monde peut rejoindre)', + 'create_group.open_desc': 'Tout le monde peut rejoindre sans validation', + '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} — transmettez-le-lui ' + + 'par le moyen dont vous avez l’habitude. Il ne fonctionne qu’une fois, et ne ' + + 'transite jamais par le hub.', + 'members.invite_code_hint': 'La personne le saisit la première fois qu’elle ouvre ' + + 'ce groupe. Vous n’avez pas besoin d’être en ligne à ce moment-là.', + 'transfers.title': 'Transferts', + 'transfers.clear': 'Effacer les terminés', + 'transfers.cancel': 'Annuler', + 'transfers.open': 'Ouvrir', + 'transfers.done': 'Terminé', + 'transfers.cancelled': 'Annulé', + '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.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', + + '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.title': 'Rechercher des fichiers', + 'search.placeholder': 'Rechercher dans tous les groupes...', + 'search.no_results': 'Aucun fichier ne correspond à votre recherche.', + 'search.synced': 'synchronisé {ago}', + 'search.cache_note': 'La recherche s’appuie sur l’état de chaque groupe lors de ' + + 'votre dernière visite. Ouvrez un groupe pour mettre ses fichiers à jour ici.', + 'search.col_group': 'Groupe', + 'search.result_count': { + one: '{n} fichier trouvé', + other: '{n} fichiers trouvés', + }, + 'search.hint': 'Recherche les noms de fichiers dans tous les index de groupe en cache.', +}; |