Gitfed
bastien-mrq/gitfed / internal / i18n / strings_fr.go
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é",
}