| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- {
- "page": {
- "notFound": "Dossier de service introuvable",
- "updated": "Dossier de service mis à jour",
- "failedUpdate": "Impossible de mettre à jour le dossier de service",
- "deleteTitle": "Supprimer le Dossier de Service",
- "deleteDescription": "Cela supprimera définitivement ce dossier de service et toutes les données associées. Cette action ne peut pas être annulée.",
- "deleted": "Dossier de service supprimé",
- "failedDelete": "Impossible de supprimer",
- "datesExpiredTitle": "Dates de facture expirées",
- "datesExpiredDescription": "La date de facturation ou la date d'échéance est dépassée. Souhaitez-vous les mettre à jour avant de continuer ?",
- "datesExpiredUpdate": "Mettre à jour les dates et continuer",
- "datesExpiredProceed": "Continuer sans modifications",
- "datesExpiredUseToday": "Mettre à jour à la date du jour",
- "datesExpiredCustomize": "Choisir les dates manuellement",
- "datesExpiredBack": "Retour",
- "datesExpiredSetToday": "Définir à aujourd'hui",
- "customFieldsInvalid": "Veuillez remplir tous les champs personnalisés obligatoires",
- "customFieldsSaveFailed": "Échec de l'enregistrement des champs personnalisés",
- "problems": {
- "title": "Le travail doit avoir un titre avant d'être enregistré.",
- "negative": "Les quantités, heures, prix et coûts ne peuvent pas être négatifs.",
- "partName": "Chaque pièce avec un prix doit avoir un nom.",
- "laborDescription": "Chaque ligne de main-d'œuvre avec des heures ou un taux doit avoir une description."
- }
- },
- "header": {
- "tabs": {
- "details": "Détails",
- "images": "Images",
- "video": "Vidéo",
- "documents": "Documents",
- "statusReports": "Rapports d'état"
- },
- "save": "Enregistrer",
- "pdf": "PDF",
- "email": "Email",
- "share": "Partager",
- "notify": "Notifier",
- "delete": "Supprimer",
- "unpaid": "Non Payé",
- "unsavedChanges": "Modifications non enregistrées",
- "saved": "Enregistré",
- "joinCall": "Rejoindre l'appel vidéo"
- },
- "basicInfo": {
- "title": "Informations de Base",
- "invoiceDetails": "Détails de la facture",
- "customerInfo": "Client et véhicule",
- "paid": "Payé",
- "markPaid": "Marquer comme payé",
- "markUnpaid": "Marquer comme non payé",
- "vehicle": "Véhicule",
- "open": "Ouvert",
- "customer": "Client",
- "titleLabel": "Titre *",
- "titlePlaceholder": "Vidange d'Huile",
- "date": "Date",
- "type": "Type",
- "mileage": "Kilométrage",
- "mileageMarine": "Heures Moteur",
- "status": "Statut",
- "technician": "Technicien",
- "invoiceNumber": "Numéro de Facture",
- "invoiceDate": "Date de facture",
- "invoiceDueDate": "Date d'échéance",
- "typeOptions": {
- "maintenance": "Maintenance",
- "repair": "Réparation",
- "upgrade": "Mise à Niveau",
- "inspection": "Inspection"
- },
- "statusOptions": {
- "pending": "En Attente",
- "in_progress": "En Cours",
- "waiting_parts": "En Attente de Pièces",
- "completed": "Complété"
- },
- "searchVehicles": "Rechercher des véhicules...",
- "noVehicleFound": "Aucun véhicule trouvé.",
- "techPicker": {
- "placeholder": "Sélectionner ou tapez un nom...",
- "searchPlaceholder": "Rechercher ou tapez un nom...",
- "useCustom": "Utiliser \"{search}\"",
- "typePrompt": "Tapez un nom...",
- "boardTechnicians": "Techniciens du Tableau",
- "teamMembers": "Membres de l'Équipe"
- },
- "design": "Design de facture",
- "designDefault": "Défaut de l'atelier",
- "designFollowing": "Défaut ({name})",
- "designPinned": "La feuille a été figée à l'émission de la facture le {date}. Un nouveau choix ne s'applique qu'après qu'un propriétaire déverrouille la facture et qu'elle soit renvoyée.",
- "designSaved": "Design de facture mis à jour",
- "designFollowingRule": "Par défaut ({name}, {rule})",
- "designRule": {
- "parts_sale": "Vente de pièces seule"
- },
- "designSaveFailed": "Impossible de changer le design de la facture"
- },
- "parts": {
- "title": "Pièces",
- "fromInventory": "De l'Inventaire",
- "addPart": "Ajouter une Pièce",
- "partNumber": "Nº de Pièce",
- "name": "Nom",
- "qty": "Qté",
- "unitCost": "Coût",
- "unitCostHint": "Coût fournisseur (interne — non visible par le client)",
- "markupPercent": "Marge %",
- "markupPercentHint": "Marge appliquée au coût (interne — non visible par le client)",
- "applyMarkup": "Appliquer {percent}%",
- "applyMarkupHint": "Réappliquer la marge de {percent}% au coût sur chaque ligne",
- "unitPrice": "Prix Unitaire",
- "total": "Total",
- "namePlaceholder": "Nom *",
- "subtotal": "Sous-total Pièces: {amount}",
- "inventoryTitle": "Sélectionner une Pièce de l'Inventaire",
- "searchInventory": "Rechercher l'inventaire...",
- "inStock": "{quantity} en stock",
- "noInventory": "Aucune pièce d'inventaire trouvée.",
- "scanBarcode": "Scanner",
- "scanTitle": "Scanner le code-barres",
- "partFound": "\"{name}\" ajouté depuis l'inventaire",
- "partNotFound": "Aucune pièce trouvée pour le code-barres \"{barcode}\"",
- "deleteRow": "Delete row",
- "outOfStock": "En rupture de stock",
- "onBackorder": "En réapprovisionnement ({count})",
- "nameMissingHint": "Les lignes sans nom de pièce ne sont pas enregistrées."
- },
- "labor": {
- "title": "Main-d'œuvre",
- "addLabor": "Ajouter une Main-d'œuvre",
- "fromPresets": "Depuis modèles",
- "description": "Description",
- "hours": "Heures",
- "rate": "Taux ({currency}/h)",
- "total": "Total",
- "descriptionPlaceholder": "Description *",
- "subtotal": "Sous-total Main-d'œuvre: {amount}",
- "addService": "Add Service",
- "addFinding": "Observation",
- "newObservation": "Nouvelle observation",
- "addExisting": "Voir existantes ({count})",
- "qty": "Qty",
- "qtyOrHours": "Unit / Hours",
- "hourlyTag": "HR",
- "serviceTag": "SVC",
- "switchToHourly": "Switch to hourly pricing",
- "switchToService": "Switch to service pricing",
- "switchToHourlyHint": "À l'heure : facturé selon les heures travaillées (heures × taux/h). Cliquez pour changer.",
- "switchToServiceHint": "Forfait : facturé au prix fixe par unité. Cliquez pour changer.",
- "deleteRow": "Delete row",
- "descriptionMissingHint": "Les lignes sans description ne sont pas enregistrées."
- },
- "totals": {
- "title": "Totaux",
- "parts": "Pièces",
- "labor": "Main-d'œuvre",
- "subtotal": "Sous-total",
- "subtotalInclTax": "Sous-total (TTC)",
- "discount": "Remise",
- "discountNone": "Aucune",
- "discountPercentage": "Pourcentage",
- "discountFixed": "Fixe",
- "tax": "Taxe",
- "taxIncluded": "Taxe (incl.)",
- "total": "Total",
- "inclusiveModeHint": "Les prix de ligne sont saisis taxe incluse. Les totaux affichent la répartition net + taxe.",
- "partsCost": "Coût des pièces (interne)"
- },
- "notes": {
- "title": "Notes",
- "public": "Public",
- "internal": "Interne",
- "publicPlaceholder": "Notes visibles sur la facture...",
- "internalPlaceholder": "Notes internes (non affichées sur la facture)...",
- "publicHelper": "Affichées sur la facture et les documents partagés",
- "internalHelper": "Visibles uniquement pour votre équipe",
- "aiWrite": "AI Rédiger",
- "aiGenerated": "Notes AI générées avec succès",
- "aiGenerateFailed": "Échec de la génération des notes AI",
- "aiDialogTitle": "IA Écrire",
- "aiDialogDescription": "L'IA analysera les pièces et la main-d'œuvre de cet enregistrement de service et générera une description professionnelle. Le résultat sera écrit dans le type de note sélectionné.",
- "aiGenerate": "Générer",
- "aiOverwriteDescription": "Cette note a déjà du contenu. Vous pouvez le remplacer ou ajouter le texte généré par l'IA en dessous.",
- "aiOverwriteReplace": "Remplacer",
- "aiOverwriteAppend": "Ajouter",
- "aiOverwriteCancel": "Annuler",
- "aiDontShowAgain": "Ne plus afficher"
- },
- "invoice": {
- "title": "Résumé de la Facture",
- "parts": "Pièces",
- "labor": "Main-d'œuvre",
- "subtotal": "Sous-total",
- "subtotalInclTax": "Sous-total (TTC)",
- "discount": "Remise",
- "tax": "Taxe ({rate}%)",
- "taxIncluded": "Taxe (incl., {rate}%)",
- "total": "Total",
- "paid": "Payé",
- "balanceDue": "Solde Dû",
- "paidBadge": "PAYÉ",
- "entityLabel": "Facture",
- "emailSubject": "Confirmation de Paiement",
- "statusEmailSubject": "Mise à jour du statut du service",
- "markCompletedTitle": "Marquer cette facture comme terminée ?",
- "markCompletedDescription": "Elle est partie chez le client mais reste marquée comme non terminée, elle continuera donc d'apparaître sur le tableau.",
- "markCompletedConfirm": "Marquer comme terminée",
- "lockedFieldsetLabel": "Facture verrouillée, modification désactivée"
- },
- "payments": {
- "title": "Paiements",
- "markUnpaid": "Marquer comme Non Payé",
- "markPaid": "Marquer comme Payé",
- "recordPayment": "Enregistrer un Paiement",
- "totalPaid": "Total Payé",
- "amount": "Montant",
- "date": "Date",
- "method": "Méthode",
- "note": "Note",
- "notePlaceholder": "Note facultative",
- "savePayment": "Enregistrer le Paiement",
- "methodOptions": {
- "cash": "Comptant",
- "card": "Carte",
- "transfer": "Virement",
- "other": "Autre"
- },
- "recorded": "Paiement enregistré",
- "markedPaid": "Marqué comme payé",
- "markedUnpaid": "Marqué comme non payé",
- "deleted": "Paiement supprimé",
- "failedRecord": "Impossible d'enregistrer le paiement",
- "failedStatus": "Impossible de mettre à jour le statut du paiement",
- "failedDelete": "Impossible de supprimer le paiement",
- "deleteTitle": "Supprimer le Paiement",
- "deleteDescription": "Cela supprimera ce dossier de paiement.",
- "failedPdf": "Impossible de générer la facture PDF"
- },
- "attachments": {
- "deleteTitle": "Supprimer la Pièce Jointe",
- "deleteDescription": "Cela supprimera définitivement cette pièce jointe. Cette action ne peut pas être annulée.",
- "deleted": "Pièce jointe supprimée",
- "failedDelete": "Impossible de supprimer",
- "images": "Images ({count})",
- "videos": "Vidéos ({count})",
- "diagnostics": "Rapports Diagnostiques ({count})",
- "documents": "Documents ({count})",
- "download": "Download",
- "close": "Close"
- },
- "share": {
- "title": "Partager la Facture",
- "description": "Générer un lien public qui permet à n'importe qui de consulter et télécharger cette facture sans se connecter.",
- "notifyTitle": "Notifier {name}",
- "email": "Email",
- "noEmail": "(pas d'email en dossier)",
- "sms": "SMS",
- "noPhone": "(pas de numéro en dossier)",
- "sendNotification": "Envoyer une Notification",
- "revokeLink": "Révoquer le Lien",
- "generateLink": "Générer un Lien Public",
- "emailSent": "Email envoyé",
- "failedEmail": "Impossible d'envoyer l'email",
- "smsSent": "SMS envoyé",
- "failedSms": "Impossible d'envoyer le SMS",
- "copyLink": "Copy link"
- },
- "sidebar": {
- "vehicle": "Véhicule",
- "customer": "Client",
- "vin": "VIN: {vin}",
- "mileageAtService": "Kilométrage au service: {mileage} {unit}",
- "engineHoursAtService": "Heures moteur au service: {mileage} {unit}",
- "sharedLink": {
- "title": "Lien partagé",
- "sharedOn": "Partagé le {date}",
- "notViewed": "Pas encore consulté",
- "viewedTimes": "Consulté {count, plural, one {# fois} other {# fois}}",
- "lastViewed": "Dernier {date}",
- "copyLink": "Copier le lien",
- "linkCopied": "Lien copié"
- }
- },
- "images": {
- "title": "Images du Service",
- "dropzone": "Déposez les images ici ou cliquez pour parcourir",
- "uploading": "Téléversement...",
- "formats": "JPG, PNG, WebP — max. 10 Mo chacune",
- "uploadingImages": "Téléversement des images...",
- "limitReached": "Limite d'images atteinte ({count}/{max})",
- "upgradePrompt": "Mettez à niveau votre plan pour téléverser plus d'images.",
- "onlyAllowed": "Seules les images JPG, PNG et WebP sont autorisées. {names} ignoré(es).",
- "onlyUploading": "Seules {count} image(s) seront téléversée(s) pour respecter la limite.",
- "uploadingCount": "Téléversement de {count} image(s)...",
- "uploadedCount": "{count} image(s) téléversée(s)",
- "uploadFailed": "Échec du téléversement",
- "deleted": "Image supprimée",
- "failedDelete": "Impossible de supprimer l'image",
- "failedUpdate": "Impossible de mettre à jour",
- "description": "Description...",
- "invoice": "Facture"
- },
- "videos": {
- "title": "Vidéos du Service",
- "dropzone": "Déposez les vidéos ici ou cliquez pour parcourir",
- "uploading": "Téléversement...",
- "formats": "MP4, WebM, MOV — max. 10 Mo chacune",
- "uploadingVideos": "Téléversement des vidéos...",
- "uploadingCount": "Téléversement de {count} vidéo(s)...",
- "uploadedCount": "{count} vidéo(s) téléversée(s)",
- "uploadFailed": "Échec du téléversement",
- "deleted": "Vidéo supprimée",
- "failedDelete": "Impossible de supprimer la vidéo",
- "failedUpdate": "Impossible de mettre à jour",
- "invoice": "Facture"
- },
- "documents": {
- "diagnosticTitle": "Rapports de Diagnostic",
- "documentsTitle": "Documents",
- "dropzone": "Déposez les fichiers ici ou cliquez pour parcourir",
- "uploading": "Téléversement...",
- "diagnosticFormats": "PDF, CSV, TXT — max. 10 Mo chacun",
- "documentFormats": "PDF, DOCX, XLSX, CSV, TXT — max. 10 Mo chacun",
- "uploadingReports": "Téléversement des rapports...",
- "uploadingDocuments": "Téléversement des documents...",
- "diagnosticLimitReached": "Limite de rapports de diagnostic atteinte ({count}/{max})",
- "documentLimitReached": "Limite de documents atteinte ({count}/{max})",
- "upgradePrompt": "Mettez à niveau votre plan pour téléverser davantage.",
- "diagnosticLabel": "Rapport de diagnostic",
- "documentLabel": "Document",
- "limitReachedToast": "Limite de {label} atteinte ({count}/{max}). Mettez à niveau votre plan pour plus.",
- "onlyUploading": "Seuls {count} fichier(s) seront téléversé(s) pour respecter la limite.",
- "uploadingCount": "Téléversement de {count} fichier(s)...",
- "uploadedCount": "{count} fichier(s) téléversé(s)",
- "uploadFailed": "Échec du téléversement",
- "deleted": "Fichier supprimé",
- "failedDelete": "Impossible de supprimer le fichier",
- "failedUpdate": "Impossible de mettre à jour",
- "invoice": "Facture"
- },
- "schedule": {
- "title": "Planification",
- "date": "Date",
- "startTime": "Heure de début",
- "endTime": "Heure de fin",
- "technician": "Technicien",
- "selectTechnician": "Sélectionner un technicien...",
- "searchOrCreate": "Rechercher ou créer un technicien...",
- "createTechnician": "Créer \"{name}\"",
- "creating": "Création...",
- "failedCreate": "Impossible de créer le technicien",
- "addNew": "+ Ajouter nouveau",
- "add": "Ajouter",
- "newTechPlaceholder": "Nom du technicien...",
- "assign": "Assigner au tableau",
- "assigned": "Assigné au tableau de travail",
- "failedAssign": "Échec de l'assignation",
- "endBeforeStart": "L'heure de fin doit être après l'heure de début",
- "failedUpdate": "Impossible de mettre à jour le planning",
- "splitCreated": "Le travail s'étend sur plusieurs jours — suite créée pour le jour suivant",
- "platformUsers": "Platform Users",
- "customTechnicians": "Custom",
- "readMore": "En savoir plus",
- "setDefaults": "Paramètres par défaut",
- "workBay": "Poste de travail",
- "selectWorkBay": "Choisir un poste…",
- "noWorkBay": "Aucun poste",
- "noTechnician": "Sans technicien",
- "technicians": "Techniciens",
- "otherTeamMembers": "Autres membres de l’équipe",
- "makeTechnician": "En fait un technicien",
- "addSomeoneNew": "Ajouter quelqu’un",
- "notOnBoard": "Pas encore sur le planning",
- "putOnBoard": "Mettre au planning",
- "slotTaken": "{count, plural, one {Ce créneau est déjà réservé} other {Ce créneau a # conflits}}",
- "anotherJob": "un autre travail",
- "clashTechnician": "le technicien est occupé",
- "clashBay": "la baie est occupée",
- "clashBoth": "les deux sont occupés",
- "bookedAnyway": "Enregistré quand même. Changez l'heure ou choisissez le prochain créneau libre.",
- "pickNextAvailable": "Choisir le prochain créneau libre",
- "findingSlot": "Recherche d'un créneau…",
- "slotPicked": "Placé sur le prochain créneau libre",
- "noSlotFound": "Aucun créneau libre trouvé dans les prochaines semaines"
- },
- "notifications": {
- "title": "Notifications client",
- "viaSms": "par SMS",
- "viaEmail": "par e-mail",
- "justNow": "À l'instant",
- "minutesAgo": "il y a {count}m",
- "hoursAgo": "il y a {count}h",
- "daysAgo": "il y a {count}j"
- },
- "table": {
- "warranty": "Garantie"
- },
- "warranty": {
- "title": "Garantie",
- "months": "Durée (mois)",
- "mileage": "Limite de kilométrage",
- "notes": "Conditions de garantie",
- "notesPlaceholder": "ex. Garantie de 12 mois sur toutes les pièces et la main-d'œuvre...",
- "expiresAt": "Expire",
- "presets": {
- "3months": "3 m",
- "6months": "6 m",
- "12months": "12 m",
- "24months": "24 m"
- },
- "status": {
- "active": "Active",
- "expiring": "Expire bientôt",
- "expired": "Expirée",
- "none": "Aucune"
- },
- "defaults": {
- "title": "Paramètres de garantie par défaut",
- "description": "Définir les conditions de garantie par défaut pour les nouveaux dossiers de service"
- }
- },
- "concerns": {
- "title": "Demandes du client",
- "addFirst": "Ajouter une demande du client",
- "add": "En ajouter un autre",
- "placeholder": "Il y a un bruit à l'arrière quand je freine",
- "remove": "Retirer ce point",
- "notAnswered": "Rien trouvé à ce sujet pour l'instant",
- "answered": "{count} constat(s) à ce sujet"
- },
- "videoCall": {
- "title": "Appel vidéo",
- "none": "Aucun appel vidéo sur cet ordre de travail.",
- "needsSchedule": "Définissez d'abord une heure de début. La réunion suit le planning.",
- "add": "Ajouter une réunion {provider}",
- "addedHere": "ajouté depuis cet ordre de travail",
- "fromCalendar": "depuis l'événement du calendrier",
- "join": "Rejoindre",
- "copy": "Copier le lien",
- "copied": "Lien copié",
- "remove": "Supprimer",
- "removeTitle": "Supprimer l'appel vidéo ?",
- "removeDescription": "La réunion est supprimée chez le fournisseur. Ceux qui ont déjà le lien ne pourront plus rejoindre.",
- "created": "Réunion créée. Le lien est sur l'ordre de travail.",
- "removed": "Réunion supprimée",
- "failed": "Une erreur s'est produite",
- "shareHint": "Le client ne reçoit ce lien que si vous l'envoyez.",
- "shareHintNoChannel": "Le client ne reçoit ce lien que si vous l'envoyez. Aucun canal de messagerie n'est configuré : copiez-le vous-même dans un message.",
- "send": {
- "button": "Envoyer au client",
- "title": "Envoyer le lien de l'appel vidéo",
- "description": "Envoyer le lien de connexion à {name}.",
- "messageLabel": "Note (facultatif)",
- "messagePlaceholder": "Ce que le client doit savoir avant l'appel...",
- "linkAlwaysIncluded": "Le lien de connexion est toujours ajouté sous votre note.",
- "sms": "SMS",
- "email": "E-mail",
- "telegram": "Telegram",
- "noPhone": "(pas de téléphone)",
- "noEmail": "(pas d'e-mail)",
- "noTelegram": "(pas de chat lié)",
- "notAvailable": "(non configuré)",
- "cancel": "Annuler",
- "send": "Envoyer",
- "sent": "Lien de l'appel vidéo envoyé",
- "partlySent": "Envoyé par {sent} ; pas par {failed}",
- "failed": "Impossible d'envoyer le lien"
- },
- "notify": {
- "invitation": "Bonjour {name}, votre appel vidéo concernant le véhicule {vehicle} a lieu le {when}. Rejoignez-le ici : {url}",
- "invitationNoTime": "Bonjour {name}, voici le lien de l'appel vidéo concernant le véhicule {vehicle} : {url}",
- "joinLine": "Rejoignez l'appel vidéo ici : {url}",
- "emailSubject": "Appel vidéo concernant votre {vehicle}"
- }
- }
- }
|