fr.yml 1028 lignes · 51066 octets
# Traductions françaises — rustwarden-ui
# Sections : login, pages utilisateur, admin, navigation

# Connexion
login:
  title: "Connexion"
  page_title: "Connexion"
  page_description: "Connexion à votre compte"
  subtitle: "Connectez-vous à votre compte"
  username: "Nom d'utilisateur ou email"
  password: "Mot de passe"
  submit: "Se connecter"
  remember_me: "Se souvenir de moi"
  tab_login: "Connexion"
  tab_register: "Inscription"
  register_title: "Créer un compte"
  register_submit: "Créer mon compte"
  username_placeholder: "Nom d'utilisateur ou email"
  password_placeholder: "Votre mot de passe"
  username_placeholder_register: "Votre nom d'utilisateur (min. 3 caractères)"
  username_pattern_register: "Minuscules, chiffres et tirets uniquement, 3 à 39 caractères"
  password_placeholder_register: "Votre mot de passe (min. 8 caractères)"
  email_placeholder: "votre@email.com"
  forgot_password: "Mot de passe oublié ?"
  email_not_verified: "Email non vérifié ?"
  resend_verification: "Renvoyer l'email de validation"
  already_have_account: "Déjà un compte ?"
  sign_in_link: "Se connecter"
  success_message: "Connexion réussie ! Redirection..."
  error_message: "Erreur de connexion. Vérifiez vos identifiants."
  email_unverified_message: "Votre email n'est pas vérifié. Cliquez ci-dessous pour renvoyer le lien."
  resend_button: "Renvoyer l'email de validation"
  resend_success: "Email de validation renvoyé si le compte existe."
  resend_error: "Impossible d'envoyer la demande pour l'instant."
  resend_prompt: "Veuillez renseigner votre email avant de renvoyer."
  register_success: "Compte créé avec succès ! Veuillez vérifier votre email."
  register_error: "Erreur lors de l'inscription"
  email_label: "Email"
  footer_text: "Comptes et authentification"

# Demande de lien de réinitialisation
forgot_password:
  page_title: "Mot de passe oublié"
  title: "Mot de passe oublié"
  subtitle: "Entrez votre adresse email. Si un compte existe, un lien de réinitialisation vous sera envoyé."
  email_label: "Adresse email"
  email_placeholder: "vous@example.com"
  submit: "Envoyer le lien"
  back_to_login: "Revenir à la connexion"
  error_default: "Impossible d'envoyer la demande."
  success_default: "Si un compte existe pour cette adresse, un email de réinitialisation a été envoyé."
  error_missing_email: "Veuillez renseigner votre email."
  error_cannot_send: "Impossible d'envoyer la demande pour l'instant."

# Renvoyer l'email de validation
resend_verification:
  page_title: "Renvoyer l'email de validation - RustWarden"
  title: "Renvoyer l'email de validation"
  subtitle: "Entrez votre adresse email pour recevoir un nouveau lien de validation."
  email_label: "Adresse email"
  email_placeholder: "vous@example.com"
  submit: "Envoyer le lien de validation"
  back_to_login: "Revenir à la connexion"
  error_default: "Impossible d'envoyer la demande."
  success_default: "Si le compte existe et n'est pas vérifié, un email a été envoyé."
  error_missing_email: "Veuillez renseigner votre email."
  error_cannot_send: "Impossible d'envoyer la demande pour l'instant."

# Réinitialisation de mot de passe (via lien email)
password_reset:
  page_title: "Réinitialiser le mot de passe"
  title: "Réinitialiser le mot de passe"
  subtitle: "Entrez votre nouveau mot de passe ci-dessous."
  new_password_label: "Nouveau mot de passe"
  new_password_placeholder: "Nouveau mot de passe sécurisé"
  requirements: "⚠️ Doit contenir : 8+ caractères, majuscule, minuscule, chiffre, caractère spécial"
  confirm_password_label: "Confirmer le mot de passe"
  confirm_password_placeholder: "Confirmez votre nouveau mot de passe"
  missing_token_url: "Token de réinitialisation manquant dans l'URL."
  missing_token: "Token de réinitialisation manquant."
  missing_new_password: "Veuillez entrer un nouveau mot de passe."
  passwords_not_match: "Les mots de passe ne correspondent pas."
  success_message: "Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter."
  error_link_invalid: "Impossible de réinitialiser le mot de passe. Le lien peut être expiré ou invalide."
  error_generic: "Impossible de réinitialiser le mot de passe pour l'instant."

# Page 2FA login
login_2fa:
  page_title: "Vérification 2FA"
  title: "Vérification en deux étapes"
  subtitle: "Entrez le code de votre application d'authentification"
  code_label: "Code d'authentification"
  backup_code_label: "Code de secours"
  verify_button: "Vérifier"
  use_backup_code: "Utiliser un code de secours"
  use_totp_code: "Utiliser le code de l'application"
  back_to_login: "Retour à la connexion"
  error_invalid_code: "Code invalide. Veuillez réessayer."
  error_network: "Erreur réseau. Veuillez réessayer."

# Sécurité 2FA
settings_security:
  page_title: "Sécurité - RustWarden"
  title: "Authentification à deux facteurs"
  subtitle: "Protégez votre compte avec une couche de sécurité supplémentaire"
  totp_title: "Authentification TOTP"
  status_enabled: "Activé"
  status_disabled: "Désactivé"
  enabled_message: "Votre compte est protégé par l'authentification à deux facteurs."
  disabled_message: "Ajoutez une couche de sécurité supplémentaire à votre compte en activant l'authentification à deux facteurs via une application comme Google Authenticator ou Authy."
  enable_button: "Activer le 2FA"
  disable_button: "Désactiver le 2FA"
  scan_qr: "Scannez ce QR code avec votre application d'authentification"
  manual_entry: "Ou entrez ce code manuellement"
  enter_code: "Entrez le code à 6 chiffres de votre application"
  verify_button: "Vérifier et activer"
  backup_codes_title: "Codes de secours"
  backup_codes_warning: "Conservez ces codes dans un endroit sûr. Chaque code ne peut être utilisé qu'une seule fois."
  backup_codes_remaining: "Codes de secours restants"
  regenerate_button: "Régénérer les codes"
  regenerate_confirm: "Êtes-vous sûr ? Les anciens codes seront remplacés."
  confirm_disable: "Entrez votre mot de passe pour désactiver le 2FA"
  password_label: "Mot de passe actuel"
  copy_button: "Copier"
  saved_codes_button: "J'ai sauvegardé mes codes"
  breadcrumb: "Sécurité"
  force_2fa_message: "L'administrateur exige l'activation de l'authentification à deux facteurs. Vous devez configurer le 2FA avant de pouvoir accéder au reste de l'application."
  force_2fa_logout: "Se déconnecter"

# Paramètres
settings:
  title: "Paramètres"
  page_title: "Paramètres - RustWarden"
  subtitle: "Gérez vos préférences et paramètres de compte"
  profile_title: "Mon Profil"
  profile_desc: "Modifiez vos informations personnelles (nom d'utilisateur, email)"
  password_title: "Mot de passe"
  password_desc: "Changez votre mot de passe pour sécuriser votre compte"
  sessions_title: "Sessions actives"
  sessions_desc: "Gérez vos sessions actives et révoquez l'accès depuis d'autres appareils"
  preferences_title: "Préférences"
  preferences_desc: "Personnalisez votre expérience (thème, langue)"
  access: "Accéder"
  info_title: "Informations"
  info_desc: "Utilisez les sections ci-dessus pour gérer différents aspects de votre compte. Toutes les modifications sont sécurisées et nécessitent votre authentification."
  language: "Langue"
  language_description: "Choisissez votre langue préférée"
  save: "Enregistrer"
  saved: "Paramètres enregistrés"

# Page d'accueil
home:
  welcome: "Bienvenue, {username} !"
  subtitle: "Bienvenue sur votre espace personnel"
  my_account: "Mon Compte"
  stat_username: "Nom d'utilisateur"
  stat_email: "Email"
  stat_member_since: "Membre depuis"
  stat_roles: "Rôles"

# Préférences
preferences:
  title: "Préférences d'affichage"
  page_title: "Préférences d'affichage"
  subtitle: "Personnalisez l'apparence de l'interface"
  theme: "Thème"
  theme_light: "Clair"
  theme_light_desc: "Interface lumineuse et épurée"
  theme_dark: "Sombre"
  theme_dark_desc: "Réduit la fatigue oculaire"
  theme_auto: "Automatique"
  theme_auto_desc: "S'adapte à l'heure de la journée"
  theme_preview: "Le thème sera appliqué immédiatement après l'enregistrement"
  language: "Langue"
  language_fr: "Français"
  language_fr_desc: "Interface en français"
  language_en: "English"
  language_en_desc: "English interface"
  language_de: "Deutsch"
  language_de_desc: "Deutsche Benutzeroberfläche"
  language_es: "Español"
  language_es_desc: "Interfaz en español"
  language_it: "Italiano"
  language_it_desc: "Interface en italien"
  language_pt: "Português"
  language_pt_desc: "Interface en portugais"
  translation_warning: "La traduction complète de l'interface est en cours de développement. Certains éléments peuvent rester en français."
  modified: "Préférences modifiées"
  modified_desc: "Enregistrez vos changements pour les appliquer"
  save: "Enregistrer les préférences"
  saving: "Enregistrement..."
  cancel: "Annuler"
  saved_success: "Préférences enregistrées avec succès !"
  saved_reload: "Préférences enregistrées avec succès !\n\nLa langue a été modifiée. Voulez-vous recharger la page maintenant pour appliquer les changements ?"
  error: "Erreur : {message}"
  network_error: "Erreur réseau. Veuillez réessayer."
  sync_title: "Vos préférences sont synchronisées"
  sync_desc: "Vos préférences d'affichage sont enregistrées et s'appliquent automatiquement sur tous vos appareils connectés à votre compte."
  preview_dark: "Aperçu : Thème sombre sera appliqué"
  preview_light: "Aperçu : Thème clair sera appliqué"
  preview_auto: "Aperçu : Thème automatique sera appliqué"

# Profil
profile:
  title: "Mon Profil"
  page_title: "Mon Profil"
  subtitle: "Modifiez vos informations personnelles"
  account_info: "Informations du compte"
  username: "Nom d'utilisateur"
  username_public: "Visible publiquement"
  username_placeholder: "Votre nom d'utilisateur"
  username_pattern: "Minuscules, chiffres et tirets uniquement, 3 à 39 caractères"
  email: "Email"
  email_placeholder: "votre@email.com"
  save: "Enregistrer les modifications"
  saving: "Enregistrement..."
  saved: "Profil mis à jour avec succès"
  error: "Erreur lors de la mise à jour du profil"
  email_label: "Adresse email"
  email_used_for: "Utilisée pour la connexion"
  email_warning: "L'adresse actuelle ne se modifie pas ici."
  email_change_info: "Un lien de confirmation est envoyé à la nouvelle adresse. L'adresse actuelle reçoit un avis. Le compte ne change qu'après confirmation."
  email_change_title: "Changer l'adresse email"
  new_email_label: "Nouvelle adresse"
  current_password_label: "Mot de passe actuel"
  request_button: "Demander le changement"
  email_change_error: "Impossible d'envoyer la demande."
  network_error: "Erreur réseau. Veuillez réessayer."
  username_help: "3 à 39 caractères (a-z, 0-9, -)"
  additional_info: "Informations supplémentaires"
  account_created: "Compte créé le"
  roles: "Rôles"
  linked_accounts_title: "Comptes liés"
  no_linked_accounts: "Aucun compte externe lié."
  linked_since: "Lié depuis"
  unlink_button: "Délier"
  unlink_confirm: "Êtes-vous sûr de vouloir délier ce compte ?"
  unlink_error: "Impossible de délier ce compte."
  cannot_unlink_last: "Impossible de supprimer votre dernier moyen d'authentification."

# Breadcrumb
breadcrumb:
  home: "Accueil"
  settings: "Paramètres"
  admin: "Administration"
  preferences: "Préférences"
  profile: "Profil"
  password: "Mot de passe"
  users: "Utilisateurs"
  sessions: "Sessions"

# Admin
admin:
  dashboard:
    title: "Administration"
    heading: "Tableau de bord Administrateur"
    users_card_title: "Utilisateurs"
    users_card_subtitle: "Total utilisateurs"
    access_button: "Accéder"
    sessions_card_title: "Sessions actives"
    sessions_card_subtitle: "Sessions en cours"
    admins_card_title: "Administrateurs"
    admins_card_subtitle: "Comptes admin"
    last_activity_card_title: "Dernière activité"
    last_activity_card_subtitle: "Dernière connexion"
    audit_section_title: "Statistiques des logs d'audit"
    audit_total_logs: "Total des logs"
    audit_last_24h: "Dernières 24h"
    audit_by_level: "Par niveau"
    chart_label: "Logs par niveau"
    view_logs: "Voir les logs"
    logs_card_title: "Logs d'audit"
    logs_card_desc: "Dernières actions enregistrées : changements d'email, connexions bloquées."
    roles_card_title: "Gestion des Rôles"
    roles_card_desc: "Gérer les rôles et les permissions granulaires"
    roles_stat_title: "Rôles"
    settings_card_title: "Paramètres Application"
    settings_card_desc: "Configurer les paramètres globaux de l'application"
    apps_card_title: "Gestion des Applications"
    apps_card_desc: "Activer ou désactiver les applications modulaires"
    fediverse_card_title: "Fédération ActivityPub"
    fediverse_card_desc: "Réglages, liste de confiance, file d'envoi, sessions distantes, NodeInfo"
    orgs_card_title: "Gestion des Organisations"
    orgs_card_desc: "Créer et gérer les organisations et leurs membres"
    orgs_stat_title: "Organisations"
    orgs_members_stat_title: "Membres totaux"
  logs:
    page_title: "Logs d'audit"
    heading: "Logs d'audit"
    empty: "Aucune entrée pour le moment."
    col_date: "Date"
    col_level: "Niveau"
    col_action: "Action"
    col_message: "Message"
  roles_list:
    page_title: "Gestion des rôles"
    breadcrumb_roles: "Rôles"
    title: "Rôles"
    create_role: "Créer un rôle"
    table_name: "Nom"
    table_description: "Description"
    table_users: "Utilisateurs"
    table_permissions: "Permissions"
    table_actions: "Actions"
    edit: "Modifier"
    delete: "Supprimer"
    no_roles: "Aucun rôle trouvé."
    protected_hint: "Protégé"
    delete_confirm_title: "Confirmer la suppression"
    delete_confirm_message: "Êtes-vous sûr de vouloir supprimer le rôle"
    delete_button: "Supprimer"
  role_form:
    title_create: "Créer un rôle"
    title_edit: "Modifier le rôle"
    breadcrumb_create: "Créer"
    breadcrumb_edit: "Modifier"
    back_to_list: "Retour à la liste"
    name_label: "Nom du rôle"
    name_placeholder: "ex: moderator"
    description_label: "Description"
    description_placeholder: "Description du rôle..."
    permissions_label: "Permissions"
    protected_name_hint: "Le nom de ce rôle ne peut pas être modifié."
    cancel: "Annuler"
    submit_create: "Créer le rôle"
    submit_edit: "Enregistrer les modifications"
  errors:
    title: "Codes d'Erreur"
    description: "Documentation des codes d'erreur de l'application. Chaque code d'erreur est associé à un middleware et fournit des informations de contexte pour le débogage."
    breadcrumb_errors: "Codes d'Erreur"
    table_code: "Code"
    table_description: "Description"
    table_category: "Catégorie"
    table_middleware: "Middleware"
    table_context: "Contexte"
    table_example: "Exemple"
    legend_title: "Légende"
    legend_code: "Identifiant unique de l'erreur (format: CATEGORY_NUMBER)"
    legend_description: "Description en français de l'erreur"
    legend_category: "Type d'erreur (Authentification, CSRF, Rate Limiting, etc.)"
    legend_middleware: "Middleware responsable de générer cette erreur"
    legend_context: "Explication détaillée de quand cette erreur se produit"
    legend_example: "Exemple concret de situation générant cette erreur"
    error_auth001_desc: "Identifiants invalides"
    error_auth001_category: "Authentification"
    error_auth001_context: "L'utilisateur a fourni des identifiants incorrects lors de la connexion"
    error_auth001_example: "Tentative de connexion avec un mot de passe incorrect"
    error_auth002_desc: "Token invalide"
    error_auth002_category: "Authentification"
    error_auth002_context: "Le token JWT fourni est invalide ou malformé"
    error_auth002_example: "Token JWT corrompu ou signé avec une clé différente"
    error_auth003_desc: "Token expiré"
    error_auth003_category: "Authentification"
    error_auth003_context: "Le token JWT a expiré et doit être renouvelé"
    error_auth003_example: "Tentative d'accès avec un token expiré après la durée de validité"
    error_csrf001_desc: "Token CSRF manquant"
    error_csrf001_category: "CSRF Protection"
    error_csrf001_context: "La requête POST/PUT/DELETE ne contient pas de token CSRF"
    error_csrf001_example: "Formulaire soumis sans token CSRF dans le header ou le body"
    error_csrf002_desc: "Token CSRF invalide"
    error_csrf002_category: "CSRF Protection"
    error_csrf002_context: "Le token CSRF fourni ne correspond pas au token de la session"
    error_csrf002_example: "Token CSRF modifié ou volé"
    error_rate001_desc: "Limite de taux dépassée"
    error_rate001_category: "Rate Limiting"
    error_rate001_context: "Le nombre de requêtes par minute a été dépassé"
    error_rate001_example: "Plus de 100 requêtes/min sur les endpoints admin"
    error_valid001_desc: "Données d'entrée invalides"
    error_valid001_category: "Validation"
    error_valid001_context: "Les données fournies ne respectent pas les règles de validation"
    error_valid001_example: "Email au format invalide ou champ requis manquant"
    error_valid002_desc: "Complexité du mot de passe non respectée"
    error_valid002_category: "Validation"
    error_valid002_context: "Le mot de passe ne respecte pas les règles de complexité configurées"
    error_valid002_example: "Mot de passe trop court ou ne contenant pas les caractères requis"
    error_rbac001_desc: "Permissions insuffisantes"
    error_rbac001_category: "Autorisation"
    error_rbac001_context: "L'utilisateur n'a pas les permissions nécessaires pour cette action"
    error_rbac001_example: "Utilisateur non-admin tentant d'accéder à /admin/users"
    error_rbac002_desc: "Rôle administrateur requis"
    error_rbac002_category: "Autorisation"
    error_rbac002_context: "L'action nécessite le rôle administrateur"
    error_rbac002_example: "Tentative de suppression d'utilisateur sans rôle admin"
    error_db001_desc: "Erreur d'opération de base de données"
    error_db001_category: "Base de données"
    error_db001_context: "Une opération de base de données a échoué"
    error_db001_example: "Contrainte de clé étrangère violée ou connexion DB perdue"
    error_db002_desc: "Ressource non trouvée"
    error_db002_category: "Base de données"
    error_db002_context: "La ressource demandée n'existe pas dans la base de données"
    error_db002_example: "Utilisateur avec ID inexistant"
  user_form:
    breadcrumb_create: "Créer"
    breadcrumb_edit: "Modifier"
    title_create: "Créer un utilisateur"
    title_edit: "Modifier un utilisateur"
    back_to_list: "Retour à la liste"
    username_label: "Nom d'utilisateur"
    username_placeholder: "nom-utilisateur"
    username_pattern: "Minuscules, chiffres et tirets uniquement, 3 à 39 caractères"
    username_readonly_hint: "Le nom d'utilisateur ne peut pas être modifié après création"
    email_label: "Email"
    email_placeholder: "utilisateur@example.com"
    email_change_hint: "Changer l'adresse l'écrit tout de suite, marque l'email comme vérifié et ferme les sessions de cet utilisateur."
    password_label: "Mot de passe"
    password_optional: "Optionnel"
    password_placeholder: "Laisser vide pour générer un mot de passe aléatoire"
    password_hint: "Si laissé vide, un mot de passe sécurisé sera généré automatiquement"
    roles_label: "Rôles"
    roles_hint: "Sélectionnez au moins un rôle"
    must_change_password_label: "Forcer le changement de mot de passe"
    must_change_password_desc: "L'utilisateur devra changer son mot de passe à la prochaine connexion"
    cancel: "Annuler"
    submit_create: "Créer l'utilisateur"
    submit_edit: "Enregistrer les modifications"
  settings:
    title: "Paramètres de l'Application"
    page_title: "Paramètres de l'Application - Admin"
    subtitle: "Configuration globale de l'application"
    general: "Général"
    app_name: "Nom de l'application"
    app_domain: "Domaine"
    app_domain_placeholder: "example.com"
    app_description: "Description"
    allow_registration: "Permettre l'enregistrement"
    allow_registration_desc: "Les utilisateurs peuvent créer des comptes depuis la page d'accueil"
    email_validation_required: "Validation email requise"
    email_validation_required_desc: "Les utilisateurs doivent valider leur email avant de pouvoir se connecter"
    save: "Enregistrer les paramètres"
    cancel: "Annuler"
    saved: "Paramètres enregistrés avec succès"
    error: "Erreur lors de l'enregistrement"
    network_error: "Erreur réseau. Veuillez réessayer."
    password_security: "Sécurité des Mots de Passe"
    password_min_length: "Longueur minimale"
    password_min_length_hint: "Entre 6 et 128 caractères"
    password_complexity: "Exigences de complexité"
    require_uppercase: "Majuscule requise"
    require_lowercase: "Minuscule requise"
    require_digits: "Chiffre requis"
    require_special: "Caractère spécial requis"
    password_change_require_email: "Confirmation par email du changement de mot de passe"
    password_change_require_email_desc: "Lorsqu'activé, un email de confirmation est envoyé pour valider tout changement de mot de passe. Sinon, le changement est appliqué immédiatement."
    password_expiration: "Expiration des mots de passe"
    password_expiration_desc: "Forcer le changement périodique"
    expiration_days: "Expiration après (jours)"
    expiration_alert: "Alerte email avant expiration"
    expiration_alert_days: "Alerte (jours avant)"
    audit_logging: "Journalisation des Audits"
    log_level: "Niveau de log"
    log_level_debug: "DEBUG - Tous les détails"
    log_level_info: "INFO - Informations normales"
    log_level_warn: "WARN - Avertissements uniquement"
    log_level_error: "ERROR - Erreurs uniquement"
    log_level_hint: "Contrôle la verbosité des logs d'audit"
    log_retention: "Rétention des logs (jours)"
    log_retention_hint: "Durée de conservation des logs (1-365 jours)"
    audit_info_message: "Les logs d'audit enregistrent toutes les actions administratives (création, modification, suppression d'utilisateurs)."
    save_changes: "Sauvegarder les modifications"
    save_changes_desc: "Les paramètres seront appliqués immédiatement"
    saving: "Enregistrement..."
    save_success: "Paramètres enregistrés avec succès !"
    save_error_prefix: "Erreur"
    oauth_sso_title: "OAuth / SSO"
    oauth_enabled_label: "Activer OAuth"
    oauth_enabled_desc: "Autorise la connexion via des fournisseurs externes (Google, GitHub, etc.)"
    oauth_redirect_url_label: "URL de redirection de base"
    oauth_redirect_url_desc: "URL de base pour les callbacks OAuth (ex: https://monapp.example.com)"
    oauth_auto_register_label: "Auto-inscription"
    oauth_auto_register_desc: "Créer automatiquement un compte si l'email n'existe pas"
    oauth_link_existing_label: "Lier les comptes existants"
    oauth_link_existing_desc: "Lier automatiquement un compte OAuth si l'email vérifié correspond"
    oauth_client_id: "Client ID"
    oauth_client_secret: "Client Secret"
    oauth_tenant: "Tenant ID"
    oauth_redirect_uri: "URI de redirection"
    oauth_copy_uri: "Copier"
    oauth_secret_configured: "Configuré"
    oauth_secret_not_configured: "Non configuré"
    oauth_secret_change: "Modifier"
    oauth_restart_warning: "Les modifications de credentials nécessitent un redémarrage de l'application."
    oauth_env_info: "Les credentials peuvent aussi être configurées via variables d'environnement (OAUTH_*_CLIENT_ID, etc.)."
    oauth_google_label: "Google"
    oauth_google_desc: "OpenID Connect"
    oauth_github_label: "GitHub"
    oauth_github_desc: "OAuth2"
    oauth_discord_label: "Discord"
    oauth_discord_desc: "OAuth2"
    oauth_microsoft_label: "Microsoft"
    oauth_microsoft_desc: "OpenID Connect"
    # Audience measurement. The script URL is read-only here: it feeds
    # the CSP, which is frozen at startup (see config::analytics).
    analytics_title: 'Mesure d''audience'
    analytics_desc: 'Script de suivi tiers injecté dans les pages. L''adresse du script se configure par variable d''environnement ; les réglages ci-dessous s''appliquent sans redémarrage.'
    analytics_enabled_label: 'Activer la mesure d''audience'
    analytics_enabled_desc: 'Lorsque désactivé, aucun script de suivi n''est envoyé aux visiteurs.'
    analytics_site_id_label: 'Identifiant du site'
    analytics_site_id_desc: 'Fourni par votre service de mesure d''audience.'
    analytics_attributes_label: 'Attributs supplémentaires'
    analytics_attributes_desc: 'Objet JSON d''attributs data-*, par exemple une paire data-consent / opt-in.'
    analytics_script_url_label: 'Adresse du script'
    analytics_script_url_desc: 'Lecture seule : cette adresse alimente la politique de sécurité du contenu, figée au démarrage. Elle se configure via ANALYTICS_SCRIPT_URL.'
    analytics_not_configured: 'Aucun script de mesure d''audience n''est configuré. Définissez ANALYTICS_SCRIPT_URL puis redémarrez l''application pour activer cette section.'
  users_list:
    page_title: "Gestion des Utilisateurs - Admin"
    title: "Gestion des Utilisateurs"
    breadcrumb_users: "Utilisateurs"
    create_user: "Créer un utilisateur"
    search_label: "Rechercher"
    search_placeholder: "Nom d'utilisateur ou email..."
    role_filter_label: "Rôle"
    all_roles: "Tous les rôles"
    per_page_label: "Par page"
    search_button: "Rechercher"
    results_summary: "Affichage de {count} utilisateur(s) sur {total} total"
    page_info: "Page {page} sur {total_pages}"
    table_username: "Nom d'utilisateur"
    table_email: "Email"
    table_roles: "Rôles"
    table_created_at: "Créé le"
    table_last_login: "Dernière connexion"
    table_actions: "Actions"
    never: "Jamais"
    edit: "Modifier"
    delete: "Supprimer"
    reset_password: "Réinitialiser le mot de passe"
    no_users: "Aucun utilisateur trouvé"
    reset_password_title: "Réinitialiser le mot de passe"
    reset_generate: "Générer un mot de passe aléatoire"
    reset_custom: "Définir un mot de passe personnalisé"
    reset_email: "Réinitialiser par email"
    reset_new_password_label: "Nouveau mot de passe"
    reset_new_password_placeholder: "Minimum 8 caractères, majuscule, minuscule, chiffre, caractère spécial"
    reset_password_requirements: "⚠️ Doit contenir : 8+ caractères, majuscule, minuscule, chiffre, caractère spécial"
    reset_invalidate_sessions: "Invalider toutes les sessions actives de cet utilisateur"
    reset_invalidate_sessions_desc: "L'utilisateur devra se reconnecter après le changement"
    reset_button: "Réinitialiser"
    delete_confirm_title: "⚠️ Confirmer la suppression"
    delete_confirm_message: "Êtes-vous sûr de vouloir supprimer cet utilisateur ?"
    delete_confirm_username: "Nom d'utilisateur :"
    delete_confirm_email: "Email :"
    delete_irreversible: "Cette action est irréversible !"
    delete_button: "Supprimer définitivement"
    edit_user_title: "Modifier l'utilisateur"
    delete_error: "Erreur lors de la suppression de l'utilisateur"
    network_error: "Erreur réseau"
    resetting: "Réinitialisation..."
    reset_by_email_title: "Réinitialisation par email"
    close: "Fermer"
    password_reset_success_title: "Mot de passe réinitialisé"
    password_warning_once: "Ce mot de passe ne sera affiché qu'une seule fois. Copiez-le maintenant !"
    new_password_label: "Nouveau mot de passe"
    copy: "Copier"
    password_copied: "Mot de passe copié dans le presse-papiers"
    password_set_success: "Mot de passe réinitialisé avec succès"
    reset_error: "Erreur lors de la réinitialisation du mot de passe"

# Password Change
password:
  title: "Changer mon mot de passe"
  page_title: "Changer mon mot de passe"
  subtitle: "Modifiez votre mot de passe pour sécuriser votre compte. Un email de confirmation vous sera envoyé pour valider le changement."
  subtitle_no_email: "Modifiez votre mot de passe pour sécuriser votre compte."
  must_change_message: "⚠️ Vous devez changer votre mot de passe avant de continuer."
  new_password: "Nouveau mot de passe"
  current_password: "Mot de passe actuel"
  current_password_placeholder: "Votre mot de passe actuel"
  new_password_placeholder: "Nouveau mot de passe sécurisé"
  required: "Requis"
  requirements: "📌 Respectez les exigences de complexité indiquées ci-dessous."
  strength: "Force du mot de passe :"
  strength_weak: "Faible"
  strength_medium: "Moyen"
  strength_strong: "Fort ✓"
  strength_too_short: "trop court"
  strength_missing_lowercase: "minuscule manquante"
  strength_missing_uppercase: "majuscule manquante"
  strength_missing_digit: "chiffre manquant"
  strength_missing_special: "caractère spécial manquant"
  confirm_password: "Confirmer le nouveau mot de passe"
  confirm_password_placeholder: "Répétez le nouveau mot de passe"
  passwords_match: "✓ Les mots de passe correspondent"
  passwords_not_match: "✗ Les mots de passe ne correspondent pas"
  change_button: "Changer le mot de passe"
  changing: "Changement en cours..."
  logout_warning_title: "Déconnexion des autres sessions"
  logout_warning_desc: "Toutes vos autres sessions actives seront automatiquement déconnectées après le changement de mot de passe. Seule votre session actuelle restera active."
  save: "Enregistrer le nouveau mot de passe"
  saving: "Enregistrement..."
  saved: "Un email de confirmation a été envoyé à votre adresse. Cliquez sur le lien dans l'email pour valider le changement de mot de passe."
  saved_direct: "Mot de passe changé avec succès ! Vos autres sessions ont été déconnectées."
  error: "Erreur lors de la modification du mot de passe"
  error_all_fields_required: "Tous les champs sont requis."
  error_empty_data: "Les données à envoyer sont vides."
  error_invalid_data: "Données invalides. Vérifiez que tous les champs sont remplis."
  error_incorrect_current: "Mot de passe actuel incorrect."
  error_reading_response: "Erreur lors de la lecture de la réponse du serveur"
  error_415: "Erreur 415 : Le serveur n'a pas reçu les données au format JSON attendu. Veuillez réessayer."
  network_error: "Erreur réseau. Veuillez réessayer."
  security_tips_title: "Conseils de sécurité"
  security_tip_unique: "Utilisez un mot de passe unique que vous n'utilisez pas ailleurs"
  security_tip_share: "Ne partagez jamais votre mot de passe avec qui que ce soit"
  security_tip_regular: "Changez votre mot de passe régulièrement (tous les 3-6 mois)"
  security_tip_2fa: "Activez l'authentification à deux facteurs si disponible"
  security_tip_manager: "Utilisez un gestionnaire de mots de passe pour plus de sécurité"
  pending_request_message: "⚠️ Une demande de changement de mot de passe est en attente de confirmation par email."
  pending_request_info: "Un email de confirmation a été envoyé à votre adresse. Cliquez sur le lien dans l'email pour confirmer le changement."
  pending_request_cancel: "Annuler la demande en attente"
  pending_request_canceled: "Demande annulée avec succès"
  pending_request_cancel_error: "Erreur lors de l'annulation de la demande"
  confirmation_sent: "Email de confirmation envoyé ! Vérifiez votre boîte de réception."
  confirmation_error: "Erreur lors de l'envoi de l'email de confirmation"

# Sessions
sessions:
  title: "Sessions actives"
  page_title: "Sessions actives"
  subtitle: "Gérez les appareils connectés à votre compte"
  current_session: "Session actuelle"
  current_badge: "Actuelle"
  unknown_device: "Appareil inconnu"
  ip_address: "Adresse IP :"
  created_at: "Créée le :"
  last_activity: "Dernière activité :"
  session_id: "ID Session :"
  revoke: "Révoquer"
  revoke_confirm: "Êtes-vous sûr de vouloir révoquer la session pour \"{device}\" ?\n\nCet appareil sera déconnecté immédiatement."
  revoke_success: "Session révoquée avec succès !"
  revoke_error: "Erreur lors de la révocation de la session"
  no_sessions: "Aucune session active"
  no_sessions_desc: "Vous n'avez actuellement aucune session active"
  danger_zone: "Zone de danger"
  danger_zone_desc: "Déconnectez tous les autres appareils en une seule action (votre session actuelle restera active)."
  revoke_all: "Révoquer toutes les autres sessions"
  revoke_all_confirm: "⚠️ ATTENTION\n\nÊtes-vous sûr de vouloir révoquer TOUTES vos autres sessions ?\n\nTous vos autres appareils seront déconnectés. Seule votre session actuelle restera active."
  revoke_all_success: "Toutes les autres sessions ont été révoquées !"
  revoke_all_error: "Erreur lors de la révocation. Certaines sessions n'ont peut-être pas été révoquées."
  about_title: "À propos des sessions"
  about_desc: "Une session est créée à chaque connexion depuis un appareil ou navigateur différent. Révoquer une session déconnecte immédiatement cet appareil. Votre session actuelle ne peut pas être révoquée depuis cette page (déconnectez-vous pour cela)."
  back_to_settings: "Retour aux paramètres"

# Navigation menu (navbar)
nav:
  home: "Accueil"
  settings: "Paramètres"
  admin: "Administration"

# User menu
user_menu:
  profile: "Profil"
  logout: "Déconnexion"
  settings: "Paramètres"

# Organisations
organisations:
  list:
    title: "Gestion des Organisations"
    create: "Créer une organisation"
    search: "Rechercher"
    search_placeholder: "Nom ou description..."
    no_organisations: "Aucune organisation trouvée"
    results_summary: "Résultats"
    manage_members: "Gérer les membres"
    table:
      name: "Nom"
      description: "Description"
      members: "Membres"
      created_at: "Créée le"
      actions: "Actions"
  create:
    title: "Créer une organisation"
    submit: "Créer"
    success: "Organisation créée avec succès"
    error:
      already_exists: "L'organisation '{gid}' existe déjà"
      invalid_gid: "Format de gid invalide: {gid}"
      generic: "Une erreur est survenue lors de la création de l'organisation"
  edit:
    title: "Modifier l'organisation"
    submit: "Enregistrer"
  update:
    success: "Organisation mise à jour avec succès"
  delete:
    success: "Organisation supprimée avec succès"
    confirm: "Êtes-vous sûr de vouloir supprimer cette organisation ? Cette action est irréversible."
  form:
    name_label: "Nom"
    name_placeholder: "Nom de l'organisation"
    description_label: "Description"
    description_placeholder: "Description de l'organisation (optionnel)"
    gid_label: "Identifiant (GID)"
    gid_placeholder: "identifiant-unique"
    gid_help: "Identifiant unique (lettres, chiffres, underscores uniquement, max 64 caractères)"
  members:
    title: "Membres de l'organisation"
    add_member: "Ajouter un membre"
    search_user_label: "Rechercher un utilisateur"
    search_user_placeholder: "Nom d'utilisateur ou email..."
    no_members: "Aucun membre dans cette organisation"
    back_to_list: "Retour à la liste"
    table:
      username: "Nom d'utilisateur"
      role: "Rôle"
      joined_at: "Rejoint le"
      actions: "Actions"
    add_success: "Membre ajouté avec succès"
    remove_success: "Membre retiré avec succès"
    add_error: "Erreur lors de l'ajout du membre"
    remove_error: "Erreur lors du retrait du membre"
    user_not_found: "Utilisateur '{search}' non trouvé"
    error:
      organisation_not_found: "Organisation '{gid}' non trouvée"
      already_member: "Cet utilisateur est déjà membre de l'organisation"

# Sharing
sharing:
  modal:
    title: "Partager une ressource"
    resource_label: "Ressource"
    resource_type_label: "Type"
    expiration_label: "Date d'expiration (optionnel)"
    expiration_help: "Le partage expirera automatiquement à cette date"
    cancel_button: "Annuler"
    submit_button: "Partager"
    close_button: "Fermer"
    success_message: "Partage créé avec succès"
    error_message: "Erreur lors de la création du partage"
    error:
      already_exists: "Ce partage existe déjà pour cette ressource et cette organisation"
  components:
    share_button_label: "Partager"
    permissions_label: "Permissions"
    permissions_help: "Choisissez les permissions accordées pour ce partage"
    share_with_label: "Partager avec"
    user_tab_label: "Utilisateur"
    organisation_tab_label: "Organisation"
    select_user_label: "Sélectionner un utilisateur"
    search_user_placeholder: "Rechercher un utilisateur..."
    select_organisation_label: "Sélectionner une organisation"
    select_organisation_placeholder: "Choisir une organisation..."
    no_organisations_message: "Aucune organisation disponible"
  permissions:
    read_only: "Lecture seule"
    read_only_value: "1"
    read_only_description: "Peut uniquement consulter la ressource"
    read_write: "Lecture + Écriture"
    read_write_value: "3"
    read_write_description: "Peut consulter et modifier la ressource"
    all: "Toutes les permissions"
    all_value: "15"
    all_description: "Peut consulter, modifier, supprimer et partager"

# Fédération ActivityPub - RFC 0021 admin foundations
fediverse:
  settings:
    title: "Réglages fédération"
    breadcrumb: "Fédération"
    heading: "Réglages de la fédération ActivityPub"
    subtitle: "Activez et configurez la fédération avec les autres instances Rustwarden et compatibles ActivityPub. Fonctionnalité expérimentale."
    card_activation: "Activation"
    card_trust: "Confiance"
    card_interop: "Interopérabilité"
    card_security: "Sécurité avancée"
    enabled_label: "Activer la fédération ActivityPub (expérimental)"
    enabled_desc: "Quand désactivé, les routes /admin/fediverse/* hors cette page renvoient 404."
    trust_mode_label: "Mode de confiance"
    trust_mode_allowlist: "Liste blanche (zero-trust, recommandé)"
    trust_mode_open: "Ouvert avec liste de blocage (style Mastodon)"
    interop_scope_label: "Périmètre d'interopérabilité"
    interop_scope_rustwarden_only: "Rustwarden uniquement (refus poli des autres instances)"
    interop_scope_rustwarden_plus: "Rustwarden + lecture universelle"
    interop_scope_open: "Ouvert (toute instance ActivityPub)"
    authorized_fetch_label: "Authorized-fetch"
    authorized_fetch_desc: "Exiger une signature HTTP pour récupérer un acteur distant. À activer après audit."
    save_button: "Enregistrer"
    saved_toast: "Réglages enregistrés."
  trust:
    title: "Domaines de confiance"
    breadcrumb: "Confiance"
    heading: "Liste de confiance fédération"
    subtitle: "Gère les domaines acceptés ou bloqués pour la fédération ActivityPub. Le mode actif (liste blanche ou liste de blocage) est défini sur la page Réglages fédération."
    mode_allowlist: "Mode liste blanche (zero-trust)"
    mode_blocklist: "Mode liste de blocage (style Mastodon)"
    add_legend: "Ajouter un domaine"
    domain_label: "Domaine"
    domain_placeholder: "exemple.tld"
    note_label: "Note (optionnelle)"
    reason_label: "Raison du blocage (optionnelle)"
    severity_label: "Sévérité"
    severity_suspend: "Suspension (rejet total)"
    severity_silence: "Silence (filtrage discret)"
    severity_reject_auth: "Refus d'authentification uniquement"
    add_button: "Ajouter"
    table_domain: "Domaine"
    table_note_or_reason: "Note / Raison"
    table_severity: "Sévérité"
    table_created_at: "Ajouté le"
    table_actions: "Actions"
    delete_button: "Supprimer"
    delete_confirm_title: "Confirmer la suppression"
    delete_confirm_body: "Cette action est irréversible. Le domaine ci-dessous sera retiré de la liste active."
    modal_cancel: "Annuler"
    modal_confirm: "Confirmer la suppression"
    empty_title: "Liste vide"
    empty_body: "Aucun domaine n'est configuré. Ajoute un domaine pour commencer à fédérer."
    saved_toast: "Liste mise à jour."
  auth:
    error:
      page_title: "Erreur d'authentification fédérée"
      subtitle: "Une erreur est survenue lors de l'authentification ActivityPub."
      back_to_login: "Retour à la connexion"
      timeout:
        title: "Délai dépassé"
        body: "Votre instance d'origine n'a pas répondu dans le temps imparti. Vérifie qu'elle est joignable et réessaie dans quelques instants."
      rejected:
        title: "Demande refusée"
        body: "Votre instance d'origine a refusé la demande d'authentification. Si tu n'es pas à l'origine de cette tentative, ignore-la."
      untrusted:
        title: "Domaine non autorisé"
        body: "Le domaine de votre identité n'est pas dans la liste de confiance de cette instance. Contacte l'administrateur si tu penses que c'est une erreur."
      invalid_signature:
        title: "Signature invalide"
        body: "La signature de votre instance d'origine n'a pas pu être vérifiée. Cela peut indiquer une mauvaise configuration ou une tentative malveillante."
      unknown:
        title: "Erreur inconnue"
        body: "Une erreur inattendue est survenue. Réessaie ou contacte l'administrateur si le problème persiste."
    login:
      page_title: "Connexion ActivityPub"
      subtitle: "Connecte-toi avec une identité hébergée sur une autre instance fédérée."
      heading: "Se connecter avec une identité ActivityPub"
      field_label: "Identité"
      field_placeholder: "@user@instance.tld"
      field_help: "Format Mastodon : @ suivi du nom d'utilisateur, puis @, puis le domaine de l'instance."
      submit: "Continuer"
      back_to_login: "Retour à la connexion classique"
    waiting:
      page_title: "Authentification en cours"
      subtitle: "Patiente pendant que ton instance d'origine valide la demande."
      heading: "Authentification en cours…"
      explainer: "Ton instance d'origine doit confirmer ton identité. Cette page se mettra à jour automatiquement dès qu'une réponse arrive (jusqu'à 5 minutes)."
      cancel: "Annuler"
    consent:
      page_title: "Confirmer une connexion fédérée"
      heading: "Une instance demande une authentification"
      explainer: "Une instance fédérée veut t'authentifier auprès d'elle en ton nom. Vérifie le domaine et l'identité ci-dessous avant d'approuver."
      label_requester: "Domaine demandeur"
      label_handle: "Identité concernée"
      approve: "Approuver"
      reject: "Refuser"
      already_decided: "Cette demande a déjà été traitée."
  queue:
    title: "File outbound fédération"
    breadcrumb: "File outbound"
    heading: "Livraisons sortantes"
    subtitle: "Tableau de bord des activités ActivityPub à distribuer aux instances distantes. 100 dernières lignes affichées."
    stats_pending: "En attente"
    stats_delivered: "Livrées"
    stats_failed: "Échouées"
    stats_dead: "Mortes"
    table_activity: "Activité"
    table_target: "Cible"
    table_status: "Statut"
    table_attempts: "Tentatives"
    table_last_error: "Dernière erreur"
    table_next_retry: "Prochain essai"
    table_created_at: "Créée le"
    empty_title: "File vide"
    empty_body: "Aucune activité sortante. Le worker est sain ou la fédération n'a pas encore d'activité."
  sessions_remote:
    title: "Sessions distantes"
    breadcrumb: "Sessions distantes"
    heading: "Sessions distantes actives"
    subtitle: "Identités fédérées qui ont contacté cette instance et ne sont pas désactivées. Action de révocation = mise en disabled (les sessions JWT remote correspondantes seront rejetées)."
    kill_switch_legend: "Kill switch par domaine"
    kill_switch_label: "Désactiver toutes les identités d'un domaine"
    kill_switch_button: "Désactiver le domaine"
    kill_switch_confirm_title: "Confirmer le kill switch"
    kill_switch_confirm_body: "Toutes les identités fédérées du domaine ci-dessous seront mises en disabled. Cette action est irréversible côté UI (un nouveau login fédéré recréera la row)."
    table_handle: "Handle"
    table_display_name: "Nom affiché"
    table_domain: "Domaine"
    table_last_seen: "Vu pour la dernière fois"
    table_actions: "Actions"
    revoke_button: "Révoquer"
    revoke_confirm_title: "Confirmer la révocation"
    revoke_confirm_body: "Cette identité sera mise en disabled. La prochaine vérification JWT remote la rejettera."
    modal_cancel: "Annuler"
    modal_confirm: "Confirmer"
    empty_title: "Aucune session distante"
    empty_body: "Aucune identité fédérée n'a encore contacté cette instance, ou toutes ont été désactivées."
    saved_toast: "Action effectuée."
  admin:
    tabs:
      settings: "Réglages"
      trust_list: "Liste de confiance"
      queue: "File d'envoi"
      sessions_remote: "Sessions distantes"
      nodeinfo: "NodeInfo"
      invites: "Invitations"
    hub:
      title: "Fédération ActivityPub"
      subtitle: "Tableau de bord centralisé pour piloter la fédération avec d'autres instances Rustwarden et compatibles ActivityPub."
      card:
        settings:
          title: "Réglages"
          desc: "Activer la fédération, choisir le mode de confiance, le périmètre d'interopérabilité et l'authorized-fetch."
        trust_list:
          title: "Liste de confiance"
          desc: "Gérer les domaines acceptés (allowlist) ou bloqués (blocklist)."
        queue:
          title: "File d'envoi"
          desc: "Tableau de bord opérateur pour la file de livraison sortante (RFC 0011 + RFC 0019)."
        sessions_remote:
          title: "Sessions distantes"
          desc: "Identités fédérées actives, kill switch par identité ou par domaine."
        nodeinfo:
          title: "NodeInfo"
          desc: "Statistiques humaines de l'instance fédérée (NodeInfo 2.1)."
        invites:
          title: "Invitations"
          desc: "Inviter un compte distant à rejoindre une équipe (vue par équipe)."
    teams_for_invites:
      title: "Choisir une équipe pour gérer ses invitations"
      breadcrumb: "Invitations"
      heading: "Invitations fédérées par équipe"
      subtitle: "Sélectionnez une équipe pour voir et créer des invitations vers des comptes distants."
      empty_title: "Aucune équipe"
      empty_body: "Créez d'abord une équipe pour pouvoir y inviter des comptes fédérés."

# Communs (RFC 0024 Slice C iter. 3)
common:
  yes: "Oui"
  no: "Non"

# Stats NodeInfo (RFC 0024 Slice C iter. 3). Gardé en namespace
# top-level dédié pour ne pas re-ouvrir `fediverse:` (qui écraserait
# settings/trust/auth/queue/sessions_remote sous yaml-rust2).
fediverse_nodeinfo:
  title: "NodeInfo - Stats fédération"
  breadcrumb: "NodeInfo"
  heading: "NodeInfo - Stats humanisées"
  subtitle: "Vue d'ensemble de la configuration runtime + stats utilisateurs locaux et identités distantes."
  card_software: "Logiciel"
  card_runtime: "Configuration runtime"
  card_users: "Utilisateurs locaux"
  card_remotes: "Identités distantes"
  label_name: "Nom"
  label_version: "Version"
  label_domain: "Domaine"
  label_enabled: "Fédération activée"
  label_trust_mode: "Mode de confiance"
  label_interop_scope: "Périmètre interop"
  label_authorized_fetch: "Authorized-fetch"
  label_users_total: "Total"
  label_users_active_month: "Actifs 30j"
  label_users_active_halfyear: "Actifs 180j"
  label_remote_identities_active: "Actives"
  label_remote_distinct_domains: "Domaines distincts"

# Invitations cross-instance team (RFC 0024 Slice C iter. 4) — namespace
# top-level dédié pour ne pas re-ouvrir `fediverse:`.
fediverse_invites:
  title: "Invitations équipe fédérée"
  breadcrumb: "Invitations"
  heading: "Invitations cross-instance"
  subtitle: "Inviter une identité ActivityPub à rejoindre l'équipe :"
  add_legend: "Inviter par handle"
  handle_label: "Handle de l'utilisateur"
  handle_placeholder: "@user@instance.tld"
  role_label: "Rôle"
  role_member: "Membre"
  role_admin: "Administrateur"
  role_owner: "Propriétaire"
  add_button: "Envoyer l'invitation"
  table_handle: "Handle invité"
  table_role: "Rôle"
  table_status: "Statut"
  table_created_at: "Envoyée le"
  table_actions: "Actions"
  revoke_button: "Révoquer"
  revoke_confirm_title: "Confirmer la révocation"
  revoke_confirm_body: "L'invitation sera annulée. Si elle a déjà été acceptée, l'identité sera retirée de l'équipe par le signal Revoke{Membership} (RFC 0010)."
  modal_cancel: "Annuler"
  modal_confirm: "Confirmer"
  empty_title: "Aucune invitation"
  empty_body: "Aucune invitation n'a encore été envoyée pour cette équipe."
  saved_toast: "Action effectuée."

# Apps fédérées connectées (RFC 0024 Slice C iter. 5).
fediverse_connected_apps:
  page_title: "Apps fédérées connectées"
  heading: "Mes apps fédérées connectées"
  subtitle: "Instances ActivityPub où tu t'es authentifié·e avec ton identité de cette instance."
  table_domain: "Instance"
  table_count: "Sessions"
  table_last_seen: "Dernière activité"
  empty_title: "Aucune app fédérée"
  empty_body: "Tu n'as pas encore approuvé d'authentification fédérée vers une autre instance."
  revoke_note: "Note: la révocation manuelle d'une session distante depuis cette page sera disponible avec RFC 0006 Phase 2 (blacklist JWT remote). En attendant, demande à l'admin via /admin/fediverse/sessions_remote ou attend l'expiration naturelle du JWT."
  back_to_profile: "Retour au profil"

# Page d'acceptation invitation team cross-instance (RFC 0024 Slice C iter. 6).
fediverse_invite_landing:
  page_title: "Invitation à rejoindre une équipe"
  heading: "Tu as reçu une invitation"
  explainer: "Une équipe d'une autre instance fédérée t'invite à la rejoindre. Vérifie les détails ci-dessous avant de répondre."
  team_label: "Équipe"
  role_label: "Rôle proposé"
  status_label: "Statut"
  accept_button: "Accepter"
  reject_button: "Refuser"
  already_decided: "Cette invitation a déjà été traitée."
  cannot_accept_note: "Pour accepter, tu dois être connecté·e via une identité fédérée (login depuis ton instance d'origine). Tu peux refuser depuis ce compte local, mais l'acceptation passe par le flow AP-native."

# Page 404 (route inconnue)
http_errors:
  not_found_title: "Page introuvable"
  not_found_message: "Cette adresse ne correspond à aucune page."
  code_label: "Erreur 404"
  home: "Retour à l'accueil"
  login: "Se connecter"

analytics:
  opt_out:
    hint: 'Vous pouvez vous opposer à tout moment à la mesure d''audience. Votre choix est enregistré dans votre navigateur et prend effet au prochain chargement de page.'
    opt_out_label: 'M''opposer à la mesure d''audience'
    opt_in_label: 'Réactiver la mesure d''audience'
    opted_out_badge: 'Vous êtes opposé au suivi'