| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752 |
- {
- "page": {
- "notFound": "Service record not found",
- "updated": "Service record updated",
- "failedUpdate": "Failed to update service record",
- "deleteTitle": "Delete Service Record",
- "deleteDescription": "This will permanently delete this service record and all associated data. This cannot be undone.",
- "deleted": "Service record deleted",
- "failedDelete": "Failed to delete",
- "datesExpiredTitle": "Invoice Dates Expired",
- "datesExpiredDescription": "The invoice date or due date has passed. Would you like to update them before proceeding?",
- "datesExpiredUpdate": "Update dates and proceed",
- "datesExpiredProceed": "Proceed without changes",
- "datesExpiredUseToday": "Update to today's date",
- "datesExpiredCustomize": "Choose dates manually",
- "datesExpiredBack": "Back",
- "datesExpiredSetToday": "Set to today",
- "customFieldsInvalid": "Please fill in all required custom fields",
- "customFieldsSaveFailed": "Failed to save custom fields",
- "problems": {
- "title": "The job needs a title before it can be saved.",
- "negative": "Quantities, hours, prices and costs cannot be negative.",
- "partName": "Every priced part needs a name.",
- "laborDescription": "Every labour line with hours or a rate needs a description.",
- "concernCondition": "A concern with a cause, correction or confirmation needs its condition filled in."
- }
- },
- "header": {
- "tabs": {
- "details": "Details",
- "images": "Images",
- "video": "Video",
- "documents": "Documents",
- "statusReports": "Status Reports"
- },
- "save": "Save",
- "pdf": "PDF",
- "email": "Email",
- "share": "Share",
- "notify": "Notify",
- "delete": "Delete",
- "unpaid": "Unpaid",
- "unsavedChanges": "Unsaved changes",
- "saved": "Saved",
- "joinCall": "Join video call",
- "moreActions": "More actions",
- "designMenu": "Invoice design",
- "designMenuLoading": "Checking which design this invoice prints with...",
- "designMenuExplain": "Sent to the customer on {date}, so it still prints with the design it was sent with. Choosing another changes only how it looks. What it says stays as it was sent, and the old look is not kept.",
- "designSentWith": "The design it was sent with",
- "designFollow": "Follow the current default",
- "designFollowNamed": "Follow the current default ({name})",
- "designDefaultName": "the current default",
- "designPickConfirmTitle": "Change this invoice to {name}?",
- "designPickConfirmBody": "Only the look changes. The workshop details, the customer, the payment terms and the totals stay exactly as they were sent. The design it prints with now is not kept, so this cannot be undone.",
- "designPickConfirm": "Change the design",
- "designPickDone": "This invoice now prints with {name}",
- "designPickFailed": "Could not change the design",
- "designRefresh": "Update to today's details",
- "designRefreshConfirmTitle": "Update this invoice to today's details?",
- "designRefreshConfirmBody": "The workshop details, the customer, the vehicle, the payment terms and the design are read again as they are today, and the invoice is locked to them. Its lines and totals are its own and do not change. Copies already downloaded or emailed stay as they were; the share link and the portal show the updated invoice. This cannot be undone.",
- "designRefreshConfirm": "Update the invoice",
- "designRefreshDone": "This invoice now prints with today's details",
- "designRefreshFailed": "Could not update the invoice",
- "printWorkOrder": "Print work order"
- },
- "basicInfo": {
- "title": "Basic Information",
- "invoiceDetails": "Invoice Details",
- "customerInfo": "Customer & Vehicle",
- "paid": "Paid",
- "markPaid": "Mark as Paid",
- "markUnpaid": "Mark as Unpaid",
- "vehicle": "Vehicle",
- "open": "Open",
- "customer": "Customer",
- "titleLabel": "Title *",
- "titlePlaceholder": "Oil Change",
- "date": "Date",
- "type": "Type",
- "mileage": "Mileage",
- "mileageMarine": "Engine Hours",
- "status": "Status",
- "technician": "Technician",
- "invoiceNumber": "Invoice Number",
- "invoiceDate": "Invoice Date",
- "invoiceDueDate": "Due Date",
- "typeOptions": {
- "maintenance": "Maintenance",
- "repair": "Repair",
- "upgrade": "Upgrade",
- "inspection": "Inspection"
- },
- "statusOptions": {
- "pending": "Pending",
- "in_progress": "In Progress",
- "waiting_parts": "Waiting Parts",
- "completed": "Completed"
- },
- "searchVehicles": "Search vehicles...",
- "noVehicleFound": "No vehicle found.",
- "techPicker": {
- "placeholder": "Select or type a name...",
- "searchPlaceholder": "Search or type name...",
- "useCustom": "Use \"{search}\"",
- "typePrompt": "Type a name...",
- "boardTechnicians": "Board Technicians",
- "teamMembers": "Team Members"
- },
- "design": "Invoice design",
- "designDefault": "Workshop default",
- "designFollowing": "Default ({name})",
- "designSaved": "Invoice design updated",
- "designFollowingRule": "Default ({name}, {rule})",
- "designRule": {
- "parts_sale": "Parts-Only Sale"
- },
- "designSaveFailed": "Could not change the invoice design"
- },
- "parts": {
- "title": "Parts",
- "fromInventory": "From Inventory",
- "addPart": "Add Part",
- "partNumber": "Part #",
- "name": "Name",
- "qty": "Qty",
- "unitCost": "Cost",
- "unitCostHint": "Vendor cost (internal — not shown to customer)",
- "markupPercent": "Markup %",
- "markupPercentHint": "Markup applied to cost (internal — not shown to customer)",
- "applyMarkup": "Apply {percent}%",
- "applyMarkupHint": "Re-apply {percent}% markup to cost on every row",
- "unitPrice": "Unit Price",
- "total": "Total",
- "namePlaceholder": "Name *",
- "subtotal": "Parts Subtotal: {amount}",
- "inventoryTitle": "Select Part from Inventory",
- "searchInventory": "Search inventory...",
- "inStock": "{quantity} in stock",
- "noInventory": "No inventory parts found.",
- "scanBarcode": "Scan",
- "scanTitle": "Scan Barcode",
- "partFound": "Added \"{name}\" from inventory",
- "partNotFound": "No part found for barcode \"{barcode}\"",
- "deleteRow": "Delete row",
- "outOfStock": "Out of stock",
- "onBackorder": "On backorder ({count})",
- "nameMissingHint": "Rows without a part name are not saved."
- },
- "labor": {
- "title": "Labor & Services",
- "addLabor": "Add Labor",
- "addService": "Add Service",
- "addFinding": "Observation",
- "newObservation": "New Observation",
- "addExisting": "Show Existing ({count})",
- "fromPresets": "From Presets",
- "description": "Description",
- "hours": "Hours",
- "qty": "Qty",
- "qtyOrHours": "Unit / Hours",
- "rate": "Rate ({currency}/hr)",
- "total": "Total",
- "descriptionPlaceholder": "Description *",
- "subtotal": "Labor Subtotal: {amount}",
- "hourlyTag": "HR",
- "serviceTag": "SVC",
- "hourlyHint": "Hourly: priced by hours worked (hours × rate/hr). Click to switch.",
- "serviceHint": "Service: priced as a flat fee per unit. Click to switch.",
- "deleteRow": "Delete row",
- "descriptionMissingHint": "Rows without a description are not saved.",
- "shopFeeTag": "Fee",
- "shopFeeHintFlat": "The shop fee from Settings, as a flat amount. Change the price for this job, or delete the line to leave it off.",
- "shopFeeHintPercentLabor": "The shop fee from Settings: {percent} % of the labor on this job. Delete the line to leave it off.",
- "shopFeeHintPercentAll": "The shop fee from Settings: {percent} % of the labor and parts on this job. Delete the line to leave it off."
- },
- "liveLabor": {
- "title": "{count, plural, one {A technician added labor to this job} other {A technician added # labor lines to this job}}",
- "body": "It stays out of the list while you are editing. Your next save includes it either way.",
- "show": "Show it"
- },
- "totals": {
- "title": "Totals",
- "parts": "Parts",
- "labor": "Labor",
- "subtotal": "Subtotal",
- "subtotalInclTax": "Subtotal (incl. tax)",
- "discount": "Discount",
- "discountNone": "None",
- "discountPercentage": "Percentage",
- "discountFixed": "Fixed",
- "tax": "Tax",
- "taxIncluded": "Tax (incl.)",
- "total": "Total",
- "inclusiveModeHint": "Line item prices are entered with tax included. Totals show the net + tax breakdown.",
- "partsCost": "Parts cost (internal)"
- },
- "notes": {
- "title": "Notes",
- "public": "Public",
- "internal": "Internal",
- "publicPlaceholder": "Notes visible on the invoice...",
- "internalPlaceholder": "Internal notes (not shown on invoice)...",
- "publicHelper": "Shown on the invoice and shared documents",
- "internalHelper": "Only visible to your team",
- "aiWrite": "AI Write",
- "aiGenerated": "AI notes generated successfully",
- "aiGenerateFailed": "Failed to generate AI notes",
- "aiDialogTitle": "AI Write",
- "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.",
- "aiGenerate": "Generate",
- "aiOverwriteDescription": "The current note already has content. You can replace it or append the AI-generated text below it.",
- "aiOverwriteReplace": "Replace",
- "aiOverwriteAppend": "Append",
- "aiOverwriteCancel": "Cancel",
- "aiDontShowAgain": "Don't show this again",
- "internalTitle": "Internal notes",
- "publicTitle": "Customer notes"
- },
- "invoice": {
- "title": "Invoice Summary",
- "parts": "Parts",
- "labor": "Labor",
- "subtotal": "Subtotal",
- "subtotalInclTax": "Subtotal (incl. tax)",
- "discount": "Discount",
- "tax": "Tax ({rate}%)",
- "taxIncluded": "Tax (incl., {rate}%)",
- "total": "Total",
- "paid": "Paid",
- "balanceDue": "Balance Due",
- "paidBadge": "PAID",
- "entityLabel": "Invoice",
- "emailSubject": "Payment Confirmation",
- "statusEmailSubject": "Service Status Update",
- "markCompletedTitle": "Mark this invoice as completed?",
- "markCompletedDescription": "It has gone to the customer but is still marked as not finished, so it will keep showing on the work board.",
- "markCompletedConfirm": "Mark completed",
- "lockedFieldsetLabel": "Locked invoice, editing disabled"
- },
- "payments": {
- "title": "Payments",
- "markUnpaid": "Mark as Unpaid",
- "markPaid": "Mark as Paid",
- "recordPayment": "Record Payment",
- "totalPaid": "Total Paid",
- "amount": "Amount",
- "date": "Date",
- "method": "Method",
- "note": "Note",
- "notePlaceholder": "Optional note",
- "savePayment": "Save Payment",
- "methodOptions": {
- "cash": "Cash",
- "card": "Card",
- "transfer": "Transfer",
- "other": "Other"
- },
- "recorded": "Payment recorded",
- "markedPaid": "Marked as paid",
- "markedUnpaid": "Marked as unpaid",
- "deleted": "Payment deleted",
- "failedRecord": "Failed to record payment",
- "failedStatus": "Failed to update payment status",
- "failedDelete": "Failed to delete payment",
- "deleteTitle": "Delete Payment",
- "deleteDescription": "This will remove this payment record.",
- "failedPdf": "Failed to generate PDF invoice",
- "received": "Payments received",
- "noneYet": "Nothing paid yet.",
- "balanceDue": "Balance due"
- },
- "attachments": {
- "deleteTitle": "Delete Attachment",
- "deleteDescription": "This will permanently delete this attachment. This cannot be undone.",
- "deleted": "Attachment deleted",
- "failedDelete": "Failed to delete",
- "images": "Images ({count})",
- "videos": "Videos ({count})",
- "diagnostics": "Diagnostic Reports ({count})",
- "documents": "Documents ({count})",
- "download": "Download",
- "close": "Close"
- },
- "share": {
- "title": "Share Invoice",
- "description": "Generate a public link that allows anyone to view and download this invoice without signing in.",
- "notifyTitle": "Notify {name}",
- "email": "Email",
- "noEmail": "(no email on file)",
- "sms": "SMS",
- "noPhone": "(no phone on file)",
- "sendNotification": "Send Notification",
- "revokeLink": "Revoke Link",
- "generateLink": "Generate Public Link",
- "emailSent": "Email sent",
- "failedEmail": "Failed to send email",
- "smsSent": "SMS sent",
- "failedSms": "Failed to send SMS",
- "copyLink": "Copy link"
- },
- "sidebar": {
- "vehicle": "Vehicle",
- "customer": "Customer",
- "vin": "VIN: {vin}",
- "mileageAtService": "Mileage at service: {mileage} {unit}",
- "engineHoursAtService": "Engine hours at service: {mileage} {unit}",
- "sharedLink": {
- "title": "Shared Link",
- "sharedOn": "Shared on {date}",
- "notViewed": "Not viewed yet",
- "viewedTimes": "Viewed {count, plural, one {# time} other {# times}}",
- "lastViewed": "Last {date}",
- "copyLink": "Copy link",
- "linkCopied": "Link copied"
- }
- },
- "images": {
- "title": "Service Images",
- "dropzone": "Drop images here or click to browse",
- "uploading": "Uploading...",
- "formats": "JPG, PNG, WebP — max 10MB each",
- "uploadingImages": "Uploading images...",
- "limitReached": "Image limit reached ({count}/{max})",
- "upgradePrompt": "Upgrade your plan to upload more images.",
- "onlyAllowed": "Only JPG, PNG, and WebP images are allowed. {names} skipped.",
- "onlyUploading": "Only uploading {count} image(s) to stay within limit.",
- "uploadingCount": "Uploading {count} image(s)...",
- "uploadedCount": "{count} image(s) uploaded",
- "uploadFailed": "Upload failed",
- "deleted": "Image deleted",
- "failedDelete": "Failed to delete image",
- "failedUpdate": "Failed to update",
- "description": "Description...",
- "invoice": "Invoice"
- },
- "videos": {
- "title": "Service Videos",
- "dropzone": "Drop videos here or click to browse",
- "uploading": "Uploading...",
- "formats": "MP4, WebM, MOV — max 10MB each",
- "uploadingVideos": "Uploading videos...",
- "uploadingCount": "Uploading {count} video(s)...",
- "uploadedCount": "{count} video(s) uploaded",
- "uploadFailed": "Upload failed",
- "deleted": "Video deleted",
- "failedDelete": "Failed to delete video",
- "failedUpdate": "Failed to update",
- "invoice": "Invoice"
- },
- "documents": {
- "diagnosticTitle": "Diagnostic Reports",
- "documentsTitle": "Documents",
- "dropzone": "Drop files here or click to browse",
- "uploading": "Uploading...",
- "diagnosticFormats": "PDF, CSV, TXT — max 10MB each",
- "documentFormats": "PDF, DOCX, XLSX, CSV, TXT — max 10MB each",
- "uploadingReports": "Uploading reports...",
- "uploadingDocuments": "Uploading documents...",
- "diagnosticLimitReached": "Diagnostic report limit reached ({count}/{max})",
- "documentLimitReached": "Document limit reached ({count}/{max})",
- "upgradePrompt": "Upgrade your plan to upload more.",
- "diagnosticLabel": "Diagnostic report",
- "documentLabel": "Document",
- "limitReachedToast": "{label} limit reached ({count}/{max}). Upgrade your plan for more.",
- "onlyUploading": "Only uploading {count} file(s) to stay within limit.",
- "uploadingCount": "Uploading {count} file(s)...",
- "uploadedCount": "{count} file(s) uploaded",
- "uploadFailed": "Upload failed",
- "deleted": "File deleted",
- "failedDelete": "Failed to delete file",
- "failedUpdate": "Failed to update",
- "invoice": "Invoice"
- },
- "schedule": {
- "title": "Schedule",
- "date": "Date",
- "startTime": "Start Time",
- "endTime": "End Time",
- "durationPresets": "Duration presets",
- "technician": "Technician",
- "selectTechnician": "Select technician...",
- "searchOrCreate": "Search or create technician...",
- "createTechnician": "Create \"{name}\"",
- "creating": "Creating...",
- "failedCreate": "Failed to create technician",
- "addNew": "+ Add New",
- "add": "Add",
- "newTechPlaceholder": "Technician name...",
- "assign": "Assign to Board",
- "assigned": "Assigned to work board",
- "failedAssign": "Failed to assign",
- "assignNotAllowed": "You don't have permission to assign technicians. Ask an owner or admin to allow work board changes for your role.",
- "endBeforeStart": "End time must be after start time",
- "failedUpdate": "Failed to update schedule times",
- "splitCreated": "Job spans multiple days — continuation created for next day",
- "customTechnicians": "Custom",
- "readMore": "Read More",
- "setDefaults": "Set Defaults",
- "workBay": "Work bay",
- "selectWorkBay": "Select work bay...",
- "noWorkBay": "No work bay",
- "noTechnician": "No technician",
- "technicians": "Technicians",
- "otherTeamMembers": "Other team members",
- "makeTechnician": "Makes them a technician",
- "addSomeoneNew": "Add someone new",
- "notOnBoard": "Not on the board yet",
- "putOnBoard": "Put on board",
- "slotTaken": "{count, plural, one {This slot is already booked} other {This slot has # clashes}}",
- "anotherJob": "another job",
- "clashTechnician": "the technician is busy",
- "clashBay": "the bay is in use",
- "clashBoth": "both are taken",
- "bookedAnyway": "Saved anyway. Change the time, or pick the next free slot.",
- "pickNextAvailable": "Pick next available slot",
- "findingSlot": "Finding a slot…",
- "slotPicked": "Booked into the next free slot",
- "noSlotFound": "No free slot found in the next few weeks",
- "assignedTitle": "Assigned technician",
- "boardLink": "Work board",
- "someoneElse": "Someone else",
- "loadOf": "{booked} / {capacity} h",
- "loadFree": "{hours} h free",
- "loadFull": "Fully booked",
- "loadOn": "Booked hours on {date}",
- "promisedAt": "Promised to customer",
- "promisedPlaceholder": "Not promised yet",
- "promisedClear": "Clear"
- },
- "notifications": {
- "title": "Customer Notifications",
- "viaSms": "via SMS",
- "viaEmail": "via Email",
- "justNow": "Just now",
- "minutesAgo": "{count}m ago",
- "hoursAgo": "{count}h ago",
- "daysAgo": "{count}d ago"
- },
- "table": {
- "warranty": "Warranty"
- },
- "warranty": {
- "title": "Warranty",
- "months": "Duration (months)",
- "notes": "Warranty Terms",
- "notesPlaceholder": "e.g. 12-month warranty on all parts and labor...",
- "expiresAt": "Expires",
- "presets": {
- "3months": "3 mo",
- "6months": "6 mo",
- "12months": "12 mo",
- "24months": "24 mo"
- },
- "status": {
- "active": "Active",
- "expiring": "Expiring",
- "expired": "Expired",
- "none": "N/A"
- },
- "statementLabel": "What the customer is told about warranty",
- "statement": {
- "none": "Not stated",
- "included": "Included",
- "not_included": "Not included"
- },
- "noneHint": "Nothing about warranty is printed on this document.",
- "mileageWithUnit": "Distance limit ({unit})",
- "notIncludedNotes": "Statement to the customer",
- "notIncludedPlaceholder": "e.g. No workshop warranty is offered on customer-supplied parts.",
- "printedHint": "Printed under the warranty on the document.",
- "notIncludedHint": "Leave empty and the document says that statutory rights are not affected.",
- "summaryMonths": "{count} mo"
- },
- "concerns": {
- "title": "Customer concerns",
- "hint": "Why the customer came in, in their own words. One row for each thing they mentioned.",
- "add": "Add another",
- "placeholder": "There is a noise from the back when I brake",
- "remove": "Remove this concern",
- "notAnswered": "Nothing found against this yet",
- "answered": "{count, plural, one {# observation against this} other {# observations against this}}",
- "storyTitle": "Job description",
- "storyHint": "Condition, cause, correction, confirm. Click a step to open it; one row for each thing the customer mentioned or you observed.",
- "steps": {
- "condition": "Condition",
- "cause": "Cause",
- "correction": "Correction",
- "confirm": "Confirm"
- },
- "conditionPlaceholder": "What the customer reported, or what you observed",
- "causePlaceholder": "What testing showed the root cause to be",
- "correctionPlaceholder": "What was done to fix it",
- "confirmPlaceholder": "How the fix was checked: test drive, re-scan, symptom gone",
- "markConfirmed": "Confirmed",
- "confirmedBy": "Confirmed by {name}, {date}",
- "confirmedAt": "Confirmed {date}",
- "confirmedOnSave": "Stamped with your name when you save",
- "confirmedCount": "{confirmed} of {total} confirmed",
- "findingsCount": "{count, plural, one {# observation} other {# observations}}",
- "addFinding": "Add observation",
- "unconfirmedTitle": "Complete with unconfirmed concerns?",
- "unconfirmedBody": "{count, plural, one {One concern has not been confirmed as fixed:} other {# concerns have not been confirmed as fixed:}}",
- "unconfirmedProceed": "Complete anyway",
- "addMedia": "Add media",
- "mediaUploading": "Uploading…",
- "mediaAdded": "{count, plural, one {# file added} other {# files added}}",
- "mediaFailed": "Could not upload {name}",
- "mediaTypes": "Choose a photo (JPG, PNG, WebP) or a video.",
- "dictate": {
- "start": "Dictate",
- "listening": "Listening",
- "startHint": "Speak and it is written here. Nothing is recorded.",
- "stopHint": "Stop listening",
- "notAllowed": "The browser was not allowed to use the microphone. Allow it for this site and try again.",
- "noMicrophone": "No microphone was found.",
- "failed": "Dictation stopped. Try again.",
- "startHintServer": "Speak and it is written as you talk. The audio goes to your speech model to be written down and is not kept.",
- "transcribing": "Finishing…",
- "language": "Language spoken",
- "auto": "Auto",
- "nothingHeard": "Nothing was heard.",
- "fellBack": "Using the browser's own dictation for now.",
- "autoLong": "Auto (detect the language)",
- "engine": "Written down by",
- "engineAi": "Speech model (more accurate)",
- "engineBrowser": "Browser (writes as you speak)",
- "liveFellBack": "Writing in steps of a few seconds instead of word by word."
- },
- "stepEmpty": "Not written yet",
- "removeTitle": "Remove this concern?",
- "removeBody": "Its condition, cause, correction and confirmation are removed with it when you save the work order.",
- "removeAttached": "Its observations and media stay on the job, no longer filed under a concern.",
- "removeConfirm": "Remove concern",
- "saveFirst": "Save the work order first"
- },
- "videoCall": {
- "title": "Video call",
- "none": "No video call on this work order.",
- "needsSchedule": "Set a start time first. The meeting follows the schedule.",
- "add": "Add {provider} meeting",
- "addedHere": "added from this work order",
- "fromCalendar": "from the calendar event",
- "join": "Join",
- "copy": "Copy link",
- "copied": "Link copied",
- "remove": "Remove",
- "removeTitle": "Remove the video call?",
- "removeDescription": "The meeting is deleted at the provider. Anyone who already has the link can no longer join.",
- "created": "Meeting created. The link is on the work order.",
- "removed": "Meeting removed",
- "failed": "Something went wrong",
- "shareHint": "The customer only gets this link when you send it.",
- "shareHintNoChannel": "The customer only gets this link when you send it. No messaging channel is set up, so copy it into a message yourself.",
- "send": {
- "button": "Send to customer",
- "title": "Send the video call link",
- "description": "Send the join link to {name}.",
- "messageLabel": "Note (optional)",
- "messagePlaceholder": "Anything the customer should know before the call...",
- "linkAlwaysIncluded": "The join link is always added below your note.",
- "sms": "SMS",
- "email": "Email",
- "telegram": "Telegram",
- "noPhone": "(no phone)",
- "noEmail": "(no email)",
- "noTelegram": "(no chat linked)",
- "notAvailable": "(not set up)",
- "cancel": "Cancel",
- "send": "Send",
- "sent": "Video call link sent",
- "partlySent": "Sent by {sent}; not by {failed}",
- "failed": "Could not send the link"
- },
- "notify": {
- "invitation": "Hi {name}, your video call about the {vehicle} is on {when}. Join here: {url}",
- "invitationNoTime": "Hi {name}, here is the link for the video call about the {vehicle}: {url}",
- "joinLine": "Join the video call here: {url}",
- "emailSubject": "Video call about your {vehicle}"
- }
- },
- "modern": {
- "statusLabel": "Work order status",
- "back": "Back",
- "backToClassic": "Back to the classic layout",
- "openCustomer": "Open customer",
- "serviceHistory": "Service history",
- "changeVehicle": "Change vehicle",
- "vehicleChangesOnSave": "The work order moves to this vehicle when you save.",
- "phone": "Phone",
- "email": "Email",
- "notSet": "Not set",
- "noCustomer": "No customer on this work order.",
- "invoiceTitle": "Invoice & payment",
- "filesTitle": "Files & media",
- "activity": {
- "title": "Activity",
- "messageSent": "Message sent to the customer",
- "linkShared": "Invoice link shared",
- "linkViewed": "{count, plural, one {Customer opened the link} other {Customer opened the link # times}}",
- "paymentTaken": "Payment of {amount} recorded",
- "statusSet": "Status set to {status}"
- },
- "invite": {
- "title": "The work order page has been overhauled.",
- "body": "A clearer layout with the same fields. You can switch back at any time.",
- "try": "Try it now",
- "dismiss": "Not now",
- "menu": "Try the new layout"
- },
- "promised": "Promised {date}",
- "promisedOverdue": "Promised {date}, overdue",
- "opened": "Opened {date}",
- "openedBy": "Opened {date} by {name}",
- "editTitle": "Edit title",
- "titleField": "Title",
- "media": {
- "tabs": {
- "photos": "Photos",
- "diagnostics": "Diagnostics",
- "dropoff": "Drop-off"
- },
- "summary": "{count, plural, one {# file} other {# files}} · shared with the customer only when marked",
- "customerCanSee": "Customer can see",
- "showToCustomer": "Show to the customer",
- "hideFromCustomer": "Hide from the customer",
- "add": {
- "image": "Add photos",
- "document": "Add documents",
- "diagnostic": "Add diagnostic report",
- "video": "Add video",
- "dropoff": "Add drop-off photos"
- },
- "dropHint": "Drop files or click to browse",
- "added": "{count, plural, one {# file added} other {# files added}}",
- "failed": "Could not upload {name}",
- "wrongType": "Not the right kind of file for this tab: {names}",
- "limit": "Limit reached ({count}/{max})",
- "dropoffHint": "The car as it arrived, with the time each photo was taken. Kept for the workshop, not shown to the customer unless you choose to.",
- "onInvoice": "Include the vehicle condition on this invoice",
- "onInvoiceHint": "Off unless you tick it here. To print it on every invoice, switch on Vehicle Condition in the invoice designer.",
- "onInvoiceByDesign": "On in the invoice designer for every invoice. Untick to leave it off this one.",
- "onInvoiceFailed": "Could not save the choice"
- },
- "moneyBar": {
- "total": "Total",
- "paid": "Paid",
- "balance": "Balance due",
- "settled": "Paid in full",
- "takePayment": "Take payment",
- "preview": "Preview invoice",
- "previewShort": "Preview",
- "send": "Send to customer",
- "sendShort": "Send"
- },
- "vehicleInfo": {
- "more": "More info",
- "less": "Less info",
- "copy": "Copy {label}",
- "copied": "Copied",
- "lastInspection": "Last periodic inspection",
- "purchaseDate": "Purchase date",
- "purchasePrice": "Purchase price",
- "overdue": "overdue",
- "customerSince": "Customer since"
- },
- "moreStatuses": "More statuses",
- "fromInspection": "From inspection {name}, {date}",
- "startInspection": "Start inspection"
- },
- "photoHandoff": {
- "button": "Add from phone",
- "dialogTitle": "Add photos and documents from a phone",
- "dialogBody": "Take or choose photos, or share a PDF, on any phone. Everything lands straight on this work order.",
- "expires": "The code works until {time}.",
- "waiting": "Waiting for photos and documents…",
- "received": "{count, plural, one {# file received} other {# files received}}",
- "copyLink": "Copy link",
- "linkCopied": "Link copied",
- "failed": "Could not make a code. Try again.",
- "done": "Done",
- "pageTitle": "Add photos and documents",
- "forJob": "Work order {number}",
- "takePhoto": "Take photo",
- "choosePhotos": "Choose photos",
- "hint": "Everything goes straight onto the work order. Take as many photos as you need.",
- "uploading": "Uploading…",
- "added": "Added",
- "notAdded": "Not added",
- "retry": "Try again",
- "addedCount": "{count, plural, one {# file added} other {# files added}}",
- "expiredTitle": "This code has expired",
- "invalidTitle": "This link does not work",
- "errors": {
- "expired": "Ask for a new code at the desk. Each one works for 30 minutes.",
- "invalid": "Scan the code on the work order again.",
- "limit": "This work order already has as many photos as it can take.",
- "type": "Only photos and PDF documents can be added here.",
- "tooLarge": "That file is too large.",
- "failed": "The photo was not added. Check the connection and try again.",
- "codeLimit": "This code has added as many photos as one code can. Scan a new code at the desk."
- },
- "concernHeading": "Photos go under this concern",
- "howTitle": "How it works",
- "step1": "Point the phone camera at the code and open the link.",
- "step2": "Take photos, or choose photos or PDF documents already on the phone.",
- "step3": "They appear on this work order as they arrive.",
- "noSignIn": "No sign-in needed on the phone.",
- "customerToo": "Staff can use it, and so can the customer: let them scan it, or send them the link.",
- "scope": "The link only adds photos and documents to this work order, and stops working after 30 minutes.",
- "scanHint": "Scan with the phone camera",
- "chooseDocument": "Upload a document",
- "privacy": "Only the workshop can see what you add here.",
- "dropoff": {
- "button": "Drop-off photos",
- "dialogTitle": "Photograph the car as it arrives",
- "dialogBody": "A walk round the car before work starts: four sides, the odometer and any damage already there. It is your record if a scratch is ever questioned.",
- "step2": "Follow the list on the phone: one photo for each side, the odometer, and any damage.",
- "scope": "The link only adds drop-off photos to this work order, and stops working after 30 minutes.",
- "pageTitle": "The car as it arrives",
- "pageBody": "Take each photo in turn. Add a close-up of any damage that is already there.",
- "retake": "Retake",
- "slots": {
- "front": "Front",
- "right": "Right side",
- "rear": "Rear",
- "left": "Left side",
- "odometer": "Odometer",
- "other": "Damage or other"
- }
- }
- },
- "payCode": {
- "button": "Pay code",
- "title": "Pay by scanning",
- "body": "The customer scans this with their phone camera, the invoice opens, and they pay there.",
- "sharesInvoice": "Showing the code shares the invoice with the customer, the same as sending it. From then on the invoice keeps the details it has now.",
- "show": "Show the code",
- "failed": "The code could not be made. Try again.",
- "toPay": "To pay",
- "scanHint": "Scan with the phone camera",
- "copyLink": "Copy link",
- "linkCopied": "Link copied",
- "waiting": "Waiting for the payment. This updates on its own.",
- "paid": "Payment received",
- "paidBody": "The payment is on the work order.",
- "done": "Done"
- },
- "customStatus": {
- "defaultMessage": "Hi {customer_name}, an update on your {vehicle}: {status}. {company_name}"
- }
- }
|