package i18n
var fr = map[string]string{
// ---------- nav / shell ----------
"nav.home": "Accueil",
"nav.explore": "Explorer",
"nav.security": "Sécurité",
"nav.dashboard": "Mes repos",
"nav.search_placeholder": "Rechercher un dépôt…",
"nav.login": "Se connecter",
"nav.signed_in_as": "Connecté en tant que",
"nav.settings": "Paramètres",
"nav.admin": "Administration",
"nav.logout": "Se déconnecter",
"nav.notifications": "Notifications",
"theme.system": "Auto",
"theme.light": "Clair",
"theme.dark": "Sombre",
"theme.toggle": "Changer de thème",
"settings.tab_preferences": "Préférences",
"settings.theme_title": "Thème",
"settings.theme_hint": "Auto suit le réglage de ton système. Ça change aussi le petit bouton dans la barre de navigation.",
"footer.changelog": "Gitfed %s",
// ---------- explore ----------
"explore.title": "Explorer les dépôts publics",
"explore.subtitle": "Dépôts publics de cette instance, lisibles par tout le monde — clonables en HTTPS sans compte.",
"explore.repo_count": "dépôts publics",
"explore.search_placeholder": "Filtrer par nom…",
"explore.topics_label": "Sujets",
"explore.clear": "effacer",
"explore.col_repo": "Dépôt",
"explore.col_owner": "Propriétaire",
"explore.col_topics": "Sujets",
"explore.empty_title": "Aucun dépôt public ne correspond",
"explore.empty_hint": "Essayez un autre sujet ou une autre recherche, ou effacez le filtre.",
// ---------- profile ----------
"profile.joined": "Inscrit·e depuis",
"profile.keys_title": "Clés publiques",
"profile.keys_hint": "Empreintes SHA256 uniquement — jamais la clé complète.",
"profile.repos_title": "Dépôts publics",
"profile.no_repos": "Aucun dépôt public pour l'instant.",
"profile.activity_title": "Activité récente",
"profile.no_activity": "Aucune activité récente.",
// ---------- landing ----------
"landing.title": "",
"landing.kicker": "git auto-hébergé & fédéré",
"landing.h1_1": "Votre code. Votre serveur.",
"landing.h1_2": "Vos règles.",
"landing.lead": "Gitfed est un serveur git que vous hébergez vous-même — pour garder la propriété de votre code et de vos données, sans renoncer à collaborer avec qui vous voulez, où que cette personne héberge son instance.",
"landing.cta_explore": "Explorer les dépôts publics",
"landing.cta_security": "Comment c'est sécurisé →",
"landing.pillar1_h": "Propriété",
"landing.pillar1_p": "Votre code et vos données restent sur votre machine, votre serveur, votre infrastructure. Aucune plateforme tierce ne peut les exploiter, les fermer, ou vous couper l'accès.",
"landing.pillar2_h": "Fédération",
"landing.pillar2_p": "Chaque instance reste indépendante, mais peut faire confiance à d'autres — comme le mail. Un seul compte, chez vous, suffit pour pousser du code sur une instance qui vous fait confiance.",
"landing.pillar3_h": "Contrôle",
"landing.pillar3_p": "Public ou privé, lecture ou écriture, dépôt par dépôt, personne par personne. C'est vous qui décidez — aucune règle de plateforme ne s'impose à vous.",
"landing.split_h": "Un compte chez vous, pas un compte partout",
"landing.split_p": "Quand une personne d'une autre instance veut collaborer sur un de vos dépôts, elle ne crée pas de compte chez vous : son instance d'origine signe un certificat qui prouve qui elle est, et votre instance vérifie qu'elle fait confiance à cette instance-là. Une fois la confiance établie, tout se passe localement — aucun appel réseau à chaque `git push`.",
"landing.split_link_security": "En savoir plus sur la sécurité",
"landing.split_link_explore": "Explorer les dépôts",
"landing.diagram_you": "Votre instance",
"landing.diagram_friend": "Instance d'un ami",
"landing.diagram_cert": "certificat",
"landing.diagram_trust": "confiance vérifiée",
"landing.diagram_no_account1": "pas de compte « bob »",
"landing.diagram_no_account2": "chez alice",
"landing.cta_band_h": "Envie de reprendre la main sur votre code ?",
"landing.cta_band_p": "Gitfed est open-source et auto-hébergé — un binaire Go, une base embarquée, aucune dépendance externe.",
"landing.cta_band_dashboard": "Aller à mes dépôts",
"landing.changelog_link": "Changelog complet",
// ---------- security ----------
"security.title": "Sécurité",
"security.kicker": "modèle de sécurité",
"security.h1": "Pourquoi c'est sécurisé, expliqué simplement",
"security.lead": "Pas de jargon inutile : voici, étape par étape, comment Gitfed protège votre code — du transport jusqu'à l'identité de vos collaborateurs.",
"security.s1_tag": "01 · transport",
"security.s1_h": "Uniquement du SSH, jamais du git en HTTP",
"security.s1_p": "Gitfed n'expose aucun protocole git par HTTP. Toute lecture ou écriture passe par SSH — un protocole éprouvé depuis 25 ans, avec une seule porte d'entrée à surveiller plutôt que deux.",
"security.s1_diagram_client": "git clone/push",
"security.s1_diagram_open": "SSH — ouvert",
"security.s1_diagram_http": "HTTP git — inexistant",
"security.s1_diagram_repos": "dépôts",
"security.s1_caption": "Une seule porte d'entrée réseau pour le git : le port SSH.",
"security.s2_tag": "02 · identité",
"security.s2_h": "Des certificats de courte durée, pas des mots de passe partagés",
"security.s2_p": "Chaque instance génère sa propre autorité de certification. Votre instance signe un certificat prouvant qui vous êtes, valable 24h par défaut — jamais un secret longue durée à faire fuiter.",
"security.s2_diagram_haskey": "a une clé SSH",
"security.s2_diagram_step1": "1. demande",
"security.s2_diagram_alice_instance": "instance d'alice",
"security.s2_diagram_local_ca": "autorité (CA) locale",
"security.s2_diagram_signs": "signe 24h",
"security.s2_diagram_step2": "2. certificat",
"security.s2_diagram_bob_instance": "instance de bob",
"security.s2_diagram_trust1": "a-t-elle confiance",
"security.s2_diagram_trust2": "en cette CA ?",
"security.s2_diagram_access": "accès",
"security.s2_diagram_local1": "vérification 100% locale ensuite —",
"security.s2_diagram_local2": "aucun appel réseau à chaque push",
"security.s2_caption": "alice demande un certificat à sa propre instance, le présente chez bob, qui vérifie sa confiance envers l'instance d'alice.",
"security.s3_tag": "03 · confiance",
"security.s3_h": "La confiance entre instances est explicite, jamais automatique",
"security.s3_p": "La première fois qu'une instance inconnue apparaît, Gitfed consulte sa fiche publique (/.well-known/gitfed.json) puis met sa clé en attente — un administrateur doit l'approuver avant que le moindre accès soit accordé. La découverte est aussi limitée à 10 nouveaux domaines par minute, pour éviter tout abus.",
"security.s3_diagram_unknown": "Domaine inconnu",
"security.s3_diagram_unknown_sub": "contacte votre instance",
"security.s3_diagram_discovery": "Découverte",
"security.s3_diagram_discovery_sub": "lit sa clé publique CA",
"security.s3_diagram_pending": "En attente",
"security.s3_diagram_pending_sub": "tant qu'un admin n'a rien fait",
"security.s3_diagram_approved": "Approuvé",
"security.s3_diagram_approved_sub": "décision d'un admin",
"security.s4_tag": "04 · cloisonnement",
"security.s4_h": "L'accès web et l'accès git ne partagent rien",
"security.s4_p": "Le mot de passe de l'interface web n'a rien à voir avec vos accès git : il est haché (bcrypt), jamais stocké en clair, et n'ouvre qu'une session web opaque, à durée limitée. Un `git push` ne dépend jamais de ce mot de passe — uniquement de votre clé SSH ou de votre certificat.",
"security.s4_fact1_h": "Rôles précis par dépôt",
"security.s4_fact1_p": "lecture, écriture, admin, jamais tout ou rien.",
"security.s4_fact2_h": "Public ≠ inscriptible",
"security.s4_fact2_p": "un dépôt public s'ouvre en lecture, jamais en écriture sans droit explicite.",
"security.s4_fact3_h": "Cookies de session",
"security.s4_fact3_p": "HttpOnly, Secure, SameSite — inaccessibles en JavaScript.",
"security.s4_fact4_h": "Journal d'audit",
"security.s4_fact4_p": "chaque décision d'accès, autorisée ou refusée, est enregistrée.",
// ---------- common ----------
"common.public": "public",
"common.private": "privé",
"role.owner": "propriétaire",
"role.read": "lecture",
"role.write": "écriture",
"role.admin": "admin",
// ---------- dashboard ----------
"dashboard.title": "Vos dépôts",
"dashboard.stat_repos": "Dépôts",
"dashboard.stat_public": "Publics",
"dashboard.stat_shared": "Partagés avec vous",
"dashboard.add_repo": "Ajouter un dépôt",
"dashboard.new_repo": "Nouveau dépôt",
"dashboard.repo_name": "Nom",
"dashboard.create": "Créer",
"dashboard.empty": "Aucun dépôt pour le moment — créez-en un ci-dessus.",
"dashboard.msg_created": "%s créé",
"dashboard.msg_name_required": "le nom du dépôt est obligatoire",
"dashboard.msg_bad_namespace": "vous ne pouvez créer des dépôts que dans votre propre espace de noms",
"dashboard.msg_quota": "vous avez atteint le nombre maximum de dépôts",
"dashboard.import_repo": "Importer depuis une URL",
"dashboard.import_url_label": "URL du dépôt source (HTTPS)",
"dashboard.import": "Importer",
"dashboard.msg_import_url_required": "l'URL du dépôt source est obligatoire",
"dashboard.msg_imported": "%s importé",
// ---------- dépôts épinglés ----------
"dashboard.pinned_title": "Épinglés ailleurs",
"dashboard.pinned_note": "Des liens vers des dépôts sur d'autres instances — un lien, pas un accès. Fonctionne sans rien pour un dépôt public ; un privé demande juste une session sur cette instance-là.",
"dashboard.pin_add": "Épingler un dépôt",
"dashboard.pin_input_label": "URL du dépôt ou domaine/propriétaire/dépôt",
"dashboard.pin_remove": "Retirer",
"dashboard.pins_empty": "Rien d'épinglé pour le moment.",
"dashboard.msg_pin_invalid": "impossible d'en tirer un domaine et un dépôt",
"dashboard.msg_pin_quota": "vous avez atteint le nombre maximum d'épingles",
"dashboard.msg_pinned": "%s épinglé",
// ---------- notifications ----------
"notif.title": "Notifications",
"notif.note": "Une autre instance vous informe qu'un accès vous a été accordé chez elle — purement informatif, et son contenu n'est pas vérifié indépendamment (seule la signature de cette instance l'est). Accepter épingle juste le lien ; ça n'accorde rien par soi-même, et votre accès réel est celui que le propriétaire de cette instance a réellement défini, peu importe ce qu'affirme une notification.",
"notif.granted_by": "accordé par",
"notif.accept": "Accepter",
"notif.dismiss": "Ignorer",
"notif.status_accepted": "accepté",
"notif.status_dismissed": "ignoré",
"notif.empty": "Aucune notification.",
"notif.msg_accepted": "épinglé dans Mes repos",
"notif.mr_opened": "%s a ouvert la merge request #%d : %s",
"notif.mr_comment": "%s a commenté la merge request #%d : %s",
"notif.view": "Voir",
"notif.msg_seen": "marqué comme vu",
// ---------- settings ----------
"settings.title": "Paramètres",
"settings.tab_profile": "Profil",
"settings.tab_keys": "Clés SSH",
"settings.tab_password": "Mot de passe",
"settings.logged_in_as": "Connecté en tant que",
"settings.profile_note": "Ce mot de passe ne sert qu'à se connecter à l'interface web. Le push/pull git passe toujours par SSH avec une clé, indépendamment de lui.",
"settings.remove": "Retirer",
"settings.confirm_remove_key": "Retirer cette clé ? Si c'est la seule, vous perdrez l'accès SSH/git jusqu'à en ajouter une autre.",
"settings.no_keys": "Aucune clé pour le moment.",
"settings.add_key": "Ajouter une clé SSH",
"settings.pubkey_label": "Clé publique (format authorized_keys)",
"settings.add": "Ajouter",
"settings.change_password": "Changer le mot de passe",
"settings.current_password": "Mot de passe actuel",
"settings.new_password": "Nouveau mot de passe",
"settings.msg_key_added": "clé ajoutée",
"settings.msg_key_removed": "clé retirée",
"settings.msg_wrong_password": "mot de passe actuel incorrect",
"settings.msg_password_changed": "mot de passe changé",
"settings.bio_title": "Bio publique",
"settings.bio_label": "Affichée sur votre page de profil publique — Markdown pris en charge.",
"settings.bio_placeholder": "Quelques mots sur vous ou ce sur quoi vous travaillez…",
"settings.public_profile_hint": "N'importe qui peut voir votre profil public, même sans compte.",
"settings.view_public_profile": "Voir le profil public",
"settings.msg_bio_saved": "bio enregistrée",
"settings.msg_bio_too_long": "la bio est trop longue",
// ---------- auth ----------
"auth.login": "Se connecter",
"auth.username": "Nom d'utilisateur",
"auth.password": "Mot de passe",
"auth.note": "Les comptes sont créés par un administrateur de l'instance — pas d'inscription libre. Ceci ne fait que vous connecter à l'interface web ; le push/pull git passe toujours par SSH avec votre clé.",
"auth.invalid_login": "nom d'utilisateur ou mot de passe invalide",
"auth.rate_limited": "trop de tentatives de connexion, réessayez dans quelques minutes",
"auth.error": "impossible de vous connecter pour le moment, réessayez plus tard",
"common.server_error": "une erreur interne est survenue",
// ---------- search / changelog ----------
"search.title": "Recherche",
"search.no_matches": "Aucun résultat.",
"search.prompt": "Tapez quelque chose pour rechercher.",
"changelog.title": "Changelog",
// ---------- admin ----------
"admin.title": "Administration",
"admin.card_users": "Utilisateurs",
"admin.card_users_sub": "%d admin(s), %d classique(s)",
"admin.card_users_link": "Gérer les utilisateurs",
"admin.card_trust": "Confiance fédérée",
"admin.card_trust_pending": "en attente",
"admin.card_trust_sub": "domaines fédérés connus",
"admin.card_trust_link": "Revoir la confiance fédérée",
"admin.pending_trust_tooltip": "Un domaine fédéré attend une approbation de confiance — ses collaborateurs ne peuvent pas s'authentifier tant que ce n'est pas fait",
"admin.card_audit": "Journal d'audit",
"admin.card_audit_sub": "événements récents enregistrés",
"admin.card_audit_link": "Voir le journal d'audit",
"admin.card_repos": "Stockage",
"admin.card_repos_sub": "sur %d dépôts",
"admin.card_repos_link": "Voir les dépôts",
"admin.recent_activity": "Activité récente",
"admin.audit_allow": "autorisé",
"admin.audit_deny": "refusé",
"admin.users_title": "Administration — Utilisateurs",
"admin.users_col_username": "Utilisateur",
"admin.users_col_keys": "Clés",
"admin.revoke_admin": "Retirer admin",
"admin.make_admin": "Passer admin",
"admin.confirm_delete_user": "Supprimer l'utilisateur",
"admin.users_empty": "Aucun utilisateur pour le moment.",
"admin.add_user": "Ajouter un utilisateur",
"admin.initial_password": "Mot de passe initial",
"admin.grant_admin": "Accorder les droits admin",
"admin.msg_user_created": "utilisateur %s créé",
"admin.msg_user_deleted": "utilisateur %s supprimé",
"admin.msg_user_updated": "%s mis à jour",
"admin.trust_title": "Administration — Confiance fédérée",
"admin.trust_col_domain": "Domaine",
"admin.trust_col_status": "Statut",
"admin.trust_col_first_seen": "Vu pour la première fois",
"admin.trust_status_pending": "en attente",
"admin.trust_status_trusted": "approuvé",
"admin.approve": "Approuver",
"admin.trust_empty": "Aucun domaine distant découvert pour le moment.",
"admin.trust_note": "Les domaines apparaissent ici automatiquement dès qu'un collaborateur d'un domaine distant reçoit un accès à un dépôt. Avec la politique par défaut (liste blanche), ils restent en attente jusqu'à approbation ici.",
"admin.msg_domain_approved": "%s approuvé",
"admin.audit_title": "Administration — Journal d'audit",
"admin.audit_col_time": "Heure",
"admin.audit_col_action": "Action",
"admin.audit_col_principal": "Principal",
"admin.audit_col_repo_domain": "Dépôt/Domaine",
"admin.audit_col_result": "Résultat",
"admin.audit_col_detail": "Détail",
"admin.audit_empty": "Aucun événement enregistré pour le moment.",
"admin.audit_note": "Affichage des 200 événements les plus récents.",
"admin.repos_title": "Administration — Dépôts",
"admin.repos_sub": "%d dépôts, %s au total sur disque",
"admin.repos_col_name": "Nom",
"admin.repos_col_owner": "Propriétaire",
"admin.repos_col_visibility": "Visibilité",
"admin.repos_col_size": "Taille",
"admin.repos_empty": "Aucun dépôt pour le moment.",
// ---------- repo ----------
"repo.owner": "propriétaire",
"repo.copy_clone_url": "Copier l'URL de clonage",
"repo.read_only": "lecture seule",
"repo.https_readonly_hint": "Clone/fetch anonyme uniquement — impossible de pousser en HTTPS, même sur un dépôt public. Le push passe toujours par SSH.",
"repo.empty": "Ce dépôt est vide.",
"repo.directory": "dossier",
"repo.file": "fichier",
"repo.nothing_here": "Rien ici.",
"repo.tags": "Tags",
"repo.download": "Télécharger",
"repo.stat_commits": "%d commits",
"repo.stat_contributors": "%d contributeurs",
"repo.commits_title": "Commits",
"repo.commits_empty": "Aucun commit pour le moment.",
"repo.pager_prev": "Précédent",
"repo.pager_next": "Suivant",
"repo.pager_page": "Page %d",
"repo.commit_label": "commit",
"repo.parent_label": "parent",
"repo.files_changed": "fichiers modifiés",
"repo.diff_truncated": "Le diff de ce commit est trop volumineux pour être affiché en entier — la liste ci-dessus montre tout de même chaque fichier modifié.",
"repo.license": "Licence",
"repo.view_file": "Voir le fichier",
"repo.binary_file": "Fichier binaire — non affiché.",
"repo.settings_title": "paramètres",
"repo.visibility_topics": "Visibilité et sujets",
"repo.public_desc": "Public (lisible par tout principal authentifié)",
"repo.topics_label": "Sujets (séparés par des virgules)",
"repo.description_label": "Description",
"repo.description_placeholder": "À quoi sert ce dépôt ?",
"repo.save": "Enregistrer",
"repo.col_principal": "Principal",
"repo.col_role": "Rôle",
"repo.revoke": "Révoquer",
"repo.grant_collaborator": "Ajouter un collaborateur",
"repo.grant": "Accorder",
"repo.grant_note": "Accorder un accès à un domaine encore inconnu de cette instance déclenche la découverte fédérée de la CA de ce domaine — un administrateur de l'instance doit l'approuver dans Administration → Confiance fédérée (politique de liste blanche).",
"repo.confirm_delete": "Supprimer",
"repo.confirm_revoke": "Révoquer l'accès de",
"repo.danger_zone": "Zone de danger",
"repo.danger_zone_note": "La suppression retire l'entrée du dépôt de Gitfed — elle ne supprime pas le dépôt bare sur le disque.",
"repo.collaborators_title": "Collaborateurs",
"repo.federated_collaborator": "collaborateur fédéré",
"repo.local_collaborator": "collaborateur local",
"repo.delete_record": "Supprimer l'entrée du dépôt",
"repo.msg_saved": "paramètres enregistrés",
"repo.msg_granted": "%s ajouté avec le rôle %s",
"repo.msg_granted_pending_trust": "%s ajouté — mais %s est en attente d'approbation dans Admin → Trust store, il/elle ne pourra pas s'authentifier tant que ce n'est pas fait",
"repo.msg_revoked": "%s révoqué",
"repo.msg_deleted": "%s supprimé",
// ---------- merge requests ----------
"mr.list_title": "Merge requests",
"mr.new": "Nouvelle merge request",
"mr.by": "ouverte par",
"mr.opened_by": "Ouverte par",
"mr.empty_title": "Aucune merge request pour le moment",
"mr.empty_hint": "Ouvrez-en une pour proposer de fusionner une branche dans une autre.",
"mr.need_two_branches": "Ce dépôt a besoin d'au moins deux branches pour ouvrir une merge request.",
"mr.branches_label": "Branches",
"mr.title_label": "Titre",
"mr.description_label": "Description (optionnel)",
"mr.cancel": "Annuler",
"mr.open": "Ouvrir la merge request",
"mr.status_open": "ouverte",
"mr.status_merged": "fusionnée",
"mr.status_closed": "fermée",
"mr.branch_missing": "Une des branches de cette merge request n'existe plus.",
"mr.clean_title": "Aucun conflit — prête à fusionner",
"mr.conflict_title": "Conflit — fusion impossible pour le moment",
"mr.merge": "Fusionner",
"mr.close": "Fermer",
"mr.merged_note": "Fusionnée par",
"mr.closed_note": "Fermée sans fusion.",
"mr.comment_placeholder": "Ajouter un commentaire…",
"mr.comment_submit": "Commenter",
"mr.msg_invalid": "choisissez un titre et deux branches différentes",
"mr.msg_created": "merge request ouverte",
"mr.msg_merged": "fusionnée",
"mr.msg_conflict": "fusion impossible : fichiers en conflit — résolvez en local puis repoussez, et réessayez",
"mr.msg_closed": "fermée",
"mr.msg_comment_empty": "le commentaire ne peut pas être vide",
"mr.msg_commented": "commentaire ajouté",
}