service.json 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. {
  2. "page": {
  3. "notFound": "Service record not found",
  4. "updated": "Service record updated",
  5. "failedUpdate": "Failed to update service record",
  6. "deleteTitle": "Delete Service Record",
  7. "deleteDescription": "This will permanently delete this service record and all associated data. This cannot be undone.",
  8. "deleted": "Service record deleted",
  9. "failedDelete": "Failed to delete",
  10. "datesExpiredTitle": "Invoice Dates Expired",
  11. "datesExpiredDescription": "The invoice date or due date has passed. Would you like to update them before proceeding?",
  12. "datesExpiredUpdate": "Update dates and proceed",
  13. "datesExpiredProceed": "Proceed without changes",
  14. "datesExpiredSetToday": "Set to today",
  15. "customFieldsInvalid": "Please fill in all required custom fields",
  16. "customFieldsSaveFailed": "Failed to save custom fields"
  17. },
  18. "header": {
  19. "tabs": {
  20. "details": "Details",
  21. "images": "Images",
  22. "video": "Video",
  23. "documents": "Documents",
  24. "statusReports": "Status Reports"
  25. },
  26. "save": "Save",
  27. "pdf": "PDF",
  28. "email": "Email",
  29. "share": "Share",
  30. "delete": "Delete",
  31. "unpaid": "Unpaid",
  32. "unsavedChanges": "Unsaved changes",
  33. "saved": "Saved"
  34. },
  35. "basicInfo": {
  36. "title": "Basic Information",
  37. "invoiceDetails": "Invoice Details",
  38. "customerInfo": "Customer & Vehicle",
  39. "paid": "Paid",
  40. "markPaid": "Mark as Paid",
  41. "markUnpaid": "Mark as Unpaid",
  42. "vehicle": "Vehicle",
  43. "open": "Open",
  44. "customer": "Customer",
  45. "titleLabel": "Title *",
  46. "titlePlaceholder": "Oil Change",
  47. "date": "Date",
  48. "type": "Type",
  49. "mileage": "Mileage",
  50. "mileageMarine": "Engine Hours",
  51. "status": "Status",
  52. "technician": "Technician",
  53. "invoiceNumber": "Invoice Number",
  54. "invoiceDate": "Invoice Date",
  55. "invoiceDueDate": "Due Date",
  56. "typeOptions": {
  57. "maintenance": "Maintenance",
  58. "repair": "Repair",
  59. "upgrade": "Upgrade",
  60. "inspection": "Inspection"
  61. },
  62. "statusOptions": {
  63. "pending": "Pending",
  64. "in_progress": "In Progress",
  65. "waiting_parts": "Waiting Parts",
  66. "completed": "Completed"
  67. },
  68. "searchVehicles": "Search vehicles...",
  69. "noVehicleFound": "No vehicle found.",
  70. "techPicker": {
  71. "placeholder": "Select or type a name...",
  72. "searchPlaceholder": "Search or type name...",
  73. "useCustom": "Use \"{search}\"",
  74. "typePrompt": "Type a name...",
  75. "boardTechnicians": "Board Technicians",
  76. "teamMembers": "Team Members"
  77. }
  78. },
  79. "parts": {
  80. "title": "Parts",
  81. "fromInventory": "From Inventory",
  82. "addPart": "Add Part",
  83. "partNumber": "Part #",
  84. "name": "Name",
  85. "qty": "Qty",
  86. "unitPrice": "Unit Price",
  87. "total": "Total",
  88. "namePlaceholder": "Name *",
  89. "subtotal": "Parts Subtotal: {amount}",
  90. "inventoryTitle": "Select Part from Inventory",
  91. "searchInventory": "Search inventory...",
  92. "inStock": "{quantity} in stock",
  93. "noInventory": "No inventory parts found.",
  94. "scanBarcode": "Scan",
  95. "scanTitle": "Scan Barcode",
  96. "partFound": "Added \"{name}\" from inventory",
  97. "partNotFound": "No part found for barcode \"{barcode}\""
  98. },
  99. "labor": {
  100. "title": "Labor & Services",
  101. "addLabor": "Add Labor",
  102. "addService": "Add Service",
  103. "fromPresets": "From Presets",
  104. "description": "Description",
  105. "hours": "Hours",
  106. "qty": "Qty",
  107. "qtyOrHours": "Unit / Hours",
  108. "rate": "Rate ({currency}/hr)",
  109. "total": "Total",
  110. "descriptionPlaceholder": "Description *",
  111. "subtotal": "Labor Subtotal: {amount}",
  112. "hourlyTag": "HR",
  113. "serviceTag": "SVC",
  114. "switchToHourly": "Switch to hourly pricing",
  115. "switchToService": "Switch to service pricing",
  116. "switchToHourlyHint": "Hourly: priced by hours worked (hours \u00d7 rate/hr). Click to switch.",
  117. "switchToServiceHint": "Service: priced as a flat fee per unit. Click to switch."
  118. },
  119. "totals": {
  120. "title": "Totals",
  121. "parts": "Parts",
  122. "labor": "Labor",
  123. "subtotal": "Subtotal",
  124. "discount": "Discount",
  125. "discountNone": "None",
  126. "discountPercentage": "Percentage",
  127. "discountFixed": "Fixed",
  128. "tax": "Tax",
  129. "total": "Total"
  130. },
  131. "notes": {
  132. "title": "Notes",
  133. "public": "Public",
  134. "internal": "Internal",
  135. "publicPlaceholder": "Notes visible on the invoice...",
  136. "internalPlaceholder": "Internal notes (not shown on invoice)...",
  137. "publicHelper": "Shown on the invoice and shared documents",
  138. "internalHelper": "Only visible to your team",
  139. "aiWrite": "AI Write",
  140. "aiGenerated": "AI notes generated successfully",
  141. "aiGenerateFailed": "Failed to generate AI notes",
  142. "aiDialogTitle": "AI Write",
  143. "aiDialogDescription": "AI will analyze the parts and labor in this service record and generate a professional description. The result will be written to the currently selected note type.",
  144. "aiGenerate": "Generate",
  145. "aiOverwriteDescription": "The current note already has content. You can replace it or append the AI-generated text below it.",
  146. "aiOverwriteReplace": "Replace",
  147. "aiOverwriteAppend": "Append",
  148. "aiOverwriteCancel": "Cancel",
  149. "aiDontShowAgain": "Don't show this again"
  150. },
  151. "invoice": {
  152. "title": "Invoice Summary",
  153. "parts": "Parts",
  154. "labor": "Labor",
  155. "subtotal": "Subtotal",
  156. "discount": "Discount",
  157. "tax": "Tax ({rate}%)",
  158. "total": "Total",
  159. "paid": "Paid",
  160. "balanceDue": "Balance Due",
  161. "paidBadge": "PAID",
  162. "entityLabel": "Invoice",
  163. "emailSubject": "Payment Confirmation"
  164. },
  165. "payments": {
  166. "title": "Payments",
  167. "markUnpaid": "Mark as Unpaid",
  168. "markPaid": "Mark as Paid",
  169. "recordPayment": "Record Payment",
  170. "totalPaid": "Total Paid",
  171. "amount": "Amount",
  172. "date": "Date",
  173. "method": "Method",
  174. "note": "Note",
  175. "notePlaceholder": "Optional note",
  176. "savePayment": "Save Payment",
  177. "methodOptions": {
  178. "cash": "Cash",
  179. "card": "Card",
  180. "transfer": "Transfer",
  181. "other": "Other"
  182. },
  183. "recorded": "Payment recorded",
  184. "markedPaid": "Marked as paid",
  185. "markedUnpaid": "Marked as unpaid",
  186. "deleted": "Payment deleted",
  187. "failedRecord": "Failed to record payment",
  188. "failedStatus": "Failed to update payment status",
  189. "failedDelete": "Failed to delete payment",
  190. "deleteTitle": "Delete Payment",
  191. "deleteDescription": "This will remove this payment record.",
  192. "failedPdf": "Failed to generate PDF invoice"
  193. },
  194. "attachments": {
  195. "deleteTitle": "Delete Attachment",
  196. "deleteDescription": "This will permanently delete this attachment. This cannot be undone.",
  197. "deleted": "Attachment deleted",
  198. "failedDelete": "Failed to delete",
  199. "images": "Images ({count})",
  200. "videos": "Videos ({count})",
  201. "diagnostics": "Diagnostic Reports ({count})",
  202. "documents": "Documents ({count})"
  203. },
  204. "share": {
  205. "title": "Share Invoice",
  206. "description": "Generate a public link that allows anyone to view and download this invoice without signing in.",
  207. "notifyTitle": "Notify {name}",
  208. "email": "Email",
  209. "noEmail": "(no email on file)",
  210. "sms": "SMS",
  211. "noPhone": "(no phone on file)",
  212. "sendNotification": "Send Notification",
  213. "revokeLink": "Revoke Link",
  214. "generateLink": "Generate Public Link",
  215. "emailSent": "Email sent",
  216. "failedEmail": "Failed to send email",
  217. "smsSent": "SMS sent",
  218. "failedSms": "Failed to send SMS"
  219. },
  220. "sidebar": {
  221. "vehicle": "Vehicle",
  222. "customer": "Customer",
  223. "vin": "VIN: {vin}",
  224. "mileageAtService": "Mileage at service: {mileage} {unit}",
  225. "engineHoursAtService": "Engine hours at service: {mileage} {unit}",
  226. "sharedLink": {
  227. "title": "Shared Link",
  228. "sharedOn": "Shared on {date}",
  229. "notViewed": "Not viewed yet",
  230. "viewedTimes": "Viewed {count, plural, one {# time} other {# times}}",
  231. "lastViewed": "Last {date}",
  232. "copyLink": "Copy link",
  233. "linkCopied": "Link copied"
  234. }
  235. },
  236. "images": {
  237. "title": "Service Images",
  238. "dropzone": "Drop images here or click to browse",
  239. "uploading": "Uploading...",
  240. "formats": "JPG, PNG, WebP — max 10MB each",
  241. "uploadingImages": "Uploading images...",
  242. "limitReached": "Image limit reached ({count}/{max})",
  243. "upgradePrompt": "Upgrade your plan to upload more images.",
  244. "onlyAllowed": "Only JPG, PNG, and WebP images are allowed. {names} skipped.",
  245. "onlyUploading": "Only uploading {count} image(s) to stay within limit.",
  246. "uploadingCount": "Uploading {count} image(s)...",
  247. "uploadedCount": "{count} image(s) uploaded",
  248. "uploadFailed": "Upload failed",
  249. "deleted": "Image deleted",
  250. "failedDelete": "Failed to delete image",
  251. "failedUpdate": "Failed to update",
  252. "description": "Description...",
  253. "invoice": "Invoice"
  254. },
  255. "videos": {
  256. "title": "Service Videos",
  257. "dropzone": "Drop videos here or click to browse",
  258. "uploading": "Uploading...",
  259. "formats": "MP4, WebM, MOV — max 10MB each",
  260. "uploadingVideos": "Uploading videos...",
  261. "uploadingCount": "Uploading {count} video(s)...",
  262. "uploadedCount": "{count} video(s) uploaded",
  263. "uploadFailed": "Upload failed",
  264. "deleted": "Video deleted",
  265. "failedDelete": "Failed to delete video",
  266. "failedUpdate": "Failed to update",
  267. "invoice": "Invoice"
  268. },
  269. "documents": {
  270. "diagnosticTitle": "Diagnostic Reports",
  271. "documentsTitle": "Documents",
  272. "dropzone": "Drop files here or click to browse",
  273. "uploading": "Uploading...",
  274. "diagnosticFormats": "PDF, CSV, TXT — max 10MB each",
  275. "documentFormats": "PDF, DOCX, XLSX, CSV, TXT — max 10MB each",
  276. "uploadingReports": "Uploading reports...",
  277. "uploadingDocuments": "Uploading documents...",
  278. "diagnosticLimitReached": "Diagnostic report limit reached ({count}/{max})",
  279. "documentLimitReached": "Document limit reached ({count}/{max})",
  280. "upgradePrompt": "Upgrade your plan to upload more.",
  281. "diagnosticLabel": "Diagnostic report",
  282. "documentLabel": "Document",
  283. "limitReachedToast": "{label} limit reached ({count}/{max}). Upgrade your plan for more.",
  284. "onlyUploading": "Only uploading {count} file(s) to stay within limit.",
  285. "uploadingCount": "Uploading {count} file(s)...",
  286. "uploadedCount": "{count} file(s) uploaded",
  287. "uploadFailed": "Upload failed",
  288. "deleted": "File deleted",
  289. "failedDelete": "Failed to delete file",
  290. "failedUpdate": "Failed to update",
  291. "invoice": "Invoice"
  292. },
  293. "schedule": {
  294. "title": "Schedule",
  295. "date": "Date",
  296. "startTime": "Start Time",
  297. "endTime": "End Time",
  298. "technician": "Technician",
  299. "selectTechnician": "Select technician...",
  300. "searchOrCreate": "Search or create technician...",
  301. "createTechnician": "Create \"{name}\"",
  302. "creating": "Creating...",
  303. "failedCreate": "Failed to create technician",
  304. "addNew": "+ Add New",
  305. "add": "Add",
  306. "newTechPlaceholder": "Technician name...",
  307. "assign": "Assign to Board",
  308. "assigned": "Assigned to work board",
  309. "failedAssign": "Failed to assign",
  310. "endBeforeStart": "End time must be after start time",
  311. "failedUpdate": "Failed to update schedule times",
  312. "splitCreated": "Job spans multiple days — continuation created for next day",
  313. "platformUsers": "Platform Users",
  314. "customTechnicians": "Custom",
  315. "readMore": "Read More",
  316. "setDefaults": "Set Defaults"
  317. }
  318. }