export const frMessages = { setup: { welcomeTitle: "Bienvenue sur %{title}", welcomeSubtitle: "Pour commencer, connectez-vous à une base Supabase.", encryptedTitle: "Sécurisé", encryptedDesc: "Données protégées par AES-256", turboTitle: "Turbo", turboDesc: "Optimisé pour la vitesse et l'échelle", getStarted: "Démarrer", connectionMode: "Mode de connexion", selectVector: "Sélectionnez le vecteur d'initialisation", quickIgnition: "Allumage Rapide", autoProvision: "Auto-provisioning via jeton", manualSync: "Synchro Manuelle", existingCredentials: "Utiliser des identifiants existants", abortAccess: "Annuler l'accès", injectCoordinates: "Injecter les coordonnées", platformUrl: "URL de la plateforme", urlHelp: "Dans Project Settings > API > Project URL", anonMatrixKey: "Clé Anon / Matrix", keyHelp: "Dans Project Settings > API > anon (public) key", back: "Retour", engage: "Engager", managedTokenTitle: "Jeton de Forge", managedTokenSubtitle: "Coordonnées API Supabase", personalAccessToken: "Jeton d'accès personnel", generateAt: "Générer sur", scanOrgs: "Scanner les Organisations", projectConfigTitle: "Config Projet", engineParameters: "Paramètres moteur", projectName: "Nom du projet", hostingSector: "Secteur d'hébergement", vesselOrg: "Vaisseau (Organisation)", initializeSystem: "Initialiser le Système", provisioning: "Provisionnement", provisioningFailed: "Échec du Provisionnement", provisioningFailedDetails: "Échec du provisionnement. Voir les logs ci-dessus pour les détails.", assemblingInfrastructure: "Assemblage de l'infrastructure...", checkLogs: "Voir les logs pour détails", tryAgain: "Réessayer", useManualConnect: "Utiliser la Connexion Manuelle", installationComplete: "Installation Terminée", installingDatabase: "Installation de la Base", applyingSchemaDna: "Application de l'ADN du schéma...", systemReady: "Système prêt !", tokenRequired: "Jeton requis", readyToInstall: "Prêt à installer", managementToken: "Jeton de Gestion", installDatabaseSchema: "Installer le Schéma", retryInstallation: "Réessayer l'Installation", projectIdRequired: "L'identifiant du projet est requis pour la migration.", tokenDescription: "Un jeton d'accès Supabase est requis pour installer le schéma et synchroniser les utilisateurs.", connectingProvisioning: "Connexion au moteur de provisionnement Supabase...", projectReady: "✨ Projet prêt ! Initialisation de la base de données...", startingMigration: "Démarrage de la migration de la base de données...", setupCompleteLog: "🎉 Configuration terminée !", checkingDatabase: "Vérification de l'état de la base de données...", dbNotInitialized: "Base de données non initialisée. Migration requise pour configurer le schéma.", dbVersionBehind: "La version de la base de données (%{dbVersion}) est en retard sur la version de l'application (%{appVersion}). Migration recommandée.", dbLegacySchema: "La base de données utilise un ancien schéma mais est déjà initialisée et fonctionnelle.", skippingMigration: "✅ Migration ignorée. Base de données prête à l'emploi !", reloadingApp: "Rechargement de l'application avec les nouveaux identifiants...", dbReady: "✅ Base de données déjà configurée et prête !", setupComplete: "Configuration terminée !", redirecting: "Redirection vers votre CRM...", liveFeed: "Flux en direct", awaitingSignals: "En attente des signaux du noyau...", }, ra: { action: { send: "Envoyer", sending: "Envoi en cours...", }, auth: { user_menu: "Profil", username: "Nom d'utilisateur", password: "Mot de passe", confirm_password: "Confirmer le mot de passe", sign_in: "Se connecter", sign_in_error: "Échec de l'authentification, veuillez réessayer", logout: "Se déconnecter", }, navigation: { no_results: "Aucun résultat trouvé.", no_filtered_results: "Aucun résultat trouvé avec les filtres actuels.", clear_filters: "Effacer les filtres", }, }, crm: { root: { database_checking: "Vérification de la connexion à la base de données...", }, changelog: { title: "Quoi de neuf", }, setup_wizard: { welcome: { title: "Bienvenue sur %{title}", subtitle: "Configuration de la base de données", description: "Pour commencer, vous devez connecter une base de données Supabase.", no_project: "Vous n'avez pas de projet Supabase ?", create_free: "Créez-en un gratuitement sur", need_title: "Ce dont vous aurez besoin :", need_url: "Votre URL de projet Supabase ou ID de projet", need_key: "Votre clé API (clé anon ou publiable)", find_hint: "Où trouver ces informations ?", continue: "Continuer", }, credentials: { title: "Se connecter à Supabase", description: "Entrez vos identifiants de projet Supabase", url_label: "URL du projet ou ID", url_placeholder: "xxxxx ou https://xxxxx.supabase.co", url_valid: "URL Supabase valide", url_project_id: "ID de projet valide (sera étendu en URL complète)", url_invalid_format: "Format d'URL invalide", url_must_be_supabase: "L'URL doit être un domaine Supabase", url_hint: "Entrez l'URL complète ou l'ID de projet", url_expansion: "Sera étendu en : %{url}", url_default_hint: "Entrez l'URL complète ou juste l'ID de projet (dans Paramètres du projet → API)", key_label: "Clé API", key_placeholder: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", key_valid_publishable: "Format de clé publiable valide", key_valid_anon: "Format de clé anon valide", key_incomplete_publishable: "La clé publiable semble incomplète", key_incomplete_anon: "La clé anon semble incomplète", key_invalid: "Doit être une clé API Supabase valide (anon ou publiable)", key_default_hint: "Clé anon ou publiable (dans Paramètres du projet → API)", back: "Retour", connect: "Se connecter", error_failed: "Échec de la connexion", }, validating: { title: "Validation de la connexion", description: "Test de vos identifiants Supabase...", wait: "Veuillez patienter...", }, success: { title: "Connexion réussie !", description: "Votre base de données Supabase est maintenant connectée", reloading: "Rechargement de l'application...", }, }, nav: { dashboard: "Tableau de bord", contacts: "Contacts", companies: "Entreprises", deals: "Affaires", invoices: "Factures", tasks: "Tâches", ai: "AI", users: "Utilisateurs", settings: "Mes infos", database: "Base de données", integrations: "Intégrations", back: "Retour", }, view: { table: "Tableau", kanban: "Kanban", }, action: { new_task: "Nouvelle tâche", new_deal: "Nouvelle affaire", }, filter: { active: "Actif", active_filters: "Filtres actifs", contact: "Contact", company: "Entreprise", deal: "Affaire", loading: "Chargement...", my_tasks: "Mes tâches", assigned_to: "Assigné à", archived: "Archivé", priority: "Priorité", remove: "Supprimer le filtre %{filter}", search: "Recherche", status: "Statut", }, dashboard: { invoice_revenue: "Chiffre d'affaires", deal_pipeline: "Pipeline des opportunités", upcoming_tasks: "Tâches à venir", task_filters: { overdue: "En retard", today: "Aujourd'hui", tomorrow: "Demain", this_week: "Cette semaine", later: "Plus tard", }, load_more: "Charger plus", tasks_empty: "Tout est à jour pour l’instant.", upcoming_deal_revenue: "Revenus prévisionnels", revenue: "Chiffre d'affaires", outstanding_invoices: "Factures en attente", deals_chart: { won: "Gagné", lost: "Perdu", }, hot_contacts: "Contacts chauds", create_contact: "Créer un contact", hot_contacts_empty: { line_1: "Aucun contact chaud pour le moment.", line_2: "Créez un contact pour commencer.", }, latest_activity: "Dernière activité", latest_notes: "Dernières notes", notes: { on: "sur", added: "ajoutée", deal: "Affaire", contact: "Contact", }, pipeline: { title: "Pipeline des affaires", }, stepper: { title: "Bien démarrer", progress: "Étape %{step} sur %{total}", install: "Installer l’application", add_contact: "Ajouter votre premier contact", new_contact: "Nouveau contact", add_note: "Ajouter une note", add_note_hint: "Ajoutez une note à votre premier contact.", add_note_button: "Ajouter une note", }, welcome: { title: "Bienvenue", body_1: "est un CRM complet que vous pouvez exécuter en local.", body_2: "Il inclut contacts, entreprises, affaires et tâches dès le départ.", powered_by: "Propulsé par", fork_of: ", un fork de", by_marmelab: "par Marmelab.", }, }, task: { column: { expand: "Déplier la colonne %{column}", collapse: "Replier la colonne %{column}", }, field: { task: "Tâche", type: "Type", related_to: "Lié à", description: "Description", due_date: "Date d'échéance", completed: "Terminée", priority: "Priorité", status: "Statut", assigned_to: "Assigné à", created_by: "Créée par", actions: "Actions", }, action: { create_task: "Créer une tâche", add_task: "Ajouter une tâche", edit_task: "Modifier la tâche", edit: "Modifier", mark_complete: "Marquer comme terminée", snooze_tomorrow: "Reporter à demain", postpone_day: "Reporter d'un jour", show_details: "Voir les détails", postpone_tomorrow: "Reporter à demain", postpone_next_week: "Reporter à la semaine prochaine", menu: "Actions de la tâche", }, notification: { marked_complete: "Tâche marquée comme terminée", snoozed_tomorrow: "Tâche reportée à demain", postponed_day: "Tâche reportée d'un jour", created: "Tâche créée", updated: "Tâche mise à jour", deleted: "Tâche supprimée", deleted_success: "Tâche supprimée avec succès", move_failed: "Impossible de déplacer la tâche. Réessayez.", }, note: { marked_complete: "Tâche marquée comme terminée via action rapide", marked_complete_quick: "Marquée comme terminée via action rapide", snoozed_to_date: "Date d'échéance reportée au %{date}", postponed_to_date: "Date d'échéance repoussée au %{date}", quick_edit: "Tâche mise à jour via l'édition rapide", }, section: { info: "Infos", related: "Lié", assignment: "Attribution", activity_timeline: "Historique d’activité", activity_description: "Suivez tous les changements de statut et mises à jour de cette tâche", notes: "Notes", notes_description: "Ajoutez des notes et des mises à jour à cette tâche", }, related: { none: "Aucun élément lié", prefix: "Re :", }, entity_type: { link_to: "Lier à %{type}", none: "Aucun", contact: "Contact", company: "Entreprise", deal: "Affaire", }, due: { label: "Échéance", relative: "Échéance %{time}", no_date: "Aucune date d'échéance", overdue_one: "En retard d’un jour", overdue_many: "En retard de %{count} jours", today: "Échéance aujourd'hui", tomorrow: "Échéance demain", in_days_one: "Échéance dans 1 jour", in_days_many: "Échéance dans %{count} jours", }, activity: { loading: "Chargement de l’activité…", empty: "Aucune activité enregistrée.", created: "a créé cette tâche", updated: "a mis à jour cette tâche", updated_field: "a modifié %{field}", assigned: "a assigné cette tâche", completed: "a terminé cette tâche", reopened: "a rouvert cette tâche", duplicated: "a dupliqué cette tâche", archived: "a archivé cette tâche", truncated: "Affichage de %{count} activités sur %{total}. Les plus anciennes ne sont pas affichées.", }, dialog: { edit: { title: "Modifier la tâche", description: "Mettre à jour les détails, l’attribution et l’élément lié", }, create: { title: "Créer une nouvelle tâche", title_for: "Créer une nouvelle tâche pour %{name}", this_record: "cet enregistrement", description: "Ajoutez une nouvelle tâche avec description, échéance et attribution", }, }, status: { todo: "À faire", in_progress: "En cours", blocked: "Bloqué", done: "Terminé", cancelled: "Annulé", other: "Autre", }, priority: { low: "Faible", medium: "Moyenne", high: "Élevée", urgent: "Urgent", }, type: { none: "Aucun", email: "E-mail", demo: "Démo", lunch: "Déjeuner", meeting: "Réunion", follow_up: "Relance", thank_you: "Remerciement", ship: "Expédier", call: "Appel", }, }, note: { placeholder: "Ajouter une note", show_options: "Afficher les options", options_hint: "(joindre des fichiers ou modifier les détails)", date: "Date", added: "Note ajoutée", action: { add: "Ajouter cette note", }, status: { cold: "Froid", warm: "Tiède", hot: "Chaud", in_contract: "Sous contrat", }, }, activity: { added_note: "a ajouté une note", added_note_about: "a ajouté une note sur", added_note_about_deal: "a ajouté une note sur l'affaire", at: "chez", edit_note: "Modifier la note", delete_note: "Supprimer la note", note_deleted: "Note supprimée", cancel: "Annuler", update_note: "Mettre à jour la note", added_deal: "a ajouté l'affaire", to_company: "à l'entreprise", added_company: "a ajouté l'entreprise", added: "a ajouté", pagination: "Affichage de %{from}-%{to} sur %{total} activités", error_load: "Échec du chargement du journal d'activité", }, deal: { field: { name: "Nom de l'affaire", description: "Description", amount: "Montant", expected_closing_date: "Fermeture prévue", stage: "Étape", category: "Catégorie", account_manager: "Propriétaire", budget: "Budget", }, section: { linked_to: "Lié à", misc: "Divers", deal_info: "Infos affaire", company: "Entreprise", contacts: "Contacts", assignment: "Attribution", notes: "Notes", notes_description: "Suivez les conversations, décisions et mises à jour pour cette affaire", }, action: { edit: "Modifier l'affaire", create: "Créer une affaire", archive: "Archiver", unarchive: "Désarchiver", view_archived: "Voir les affaires archivées", }, notification: { archived: "Affaire archivée", unarchived: "Affaire désarchivée", error_archiving: "Erreur : affaire non archivée", error_unarchiving: "Erreur : affaire non désarchivée", }, empty: { title: "Aucune affaire trouvée", description: "Il semble que votre liste d'affaires soit vide.", no_contacts: "Il semble que votre liste de contacts soit vide.", add_contact: "Ajoutez votre premier contact", before_creating: "avant de créer une affaire.", }, status: { archived: "ARCHIVÉE", past: "Passé", invalid_date: "Date invalide", }, placeholder: { select_company: "Veuillez d'abord sélectionner une entreprise pour voir ses contacts", }, filter: { only_companies_i_manage: "Seulement les entreprises que je gère", }, list: { archived_title: "Affaires archivées", }, stage: { opportunity: "Opportunité", proposal_sent: "Proposition envoyée", in_negociation: "En négociation", won: "Gagné", lost: "Perdu", delayed: "Reporté", }, category: { other: "Autre", copywriting: "Rédaction", print_project: "Projet d'impression", ui_design: "Conception UI", website_design: "Conception de site web", }, }, contact: { gender: { male: "Il/Lui", female: "Elle/Elle", nonbinary: "Iel/Elle", }, field: { first_name: "Prénom", last_name: "Nom", title: "Titre", company: "Entreprise", email: "E-mail", email_addresses: "Adresses e-mail", phone_number: "Numéro de téléphone", phone_numbers: "Numéros de téléphone", linkedin_url: "URL LinkedIn", background: "Infos de contexte (bio, rencontre, etc.)", has_newsletter: "Abonné newsletter", account_manager: "Gestionnaire de compte", first_seen: "Ajouté le", last_seen_on: "Dernière activité le", followed_by: "Suivi par", subscribed_to_newsletter: "Abonné à la newsletter", linkedin: "LinkedIn", at: "chez", }, section: { identity: "Identité", position: "Poste", personal_info: "Infos personnelles", misc: "Divers", activity_timeline: "Historique d'activité", activity_timeline_description: "État du traitement en temps réel des activités entrantes", notes: "Notes", notes_description: "Registre permanent des interactions et résultats", background_info: "Infos de contexte", tags: "Étiquettes", tasks: "Tâches", }, action: { edit: "Modifier le contact", show: "Voir le contact", create: "Nouveau contact", export_vcard: "Exporter en vCard", merge_with_another: "Fusionner avec un autre contact", import: "Importer", }, type: { work: "Travail", home: "Domicile", other: "Autre", }, empty: { title: "Aucun contact trouvé", description: "Il semble que votre liste de contacts soit vide.", }, filter: { last_activity: "Dernière activité", today: "Aujourd'hui", this_week: "Cette semaine", before_this_week: "Avant cette semaine", before_this_month: "Avant ce mois", before_last_month: "Avant le mois dernier", engagement: "Engagement", engagement_status: { strong: "Fort", active: "Actif", cooling: "Refroidissement", cold: "Froid", dormant: "Inactif", }, validation: "Validation", validation_status: { valid: "Email valide", risky: "Email risqué", invalid: "Email invalide", }, tags: "Étiquettes", tasks: "Tâches", with_pending_tasks: "Avec tâches en attente", account_manager: "Gestionnaire de compte", me: "Moi", search_placeholder: "Rechercher nom, entreprise...", }, health: { title: "Santé du contact", no_data: "Aucune donnée de santé calculée pour le moment.", relationship_strength: "Force de la relation", engagement_score: "Score d'engagement", last_activity: "Dernière activité : ", days_ago: "il y a %{days} jours", today: "Aujourd'hui", yesterday: "Hier", contact_validation: "Validation du contact", bounced: "(rejeté)", validated: "Validé", status: { valid: "Valide", risky: "Risqué", invalid: "Invalide", active: "Actif", inactive: "Inactif", not_found: "Non trouvé", }, }, merge: { title: "Fusionner le contact", description: "Fusionner ce contact avec un autre.", current_contact: "Contact actuel (sera supprimé)", target_contact: "Contact cible (sera conservé)", what_will_be_merged: "Ce qui sera fusionné :", notes_to_merge: "%{count} note sera réattribuée |||| %{count} notes seront réattribuées", tasks_to_merge: "%{count} tâche sera réattribuée |||| %{count} tâches seront réattribuées", deals_to_merge: "%{count} affaire sera mise à jour |||| %{count} affaires seront mises à jour", emails_to_merge: "%{count} adresse e-mail sera ajoutée |||| %{count} adresses e-mail seront ajoutées", phones_to_merge: "%{count} numéro de téléphone sera ajouté |||| %{count} numéros de téléphone seront ajoutés", no_data: "Aucune donnée supplémentaire à fusionner", warning_title: "Attention : Opération destructive", warning_message: "Toutes les données seront transférées vers le second contact. Cette action est irréversible.", merging: "Fusion en cours...", merge_contacts: "Fusionner les contacts", select_contact: "Veuillez sélectionner un contact à fusionner", success: "Contacts fusionnés avec succès", error: "Échec de la fusion des contacts", }, import: { title: "Importer", description: "Importer des contacts depuis un fichier CSV", running: "L'importation est en cours, veuillez ne pas fermer cet onglet.", status: "Importé %{count} / %{total} contacts, avec %{errors} erreurs.", remaining_time: "Temps restant estimé : %{time}.", stop: "Arrêter l'importation", error: "Échec de l'importation de ce fichier, veuillez vous assurer d'avoir fourni un fichier CSV valide.", complete: "Importation des contacts terminée. %{count} contacts importés, avec %{errors} erreurs", template_hint: "Voici un exemple de fichier CSV que vous pouvez utiliser comme modèle", download_sample: "Télécharger l'exemple CSV", csv_file: "Fichier CSV", }, }, company: { sector: { communication_services: "Services de communication", consumer_discretionary: "Consommation discrétionnaire", consumer_staples: "Biens de consommation de base", energy: "Énergie", financials: "Finance", health_care: "Santé", industrials: "Industries", information_technology: "Technologies de l'information", materials: "Matériaux", real_estate: "Immobilier", utilities: "Services publics", }, field: { name: "Nom", website: "Site web", phone_number: "Numéro de téléphone", linkedin: "LinkedIn", twitter: "Twitter/X", facebook: "Facebook", github: "GitHub", logo_url: "URL du logo", lifecycle_stage: "Étape du cycle de vie", company_type: "Type d'entreprise", qualification_status: "Statut de qualification", employee_count: "Nombre d'employés", revenue_range: "Tranche de revenus", founded_year: "Année de fondation", tax_identifier: "Identifiant fiscal", address: "Adresse", city: "Ville", zipcode: "Code postal", state: "État/Province", country: "Pays", description: "Description", account_manager: "Gestionnaire de compte", first_seen: "Ajoutée le", followed_by: "Suivie par", size: "Taille", revenue: "Revenus", sector: "Secteur", context_links: "Liens de contexte", }, section: { contact: "Contact", social_profiles: "Profils sociaux", context: "Contexte", address: "Adresse", additional_info: "Informations complémentaires", advanced_settings: "Paramètres avancés", external_system_integration: "Intégration système externe", company_info: "Infos entreprise", main_address: "Adresse principale", }, action: { edit: "Modifier l'entreprise", show: "Voir l'entreprise", create: "Créer une entreprise", merge_with_another: "Fusionner avec une autre entreprise", }, empty: { title: "Aucune entreprise trouvée", description: "Il semble que votre liste d'entreprises soit vide.", }, placeholder: { external_id: "ex: ID de compte Salesforce", company_name: "Nom de l'entreprise", create_hint: "Commencez à taper pour créer une nouvelle entreprise", }, error: { invalid_url: "Doit être une URL valide", }, notification: { error_creating: "Une erreur est survenue lors de la création de l'entreprise", }, filter: { me: "Moi", }, health: { title: "Santé de l'entreprise", internal_engagement: "Engagement interne", engagement_score: "Score d'engagement", last_activity: "Dernière activité : ", today: "Aujourd'hui", yesterday: "Hier", days_ago: "il y a %{days} jours", updated: "Mis à jour", external_health: "Santé externe", last_checked: "Dernière vérification", status: { engaged: "Engagé", quiet: "Calme", at_risk: "À risque", unresponsive: "Sans réponse", healthy: "Sain", risky: "Risqué", dead: "Inactif", unknown: "Inconnu", }, }, size: { 1: "1 employé", 10: "2-9 employés", 50: "10-49 employés", 250: "50-249 employés", 500: "250 employés ou plus", }, merge: { title: "Fusionner l'entreprise", description: "Fusionner cette entreprise avec une autre.", current_contact: "Entreprise actuelle (sera supprimée)", target_contact: "Entreprise cible (sera conservée)", what_will_be_merged: "Ce qui sera fusionné :", contacts_to_merge: "%{count} contact sera réattribué |||| %{count} contacts seront réattribués", deals_to_merge: "%{count} affaire sera réattribuée |||| %{count} affaires seront réattribuées", links_to_merge: "%{count} lien de contexte sera ajouté |||| %{count} liens de contexte seront ajoutés", no_data: "Aucune donnée supplémentaire à fusionner", warning_title: "Attention : Opération destructive", warning_message: "Toutes les données seront transférées vers la seconde entreprise. Cette action est irréversible.", merging: "Fusion en cours...", merge_companies: "Fusionner les entreprises", select_company: "Veuillez sélectionner une entreprise à fusionner", success: "Entreprises fusionnées avec succès", error: "Échec de la fusion des entreprises", }, }, tag: { action: { add: "Ajouter une étiquette", create: "Créer une nouvelle étiquette", }, }, integrations: { title: "Intégrations", description: "Gérez les clés API, les webhooks et les canaux d'ingestion pour intégrer RealTimeX CRM à des systèmes externes.", tabs: { ingestion: "Canaux d'ingestion", file_upload: "Téléchargement de fichiers", api_keys: "Clés API", webhooks: "Webhooks (Sortants)", }, webhooks: { description: "Les webhooks informent les systèmes externes lorsque des événements se produisent dans votre CRM.", action: { create: "Créer un webhook", create_first: "Créez votre premier webhook", edit: "Modifier le webhook", delete: "Supprimer", update: "Mettre à jour", }, empty: "Pas encore de webhooks", loading: "Chargement...", status: { active: "Actif", inactive: "Inactif", more: "+%{count} de plus", }, fields: { name: "Nom", url: "URL du webhook", events: "Événements à s'abonner", created: "Créé le : %{date}", last_triggered: "Dernier déclenchement : %{date}", failed_deliveries: "Échecs de livraison : %{count}", }, dialog: { create_title: "Créer un webhook", create_description: "Créer un nouveau webhook pour recevoir des notifications d'événements", edit_title: "Modifier le webhook", edit_description: "Mettre à jour la configuration du webhook", delete_title: "Supprimer le webhook ?", delete_description: "Ceci supprimera définitivement ce webhook. Plus aucun événement ne sera envoyé à ce point de terminaison. Cette action est irréversible.", }, placeholder: { name: "ex : Notifications Slack", url: "https://exemple.com/webhook", }, notification: { created: "Webhook créé avec succès", updated: "Webhook mis à jour avec succès", deleted: "Webhook supprimé avec succès", error_creating: "Échec de la création du webhook", error_updating: "Échec de la mise à jour du webhook", error_deleting: "Échec de la suppression du webhook", }, categories: { contacts: "Contacts", companies: "Entreprises", deals: "Affaires", tasks: "Tâches", invoices: "Factures", }, events: { "contact.created": "Contact créé", "contact.updated": "Contact mis à jour", "contact.deleted": "Contact supprimé", "company.created": "Entreprise créée", "company.updated": "Entreprise mise à jour", "company.deleted": "Entreprise supprimée", "deal.created": "Affaire créée", "deal.updated": "Affaire mise à jour", "deal.deleted": "Affaire supprimée", "deal.stage_changed": "Étape de l'affaire modifiée", "deal.won": "Affaire gagnée", "deal.lost": "Affaire perdue", "task.created": "Tâche créée", "task.updated": "Tâche mise à jour", "task.assigned": "Tâche assignée", "task.completed": "Tâche terminée", "task.priority_changed": "Priorité de la tâche modifiée", "task.archived": "Tâche archivée", "task.deleted": "Tâche supprimée", "invoice.created": "Facture créée", "invoice.updated": "Facture mise à jour", "invoice.deleted": "Facture supprimée", "invoice.status_changed": "Statut de la facture changé", "invoice.sent": "Facture envoyée", }, }, api_keys: { description: "Les clés API permettent aux applications externes d'accéder aux données de votre CRM par programmation.", action: { create: "Créer une clé API", create_first: "Créez votre première clé API", copy: "Copier", copied: "Clé API complète copiée dans le presse-papiers", done: "Terminé", }, empty: "Pas encore de clés API", loading: "Chargement...", fields: { name: "Nom", created: "Créée le : %{date}", last_used: "Dernière utilisation : %{date}", expires: "Expire le : %{date}", key_hint: "Cliquez sur copier pour obtenir la clé complète non masquée", not_available: "Clé API non disponible pour la copie", scopes: "Portées", expiration: "Expiration (facultatif)", your_api_key: "Votre clé API", }, dialog: { create_title: "Créer une clé API", create_description: "Créer une nouvelle clé API pour accéder à l'API CRM", created_title: "Clé API créée", created_description: "Copiez cette clé maintenant - elle ne sera plus affichée !", delete_title: "Supprimer la clé API ?", delete_description: "Ceci supprimera définitivement cette clé API. Toutes les applications utilisant cette clé cesseront de fonctionner immédiatement. Cette action est irréversible.", warning_copy: "Assurez-vous de copier votre clé API maintenant. Vous ne pourrez plus la voir !", }, placeholder: { name: "ex : Clé API de production", }, scopes: { "contacts:read": "Contacts : Lecture", "contacts:write": "Contacts : Écriture", "companies:read": "Entreprises : Lecture", "companies:write": "Entreprises : Écriture", "deals:read": "Affaires : Lecture", "deals:write": "Affaires : Écriture", "tasks:read": "Tâches : Lecture", "tasks:write": "Tâches : Écriture", "invoices:read": "Factures : Lecture", "invoices:write": "Factures : Écriture", "activities:write": "Activités : Écriture (Notes)", }, notification: { created: "Clé API créée avec succès", deleted: "Clé API supprimée avec succès", error_creating: "Échec de la création de la clé API", error_deleting: "Échec de la suppression de la clé API", error_copying: "Échec de la copie de la clé API", }, }, file_upload: { title: "Télécharger des fichiers", description: "Téléchargez des documents, des images, des fichiers audio ou vidéo pour créer des activités. Les fichiers sont automatiquement stockés et liés à votre compte.", action: { upload: "Télécharger", upload_all: "Tout télécharger", clear_completed: "Effacer les terminés", drop_files: "Déposez les fichiers ici...", drag_and_drop: "Faites glisser et déposez des fichiers ici, ou cliquez pour sélectionner", supports_all: "Prend en charge tous les types de fichiers (exécutables bloqués pour la sécurité)", }, fields: { ingestion_channel: "Canal d'ingestion", activity_type: "Type d'activité", select_channel: "Sélectionner un canal...", files_count: "Fichiers (%{count})", }, types: { note: "Note", email: "E-mail", call: "Enregistrement d'appel", meeting: "Enregistrement de réunion", other: "Autre", }, how_it_works: { title: "Comment ça marche", step_1: "Les fichiers sont téléchargés directement sur un stockage sécurisé (pas d'encombrement de la base de données)", step_2: "Chaque fichier crée un enregistrement d'activité pour le suivi et la recherche", step_3: "Les fichiers volumineux sont gérés automatiquement (aucune limite de taille)", step_4: "Les fichiers sont liés au canal d'ingestion sélectionné", step_5: "Les activités apparaissent immédiatement dans le flux d'activité", }, notification: { select_channel: "Veuillez sélectionner un canal d'ingestion", success: "Fichier téléchargé : %{name}", error: "Échec du téléchargement : %{name}", error_network: "Erreur réseau", error_status: "Le téléchargement a échoué avec le statut %{status}", error_dangerous: "Les fichiers exécutables ne sont pas autorisés pour des raisons de sécurité", }, }, ingestion: { title: "Canaux d'ingestion", description: "Configurez les canaux entrants (e-mail, voix, SMS) pour ingérer des activités dans votre CRM.", action: { create: "Créer un canal", add: "Ajouter un canal d'ingestion", add_first: "Ajoutez votre premier canal", copy_url: "Copier l'URL du Webhook", url_copied: "URL du Webhook copiée dans le presse-papiers", }, empty: "Aucun canal d'ingestion configuré", loading: "Chargement...", fields: { webhook_url: "URL du Webhook", created: "Créé le : %{date}", }, dialog: { create_description: "Configurer une nouvelle source pour les activités entrantes.", name_label: "Nom du canal", provider_label: "Fournisseur", token_label: "Jeton d'authentification (Validation)", token_hint: "Requis pour valider les requêtes entrantes.", placeholder_name: "ex : Ligne de support US", placeholder_token: "Jeton d'authentification Twilio", select_provider: "Sélectionner un fournisseur", delete_title: "Supprimer le canal ?", delete_description: "Ceci arrêtera toute ingestion provenant de cette source. Cette action est irréversible.", }, providers: { twilio: "Twilio (Voix/SMS)", postmark: "Postmark (E-mail)", generic: "Générique / Interne", }, notification: { created: "Canal d'ingestion créé avec succès", deleted: "Canal supprimé avec succès", error_creating: "Échec de la création du canal : %{message}", error_deleting: "Échec de la suppression du canal", }, }, }, image_editor: { action: { change: "Modifier", update: "Mettre à jour l'image", delete: "Supprimer", }, dialog: { title: "Télécharger et redimensionner l'image", dropzone: "Déposez un fichier pour le télécharger, ou cliquez pour le sélectionner.", }, alt: "Contenu modifiable", }, document_viewer: { error: { docx: "Échec du rendu du contenu DOCX.", too_large: "Fichier trop volumineux (max 50Mo). Taille : %{size}Mo", not_available: "Aperçu non disponible pour ce type de fichier.", access: "Impossible d'accéder au fichier. Cela peut être dû à un problème réseau, une restriction CORS ou un lien expiré.", load: "Échec du chargement de l'aperçu du document.", }, action: { download: "Télécharger le fichier", open_new_tab: "Ouvrir dans un nouvel onglet", }, }, email_viewer: { error: { parse: "Échec de l'analyse du fichier e-mail", load: "Échec du chargement de l'e-mail", }, field: { from: "De", to: "À", cc: "Cc", date: "Date", subject_none: "(Sans objet)", content_none: "(Aucun contenu)", attachment: "Pièce jointe", attachments: "Pièces jointes", unknown: "Inconnu", unknown_type: "Type inconnu", none: "Aucun", }, action: { html: "HTML", text: "Texte brut", download_attachment: "Télécharger la pièce jointe", }, }, activity_feed: { empty: "Aucune activité pour le moment.", direction: { inbound: "Entrant", outbound: "Sortant", }, status: { processing: "Traitement en cours", failed: "Échoué", completed: "Terminé", }, label: { processing_content: "Traitement du contenu...", processing_failed: "Échec du traitement.", audio_recording: "Enregistrement audio", summary: "Résumé :", }, type: { email: "E-mail", call: "Appel", sms: "SMS", meeting: "Réunion", note: "Note", }, }, user: { action: { create: "Nouvel utilisateur", edit: "Modifier %{name}", resend_invite: "Renvoyer l'invitation", send_password_reset: "Réinitialiser le mot de passe", send_reset_link: "Envoyer le lien de réinitialisation", cancel: "Annuler", sending: "Envoi en cours...", send_invitation: "Envoyer l'invitation", }, field: { administrator: "Admin", disabled: "Désactivé", email_actions: "Actions e-mail", }, section: { create_title: "Créer un nouvel utilisateur", }, empty: { title: "Aucun utilisateur trouvé", description: "Il semble que votre liste d'utilisateurs soit vide.", }, notification: { invite_sent: "E-mail d'invitation renvoyé avec succès", created_invite_sent: "Utilisateur créé. Email d'invitation envoyé.", invite_error: "Échec du renvoi de l'e-mail d'invitation", reset_sent: "E-mail de réinitialisation envoyé avec succès", reset_error: "Échec de l'envoi de l'e-mail de réinitialisation", created: "Utilisateur créé. Il recevra bientôt un e-mail pour définir son mot de passe.", create_error: "Une erreur est survenue lors de la création de l'utilisateur.", updated: "Utilisateur mis à jour avec succès", error: "Une erreur est survenue. Veuillez réessayer.", }, dialog: { resend_invitation: { title: "Renvoyer l'invitation", description: "Envoyer un nouvel e-mail d'invitation à %{email} ?", fresh_link: "Cela lui enverra un nouveau lien d'invitation pour configurer son compte.", }, reset_password: { title: "Réinitialiser le mot de passe", description: "Envoyer un e-mail de réinitialisation à %{email} ?", reset_link: "Cela lui enverra un lien pour réinitialiser son mot de passe.", }, }, }, auth: { login_with_code: "Se connecter avec un code", enter_email_for_code: "Entrez votre e-mail pour recevoir un code de connexion à 6 chiffres", code_sent: "Un code à 6 chiffres a été envoyé à votre e-mail", enter_verification_code: "Entrez le code de vérification", code_sent_to: "Nous avons envoyé un code à 6 chiffres à %{email}", invalid_code: "Code invalide ou expiré. Veuillez réessayer.", verify_code: "Vérifier le code", verifying: "Vérification...", resend_code: "Renvoyer le code", back_to_email: "Retour à l'e-mail", back_to_login: "Retour à la connexion", no_access: "Vous n'avez pas accès à cette application. Veuillez contacter votre administrateur.", login_successful: "Connexion réussie !", set_new_password: "Définir un nouveau mot de passe", choose_password_details: "Choisissez un mot de passe sécurisé pour votre compte", password_min_length: "Le mot de passe doit comporter au moins 6 caractères", passwords_do_not_match: "Les mots de passe ne correspondent pas", password_updated: "Mot de passe mis à jour avec succès", update_password: "Mettre à jour le mot de passe", updating_password: "Mise à jour...", failed_to_update_password: "Échec de la mise à jour du mot de passe", forgot_password_code_verified: "Code vérifié ! Veuillez définir votre nouveau mot de passe.", sign_in: "Se connecter", login_otp_link: "Se connecter avec un code e-mail (OTP)", send_code: "Envoyer le code", }, signup: { title: "Bienvenue sur %{title}", subtitle: "Créez le premier compte utilisateur pour terminer la configuration.", action: { create: "Créer un compte", creating: "Création...", }, notification: { success: "Utilisateur initial créé avec succès", error: "Une erreur est survenue. Veuillez réessayer.", }, }, settings: { notification: { profile_updated: "Votre profil a été mis à jour", error: "Une erreur est survenue. Veuillez réessayer", }, action: { change_password: "Changer le mot de passe", }, inbound_email: { title: "E-mail entrant", description: "Vous pouvez commencer à envoyer des e-mails à l'adresse e-mail entrante de votre serveur, par exemple en l'ajoutant au champ Cc :. RealTimeX CRM traitera les e-mails et ajoutera des notes aux contacts correspondants.", }, database: { title: "Connexion à la base de données", description: "Gérez les paramètres de connexion à votre base de données Supabase", connected: "Connecté", not_connected: "Non connecté", no_config: "Aucune base de données Supabase n'est configurée", configured_on: "Configuré le %{date}", env_hint: "Utilisation de la configuration à partir des variables d'environnement. Vous pouvez outrepasser cela en configurant une nouvelle connexion via l'interface utilisateur.", setup_hint: "Connectez-vous à une base de données Supabase pour commencer à utiliser RealTimeX CRM. Vous pouvez créer un projet gratuit sur", anon_key: "Clé anonyme (Anon Key)", confirm_clear: "Êtes-vous sûr de vouloir effacer la configuration de la base de données ? L'application devra être reconfigurée lors du prochain lancement.", action: { change: "Modifier la connexion", clear: "Effacer la configuration", connect: "Se connecter à Supabase", }, }, }, migration: { banner: { title: "Mise à jour de la base disponible", subtitle: "Le schéma v%{version} est prêt à être installé", view_details: "Voir les détails", later: "Plus tard", command_copied: "Commande copiée !", dismiss: "Fermer", }, modal: { title: "Migration de base requise", description: "Le schéma de votre base doit être mis à jour vers la v%{version}. Suivez les étapes ci-dessous pour terminer la migration.", overview: { title: "Ce qui va se passer :", update_schema: "Le schéma sera mis à jour vers la v%{version}", enable_features: "De nouvelles fonctionnalités et améliorations seront activées", data_safe: "Vos données existantes ne seront pas affectées", duration: "Le processus prend généralement moins de 2 minutes", }, prerequisites: { title: "Prérequis", intro: "Assurez-vous d'avoir :", cli_installed: "La CLI Supabase installée (voir l'installation ci-dessous)", project_id: "Votre identifiant de projet Supabase :", db_password: "Le mot de passe de votre base (vous serez invité)", }, install_cli: { title: "Installer la CLI Supabase (si ce n'est pas déjà fait)", macos: "macOS / Linux :", windows_scoop: "Windows (Scoop) :", windows_npm: "Windows (npm) :", view_all: "Voir toutes les méthodes d'installation", }, run_migration: { title: "Lancer la commande de migration", intro: "Ouvrez votre terminal et exécutez :", tool_intro: "L'outil de migration va :", steps: { login: "Vous demander de vous connecter à Supabase (si besoin)", project_id: "Vous demander l'identifiant du projet", password: "Demander le mot de passe de la base", apply: "Appliquer automatiquement toutes les migrations en attente", deploy: "Déployer les fonctions Edge mises à jour", }, }, refresh: { title: "Rafraîchir l’application", description: "Une fois la migration terminée, rafraîchissez cette page pour accéder aux nouvelles fonctionnalités.", }, troubleshooting: { title: "Dépannage :", logout_prefix: "Si la connexion échoue, exécutez", logout_suffix: "puis réessayez", password: "Vérifiez que le mot de passe de la base est correct (dans le tableau de bord Supabase)", report: "Si le problème persiste, signalez-le sur", report_link: "GitHub Issues", }, auto: { tab_title: "✨ Auto-migration (Recommandé)", manual_tab_title: "🛠️ Instructions manuelles", title: "Migration en un clic", description: "Nous exécuterons automatiquement les scripts de migration pour vous.", project_id: "ID du projet", access_token: "Jeton d'accès Supabase (Access Token)", generate_token: "Générer un jeton", access_token_hint: "Requis si vous n'êtes pas connecté au CLI globalement.", db_password: "Mot de passe de la base (Optionnel)", db_password_placeholder: "Saisissez uniquement si votre projet n'est pas encore lié", db_password_hint: "Requis uniquement s'il s'agit de votre première connexion à ce projet depuis cette machine.", migrating: "Migration en cours...", start: "Démarrer la migration", logs_placeholder: "Les journaux apparaîtront ici...", init_log: "🚀 Initialisation du processus de migration...", error_prefix: "❌ Erreur : ", failure_toast: "La migration a échoué. Voir les journaux pour plus de détails.", missing_project_id: "Impossible de déterminer l'ID du projet à partir de la configuration.", }, close: "Fermer", copy: { unsupported: "Copie non prise en charge dans cet environnement — veuillez copier manuellement.", success: "Copié dans le presse-papiers !", error: "Échec de la copie — veuillez copier manuellement.", copy_label: "Copier", copied_label: "Copié", }, }, }, common: { activity: "Activité", contacts: "1 Contact |||| %{smart_count} Contacts", notes: "1 Note |||| %{smart_count} Notes", deals: "1 Affaire |||| %{smart_count} Affaires", tasks: "1 Tâche |||| %{smart_count} Tâches", invoices: "1 Facture |||| %{smart_count} Factures", last_activity: "dernière activité il y a %{distance}", add_contact: "Ajouter un contact", add_invoice: "Ajouter une facture", }, }, resources: { contacts: { name: "Contact |||| Contacts", fields: { first_name: "Prénom", last_name: "Nom", title: "Titre", company_id: "Entreprise", email: "Email", phone_number: "Téléphone", linkedin_url: "LinkedIn", sales_id: "Gestionnaire", nb_tasks: "Tâches", last_seen: "Dernière activité", }, }, companies: { name: "Entreprise |||| Entreprises", fields: { name: "Nom", website: "Site web", phone_number: "Téléphone", sector: "Secteur", size: "Taille", sales_id: "Gestionnaire", nb_contacts: "Contacts", nb_deals: "Affaires", created_at: "Ajouté le", context_links: "Liens de contexte", }, }, deals: { name: "Affaire |||| Affaires", fields: { name: "Nom", amount: "Montant", category: "Catégorie", stage: "Étape", company_id: "Entreprise", sales_id: "Propriétaire", }, }, tasks: { name: "Tâche |||| Tâches", fields: { title: "Titre", description: "Description", type: "Type", due_date: "Date d'échéance", status: "Statut", priority: "Priorité", sales_id: "Assigné à", contact_id: "Contact", company_id: "Entreprise", deal_id: "Affaire", }, }, sales: { name: "Utilisateur |||| Utilisateurs", fields: { first_name: "Prénom", last_name: "Nom", email: "E-mail", administrator: "Admin", disabled: "Désactivé", }, }, invoices: { name: "Facture |||| Factures", fields: { invoice_number: "N° Facture", reference: "Référence", company_id: "Entreprise", contact_id: "Contact", deal_id: "Affaire", status: "Statut", issue_date: "Date d'émission", due_date: "Date d'échéance", paid_at: "Payé le", currency: "Devise", subtotal: "Sous-total", discount: "Remise", tax_total: "TVA", total: "Total", amount_paid: "Montant payé", balance_due: "Reste à payer", notes: "Notes", payment_terms: "Conditions de paiement", terms_and_conditions: "Termes et conditions", sent_at: "Envoyé le", viewed_at: "Vu le", created_at: "Créé le", }, status: { draft: "Brouillon", sent: "Envoyée", paid: "Payée", overdue: "En retard", cancelled: "Annulée", }, section: { details: "Détails", billing: "Facturation", items: "Lignes", activity: "Activité", activity_description: "Suivez toutes les mises à jour et communications pour cette facture", actions: "Actions", assigned_to: "Créé par", }, item: { name: "Article", description_placeholder: "Ajouter des détails...", quantity: "Qté", unit_price: "Prix unitaire", tax: "Taxe", total: "Total", tax_rate: "Taux", }, item_type: { service: "Service", product: "Produit", hour: "Heure", day: "Jour", deposit: "Acompte", }, action: { new_invoice: "Nouvelle Facture", add_item: "Ajouter une ligne", edit: "Modifier la facture", mark_as_sent: "Marquer comme envoyé", mark_as_paid: "Marquer comme payé", mark_as_cancelled: "Marquer comme annulé", print: "Imprimer", suggest_number: "Suggérer un numéro", export_csv: "Exporter en CSV", send_email: "Envoyer par email", download_pdf: "Télécharger le PDF", }, notification: { status_updated: "Statut de la facture mis à jour à %{status}", email_sent: "La facture #%{number} a été envoyée à l'adresse email du client", }, helper: { invoice_number: "Identifiant unique de la facture", reference: "Numéro de référence externe optionnel", payment_terms: "ex: 30 jours net, à réception", select_company_for_contacts: "Sélectionnez une entreprise pour voir ses contacts", select_company_for_deals: "Sélectionnez une entreprise pour voir ses affaires", }, email: { subject: "Objet", body: "Corps du message", description: "Vérifiez et personnalisez le message avant de l'envoyer au client.", body_intro: "Veuillez trouver ci-joint votre facture #%{number}.", message_label: "Message (Optionnel)", message_placeholder: "Ajoutez un message personnel...", message_help: "Un e-mail professionnel sera généré automatiquement avec les détails de la facture.", attachment_title: "Pièce jointe PDF", attachment_help: "La facture %{number}.pdf sera jointe automatiquement", cc: "CC", cc_placeholder: "cc@exemple.com, autre@exemple.com", }, empty_items: "Aucune ligne ajoutée", days_overdue: "jours de retard", }, }, "ra-supabase": { auth: { password_reset: "Vérifiez vos e-mails pour le message de réinitialisation du mot de passe.", }, reset_password: { forgot_password: "Mot de passe oublié ?", forgot_password_details: "Entrez votre e-mail pour recevoir un code à 6 chiffres.", }, }, };