integrations.json 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987
  1. {
  2. "catalog": {
  3. "title": "Integrations",
  4. "description": "Connect the services your workshop already uses. Each integration is set up once and runs in the background.",
  5. "all": "All",
  6. "empty": "No integrations in this category yet.",
  7. "notConnected": "Not connected",
  8. "connect": "Connect",
  9. "manage": "Manage",
  10. "connectedTitle": "Connected",
  11. "connectedDescription": "Services this workshop has set up. Open one to check its status, change settings or disconnect.",
  12. "noneConnected": "Nothing connected yet. Pick a service below to get started.",
  13. "availableTitle": "Available",
  14. "availableDescription": "Services you can add. Each one is set up once and runs in the background.",
  15. "allConnected": "Every available service is connected.",
  16. "searchPlaceholder": "Search integrations",
  17. "noMatches": "Nothing matches \"{query}\".",
  18. "readMore": "Read more",
  19. "suggestTitle": "Missing a service you use?",
  20. "suggestDescription": "Tell us which integration would help your workshop and we will look into it.",
  21. "suggest": "Suggest an integration",
  22. "suggestSubject": "Integration suggestion"
  23. },
  24. "categories": {
  25. "calendar": "Calendar",
  26. "conferencing": "Video calls",
  27. "accounting": "Accounting",
  28. "messaging": "Messaging",
  29. "payments": "Payments",
  30. "automation": "Automation",
  31. "storage": "Files",
  32. "registry": "Vehicle registry",
  33. "repair": "Repair data",
  34. "other": "Other",
  35. "ai": "AI"
  36. },
  37. "capabilities": {
  38. "calendar": {
  39. "push": "Work orders to calendar",
  40. "pull": "Busy time from calendar",
  41. "conference": "Video call links"
  42. },
  43. "sms": {
  44. "send": "Text messages out",
  45. "receive": "Replies back in"
  46. },
  47. "whatsapp": {
  48. "send": "WhatsApp messages out",
  49. "receive": "Replies back in"
  50. },
  51. "telegram": {
  52. "send": "Telegram messages out",
  53. "receive": "Replies back in"
  54. },
  55. "email": {
  56. "send": "Email out"
  57. },
  58. "vehicle": {
  59. "lookup": "Plate and VIN lookup",
  60. "inspection": "Inspection due dates",
  61. "safety": "Recalls and owner complaints"
  62. },
  63. "ai": {
  64. "chat": "Writing and summaries",
  65. "transcribe": "Dictation"
  66. },
  67. "payments": {
  68. "checkout": "Pay from the invoice link"
  69. },
  70. "accounting": {
  71. "invoices": "Invoices to the ledger",
  72. "customers": "Customers to the ledger",
  73. "payments": "Payments both ways"
  74. },
  75. "backup": {
  76. "target": "Backup destination"
  77. },
  78. "repair": {
  79. "labor": "Labor times on work orders and quotes",
  80. "fluids": "Fluid types and capacities"
  81. }
  82. },
  83. "statuses": {
  84. "active": "Connected",
  85. "error": "Needs attention",
  86. "pending": "Setup in progress",
  87. "disconnected": "Disconnected",
  88. "needsSetup": "Setup not finished"
  89. },
  90. "connection": {
  91. "back": "All integrations",
  92. "account": "Connected account",
  93. "lastHealth": "Last checked",
  94. "lastSync": "Last sync",
  95. "lastError": "The last run failed",
  96. "setupMissingTitle": "Setup not finished",
  97. "setupMissing": "Choose {fields} in the settings below. Until then nothing is synced.",
  98. "connected": "{name} is connected.",
  99. "connectedShort": "Connected",
  100. "connectWith": "Connect {name}",
  101. "connect": "Connect",
  102. "reconnect": "Reconnect",
  103. "disconnect": "Disconnect",
  104. "disconnectTitle": "Disconnect {name}?",
  105. "disconnectDescription": "Torqvoice forgets the account and stops using it. Nothing already sent to or stored in {name} is touched.",
  106. "disconnectDescriptionCalendar": "Torqvoice forgets the account and stops syncing. Work orders already put in {name} stay there. The busy time shown from that calendar is removed from the Torqvoice calendar.",
  107. "disconnectDescriptionConferencing": "Torqvoice forgets the account and stops creating meetings. Meetings already created stay in {name}, and the links on work orders are kept.",
  108. "disconnectDescriptionAccounting": "Torqvoice forgets the account and stops sending and reading. Invoices, customers and payments already in {name} stay there.",
  109. "removeSetup": "Remove",
  110. "removeSetupTitle": "Remove {name}?",
  111. "removeSetupDescription": "Nothing is connected yet. Torqvoice forgets what was entered, and {name} goes back to the list of available services.",
  112. "removeSetupDone": "{name} removed",
  113. "removeSetupHint": "Not going ahead with this? Remove it and the service returns to the list below.",
  114. "disconnected": "Disconnected",
  115. "test": "Test connection",
  116. "testPassed": "Connection works",
  117. "syncNow": "Sync now",
  118. "syncQueued": "Sync queued; it runs within a minute",
  119. "pullNow": "Pull payments now",
  120. "pullQueued": "Payment pull queued; it runs within a minute",
  121. "backfill": "Push scheduled work orders",
  122. "backfillQueued": "Queued the scheduled work orders from the last week onwards",
  123. "backfillInvoices": "Push issued invoices",
  124. "backfillInvoicesQueuedCount": "Queued {count, plural, one {# issued invoice} other {# issued invoices}} to push",
  125. "backfillInvoicesNone": "No issued invoices to push. Only sent, shared or paid invoices go over, dated on or after the start date if you set one.",
  126. "retryQueued": "Job queued again",
  127. "settingsTitle": "Settings",
  128. "settingsDescription": "What to sync and where. Changes apply to the next sync.",
  129. "settingsSaved": "Settings saved",
  130. "save": "Save",
  131. "loading": "Loading...",
  132. "choose": "Choose...",
  133. "search": "Search...",
  134. "noMatch": "Nothing matches",
  135. "leaveEmpty": "Leave empty",
  136. "noLimit": "No limit",
  137. "planLocked": "Integrations are not included in your plan.",
  138. "lockedIntegrations": "Connect calendars, video calls and other services to your workshop.",
  139. "lockedPayments": "Let customers pay their invoices online, with each payment booked on the invoice.",
  140. "lockedAi": "Connect an AI provider to use AI features in your workshop.",
  141. "ownAppTitle": "This install uses your own app with the provider",
  142. "redirectUri": "Redirect URI to register with the provider:",
  143. "sendTestEmail": "Send test email",
  144. "testEmailSent": "Test email sent to {email}",
  145. "testEmailHint": "A test email goes to your own address through this vendor, which proves the from address and the sending rules a key check cannot.",
  146. "inboundUrl": "Inbound webhook URL",
  147. "inboundHintSecret": "Paste this URL into the vendor's inbound message settings. It carries a secret that identifies your workshop, so keep it private.",
  148. "inboundHintMeta": "Paste this URL as the callback URL in your Meta app, with the verify token you entered above, and subscribe to messages.",
  149. "inboundHintStripe": "Add this URL in the Stripe dashboard: open Workbench, then Webhooks, choose Create an event destination, and subscribe it to checkout.session.completed. Stripe then shows a signing secret for the endpoint; paste it into the signing secret field here so every notification is checked by its signature. Until it is in, Torqvoice confirms each notification by asking Stripe for the checkout itself.",
  150. "inboundHintVipps": "Enter this URL as the callback URL in the Vipps MobilePay portal. Vipps also requires published terms of sale, which are set under Settings, Payment.",
  151. "inboundHintPaypal": "Add this URL in the PayPal developer dashboard under Webhooks, subscribed to PAYMENT.CAPTURE.COMPLETED.",
  152. "copy": "Copy",
  153. "copied": "Copied",
  154. "updateKeys": "Update keys",
  155. "updateKeysHint": "The last check failed. Enter the keys again to try once more.",
  156. "awaitingKeys": "Connected, but still waiting for {keys}.",
  157. "awaitingKeysHint": "The webhook already answers the vendor, so register it now. Add these here once the vendor has issued them.",
  158. "saveKeys": "Save keys",
  159. "keysSaved": "Keys saved",
  160. "inspectionSync": {
  161. "title": "Inspection sync",
  162. "vehicles": "{count} vehicles with a plate in this workshop",
  163. "dueNow": "{count} would be looked up on the next run",
  164. "withDate": "{count} already have an inspection date",
  165. "lastPass": "Last complete pass {date}",
  166. "never": "No complete pass yet",
  167. "inProgress": "A pass is running",
  168. "off": "Turn the setting on and save; until then a pass checks nothing.",
  169. "syncNowHelp": "Sync now starts a pass straight away instead of waiting for the hourly one. It looks up 25 vehicles at a time and continues on its own until every due vehicle is done. The first pass looks up every vehicle with a plate.",
  170. "confirmTitle": "Look up vehicles now?",
  171. "confirmDescription": "{count} of the {total} vehicles with a plate will be looked up in {name} now, 25 at a time, and their inspection due dates saved. Vehicles checked recently are skipped. If {name} charges per lookup, each vehicle found is billed to your account.",
  172. "confirmLabel": "Look up {count} vehicles",
  173. "nothingDue": "Every vehicle with a plate was checked recently, so there is nothing to look up yet."
  174. },
  175. "supersedes": "Connecting {next} disconnects {current}. Only one at a time can be in charge, so {current} stops being used the moment {next} goes live.",
  176. "platformHandlesBackupsTitle": "Backups are already included",
  177. "platformHandlesBackups": "Torqvoice already backs this workshop up every hour and keeps restore points for 30 days. Connect a bucket if you also want a copy you own, readable without Torqvoice.",
  178. "platformHandlesBackupsLink": "See your restore points",
  179. "batchRetried": "{count, plural, =0 {Nothing to retry} one {# job queued again} other {# jobs queued again}}",
  180. "advanced": "Advanced",
  181. "generate": "Generate",
  182. "show": "Show",
  183. "hide": "Hide",
  184. "generatedPasswordWarning": "Keep a copy of this password somewhere safe, away from this server. Without it nobody can open these backups, not even Torqvoice.",
  185. "backup": {
  186. "title": "Backups",
  187. "description": "When this destination last got a good backup, when the next one runs, and the latest runs.",
  188. "lastGood": "Last good backup",
  189. "added": "{size} added",
  190. "never": "None yet",
  191. "nextRun": "Next run",
  192. "notScheduled": "Not scheduled",
  193. "repositorySize": "Stored at the destination",
  194. "runNow": "Back up now",
  195. "running": "Backing up",
  196. "runningHint": "A backup is running. This page updates by itself until it is done.",
  197. "started": "Backup started",
  198. "recentTitle": "Recent runs",
  199. "noRuns": "No backups have run yet.",
  200. "addedNote": "The first run uploads everything. Each run after it adds only the pieces that changed since, which is why it is small. Every backup is still complete and can be restored or explored on its own.",
  201. "notStarted": "Not started",
  202. "filesNewCount": "{count, plural, one {# new file} other {# new files}}",
  203. "columns": {
  204. "status": "Status",
  205. "started": "Started",
  206. "trigger": "Started by",
  207. "duration": "Duration",
  208. "filesNew": "New files",
  209. "bytesAdded": "Added"
  210. },
  211. "trigger": {
  212. "scheduled": "Schedule",
  213. "manual": "Manual",
  214. "restore": "Restore"
  215. },
  216. "status": {
  217. "queued": "Queued",
  218. "running": "Running",
  219. "done": "Done",
  220. "failed": "Failed",
  221. "skipped": "Skipped"
  222. },
  223. "restoring": "Restoring",
  224. "restoringHint": "A restore is running: the workshop's data is being replaced with the backup. This page updates by itself until it is done. Do not work in the workshop until then.",
  225. "explore": "Explore",
  226. "restore": {
  227. "showAll": "Show all backups",
  228. "refresh": "Refresh",
  229. "loading": "Reading the backups at the destination",
  230. "loadFailed": "The backups could not be listed",
  231. "empty": "No backups at this destination yet.",
  232. "needsOwner": "Only the workshop's owner can restore a backup here.",
  233. "needsAdmin": "Only an owner or administrator can restore a backup.",
  234. "filesIncluded": "Photos and files included",
  235. "filesNotIncluded": "Photos and files not included",
  236. "earlierInstall": "Earlier install",
  237. "action": "Restore",
  238. "dialogTitle": "Restore the backup from {time}?",
  239. "warning": "Restoring <bold>replaces everything this workshop has now</bold>: customers, vehicles, jobs, invoices, settings and, when the backup includes them, photos and files. Anything added since the backup was taken is gone. This cannot be undone.",
  240. "secretsNote": "Secret keys the backup left out keep the values this install has now. User accounts and passwords are not touched.",
  241. "confirmPrompt": "Type the workshop's name, <bold>{name}</bold>, to confirm.",
  242. "whileRunning": "The restore runs in the background and takes a few minutes when there are many photos. The page updates by itself until it is done.",
  243. "cancel": "Cancel",
  244. "confirm": "Restore this backup",
  245. "started": "Restore started"
  246. }
  247. },
  248. "lockedBackups": "Scheduled, encrypted backups of your workshop to storage you own.",
  249. "searchOrType": "Search or type a name",
  250. "useTyped": "Use \"{value}\"",
  251. "listNeedsKeys": "Enter the keys above to see the list",
  252. "listEmpty": "Nothing was listed. Type a name instead.",
  253. "testing": "Testing the connection",
  254. "testOk": "The connection works: a test object was written and removed again.",
  255. "testFailed": "The test failed",
  256. "testSteps": {
  257. "settings": "Check the provider settings",
  258. "list": "The key cannot list the bucket",
  259. "write": "The key cannot write to the bucket",
  260. "delete": "The key cannot delete from the bucket",
  261. "folder": "The folder cannot be created or opened"
  262. },
  263. "testHint": "Fill in the keys and the bucket to test them before connecting. The test writes one small object and removes it."
  264. },
  265. "activity": {
  266. "title": "Activity",
  267. "description": "Recent jobs and log lines for this connection.",
  268. "retry": "Retry",
  269. "jobStatus": {
  270. "queued": "Queued",
  271. "running": "Running",
  272. "done": "Done",
  273. "failed": "Failed",
  274. "dead": "Gave up"
  275. },
  276. "jobs": "{count, plural, one {# job} other {# jobs}}",
  277. "counts": {
  278. "queued": "{count} queued",
  279. "running": "{count} running",
  280. "done": "{count} done",
  281. "failed": "{count} failed",
  282. "dead": "{count} gave up"
  283. },
  284. "noFailures": "Nothing failed.",
  285. "retryFailed": "Retry failed jobs",
  286. "details": "Show details",
  287. "loadingMore": "Loading older jobs",
  288. "loadFailed": "Older jobs could not be loaded.",
  289. "cleared": "Finished jobs are cleared after 7 days."
  290. },
  291. "errors": {
  292. "generic": "Something went wrong",
  293. "demo": "Integrations cannot be connected on the demo.",
  294. "forbidden": "Only an administrator can connect integrations.",
  295. "unknown": "Unknown integration.",
  296. "plan": "This integration is not included in your plan.",
  297. "no-client": "No app credentials are configured for this provider.",
  298. "denied": "You cancelled the sign-in with the provider.",
  299. "vendor": "The provider returned an error. Try again.",
  300. "invalid": "The provider's response was incomplete. Try again.",
  301. "state": "This sign-in has expired or belongs to another session. Start again.",
  302. "exchange": "The provider refused the sign-in. Check the app credentials and try again.",
  303. "identify": "Connected, but the account could not be read. Try reconnecting.",
  304. "backupRunning": "A backup is already running.",
  305. "restoreOwnerOnly": "On Torqvoice Cloud only the workshop's owner can restore a backup.",
  306. "restoreBusy": "A backup or restore is already running on this server. Try again when it is done."
  307. },
  308. "meeting": {
  309. "join": "Join video call",
  310. "google-meet": "Google Meet",
  311. "teams": "Microsoft Teams",
  312. "zoom": "Zoom"
  313. },
  314. "calendar": {
  315. "external": "From connected calendars",
  316. "busy": "Busy"
  317. },
  318. "connectors": {
  319. "google-calendar": {
  320. "description": "Put scheduled work orders on a Google Calendar, add a Google Meet link, and see the calendar's busy time in Torqvoice.",
  321. "tenantHelp": "Create an OAuth client in Google Cloud Console (APIs & Services → Credentials), enable the Google Calendar API, add the redirect URI below, and paste the client id and secret here.",
  322. "fields": {
  323. "clientId": "Client ID",
  324. "clientSecret": "Client secret"
  325. },
  326. "settings": {
  327. "calendarId": "Calendar",
  328. "pushEnabled": "Add scheduled work orders to this calendar",
  329. "includeCustomer": "Include the customer's name and phone in the event",
  330. "addConference": "Add a Google Meet meeting to every scheduled work order",
  331. "addConferenceHelp": "On: every work order pushed to the calendar gets a Google Meet meeting, and the join link shows on the work order. Off: add a Google Meet meeting to a single work order from its page. Either way the customer only gets the link when you send it.",
  332. "pullEnabled": "Show this calendar's busy time on the Torqvoice calendar",
  333. "pullEnabledHelp": "Read-only. Refreshed every 15 minutes, one week back and two months ahead."
  334. }
  335. },
  336. "microsoft-365": {
  337. "name": "Microsoft 365 Calendar",
  338. "description": "Put scheduled work orders on an Outlook calendar, add a Microsoft Teams link, and see the calendar's busy time in Torqvoice.",
  339. "tenantHelp": "Register an application in Microsoft Entra (App registrations), allow personal and work accounts, add the redirect URI below as a Web platform, create a client secret, and paste both here.",
  340. "fields": {
  341. "clientId": "Application (client) ID",
  342. "clientSecret": "Client secret"
  343. },
  344. "settings": {
  345. "calendarId": "Calendar",
  346. "pushEnabled": "Add scheduled work orders to this calendar",
  347. "includeCustomer": "Include the customer's name and phone in the event",
  348. "addConference": "Add a Microsoft Teams meeting to every scheduled work order",
  349. "addConferenceHelp": "On: every work order pushed to the calendar gets a Microsoft Teams meeting, and the join link shows on the work order. Off: add a Microsoft Teams meeting to a single work order from its page. Either way the customer only gets the link when you send it.",
  350. "pullEnabled": "Show this calendar's busy time on the Torqvoice calendar",
  351. "pullEnabledHelp": "Read-only. Refreshed every 15 minutes, one week back and two months ahead."
  352. }
  353. },
  354. "zoom": {
  355. "description": "Add a Zoom meeting to a scheduled work order and keep the join link on it, for remote diagnosis or walking a customer through findings.",
  356. "tenantHelp": "In the Zoom App Marketplace, build a General app (user-managed), add the redirect URI below, add the scopes meeting:write:meeting, meeting:update:meeting, meeting:delete:meeting, meeting:read:meeting and user:read:user, and paste the client ID and secret here.",
  357. "fields": {
  358. "clientId": "Client ID",
  359. "clientSecret": "Client secret"
  360. },
  361. "settings": {
  362. "autoCreate": "Create a Zoom meeting for every scheduled work order automatically",
  363. "autoCreateHelp": "Off: you add a video call to a work order yourself, from its page. On: every work order with a start time gets a meeting, moved when it is rescheduled and removed when it is cancelled. Either way the customer only gets the link when you send it.",
  364. "includeCustomer": "Include the customer's name in the meeting topic",
  365. "joinBeforeHost": "Let the customer join before you",
  366. "waitingRoom": "Use a waiting room"
  367. }
  368. },
  369. "twilio-sms": {
  370. "description": "Send and receive text messages through a Twilio number. Reminders, ready-for-pickup messages and the replies that come back.",
  371. "fields": {
  372. "accountSid": "Account SID",
  373. "authToken": "Auth token"
  374. },
  375. "settings": {
  376. "phoneNumber": "Send from this number"
  377. }
  378. },
  379. "vonage-sms": {
  380. "description": "Send and receive text messages through a Vonage number.",
  381. "fields": {
  382. "apiKey": "API key",
  383. "apiSecret": "API secret",
  384. "signatureSecret": "Signature secret",
  385. "signatureSecretHelp": "From the Vonage dashboard, under API settings. When set, inbound messages are only accepted when Vonage signed them. Without it, only the secret in the webhook URL is checked."
  386. },
  387. "settings": {
  388. "phoneNumber": "Send from this number"
  389. }
  390. },
  391. "telnyx-sms": {
  392. "description": "Send and receive text messages through a Telnyx number.",
  393. "fields": {
  394. "apiKey": "API key",
  395. "webhookPublicKey": "Webhook public key",
  396. "webhookPublicKeyHelp": "From the Telnyx portal, under Account settings, Keys and credentials, Public key. When set, inbound messages are only accepted when Telnyx signed them. Without it, only the secret in the webhook URL is checked."
  397. },
  398. "settings": {
  399. "phoneNumber": "Send from this number"
  400. }
  401. },
  402. "whatsapp-meta": {
  403. "description": "Message customers on WhatsApp through Meta directly. Photos of what you found, and the conversation that follows.",
  404. "fields": {
  405. "phoneNumberId": "Phone number ID",
  406. "accessToken": "Access token",
  407. "verifyToken": "Webhook verify token",
  408. "appSecret": "App secret",
  409. "apiVersion": "Graph API version",
  410. "appSecretHelp": "Meta signs every delivery with it. Until it is entered, messages posted to the webhook are refused, since anyone who learns the URL could otherwise post as your customers.",
  411. "phoneNumberIdHelp": "From WhatsApp Manager, on the number you send from; not the phone number itself. Meta issues it only after the webhook is verified, so leave it empty, connect, register the webhook, then come back and add it.",
  412. "accessTokenHelp": "A permanent system user token. The one Meta shows during setup expires within 24 hours. Add it together with the phone number ID once the webhook is verified.",
  413. "verifyTokenHelp": "Any phrase you choose. Paste the same one into Meta when registering the webhook."
  414. },
  415. "settings": {
  416. "enabled": "Send messages on this channel",
  417. "phoneNumber": "Send from this number",
  418. "templateName": "Template for reopening a conversation",
  419. "templateLanguage": "Template language",
  420. "templateVariables": "Template values, in order",
  421. "mediaTemplateName": "Template for a message with a photo",
  422. "mediaTemplateLanguage": "Photo template language",
  423. "mediaTemplateVariables": "Photo template values, in order"
  424. }
  425. },
  426. "whatsapp-twilio": {
  427. "description": "Message customers on WhatsApp through a Twilio number, if Twilio is who sold you one.",
  428. "fields": {
  429. "accountSid": "Account SID",
  430. "authToken": "Auth token",
  431. "messagingServiceSid": "Messaging service SID"
  432. },
  433. "settings": {
  434. "enabled": "Send messages on this channel",
  435. "phoneNumber": "Send from this number",
  436. "templateName": "Template for reopening a conversation",
  437. "templateLanguage": "Template language",
  438. "templateVariables": "Template values, in order",
  439. "mediaTemplateName": "Template for a message with a photo",
  440. "mediaTemplateLanguage": "Photo template language",
  441. "mediaTemplateVariables": "Photo template values, in order"
  442. }
  443. },
  444. "telegram": {
  445. "description": "A Telegram bot that reaches customers who use it, and brings their replies into the inbox.",
  446. "fields": {
  447. "botToken": "Bot token"
  448. },
  449. "settings": {
  450. "enabled": "Send messages on this channel",
  451. "botUsername": "Bot username"
  452. }
  453. },
  454. "smtp": {
  455. "description": "Send invoices and reminders through your own mail server, rather than the platform mail.",
  456. "fields": {
  457. "host": "Server",
  458. "port": "Port",
  459. "user": "Username",
  460. "pass": "Password"
  461. },
  462. "settings": {
  463. "fromEmail": "Send from this address",
  464. "fromName": "Name shown as the sender",
  465. "secure": "Connect over TLS from the start",
  466. "requireTls": "Require the server to upgrade to TLS",
  467. "rejectUnauthorized": "Reject a certificate that does not check out"
  468. }
  469. },
  470. "resend": {
  471. "description": "Send invoices and reminders through Resend.",
  472. "fields": {
  473. "apiKey": "API key"
  474. },
  475. "settings": {
  476. "fromEmail": "Send from this address",
  477. "fromName": "Name shown as the sender"
  478. }
  479. },
  480. "postmark": {
  481. "description": "Send invoices and reminders through Postmark.",
  482. "fields": {
  483. "apiKey": "Server token"
  484. },
  485. "settings": {
  486. "fromEmail": "Send from this address",
  487. "fromName": "Name shown as the sender"
  488. }
  489. },
  490. "mailgun": {
  491. "description": "Send invoices and reminders through Mailgun.",
  492. "fields": {
  493. "apiKey": "API key",
  494. "domain": "Sending domain"
  495. },
  496. "settings": {
  497. "fromEmail": "Send from this address",
  498. "fromName": "Name shown as the sender",
  499. "region": "Region the domain is in"
  500. }
  501. },
  502. "sendgrid": {
  503. "description": "Send invoices and reminders through SendGrid.",
  504. "fields": {
  505. "apiKey": "API key"
  506. },
  507. "settings": {
  508. "fromEmail": "Send from this address",
  509. "fromName": "Name shown as the sender"
  510. }
  511. },
  512. "amazon-ses": {
  513. "description": "Send invoices and reminders through Amazon SES.",
  514. "fields": {
  515. "accessKeyId": "Access key ID",
  516. "secretAccessKey": "Secret access key",
  517. "region": "Region"
  518. },
  519. "settings": {
  520. "fromEmail": "Send from this address",
  521. "fromName": "Name shown as the sender"
  522. }
  523. },
  524. "vegvesen": {
  525. "description": "Fill in a vehicle from its Norwegian plate or VIN: make, model, year, fuel, gearbox, engine, colour, tyre sizes and the next EU-kontroll date, straight from Statens vegvesen's register. No owner data is returned.",
  526. "fields": {
  527. "apiKey": "API key",
  528. "apiKeyHelp": "Free. Order the key on vegvesen.no under \"API for tekniske kjøretøyopplysninger\": sign in with BankID, represent the workshop, and the key is issued at once. It allows 50,000 lookups a day."
  529. },
  530. "settings": {
  531. "syncInspections": "Keep inspection dates up to date for every vehicle in this workshop",
  532. "syncInspectionsHelp": "Once an hour, vehicles due a check are looked up by plate and their next EU-kontroll date is saved; how often a vehicle is rechecked is set below. Only vehicles stored in this workshop are ever sent.",
  533. "inspectionRecheck": "Recheck vehicles that already have a date",
  534. "inspectionRecheckHelp": "A date only changes when an inspection is passed. Monthly notices an early test soonest; only near the deadline costs the least. Near the deadline, every vehicle is rechecked weekly whatever you choose here.",
  535. "recheckMonthly": "Every month",
  536. "recheckQuarterly": "Every three months",
  537. "recheckNearDeadline": "Only near the deadline",
  538. "inspectionSoonDays": "Near the deadline means within",
  539. "inspectionSoonDaysHelp": "Inside this window a vehicle is rechecked weekly, so a passed inspection drops it off the reminder list within days. A shorter window means fewer lookups.",
  540. "soon30": "30 days",
  541. "soon60": "60 days",
  542. "soon90": "90 days",
  543. "inspectionOnlyWithCustomer": "Only vehicles with a customer",
  544. "inspectionOnlyWithCustomerHelp": "Skip vehicles with no customer on file. Nobody can be reminded about them, so looking them up costs for nothing."
  545. }
  546. },
  547. "openapi-automotive": {
  548. "description": "Fill in a vehicle from its French, Italian, Spanish, Portuguese or British plate: make, model, year, VIN, fuel, engine size and more, from the country's registration data through Openapi.com. Each lookup is billed to the workshop's own Openapi account. No owner data is returned.",
  549. "fields": {
  550. "token": "API token",
  551. "tokenHelp": "Create an account on console.openapi.com, add credit to the wallet, and under Automotive create a token for the production environment. Each successful lookup costs a few tens of cents; a miss is free."
  552. },
  553. "settings": {
  554. "country": "Country",
  555. "countryHelp": "The registry to search. French and Italian plates look the same, so the country cannot be read off the plate.",
  556. "cars": "Look up cars",
  557. "carsHelp": "Search the car registry. Turn this off if you only work on motorcycles, so a lookup skips the car search and answers faster.",
  558. "bikes": "Look up motorcycles",
  559. "bikesHelp": "Search the motorcycle registry. With cars on too, it is asked only when no car matches, and a miss on the car side is free. Not available for Portugal."
  560. }
  561. },
  562. "checkcardetails": {
  563. "description": "Fill in a vehicle from its British plate or VIN: make, model, year, colour, fuel, engine size and the MOT due date, from DVLA data through Check Car Details. Cars and motorcycles come from the same register. With UK Vehicle Data turned on for your account, the VIN, transmission and weights come too. Each lookup is billed to the workshop's own Check Car Details account. No owner data is returned.",
  564. "fields": {
  565. "apiKey": "API key",
  566. "apiKeyHelp": "Create an account on api.checkcardetails.co.uk and copy the live key under API Keys. Vehicle Registration is included on every account. To get the VIN as well, click Request Access next to UK Vehicle Data under Your Data Points; lookups use it as soon as it is turned on. A test key only finds plates that contain the letter A."
  567. },
  568. "settings": {
  569. "syncInspections": "Keep MOT dates up to date for every vehicle in this workshop",
  570. "syncInspectionsHelp": "When this is on, every vehicle with a plate is looked up once and its MOT due date saved. After that, vehicles are rechecked as set below. Each vehicle found is billed as one Vehicle Registration lookup; plates the register does not know are free. Only vehicles stored in this workshop are sent.",
  571. "inspectionRecheck": "Recheck vehicles that already have a date",
  572. "inspectionRecheckHelp": "A date only changes when an inspection is passed. Monthly notices an early test soonest; only near the deadline costs the least. Near the deadline, every vehicle is rechecked weekly whatever you choose here.",
  573. "recheckMonthly": "Every month",
  574. "recheckQuarterly": "Every three months",
  575. "recheckNearDeadline": "Only near the deadline",
  576. "inspectionSoonDays": "Near the deadline means within",
  577. "inspectionSoonDaysHelp": "Inside this window a vehicle is rechecked weekly, so a passed inspection drops it off the reminder list within days. A shorter window means fewer lookups.",
  578. "soon30": "30 days",
  579. "soon60": "60 days",
  580. "soon90": "90 days",
  581. "inspectionOnlyWithCustomer": "Only vehicles with a customer",
  582. "inspectionOnlyWithCustomerHelp": "Skip vehicles with no customer on file. Nobody can be reminded about them, so looking them up costs for nothing."
  583. }
  584. },
  585. "rdw": {
  586. "description": "Fill in a vehicle from its Dutch plate: make, model, year, fuel, engine size, colour, weights and the next APK date, straight from RDW's open vehicle register. Free, no key needed. No owner data and no VIN are published.",
  587. "fields": {
  588. "appToken": "App token (optional)",
  589. "appTokenHelp": "RDW's open data works without a key, but anonymous requests share a throttled pool. For the inspection sync, create a free account on opendata.rdw.nl, open your profile's developer settings and create an app token."
  590. },
  591. "settings": {
  592. "syncInspections": "Keep APK dates up to date for every vehicle in this workshop",
  593. "syncInspectionsHelp": "Once an hour, vehicles due a check are looked up by plate and their next APK date is saved; how often a vehicle is rechecked is set below. Only vehicles stored in this workshop are ever sent.",
  594. "inspectionRecheck": "Recheck vehicles that already have a date",
  595. "inspectionRecheckHelp": "A date only changes when an inspection is passed. Monthly notices an early test soonest; only near the deadline costs the least. Near the deadline, every vehicle is rechecked weekly whatever you choose here.",
  596. "recheckMonthly": "Every month",
  597. "recheckQuarterly": "Every three months",
  598. "recheckNearDeadline": "Only near the deadline",
  599. "inspectionSoonDays": "Near the deadline means within",
  600. "inspectionSoonDaysHelp": "Inside this window a vehicle is rechecked weekly, so a passed inspection drops it off the reminder list within days. A shorter window means fewer lookups.",
  601. "soon30": "30 days",
  602. "soon60": "60 days",
  603. "soon90": "90 days",
  604. "inspectionOnlyWithCustomer": "Only vehicles with a customer",
  605. "inspectionOnlyWithCustomerHelp": "Skip vehicles with no customer on file. Nobody can be reminded about them, so looking them up costs for nothing."
  606. }
  607. },
  608. "regcheck": {
  609. "description": "Fill in a vehicle from its plate in Australia, New Zealand, the United States, Ireland, Norway, Sweden, Denmark, Finland, Estonia, Czechia, Slovakia, Hungary or Croatia: make, model, year, VIN, fuel and engine size where the country publishes them, through RegCheck. Each successful lookup spends one credit from the workshop's own RegCheck account. No owner data is returned.",
  610. "fields": {
  611. "username": "RegCheck username",
  612. "usernameHelp": "Register on regcheck.org.uk; the account comes with 10 free lookups and more are bought in blocks of 100 through the dashboard. Only the username is needed here, never the password. A plate that is not found costs nothing."
  613. },
  614. "settings": {
  615. "country": "Country",
  616. "countryHelp": "The registry to search. Each country has its own service, so the connection searches one.",
  617. "auState": "State or territory",
  618. "auStateHelp": "Australia registers vehicles per state, and the registry must be told which one to search. Choose where most of your customers' vehicles are registered.",
  619. "usState": "State",
  620. "usStateHelp": "The two-letter code of the state the vehicles are registered in, such as CA or TX. American registries are searched per state."
  621. }
  622. },
  623. "openai": {
  624. "description": "Service descriptions, history summaries, document scanning and the assistant, answered by your own OpenAI account. Every call is billed to that account, and you choose which model answers.",
  625. "fields": {
  626. "apiKey": "API key",
  627. "apiKeyHelp": "Create one at platform.openai.com under API keys. The account needs credit on it; OpenAI bills the usage, per call."
  628. },
  629. "settings": {
  630. "model": "Model",
  631. "modelHelp": "Which model answers. The list is read from your account, newest first. Smaller models cost less per call and are enough for most workshop text."
  632. }
  633. },
  634. "anthropic": {
  635. "description": "Service descriptions, history summaries, document scanning and the assistant, answered by Claude on your own Anthropic account. Every call is billed to that account, and you choose which model answers.",
  636. "fields": {
  637. "apiKey": "API key",
  638. "apiKeyHelp": "Create one at console.anthropic.com under API keys. The account needs credit on it; Anthropic bills the usage, per call."
  639. },
  640. "settings": {
  641. "model": "Model",
  642. "modelHelp": "Which model answers. The list is read from your account, newest first. Smaller models cost less per call and are enough for most workshop text."
  643. }
  644. },
  645. "openai-compatible": {
  646. "name": "OpenAI-compatible",
  647. "description": "Service descriptions, history summaries, document scanning and the assistant, answered by any server that speaks OpenAI's chat API: Ollama, Open WebUI, LocalAI, vLLM, LM Studio, LiteLLM and the like. Your data stays on your own hardware.",
  648. "fields": {
  649. "baseUrl": "Base URL",
  650. "baseUrlHelp": "Where the server's OpenAI-style API starts, including the path: /v1 for Ollama, vLLM, LocalAI and LM Studio, /api for Open WebUI. Torqvoice appends /models and /chat/completions to it.",
  651. "apiKey": "API key",
  652. "apiKeyHelp": "Only if the server asks for one. Ollama and vLLM usually run without a key; Open WebUI issues one under Settings, Account."
  653. },
  654. "settings": {
  655. "model": "Model",
  656. "modelHelp": "Which model answers. The list is everything the server reports, by name. Use a model with vision if you want photos read."
  657. }
  658. },
  659. "stripe": {
  660. "description": "Card payments from the invoice link, into your own Stripe account. The customer pays, Stripe tells Torqvoice, and the invoice marks itself paid.",
  661. "fields": {
  662. "secretKey": "Secret key",
  663. "secretKeyHelp": "From the Stripe dashboard under Developers, API keys. Test keys process nothing real, so try a payment on them first and swap to live keys after.",
  664. "publishableKey": "Publishable key",
  665. "webhookSecret": "Webhook signing secret",
  666. "webhookSecretHelp": "Optional, and can be added after connecting. Stripe shows it under Reveal secret once the notification URL from this page is added as an endpoint. With it, every notification is verified by its signature; without it, Torqvoice asks Stripe for the checkout before recording a payment."
  667. },
  668. "settings": {
  669. "enabled": "Offer on invoice links",
  670. "enabledHelp": "Switch off to take the pay button off shared invoices for a while, without disconnecting. Payments already started are still recorded."
  671. }
  672. },
  673. "vipps": {
  674. "description": "Vipps MobilePay from the invoice link. The customer pays in the app they already have, and the invoice marks itself paid.",
  675. "fields": {
  676. "clientId": "Client ID",
  677. "clientSecret": "Client secret",
  678. "subscriptionKey": "Subscription key",
  679. "subscriptionKeyHelp": "The Ocp-Apim-Subscription-Key from the Vipps MobilePay portal, under the sales unit's API keys.",
  680. "merchantSerialNumber": "Merchant serial number"
  681. },
  682. "settings": {
  683. "enabled": "Offer on invoice links",
  684. "enabledHelp": "Switch off to take the pay button off shared invoices for a while, without disconnecting. Payments already started are still recorded.",
  685. "testMode": "Test mode",
  686. "testModeHelp": "Use the Vipps test environment with test keys. Leave it on until a full payment has gone through, then turn it off and enter the live keys."
  687. }
  688. },
  689. "paypal": {
  690. "description": "PayPal checkout from the invoice link, through your own PayPal app. The customer pays with a PayPal account or a card, and the invoice marks itself paid.",
  691. "fields": {
  692. "clientId": "Client ID",
  693. "clientSecret": "Client secret"
  694. },
  695. "settings": {
  696. "enabled": "Offer on invoice links",
  697. "enabledHelp": "Switch off to take the pay button off shared invoices for a while, without disconnecting. Payments already started are still recorded.",
  698. "sandbox": "Sandbox mode",
  699. "sandboxHelp": "Use PayPal's sandbox with sandbox app keys. Leave it on until a full payment has gone through, then turn it off and enter the live app's keys."
  700. }
  701. },
  702. "quickbooks": {
  703. "description": "Send issued invoices, their customers and their payments to QuickBooks Online, and bring back payments recorded there.",
  704. "tenantHelp": "Create an app in the Intuit Developer portal. Copy the client id and secret from Keys and credentials, and enter the redirect URI below under Settings, Redirect URIs. Development keys reach sandbox companies, production keys live ones.",
  705. "fields": {
  706. "clientId": "Client ID",
  707. "clientSecret": "Client secret"
  708. },
  709. "settings": {
  710. "pushInvoices": "Send issued invoices to QuickBooks",
  711. "pushOnComplete": "Also send invoices when the job is marked completed",
  712. "pushOnCompleteHelp": "Without this an invoice goes over once it is sent, shared or paid. With it, a completed job goes over straight away and is updated if it changes.",
  713. "startDate": "Only invoices dated on or after",
  714. "startDateHelp": "Leave empty to send every issued invoice. Use the date your books moved to QuickBooks so older invoices are not entered twice.",
  715. "includeVehicle": "Name the vehicle on the invoice",
  716. "includeVehicleHelp": "A text line above the charges with the year, make, model, plate and mileage, so the books say which car.",
  717. "laborItemId": "Item for labour lines",
  718. "laborItemIdHelp": "Leave empty and an item named Labour is created under your income account the first time.",
  719. "partsItemId": "Item for parts lines",
  720. "partsItemIdHelp": "Leave empty and an item named Parts is created under your income account the first time.",
  721. "taxAmounts": "Tax amounts",
  722. "taxAmountsHelp": "As billed sends the tax exactly as it stands on the invoice the customer received, so both systems agree to the cent. Worked out by QuickBooks lets QuickBooks apply the rate of the tax code, or the customer's address in the US, and the log says when the totals differ.",
  723. "taxAmountsBilled": "As billed in Torqvoice",
  724. "taxAmountsQuickbooks": "Worked out by QuickBooks",
  725. "taxCodeId": "Tax code for taxable invoices",
  726. "taxCodeIdHelp": "QuickBooks books the tax under a tax code. Torqvoice picks the code whose rate matches each invoice; this one is used when none does. A US company uses TAX unless you choose otherwise.",
  727. "zeroTaxCodeId": "Tax code for tax-free invoices",
  728. "zeroTaxCodeIdHelp": "Used when the invoice has no tax or the customer is tax exempt. A US company uses NON unless you choose otherwise.",
  729. "pushPayments": "Record payments in QuickBooks",
  730. "depositAccountId": "Deposit payments to",
  731. "depositAccountIdHelp": "Leave empty to use Undeposited Funds.",
  732. "manualPaidAsPayment": "Record a payment when an invoice is marked paid by hand",
  733. "manualPaidAsPaymentHelp": "An invoice marked as paid in Torqvoice without a payment entry gets one payment in QuickBooks for whatever it still shows as owed. Off, it stays open there until a payment is recorded.",
  734. "pullPayments": "Bring back payments recorded in QuickBooks",
  735. "pullPaymentsHelp": "Every 30 minutes. A payment received in QuickBooks against an invoice from Torqvoice is recorded on the invoice here."
  736. }
  737. },
  738. "fiken": {
  739. "description": "Send issued invoices, their customers and their payments to Fiken, and bring back payments recorded there.",
  740. "tenantHelp": "Create an app in Fiken under Rediger konto, API, for your own companies. Enter the redirect URI below on the app, then copy its client ID and client secret here. The company needs Fiken's API module.",
  741. "fields": {
  742. "clientId": "Client ID",
  743. "clientSecret": "Client secret"
  744. },
  745. "settings": {
  746. "companySlug": "Fiken company",
  747. "companySlugHelp": "The company whose books the invoices go into. Your Fiken user may have access to several.",
  748. "pushInvoices": "Send issued invoices to Fiken",
  749. "pushOnComplete": "Also send invoices when the job is marked completed",
  750. "pushOnCompleteHelp": "Without this an invoice goes over once it is sent, shared or paid. With it, a completed job goes over straight away and is updated if it changes.",
  751. "startDate": "Only invoices dated on or after",
  752. "startDateHelp": "Leave empty to send every issued invoice. Use the date your books moved to Fiken so older invoices are not entered twice.",
  753. "attachPdf": "Attach the invoice PDF",
  754. "attachPdfHelp": "An invoice goes into Fiken as a sale (Annet salg) under its Torqvoice number. With this on, the PDF the customer received is filed on the sale as its voucher.",
  755. "laborAccount": "Income account for labour",
  756. "laborAccountHelp": "Leave empty to use 3000.",
  757. "partsAccount": "Income account for parts",
  758. "partsAccountHelp": "Leave empty to use 3000.",
  759. "zeroVatType": "VAT type for invoices without VAT",
  760. "zeroVatTypeHelp": "How Fiken books a sale that carries no VAT. A company that is not VAT registered needs no choice here. A registered one must choose before such an invoice is sent; ask your accountant which applies.",
  761. "vatNone": "None (no VAT handling)",
  762. "vatExempt": "Exempt (fritatt)",
  763. "vatOutside": "Outside the VAT area (utenfor)",
  764. "vatExport": "Exempt, export",
  765. "vatReverse": "Exempt, reverse charge",
  766. "zeroAccount": "Income account for invoices without VAT",
  767. "zeroAccountHelp": "Leave empty to use the labour and parts accounts above. If Fiken refuses the account with the VAT type, the reason is shown in the activity log.",
  768. "pushPayments": "Record payments in Fiken",
  769. "paymentAccount": "Deposit payments to",
  770. "paymentAccountHelp": "Leave empty to use the company's first bank account.",
  771. "manualPaidAsPayment": "Record a payment when an invoice is marked paid by hand",
  772. "manualPaidAsPaymentHelp": "An invoice marked as paid in Torqvoice without a payment entry gets one payment in Fiken for whatever it still shows as owed. Off, it stays open there until a payment is recorded.",
  773. "pullPayments": "Bring back payments recorded in Fiken",
  774. "pullPaymentsHelp": "Every 30 minutes. A payment received in Fiken against an invoice from Torqvoice is recorded on the invoice here."
  775. }
  776. },
  777. "nhtsa": {
  778. "description": "Fill in a vehicle from its VIN, and see recalls, owner complaints and crash ratings for every model year, from the US safety authority. Free, no key.",
  779. "fields": {},
  780. "settings": {
  781. "refreshFleet": "Keep recall and complaint data fresh for every vehicle in this workshop",
  782. "refreshFleetHelp": "Once a day, models not refreshed in the last week are fetched again, so the vehicle page never waits and a new recall shows within a week of being filed. Only make, model and year are sent."
  783. }
  784. },
  785. "openlaborproject": {
  786. "description": "Look up book labor times and fluid capacities for the vehicle on a work order or quote, and add a job's hours as a labor line in one click. Most of the data is for US-market vehicles, and the guide says which market each lookup is for. Each value shows how sure Open Labor Project is of it, and many are AI-derived estimates, so check them before you quote a customer. Lookups use the workshop's own API key. On a paid Open Labor Project plan, a vehicle looked up once is kept for as long as the plan lasts, so looking it up again costs no call.",
  787. "fields": {
  788. "apiKey": "API key",
  789. "apiKeyHelp": "Request a key on openlaborproject.com under Developers; it arrives by email. A free key has 10 calls a day and shows hours one job at a time. The Builder plan and up raise the limit and show every job's hours at once.",
  790. "apiKeyServerHelp": "Leave this empty to use the key this server provides, or paste your own key from openlaborproject.com to use your own plan."
  791. },
  792. "settings": {
  793. "minConfidence": "Show labor times from",
  794. "minConfidenceHelp": "Leave out times the source is less sure of. Many times for European makes are AI estimates, so a strict choice can leave few jobs.",
  795. "confidenceAll": "Every confidence level",
  796. "confidenceMedium": "Medium and up",
  797. "confidenceHigh": "Verified and up",
  798. "confidenceOem": "OEM only",
  799. "hoursFrom": "Hours to add",
  800. "hoursFromHelp": "Which figure goes on the work order: the book time, or the top of the range Open Labor Project gives (1.6 h instead of 1.2 h, say). The top of the range leaves room for jobs that run long.",
  801. "hoursBook": "Book time",
  802. "hoursHigh": "Top of the range",
  803. "adjustPercent": "Adjust times by (%)",
  804. "adjustPercentHelp": "A percentage added to every time before it goes on the work order: 10 turns 1.2 h into 1.32 h, -10 turns it into 1.08 h. From -50 to 200.",
  805. "rounding": "Round hours up to",
  806. "roundingHelp": "Rounds each job's hours up, after any adjustment: with 0.25, 1.32 h becomes 1.5 h. A time already on a step stays as it is.",
  807. "roundNone": "Do not round",
  808. "roundTenth": "0.1 hour",
  809. "roundQuarter": "0.25 hour",
  810. "roundHalf": "0.5 hour",
  811. "fluids": "Show fluid specs",
  812. "fluidsHelp": "Adds a Fluids tab with capacities, specs and change intervals. Opening it uses a call of its own.",
  813. "units": "Fluid units",
  814. "unitsHelp": "The units capacities and change intervals are shown in.",
  815. "unitsBoth": "Both",
  816. "unitsMetric": "Metric (L, km)",
  817. "unitsUs": "US (qt, mi)"
  818. }
  819. },
  820. "speech-to-text": {
  821. "name": "Speech to text",
  822. "description": "Dictation on a work order, written down by a speech model instead of the browser: far more accurate, any language, and it knows a workshop's words. Separate from your AI provider, so you can keep that one as it is. Uses your own OpenAI key, or a server of your own that speaks OpenAI's transcription API. The recording is sent to be written down and is not kept.",
  823. "fields": {
  824. "apiKey": "API key",
  825. "apiKeyHelp": "An OpenAI key from platform.openai.com under API keys; OpenAI bills the usage, by the minute. For your own server, only if it asks for one.",
  826. "baseUrl": "Server address",
  827. "baseUrlHelp": "Leave empty to use OpenAI. For a server of your own (a local Whisper, LocalAI, Groq), where its OpenAI-style API starts, including the path, such as /v1. Torqvoice appends /audio/transcriptions to it."
  828. },
  829. "settings": {
  830. "model": "Model",
  831. "modelHelp": "The speech model to ask for. gpt-4o-mini-transcribe is accurate and cheap; gpt-4o-transcribe is the larger one. A server of your own usually answers to whisper-1.",
  832. "mode": "Who chooses how dictation is written down",
  833. "modeHelp": "The browser writes as you speak but is weaker, above all in smaller languages. The speech model writes when you stop.",
  834. "modeAi": "Always the speech model",
  835. "modeChoice": "Each person chooses: speech model or browser"
  836. }
  837. },
  838. "s3": {
  839. "name": "Cloud storage bucket",
  840. "description": "Encrypted backups of this workshop to a bucket you own at Amazon S3, Cloudflare R2, Backblaze B2, Wasabi, Hetzner Object Storage or any other S3-compatible storage, on a schedule you choose. After the first run only what changed is uploaded, so hourly backups stay cheap.",
  841. "fields": {
  842. "accessKeyId": "Access key ID",
  843. "accessKeyIdHelp": "A key from your storage provider with permission to list, read, write and delete objects in the bucket. Make a key for Torqvoice alone, so it can be revoked on its own.",
  844. "secretAccessKey": "Secret access key",
  845. "password": "Backup password",
  846. "passwordHelp": "Every backup is encrypted with this password. Make one up or press Generate, and keep a copy away from this server: without it nobody can open these backups, not even Torqvoice. To reconnect storage that already holds Torqvoice backups, enter the password they were made with.",
  847. "endpoint": "Custom endpoint",
  848. "endpointHelp": "Only for the Other provider: the S3 address of your own storage, such as a MinIO server, as a host name with a port if needed."
  849. },
  850. "settings": {
  851. "provider": "Provider",
  852. "providerAws": "Amazon S3",
  853. "providerR2": "Cloudflare R2",
  854. "providerB2": "Backblaze B2",
  855. "providerWasabi": "Wasabi",
  856. "providerHetzner": "Hetzner Object Storage",
  857. "providerOther": "Other S3-compatible storage",
  858. "region": "Region",
  859. "regionHelp": "Where the bucket lives. Pick it from the provider's list; for other storage, type what it expects, if anything. Not used by Cloudflare R2.",
  860. "accountId": "Cloudflare account ID",
  861. "accountIdHelp": "The 32-character id shown on the R2 overview page of your Cloudflare dashboard.",
  862. "bucket": "Bucket",
  863. "bucketHelp": "Listed from the key as soon as it is entered. A key that may use one bucket but not list them takes the name typed in.",
  864. "prefix": "Folder in the bucket",
  865. "prefixHelp": "The backups live under this folder. Use a different folder for each workshop that shares the bucket.",
  866. "frequency": "How often",
  867. "frequencyHourly": "Every hour",
  868. "frequencyEvery4h": "Every 4 hours",
  869. "frequencyDaily": "Every day",
  870. "frequencyWeekly": "Every week",
  871. "frequencyMonthly": "Every month",
  872. "time": "Time of day",
  873. "timeHelp": "On the workshop clock, as HH:MM. Used by daily, weekly and monthly backups.",
  874. "weekday": "Day of the week",
  875. "sunday": "Sunday",
  876. "monday": "Monday",
  877. "tuesday": "Tuesday",
  878. "wednesday": "Wednesday",
  879. "thursday": "Thursday",
  880. "friday": "Friday",
  881. "saturday": "Saturday",
  882. "monthDay": "Day of the month",
  883. "monthDayLast": "Last day",
  884. "contents": "Contents",
  885. "contentsHelp": "Secret keys are the ones this workshop typed into Torqvoice: payment, AI and webhook keys. Every backup is encrypted with the backup password either way. A backup holds the workshop's records and, when chosen, its files. User accounts and passwords are not in it: on a new server you sign in, invite the team and restore the data into that workshop.",
  886. "contentsData": "Data only",
  887. "contentsDataAndSecrets": "Data and secret keys",
  888. "includeFiles": "Include photos and files",
  889. "includeFilesHelp": "Every file is uploaded once and reused by later backups, so this costs little after the first run.",
  890. "keepHourly": "Keep hourly backups",
  891. "keepHourlyHelp": "How many of the most recent hourly backups to keep. Only matters for hourly and 4-hourly schedules.",
  892. "keepDaily": "Keep daily backups",
  893. "keepWeekly": "Keep weekly backups",
  894. "keepMonthly": "Keep monthly backups",
  895. "keepMonthlyHelp": "Older backups are removed after each run, keeping the newest of each kind. Set a number to 0 to keep none of that kind."
  896. }
  897. },
  898. "local-folder": {
  899. "name": "Local folder",
  900. "description": "Encrypted backups of this workshop to a folder on this server: the backups volume in the compose file, or a network drive mounted there. A copy on the same disk as the database is not safe on its own; pair it with storage elsewhere.",
  901. "fields": {
  902. "password": "Backup password",
  903. "passwordHelp": "Every backup is encrypted with this password. Make one up or press Generate, and keep a copy away from this server: without it nobody can open these backups, not even Torqvoice. To reconnect storage that already holds Torqvoice backups, enter the password they were made with."
  904. },
  905. "settings": {
  906. "folder": "Folder",
  907. "folderHelp": "The folder under the server's backup root that holds this workshop's backups. Leave it empty to use a folder named after this workshop. On a new server, type the folder name an earlier install used to get its backups back.",
  908. "frequency": "How often",
  909. "frequencyHourly": "Every hour",
  910. "frequencyEvery4h": "Every 4 hours",
  911. "frequencyDaily": "Every day",
  912. "frequencyWeekly": "Every week",
  913. "frequencyMonthly": "Every month",
  914. "time": "Time of day",
  915. "timeHelp": "On the workshop clock, as HH:MM. Used by daily, weekly and monthly backups.",
  916. "weekday": "Day of the week",
  917. "sunday": "Sunday",
  918. "monday": "Monday",
  919. "tuesday": "Tuesday",
  920. "wednesday": "Wednesday",
  921. "thursday": "Thursday",
  922. "friday": "Friday",
  923. "saturday": "Saturday",
  924. "monthDay": "Day of the month",
  925. "monthDayLast": "Last day",
  926. "contents": "Contents",
  927. "contentsHelp": "Secret keys are the ones this workshop typed into Torqvoice: payment, AI and webhook keys. Every backup is encrypted with the backup password either way. A backup holds the workshop's records and, when chosen, its files. User accounts and passwords are not in it: on a new server you sign in, invite the team and restore the data into that workshop.",
  928. "contentsData": "Data only",
  929. "contentsDataAndSecrets": "Data and secret keys",
  930. "includeFiles": "Include photos and files",
  931. "includeFilesHelp": "Every file is uploaded once and reused by later backups, so this costs little after the first run.",
  932. "keepHourly": "Keep hourly backups",
  933. "keepHourlyHelp": "How many of the most recent hourly backups to keep. Only matters for hourly and 4-hourly schedules.",
  934. "keepDaily": "Keep daily backups",
  935. "keepWeekly": "Keep weekly backups",
  936. "keepMonthly": "Keep monthly backups",
  937. "keepMonthlyHelp": "Older backups are removed after each run, keeping the newest of each kind. Set a number to 0 to keep none of that kind."
  938. }
  939. }
  940. },
  941. "jobKinds": {
  942. "calendar": {
  943. "push": "Work orders to calendar",
  944. "pull": "Busy time from calendar"
  945. },
  946. "conference": {
  947. "sync": "Video call links"
  948. },
  949. "inspection": {
  950. "refresh": "Inspection date refresh"
  951. },
  952. "accounting": {
  953. "invoice": "Invoice to ledger",
  954. "payment": "Payment to ledger",
  955. "customer": "Customer to ledger",
  956. "pull": "Payments from ledger"
  957. },
  958. "safety": {
  959. "refresh": "Recall data refresh",
  960. "vehicle": "Recall check for a new vehicle"
  961. },
  962. "repair": {
  963. "checkPlan": "Check that stored lookups may be kept"
  964. }
  965. },
  966. "backupAlerts": {
  967. "destination": "backup destination",
  968. "failedTitle": "Backup failed",
  969. "failedMessage": "The backup to {name} did not finish: {reason}",
  970. "failedSubject": "Backup to {name} failed",
  971. "failedEmailIntro": "The scheduled backup of your workshop to {name} did not finish.",
  972. "openToRetry": "Open Settings, Integrations, {name} to see the run and try again.",
  973. "overdueTitle": "Backup overdue",
  974. "overdueSince": "No backup to {name} has finished since {time}.",
  975. "overdueNever": "No backup to {name} has finished yet.",
  976. "overdueSubject": "Backup to {name} is overdue",
  977. "openToSee": "Open Settings, Integrations, {name} to see what went wrong.",
  978. "platformName": "Backups by Torqvoice",
  979. "restoredTitle": "Workshop restored",
  980. "restoredSubject": "Your workshop was restored from a backup",
  981. "restoredIntro": "{name}: the workshop was put back to restore point {snapshot} on {time}. Everything entered after that point is no longer in the workshop.",
  982. "restoredByMember": "A member of your workshop asked for this restore.",
  983. "restoredBySupport": "Torqvoice support did this at your request. Reason given: {reason}",
  984. "noReason": "none given",
  985. "restoredUndo": "A safety copy of the workshop as it was right before the restore was taken first and is kept for 90 days. Contact support to go back to it."
  986. }
  987. }