service.json 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. {
  2. "page": {
  3. "notFound": "Dossier de service introuvable",
  4. "updated": "Dossier de service mis à jour",
  5. "failedUpdate": "Impossible de mettre à jour le dossier de service",
  6. "deleteTitle": "Supprimer le Dossier de Service",
  7. "deleteDescription": "Cela supprimera définitivement ce dossier de service et toutes les données associées. Cette action ne peut pas être annulée.",
  8. "deleted": "Dossier de service supprimé",
  9. "failedDelete": "Impossible de supprimer",
  10. "datesExpiredTitle": "Dates de facture expirées",
  11. "datesExpiredDescription": "La date de facturation ou la date d'échéance est dépassée. Souhaitez-vous les mettre à jour avant de continuer ?",
  12. "datesExpiredUpdate": "Mettre à jour les dates et continuer",
  13. "datesExpiredProceed": "Continuer sans modifications",
  14. "datesExpiredUseToday": "Mettre à jour à la date du jour",
  15. "datesExpiredCustomize": "Choisir les dates manuellement",
  16. "datesExpiredBack": "Retour",
  17. "datesExpiredSetToday": "Définir à aujourd'hui",
  18. "customFieldsInvalid": "Veuillez remplir tous les champs personnalisés obligatoires",
  19. "customFieldsSaveFailed": "Échec de l'enregistrement des champs personnalisés"
  20. },
  21. "header": {
  22. "tabs": {
  23. "details": "Détails",
  24. "images": "Images",
  25. "video": "Vidéo",
  26. "documents": "Documents",
  27. "statusReports": "Rapports d'état"
  28. },
  29. "save": "Enregistrer",
  30. "pdf": "PDF",
  31. "email": "Email",
  32. "share": "Partager",
  33. "notify": "Notifier",
  34. "delete": "Supprimer",
  35. "unpaid": "Non Payé",
  36. "unsavedChanges": "Modifications non enregistrées",
  37. "saved": "Enregistré",
  38. "joinCall": "Rejoindre l'appel vidéo"
  39. },
  40. "basicInfo": {
  41. "title": "Informations de Base",
  42. "invoiceDetails": "Détails de la facture",
  43. "customerInfo": "Client et véhicule",
  44. "paid": "Payé",
  45. "markPaid": "Marquer comme payé",
  46. "markUnpaid": "Marquer comme non payé",
  47. "vehicle": "Véhicule",
  48. "open": "Ouvert",
  49. "customer": "Client",
  50. "titleLabel": "Titre *",
  51. "titlePlaceholder": "Vidange d'Huile",
  52. "date": "Date",
  53. "type": "Type",
  54. "mileage": "Kilométrage",
  55. "mileageMarine": "Heures Moteur",
  56. "status": "Statut",
  57. "technician": "Technicien",
  58. "invoiceNumber": "Numéro de Facture",
  59. "invoiceDate": "Date de facture",
  60. "invoiceDueDate": "Date d'échéance",
  61. "typeOptions": {
  62. "maintenance": "Maintenance",
  63. "repair": "Réparation",
  64. "upgrade": "Mise à Niveau",
  65. "inspection": "Inspection"
  66. },
  67. "statusOptions": {
  68. "pending": "En Attente",
  69. "in_progress": "En Cours",
  70. "waiting_parts": "En Attente de Pièces",
  71. "completed": "Complété"
  72. },
  73. "searchVehicles": "Rechercher des véhicules...",
  74. "noVehicleFound": "Aucun véhicule trouvé.",
  75. "techPicker": {
  76. "placeholder": "Sélectionner ou tapez un nom...",
  77. "searchPlaceholder": "Rechercher ou tapez un nom...",
  78. "useCustom": "Utiliser \"{search}\"",
  79. "typePrompt": "Tapez un nom...",
  80. "boardTechnicians": "Techniciens du Tableau",
  81. "teamMembers": "Membres de l'Équipe"
  82. },
  83. "design": "Design de facture",
  84. "designDefault": "Défaut de l'atelier",
  85. "designFollowing": "Défaut ({name})",
  86. "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.",
  87. "designSaved": "Design de facture mis à jour",
  88. "designFollowingRule": "Par défaut ({name}, {rule})",
  89. "designRule": {
  90. "parts_sale": "Vente de pièces seule"
  91. },
  92. "designSaveFailed": "Impossible de changer le design de la facture"
  93. },
  94. "parts": {
  95. "title": "Pièces",
  96. "fromInventory": "De l'Inventaire",
  97. "addPart": "Ajouter une Pièce",
  98. "partNumber": "Nº de Pièce",
  99. "name": "Nom",
  100. "qty": "Qté",
  101. "unitCost": "Coût",
  102. "unitCostHint": "Coût fournisseur (interne — non visible par le client)",
  103. "markupPercent": "Marge %",
  104. "markupPercentHint": "Marge appliquée au coût (interne — non visible par le client)",
  105. "applyMarkup": "Appliquer {percent}%",
  106. "applyMarkupHint": "Réappliquer la marge de {percent}% au coût sur chaque ligne",
  107. "unitPrice": "Prix Unitaire",
  108. "total": "Total",
  109. "namePlaceholder": "Nom *",
  110. "subtotal": "Sous-total Pièces: {amount}",
  111. "inventoryTitle": "Sélectionner une Pièce de l'Inventaire",
  112. "searchInventory": "Rechercher l'inventaire...",
  113. "inStock": "{quantity} en stock",
  114. "noInventory": "Aucune pièce d'inventaire trouvée.",
  115. "scanBarcode": "Scanner",
  116. "scanTitle": "Scanner le code-barres",
  117. "partFound": "\"{name}\" ajouté depuis l'inventaire",
  118. "partNotFound": "Aucune pièce trouvée pour le code-barres \"{barcode}\"",
  119. "deleteRow": "Delete row",
  120. "outOfStock": "En rupture de stock",
  121. "onBackorder": "En réapprovisionnement ({count})",
  122. "nameMissingHint": "Les lignes sans nom de pièce ne sont pas enregistrées."
  123. },
  124. "labor": {
  125. "title": "Main-d'œuvre",
  126. "addLabor": "Ajouter une Main-d'œuvre",
  127. "fromPresets": "Depuis modèles",
  128. "description": "Description",
  129. "hours": "Heures",
  130. "rate": "Taux ({currency}/h)",
  131. "total": "Total",
  132. "descriptionPlaceholder": "Description *",
  133. "subtotal": "Sous-total Main-d'œuvre: {amount}",
  134. "addService": "Add Service",
  135. "addFinding": "Observation",
  136. "newObservation": "Nouvelle observation",
  137. "addExisting": "Voir existantes ({count})",
  138. "qty": "Qty",
  139. "qtyOrHours": "Unit / Hours",
  140. "hourlyTag": "HR",
  141. "serviceTag": "SVC",
  142. "switchToHourly": "Switch to hourly pricing",
  143. "switchToService": "Switch to service pricing",
  144. "switchToHourlyHint": "Hourly: priced by hours worked (hours 00d7 rate/hr). Click to switch.",
  145. "switchToServiceHint": "Service: priced as a flat fee per unit. Click to switch.",
  146. "deleteRow": "Delete row"
  147. },
  148. "totals": {
  149. "title": "Totaux",
  150. "parts": "Pièces",
  151. "labor": "Main-d'œuvre",
  152. "subtotal": "Sous-total",
  153. "subtotalInclTax": "Sous-total (TTC)",
  154. "discount": "Remise",
  155. "discountNone": "Aucune",
  156. "discountPercentage": "Pourcentage",
  157. "discountFixed": "Fixe",
  158. "tax": "Taxe",
  159. "taxIncluded": "Taxe (incl.)",
  160. "total": "Total",
  161. "inclusiveModeHint": "Les prix de ligne sont saisis taxe incluse. Les totaux affichent la répartition net + taxe.",
  162. "partsCost": "Coût des pièces (interne)"
  163. },
  164. "notes": {
  165. "title": "Notes",
  166. "public": "Public",
  167. "internal": "Interne",
  168. "publicPlaceholder": "Notes visibles sur la facture...",
  169. "internalPlaceholder": "Notes internes (non affichées sur la facture)...",
  170. "publicHelper": "Affichées sur la facture et les documents partagés",
  171. "internalHelper": "Visibles uniquement pour votre équipe",
  172. "aiWrite": "AI Rédiger",
  173. "aiGenerated": "Notes AI générées avec succès",
  174. "aiGenerateFailed": "Échec de la génération des notes AI",
  175. "aiDialogTitle": "IA Écrire",
  176. "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é.",
  177. "aiGenerate": "Générer",
  178. "aiOverwriteDescription": "Cette note a déjà du contenu. Vous pouvez le remplacer ou ajouter le texte généré par l'IA en dessous.",
  179. "aiOverwriteReplace": "Remplacer",
  180. "aiOverwriteAppend": "Ajouter",
  181. "aiOverwriteCancel": "Annuler",
  182. "aiDontShowAgain": "Ne plus afficher"
  183. },
  184. "invoice": {
  185. "title": "Résumé de la Facture",
  186. "parts": "Pièces",
  187. "labor": "Main-d'œuvre",
  188. "subtotal": "Sous-total",
  189. "subtotalInclTax": "Sous-total (TTC)",
  190. "discount": "Remise",
  191. "tax": "Taxe ({rate}%)",
  192. "taxIncluded": "Taxe (incl., {rate}%)",
  193. "total": "Total",
  194. "paid": "Payé",
  195. "balanceDue": "Solde Dû",
  196. "paidBadge": "PAYÉ",
  197. "entityLabel": "Facture",
  198. "emailSubject": "Confirmation de Paiement",
  199. "statusEmailSubject": "Mise à jour du statut du service",
  200. "markCompletedTitle": "Marquer cette facture comme terminée ?",
  201. "markCompletedDescription": "Elle est partie chez le client mais reste marquée comme non terminée, elle continuera donc d'apparaître sur le tableau.",
  202. "markCompletedConfirm": "Marquer comme terminée",
  203. "lockedFieldsetLabel": "Facture verrouillée, modification désactivée"
  204. },
  205. "payments": {
  206. "title": "Paiements",
  207. "markUnpaid": "Marquer comme Non Payé",
  208. "markPaid": "Marquer comme Payé",
  209. "recordPayment": "Enregistrer un Paiement",
  210. "totalPaid": "Total Payé",
  211. "amount": "Montant",
  212. "date": "Date",
  213. "method": "Méthode",
  214. "note": "Note",
  215. "notePlaceholder": "Note facultative",
  216. "savePayment": "Enregistrer le Paiement",
  217. "methodOptions": {
  218. "cash": "Comptant",
  219. "card": "Carte",
  220. "transfer": "Virement",
  221. "other": "Autre"
  222. },
  223. "recorded": "Paiement enregistré",
  224. "markedPaid": "Marqué comme payé",
  225. "markedUnpaid": "Marqué comme non payé",
  226. "deleted": "Paiement supprimé",
  227. "failedRecord": "Impossible d'enregistrer le paiement",
  228. "failedStatus": "Impossible de mettre à jour le statut du paiement",
  229. "failedDelete": "Impossible de supprimer le paiement",
  230. "deleteTitle": "Supprimer le Paiement",
  231. "deleteDescription": "Cela supprimera ce dossier de paiement.",
  232. "failedPdf": "Impossible de générer la facture PDF"
  233. },
  234. "attachments": {
  235. "deleteTitle": "Supprimer la Pièce Jointe",
  236. "deleteDescription": "Cela supprimera définitivement cette pièce jointe. Cette action ne peut pas être annulée.",
  237. "deleted": "Pièce jointe supprimée",
  238. "failedDelete": "Impossible de supprimer",
  239. "images": "Images ({count})",
  240. "videos": "Vidéos ({count})",
  241. "diagnostics": "Rapports Diagnostiques ({count})",
  242. "documents": "Documents ({count})",
  243. "download": "Download",
  244. "close": "Close"
  245. },
  246. "share": {
  247. "title": "Partager la Facture",
  248. "description": "Générer un lien public qui permet à n'importe qui de consulter et télécharger cette facture sans se connecter.",
  249. "notifyTitle": "Notifier {name}",
  250. "email": "Email",
  251. "noEmail": "(pas d'email en dossier)",
  252. "sms": "SMS",
  253. "noPhone": "(pas de numéro en dossier)",
  254. "sendNotification": "Envoyer une Notification",
  255. "revokeLink": "Révoquer le Lien",
  256. "generateLink": "Générer un Lien Public",
  257. "emailSent": "Email envoyé",
  258. "failedEmail": "Impossible d'envoyer l'email",
  259. "smsSent": "SMS envoyé",
  260. "failedSms": "Impossible d'envoyer le SMS",
  261. "copyLink": "Copy link"
  262. },
  263. "sidebar": {
  264. "vehicle": "Véhicule",
  265. "customer": "Client",
  266. "vin": "VIN: {vin}",
  267. "mileageAtService": "Kilométrage au service: {mileage} {unit}",
  268. "engineHoursAtService": "Heures moteur au service: {mileage} {unit}",
  269. "sharedLink": {
  270. "title": "Lien partagé",
  271. "sharedOn": "Partagé le {date}",
  272. "notViewed": "Pas encore consulté",
  273. "viewedTimes": "Consulté {count, plural, one {# fois} other {# fois}}",
  274. "lastViewed": "Dernier {date}",
  275. "copyLink": "Copier le lien",
  276. "linkCopied": "Lien copié"
  277. }
  278. },
  279. "images": {
  280. "title": "Images du Service",
  281. "dropzone": "Déposez les images ici ou cliquez pour parcourir",
  282. "uploading": "Téléversement...",
  283. "formats": "JPG, PNG, WebP — max. 10 Mo chacune",
  284. "uploadingImages": "Téléversement des images...",
  285. "limitReached": "Limite d'images atteinte ({count}/{max})",
  286. "upgradePrompt": "Mettez à niveau votre plan pour téléverser plus d'images.",
  287. "onlyAllowed": "Seules les images JPG, PNG et WebP sont autorisées. {names} ignoré(es).",
  288. "onlyUploading": "Seules {count} image(s) seront téléversée(s) pour respecter la limite.",
  289. "uploadingCount": "Téléversement de {count} image(s)...",
  290. "uploadedCount": "{count} image(s) téléversée(s)",
  291. "uploadFailed": "Échec du téléversement",
  292. "deleted": "Image supprimée",
  293. "failedDelete": "Impossible de supprimer l'image",
  294. "failedUpdate": "Impossible de mettre à jour",
  295. "description": "Description...",
  296. "invoice": "Facture"
  297. },
  298. "videos": {
  299. "title": "Vidéos du Service",
  300. "dropzone": "Déposez les vidéos ici ou cliquez pour parcourir",
  301. "uploading": "Téléversement...",
  302. "formats": "MP4, WebM, MOV — max. 10 Mo chacune",
  303. "uploadingVideos": "Téléversement des vidéos...",
  304. "uploadingCount": "Téléversement de {count} vidéo(s)...",
  305. "uploadedCount": "{count} vidéo(s) téléversée(s)",
  306. "uploadFailed": "Échec du téléversement",
  307. "deleted": "Vidéo supprimée",
  308. "failedDelete": "Impossible de supprimer la vidéo",
  309. "failedUpdate": "Impossible de mettre à jour",
  310. "invoice": "Facture"
  311. },
  312. "documents": {
  313. "diagnosticTitle": "Rapports de Diagnostic",
  314. "documentsTitle": "Documents",
  315. "dropzone": "Déposez les fichiers ici ou cliquez pour parcourir",
  316. "uploading": "Téléversement...",
  317. "diagnosticFormats": "PDF, CSV, TXT — max. 10 Mo chacun",
  318. "documentFormats": "PDF, DOCX, XLSX, CSV, TXT — max. 10 Mo chacun",
  319. "uploadingReports": "Téléversement des rapports...",
  320. "uploadingDocuments": "Téléversement des documents...",
  321. "diagnosticLimitReached": "Limite de rapports de diagnostic atteinte ({count}/{max})",
  322. "documentLimitReached": "Limite de documents atteinte ({count}/{max})",
  323. "upgradePrompt": "Mettez à niveau votre plan pour téléverser davantage.",
  324. "diagnosticLabel": "Rapport de diagnostic",
  325. "documentLabel": "Document",
  326. "limitReachedToast": "Limite de {label} atteinte ({count}/{max}). Mettez à niveau votre plan pour plus.",
  327. "onlyUploading": "Seuls {count} fichier(s) seront téléversé(s) pour respecter la limite.",
  328. "uploadingCount": "Téléversement de {count} fichier(s)...",
  329. "uploadedCount": "{count} fichier(s) téléversé(s)",
  330. "uploadFailed": "Échec du téléversement",
  331. "deleted": "Fichier supprimé",
  332. "failedDelete": "Impossible de supprimer le fichier",
  333. "failedUpdate": "Impossible de mettre à jour",
  334. "invoice": "Facture"
  335. },
  336. "schedule": {
  337. "title": "Planification",
  338. "date": "Date",
  339. "startTime": "Heure de début",
  340. "endTime": "Heure de fin",
  341. "technician": "Technicien",
  342. "selectTechnician": "Sélectionner un technicien...",
  343. "searchOrCreate": "Rechercher ou créer un technicien...",
  344. "createTechnician": "Créer \"{name}\"",
  345. "creating": "Création...",
  346. "failedCreate": "Impossible de créer le technicien",
  347. "addNew": "+ Ajouter nouveau",
  348. "add": "Ajouter",
  349. "newTechPlaceholder": "Nom du technicien...",
  350. "assign": "Assigner au tableau",
  351. "assigned": "Assigné au tableau de travail",
  352. "failedAssign": "Échec de l'assignation",
  353. "endBeforeStart": "L'heure de fin doit être après l'heure de début",
  354. "failedUpdate": "Impossible de mettre à jour le planning",
  355. "splitCreated": "Le travail s'étend sur plusieurs jours — suite créée pour le jour suivant",
  356. "platformUsers": "Platform Users",
  357. "customTechnicians": "Custom",
  358. "readMore": "En savoir plus",
  359. "setDefaults": "Paramètres par défaut",
  360. "workBay": "Poste de travail",
  361. "selectWorkBay": "Choisir un poste…",
  362. "noWorkBay": "Aucun poste",
  363. "noTechnician": "Sans technicien",
  364. "technicians": "Techniciens",
  365. "otherTeamMembers": "Autres membres de l’équipe",
  366. "makeTechnician": "En fait un technicien",
  367. "addSomeoneNew": "Ajouter quelqu’un",
  368. "notOnBoard": "Pas encore sur le planning",
  369. "putOnBoard": "Mettre au planning",
  370. "slotTaken": "{count, plural, one {Ce créneau est déjà réservé} other {Ce créneau a # conflits}}",
  371. "anotherJob": "un autre travail",
  372. "clashTechnician": "le technicien est occupé",
  373. "clashBay": "la baie est occupée",
  374. "clashBoth": "les deux sont occupés",
  375. "bookedAnyway": "Enregistré quand même. Changez l'heure ou choisissez le prochain créneau libre.",
  376. "pickNextAvailable": "Choisir le prochain créneau libre",
  377. "findingSlot": "Recherche d'un créneau…",
  378. "slotPicked": "Placé sur le prochain créneau libre",
  379. "noSlotFound": "Aucun créneau libre trouvé dans les prochaines semaines"
  380. },
  381. "notifications": {
  382. "title": "Notifications client",
  383. "viaSms": "par SMS",
  384. "viaEmail": "par e-mail",
  385. "justNow": "À l'instant",
  386. "minutesAgo": "il y a {count}m",
  387. "hoursAgo": "il y a {count}h",
  388. "daysAgo": "il y a {count}j"
  389. },
  390. "table": {
  391. "warranty": "Garantie"
  392. },
  393. "warranty": {
  394. "title": "Garantie",
  395. "months": "Durée (mois)",
  396. "mileage": "Limite de kilométrage",
  397. "notes": "Conditions de garantie",
  398. "notesPlaceholder": "ex. Garantie de 12 mois sur toutes les pièces et la main-d'œuvre...",
  399. "expiresAt": "Expire",
  400. "presets": {
  401. "3months": "3 m",
  402. "6months": "6 m",
  403. "12months": "12 m",
  404. "24months": "24 m"
  405. },
  406. "status": {
  407. "active": "Active",
  408. "expiring": "Expire bientôt",
  409. "expired": "Expirée",
  410. "none": "Aucune"
  411. },
  412. "defaults": {
  413. "title": "Paramètres de garantie par défaut",
  414. "description": "Définir les conditions de garantie par défaut pour les nouveaux dossiers de service"
  415. }
  416. },
  417. "concerns": {
  418. "title": "Demandes du client",
  419. "addFirst": "Ajouter une demande du client",
  420. "add": "En ajouter un autre",
  421. "placeholder": "Il y a un bruit à l'arrière quand je freine",
  422. "remove": "Retirer ce point",
  423. "notAnswered": "Rien trouvé à ce sujet pour l'instant",
  424. "answered": "{count} constat(s) à ce sujet"
  425. },
  426. "videoCall": {
  427. "title": "Appel vidéo",
  428. "none": "Aucun appel vidéo sur cet ordre de travail.",
  429. "needsSchedule": "Définissez d'abord une heure de début. La réunion suit le planning.",
  430. "add": "Ajouter une réunion {provider}",
  431. "addedHere": "ajouté depuis cet ordre de travail",
  432. "fromCalendar": "depuis l'événement du calendrier",
  433. "join": "Rejoindre",
  434. "copy": "Copier le lien",
  435. "copied": "Lien copié",
  436. "remove": "Supprimer",
  437. "removeTitle": "Supprimer l'appel vidéo ?",
  438. "removeDescription": "La réunion est supprimée chez le fournisseur. Ceux qui ont déjà le lien ne pourront plus rejoindre.",
  439. "created": "Réunion créée. Le lien est sur l'ordre de travail.",
  440. "removed": "Réunion supprimée",
  441. "failed": "Une erreur s'est produite",
  442. "shareHint": "Le client ne reçoit ce lien que si vous l'envoyez. Copiez-le dans un message ou ajoutez-le à une notification."
  443. }
  444. }