Procházet zdrojové kódy

Add European Portuguese and finish translations in every language (#406)

* Add European Portuguese and translate English text left in every language

* quarterly

* tabel

* vehicle table
Bernt Christian Egeland před 1 týdnem
rodič
revize
f6eb1a9566
100 změnil soubory, kde provedl 1180 přidání a 1180 odebrání
  1. 2 2
      messages/de/admin.json
  2. 1 1
      messages/de/billing.json
  3. 5 5
      messages/de/calendar.json
  4. 2 2
      messages/de/customers.json
  5. 6 6
      messages/de/dashboard.json
  6. 17 17
      messages/de/documentLock.json
  7. 92 92
      messages/de/integrations.json
  8. 1 1
      messages/de/inventory.json
  9. 4 4
      messages/de/laborPresets.json
  10. 3 3
      messages/de/messages.json
  11. 1 1
      messages/de/navigation.json
  12. 1 1
      messages/de/notifications.json
  13. 6 6
      messages/de/pdf.json
  14. 1 1
      messages/de/reminders.json
  15. 80 80
      messages/de/reports.json
  16. 17 17
      messages/de/settings.json
  17. 5 5
      messages/de/share.json
  18. 1 1
      messages/de/statusReport.json
  19. 3 3
      messages/de/telegram.json
  20. 1 1
      messages/de/telegramMessages.json
  21. 24 24
      messages/de/vehicles.json
  22. 7 7
      messages/de/workBoard.json
  23. 1 1
      messages/de/workOrders.json
  24. 1 1
      messages/en/settings.json
  25. 1 1
      messages/en/share.json
  26. 2 2
      messages/es/admin.json
  27. 5 5
      messages/es/calendar.json
  28. 2 2
      messages/es/customers.json
  29. 6 6
      messages/es/dashboard.json
  30. 17 17
      messages/es/documentLock.json
  31. 95 95
      messages/es/integrations.json
  32. 3 3
      messages/es/inventory.json
  33. 4 4
      messages/es/laborPresets.json
  34. 3 3
      messages/es/messages.json
  35. 1 1
      messages/es/navigation.json
  36. 1 1
      messages/es/notifications.json
  37. 6 6
      messages/es/pdf.json
  38. 1 1
      messages/es/reminders.json
  39. 85 85
      messages/es/reports.json
  40. 2 2
      messages/es/service.json
  41. 17 17
      messages/es/settings.json
  42. 5 5
      messages/es/share.json
  43. 2 2
      messages/es/statusReport.json
  44. 3 3
      messages/es/telegram.json
  45. 1 1
      messages/es/telegramMessages.json
  46. 25 25
      messages/es/vehicles.json
  47. 7 7
      messages/es/workBoard.json
  48. 1 1
      messages/es/workOrders.json
  49. 2 2
      messages/fr/admin.json
  50. 1 1
      messages/fr/billing.json
  51. 6 6
      messages/fr/calendar.json
  52. 1 1
      messages/fr/customers.json
  53. 7 7
      messages/fr/dashboard.json
  54. 17 17
      messages/fr/documentLock.json
  55. 94 94
      messages/fr/integrations.json
  56. 2 2
      messages/fr/inventory.json
  57. 6 6
      messages/fr/laborPresets.json
  58. 3 3
      messages/fr/messages.json
  59. 1 1
      messages/fr/navigation.json
  60. 1 1
      messages/fr/notifications.json
  61. 2 2
      messages/fr/quotes.json
  62. 1 1
      messages/fr/reminders.json
  63. 83 83
      messages/fr/reports.json
  64. 2 2
      messages/fr/service.json
  65. 18 18
      messages/fr/settings.json
  66. 5 5
      messages/fr/share.json
  67. 1 1
      messages/fr/statusReport.json
  68. 3 3
      messages/fr/telegram.json
  69. 1 1
      messages/fr/telegramMessages.json
  70. 1 1
      messages/fr/timeTracking.json
  71. 24 24
      messages/fr/vehicles.json
  72. 7 7
      messages/fr/workBoard.json
  73. 1 1
      messages/fr/workOrders.json
  74. 2 2
      messages/it/admin.json
  75. 5 5
      messages/it/calendar.json
  76. 2 2
      messages/it/customers.json
  77. 7 7
      messages/it/dashboard.json
  78. 17 17
      messages/it/documentLock.json
  79. 93 93
      messages/it/integrations.json
  80. 1 1
      messages/it/inventory.json
  81. 4 4
      messages/it/laborPresets.json
  82. 3 3
      messages/it/messages.json
  83. 1 1
      messages/it/navigation.json
  84. 1 1
      messages/it/notifications.json
  85. 7 7
      messages/it/pdf.json
  86. 1 1
      messages/it/reminders.json
  87. 85 85
      messages/it/reports.json
  88. 15 15
      messages/it/settings.json
  89. 6 6
      messages/it/share.json
  90. 1 1
      messages/it/statusReport.json
  91. 3 3
      messages/it/telegram.json
  92. 1 1
      messages/it/telegramMessages.json
  93. 24 24
      messages/it/vehicles.json
  94. 7 7
      messages/it/workBoard.json
  95. 1 1
      messages/it/workOrders.json
  96. 1 1
      messages/lt/admin.json
  97. 2 2
      messages/lt/calendar.json
  98. 2 2
      messages/lt/customers.json
  99. 4 4
      messages/lt/dashboard.json
  100. 17 17
      messages/lt/documentLock.json

+ 2 - 2
messages/de/admin.json

@@ -31,7 +31,7 @@
     "name": "Name",
     "email": "E-Mail",
     "role": "Rolle",
-    "orgs": "Orgs",
+    "orgs": "Organisationen",
     "created": "Erstellt",
     "lastSeen": "Zuletzt gesehen",
     "noResults": "Keine Benutzer entsprechen Ihrer Suche.",
@@ -117,7 +117,7 @@
     "sendgridApiKeyHint": "Holen Sie Ihren API-Schlüssel von app.sendgrid.com"
   },
   "common": {
-    "openMenu": "Open menu"
+    "openMenu": "Menü öffnen"
   },
   "userDetails": {
     "back": "Zurück zu Benutzern",

+ 1 - 1
messages/de/billing.json

@@ -85,7 +85,7 @@
     "failedDelete": "Löschen fehlgeschlagen",
     "processed": "{count} Rechnung(en) verarbeitet",
     "failedProcess": "Verarbeitung fehlgeschlagen",
-    "pause": "Pause",
+    "pause": "Pausieren",
     "resume": "Fortsetzen",
     "delete": "Löschen",
     "removeRow": "Zeile entfernen"

+ 5 - 5
messages/de/calendar.json

@@ -80,10 +80,10 @@
   },
   "selectVehicle": "Fahrzeug für Arbeitsauftrag auswählen",
   "dateChoice": {
-    "title": "Work Order Date",
-    "description": "You have {selectedDate} selected. Which date should this work order be for?",
+    "title": "Auftragsdatum",
+    "description": "Sie haben {selectedDate} ausgewählt. Für welches Datum soll dieser Arbeitsauftrag gelten?",
     "useSelected": "Use {date}",
-    "useToday": "Use today"
+    "useToday": "Heute verwenden"
   },
   "more": "+ {count} weitere",
   "monthTotal": "{count} Termine",
@@ -144,6 +144,6 @@
       "readOnly": "Belegte Zeit aus einem verbundenen Kalender. Änderungen dort erscheinen hier bei der nächsten Synchronisierung."
     }
   },
-  "previousMonth": "Previous month",
-  "nextMonth": "Next month"
+  "previousMonth": "Vorheriger Monat",
+  "nextMonth": "Nächster Monat"
 }

+ 2 - 2
messages/de/customers.json

@@ -27,7 +27,7 @@
     "batchDeleteTitle": "Kunden löschen",
     "batchDeleteDescription": "{count} Kunde(n) löschen? Die zugehörigen Fahrzeuge werden dabei entknüpft.",
     "batchDeleteSuccess": "{count} Kunde(n) gelöscht",
-    "openMenu": "Open menu"
+    "openMenu": "Menü öffnen"
   },
   "detail": {
     "backToCustomers": "Zurück zur Kundenliste",
@@ -95,7 +95,7 @@
     "customerCreated": "Kunde angelegt",
     "saveError": "Kunde konnte nicht gespeichert werden",
     "customerNumber": "Kundennr.",
-    "customerNumberAuto": "Auto",
+    "customerNumberAuto": "Automatisch",
     "sectionContact": "Kontakt",
     "sectionBilling": "Rechnung",
     "addScannedVehicle": "Fahrzeug {vehicle} anlegen",

+ 6 - 6
messages/de/dashboard.json

@@ -74,8 +74,8 @@
     "noDismissed": "Keine ausgeblendeten Fahrzeuge.",
     "dismissedOn": "Verworfen am {date}",
     "restore": "Wiederherstellen",
-    "settingsAriaLabel": "Maintenance settings",
-    "dismissAriaLabel": "Dismiss"
+    "settingsAriaLabel": "Wartungseinstellungen",
+    "dismissAriaLabel": "Ausblenden"
   },
   "reminders": {
     "title": "Anstehende Erinnerungen",
@@ -112,7 +112,7 @@
     "createQuote": "Angebot erstellen",
     "itemsRequested": "{count, plural, one {# Position angefragt} other {# Positionen angefragt}}",
     "noData": "Keine ausstehenden Angebotsanfragen.",
-    "dismissAriaLabel": "Dismiss quote request"
+    "dismissAriaLabel": "Angebotsanfrage ausblenden"
   },
   "quoteResponses": {
     "title": "Angebotsantworten der Kunden",
@@ -120,11 +120,11 @@
     "accepted": "Angenommen",
     "changesRequested": "Änderungen gewünscht",
     "convertToWorkOrder": "In Arbeitsauftrag umwandeln",
-    "convert": "Convert",
+    "convert": "Umwandeln",
     "viewQuote": "Angebot anzeigen",
-    "view": "View",
+    "view": "Anzeigen",
     "noData": "Keine Kundenantworten.",
-    "dismissAriaLabel": "Dismiss response"
+    "dismissAriaLabel": "Antwort ausblenden"
   },
   "recentCompleted": {
     "title": "Kürzlich abgeschlossen",

+ 17 - 17
messages/de/documentLock.json

@@ -1,27 +1,27 @@
 {
   "lockedTitle": {
     "invoice": {
-      "sent": "This invoice is locked because it has been sent",
-      "paid": "This invoice is locked because it has been paid"
+      "sent": "Diese Rechnung ist gesperrt, weil sie gesendet wurde",
+      "paid": "Diese Rechnung ist gesperrt, weil sie bezahlt wurde"
     },
     "quote": {
-      "sent": "This quote is locked because it has been sent",
-      "accepted": "This quote is locked because it has been accepted"
+      "sent": "Dieses Angebot ist gesperrt, weil es gesendet wurde",
+      "accepted": "Dieses Angebot ist gesperrt, weil es angenommen wurde"
     }
   },
-  "lockedBody": "Its parts, labour, prices, discount, tax, number and date can no longer be changed. Payments, status changes, sending and attachments all still work.",
-  "lockedAdminHint": "As an owner or admin you can unlock it if something genuinely needs correcting. The unlock is recorded in the audit log.",
-  "lockedMemberHint": "Ask an owner or admin to unlock it if something needs correcting.",
-  "unlock": "Unlock for editing",
-  "relock": "Lock again",
-  "unlockConfirmTitle": "Unlock this document?",
+  "lockedBody": "Teile, Arbeitsleistung, Preise, Rabatt, Steuer, Nummer und Datum können nicht mehr geändert werden. Zahlungen, Statusänderungen, Versand und Anhänge funktionieren weiterhin.",
+  "lockedAdminHint": "Als Inhaber oder Admin können Sie die Sperre aufheben, wenn wirklich etwas korrigiert werden muss. Das Entsperren wird im Prüfprotokoll festgehalten.",
+  "lockedMemberHint": "Bitten Sie einen Inhaber oder Admin, die Sperre aufzuheben, wenn etwas korrigiert werden muss.",
+  "unlock": "Zum Bearbeiten entsperren",
+  "relock": "Wieder sperren",
+  "unlockConfirmTitle": "Dieses Dokument entsperren?",
   "unlockConfirmDescription": {
-    "invoice": "It will become editable again, and the change will be recorded in the audit log with your name. Prefer a credit note where your local rules require one.",
-    "quote": "It will become editable again, and the change will be recorded in the audit log with your name."
+    "invoice": "Es wird wieder bearbeitbar, und die Änderung wird mit Ihrem Namen im Prüfprotokoll festgehalten. Erstellen Sie lieber eine Gutschrift, wo die Vorschriften in Ihrem Land das verlangen.",
+    "quote": "Es wird wieder bearbeitbar, und die Änderung wird mit Ihrem Namen im Prüfprotokoll festgehalten."
   },
-  "unlocked": "Unlocked for editing",
-  "relocked": "Locked again",
-  "reopenedTitle": "This document has been unlocked for editing",
-  "reopenedBody": "It stays editable until it is locked again.",
-  "failed": "Could not change the lock"
+  "unlocked": "Zum Bearbeiten entsperrt",
+  "relocked": "Wieder gesperrt",
+  "reopenedTitle": "Dieses Dokument wurde zum Bearbeiten entsperrt",
+  "reopenedBody": "Es bleibt bearbeitbar, bis es wieder gesperrt wird.",
+  "failed": "Die Sperre konnte nicht geändert werden"
 }

+ 92 - 92
messages/de/integrations.json

@@ -40,19 +40,19 @@
       "conference": "Links für Videoanrufe"
     },
     "sms": {
-      "send": "Text messages out",
-      "receive": "Replies back in"
+      "send": "SMS versenden",
+      "receive": "Antworten empfangen"
     },
     "whatsapp": {
-      "send": "WhatsApp messages out",
-      "receive": "Replies back in"
+      "send": "WhatsApp-Nachrichten versenden",
+      "receive": "Antworten empfangen"
     },
     "telegram": {
-      "send": "Telegram messages out",
-      "receive": "Replies back in"
+      "send": "Telegram-Nachrichten versenden",
+      "receive": "Antworten empfangen"
     },
     "email": {
-      "send": "Email out"
+      "send": "E-Mails versenden"
     },
     "vehicle": {
       "lookup": "Kennzeichen- und FIN-Abfrage",
@@ -131,19 +131,19 @@
     "lockedAi": "Verbinden Sie einen KI-Anbieter, um KI-Funktionen in Ihrer Werkstatt zu nutzen.",
     "ownAppTitle": "Diese Installation verwendet Ihre eigene App beim Anbieter",
     "redirectUri": "Beim Anbieter zu registrierende Redirect-URI:",
-    "sendTestEmail": "Send test email",
-    "testEmailSent": "Test email sent to {email}",
-    "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.",
-    "inboundUrl": "Inbound webhook URL",
-    "inboundHintSecret": "Paste this URL into the vendor's inbound message settings. It carries a secret that identifies your workshop, so keep it private.",
-    "inboundHintMeta": "Paste this URL as the callback URL in your Meta app, with the verify token you entered above, and subscribe to messages.",
+    "sendTestEmail": "Test-E-Mail senden",
+    "testEmailSent": "Test-E-Mail an {email} gesendet",
+    "testEmailHint": "Eine Test-E-Mail geht über diesen Anbieter an Ihre eigene Adresse. So prüfen Sie die Absenderadresse und die Versandregeln, die eine reine Schlüsselprüfung nicht abdeckt.",
+    "inboundUrl": "Webhook-URL für eingehende Nachrichten",
+    "inboundHintSecret": "Fügen Sie diese URL in den Einstellungen des Anbieters für eingehende Nachrichten ein. Sie enthält ein Geheimnis, das Ihre Werkstatt identifiziert, halten Sie sie also vertraulich.",
+    "inboundHintMeta": "Tragen Sie diese URL als Callback-URL in Ihrer Meta-App ein, zusammen mit dem oben eingegebenen Verifizierungstoken, und abonnieren Sie messages.",
     "inboundHintStripe": "Fügen Sie diese URL im Stripe-Dashboard unter Developers, Webhooks hinzu, abonniert auf checkout.session.completed. Tragen Sie dann das von Stripe angezeigte Signaturgeheimnis hier im Feld Webhook-Geheimnis ein, damit Benachrichtigungen geprüft werden können.",
     "inboundHintVipps": "Tragen Sie diese URL als Callback-URL im Vipps-MobilePay-Portal ein. Vipps verlangt außerdem veröffentlichte Verkaufsbedingungen, die unter Einstellungen, Zahlung hinterlegt werden.",
     "inboundHintPaypal": "Fügen Sie diese URL im PayPal-Entwicklerdashboard unter Webhooks hinzu, abonniert auf PAYMENT.CAPTURE.COMPLETED.",
-    "copy": "Copy",
-    "copied": "Copied",
-    "updateKeys": "Update keys",
-    "updateKeysHint": "The last check failed. Enter the keys again to try once more.",
+    "copy": "Kopieren",
+    "copied": "Kopiert",
+    "updateKeys": "Schlüssel aktualisieren",
+    "updateKeysHint": "Die letzte Prüfung ist fehlgeschlagen. Geben Sie die Schlüssel erneut ein, um es noch einmal zu versuchen.",
     "inspectionSync": {
       "title": "HU-Abgleich",
       "vehicles": "{count} Fahrzeuge mit Kennzeichen in dieser Werkstatt",
@@ -256,155 +256,155 @@
       }
     },
     "twilio-sms": {
-      "description": "Send and receive text messages through a Twilio number. Reminders, ready-for-pickup messages and the replies that come back.",
+      "description": "SMS über eine Twilio-Nummer senden und empfangen. Erinnerungen, Abholbereit-Nachrichten und die Antworten darauf.",
       "fields": {
         "accountSid": "Account SID",
-        "authToken": "Auth token"
+        "authToken": "Auth-Token"
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Von dieser Nummer senden"
       }
     },
     "vonage-sms": {
-      "description": "Send and receive text messages through a Vonage number.",
+      "description": "SMS über eine Vonage-Nummer senden und empfangen.",
       "fields": {
-        "apiKey": "API key",
-        "apiSecret": "API secret",
-        "signatureSecret": "Signature secret",
-        "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."
+        "apiKey": "API-Schlüssel",
+        "apiSecret": "API-Secret",
+        "signatureSecret": "Signaturgeheimnis",
+        "signatureSecretHelp": "Aus dem Vonage-Dashboard unter API settings. Ist es gesetzt, werden eingehende Nachrichten nur angenommen, wenn Vonage sie signiert hat. Ohne es wird nur das Geheimnis in der Webhook-URL geprüft."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Von dieser Nummer senden"
       }
     },
     "telnyx-sms": {
-      "description": "Send and receive text messages through a Telnyx number.",
+      "description": "SMS über eine Telnyx-Nummer senden und empfangen.",
       "fields": {
-        "apiKey": "API key",
-        "webhookPublicKey": "Webhook public key",
-        "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."
+        "apiKey": "API-Schlüssel",
+        "webhookPublicKey": "Öffentlicher Webhook-Schlüssel",
+        "webhookPublicKeyHelp": "Aus dem Telnyx-Portal unter Account settings, Keys and credentials, Public key. Ist er gesetzt, werden eingehende Nachrichten nur angenommen, wenn Telnyx sie signiert hat. Ohne ihn wird nur das Geheimnis in der Webhook-URL geprüft."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Von dieser Nummer senden"
       }
     },
     "whatsapp-meta": {
-      "description": "Message customers on WhatsApp through Meta directly. Photos of what you found, and the conversation that follows.",
+      "description": "Kunden direkt über Meta auf WhatsApp schreiben. Fotos von dem, was Sie gefunden haben, und die Unterhaltung, die darauf folgt.",
       "fields": {
-        "phoneNumberId": "Phone number ID",
-        "accessToken": "Access token",
-        "verifyToken": "Webhook verify token",
-        "appSecret": "App secret",
-        "apiVersion": "Graph API version",
-        "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."
+        "phoneNumberId": "Telefonnummer-ID",
+        "accessToken": "Zugriffstoken",
+        "verifyToken": "Webhook-Verifizierungstoken",
+        "appSecret": "App-Secret",
+        "apiVersion": "Graph-API-Version",
+        "appSecretHelp": "Meta signiert damit jede Zustellung. Solange es nicht eingetragen ist, werden an den Webhook gesendete Nachrichten abgewiesen, da sonst jeder, der die URL kennt, im Namen Ihrer Kunden schreiben könnte."
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Nachrichten über diesen Kanal senden",
+        "phoneNumber": "Von dieser Nummer senden",
+        "templateName": "Vorlage zum Wiedereröffnen einer Unterhaltung",
+        "templateLanguage": "Sprache der Vorlage",
+        "templateVariables": "Werte der Vorlage, in Reihenfolge",
+        "mediaTemplateName": "Vorlage für eine Nachricht mit Foto",
+        "mediaTemplateLanguage": "Sprache der Fotovorlage",
+        "mediaTemplateVariables": "Werte der Fotovorlage, in Reihenfolge"
       }
     },
     "whatsapp-twilio": {
-      "description": "Message customers on WhatsApp through a Twilio number, if Twilio is who sold you one.",
+      "description": "Kunden über eine Twilio-Nummer auf WhatsApp schreiben, falls Sie Ihre Nummer von Twilio haben.",
       "fields": {
         "accountSid": "Account SID",
-        "authToken": "Auth token",
-        "messagingServiceSid": "Messaging service SID"
+        "authToken": "Auth-Token",
+        "messagingServiceSid": "Messaging Service SID"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Nachrichten über diesen Kanal senden",
+        "phoneNumber": "Von dieser Nummer senden",
+        "templateName": "Vorlage zum Wiedereröffnen einer Unterhaltung",
+        "templateLanguage": "Sprache der Vorlage",
+        "templateVariables": "Werte der Vorlage, in Reihenfolge",
+        "mediaTemplateName": "Vorlage für eine Nachricht mit Foto",
+        "mediaTemplateLanguage": "Sprache der Fotovorlage",
+        "mediaTemplateVariables": "Werte der Fotovorlage, in Reihenfolge"
       }
     },
     "telegram": {
-      "description": "A Telegram bot that reaches customers who use it, and brings their replies into the inbox.",
+      "description": "Ein Telegram-Bot, der Kunden erreicht, die ihn nutzen, und ihre Antworten in den Posteingang holt.",
       "fields": {
-        "botToken": "Bot token"
+        "botToken": "Bot-Token"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "botUsername": "Bot username"
+        "enabled": "Nachrichten über diesen Kanal senden",
+        "botUsername": "Bot-Benutzername"
       }
     },
     "smtp": {
-      "description": "Send invoices and reminders through your own mail server, rather than the platform mail.",
+      "description": "Rechnungen und Erinnerungen über Ihren eigenen Mailserver statt über den Plattform-Versand senden.",
       "fields": {
         "host": "Server",
         "port": "Port",
-        "user": "Username",
-        "pass": "Password"
+        "user": "Benutzername",
+        "pass": "Passwort"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "secure": "Connect over TLS from the start",
-        "requireTls": "Require the server to upgrade to TLS",
-        "rejectUnauthorized": "Reject a certificate that does not check out"
+        "fromEmail": "Von dieser Adresse senden",
+        "fromName": "Als Absender angezeigter Name",
+        "secure": "Von Anfang an über TLS verbinden",
+        "requireTls": "Vom Server den Wechsel zu TLS verlangen",
+        "rejectUnauthorized": "Zertifikate ablehnen, die die Prüfung nicht bestehen"
       }
     },
     "resend": {
-      "description": "Send invoices and reminders through Resend.",
+      "description": "Rechnungen und Erinnerungen über Resend senden.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "API-Schlüssel"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Von dieser Adresse senden",
+        "fromName": "Als Absender angezeigter Name"
       }
     },
     "postmark": {
-      "description": "Send invoices and reminders through Postmark.",
+      "description": "Rechnungen und Erinnerungen über Postmark senden.",
       "fields": {
-        "apiKey": "Server token"
+        "apiKey": "Server-Token"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Von dieser Adresse senden",
+        "fromName": "Als Absender angezeigter Name"
       }
     },
     "mailgun": {
-      "description": "Send invoices and reminders through Mailgun.",
+      "description": "Rechnungen und Erinnerungen über Mailgun senden.",
       "fields": {
-        "apiKey": "API key",
-        "domain": "Sending domain"
+        "apiKey": "API-Schlüssel",
+        "domain": "Versanddomain"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "region": "Region the domain is in"
+        "fromEmail": "Von dieser Adresse senden",
+        "fromName": "Als Absender angezeigter Name",
+        "region": "Region der Domain"
       }
     },
     "sendgrid": {
-      "description": "Send invoices and reminders through SendGrid.",
+      "description": "Rechnungen und Erinnerungen über SendGrid senden.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "API-Schlüssel"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Von dieser Adresse senden",
+        "fromName": "Als Absender angezeigter Name"
       }
     },
     "amazon-ses": {
-      "description": "Send invoices and reminders through Amazon SES.",
+      "description": "Rechnungen und Erinnerungen über Amazon SES senden.",
       "fields": {
-        "accessKeyId": "Access key ID",
-        "secretAccessKey": "Secret access key",
+        "accessKeyId": "Zugriffsschlüssel-ID",
+        "secretAccessKey": "Geheimer Zugriffsschlüssel",
         "region": "Region"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Von dieser Adresse senden",
+        "fromName": "Als Absender angezeigter Name"
       }
     },
     "vegvesen": {

+ 1 - 1
messages/de/inventory.json

@@ -131,7 +131,7 @@
     "saveChanges": "Änderungen speichern",
     "addPart": "Teil hinzufügen"
   },
-  "openMenu": "Open menu",
+  "openMenu": "Menü öffnen",
   "history": {
     "title": "Bestandsverlauf",
     "description": "Alle erfassten Änderungen an {name}, neueste zuerst.",

+ 4 - 4
messages/de/laborPresets.json

@@ -16,7 +16,7 @@
   "actions": {
     "edit": "Bearbeiten",
     "delete": "Löschen",
-    "openMenu": "Open menu"
+    "openMenu": "Menü öffnen"
   },
   "deletePreset": {
     "title": "Arbeitsvorlage löschen",
@@ -43,8 +43,8 @@
     "cancel": "Abbrechen",
     "create": "Erstellen",
     "saveChanges": "Änderungen speichern",
-    "itemQty": "Qty",
-    "itemQtyOrHours": "Unit / Hours",
+    "itemQty": "Menge",
+    "itemQtyOrHours": "Einheit / Stunden",
     "hourlyTag": "HR",
     "serviceTag": "SVC",
     "partsTitle": "Teile",
@@ -63,7 +63,7 @@
     "noPackages": "Keine Arbeitsvorlagen gefunden.",
     "items": "{count} Positionen",
     "totalHours": "{hours} Std. gesamt",
-    "totalUnits": "{units} unit(s)",
+    "totalUnits": "{units} Einheit(en)",
     "totalParts": "{count} Teile"
   },
   "errors": {

+ 3 - 3
messages/de/messages.json

@@ -30,8 +30,8 @@
     "deleteDescription": "Alle Nachrichten mit {name} werden dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
     "deleted": "Unterhaltung gelöscht",
     "deleteError": "Unterhaltung konnte nicht gelöscht werden",
-    "back": "Back",
-    "conversationMenu": "Conversation menu",
+    "back": "Zurück",
+    "conversationMenu": "Unterhaltungsmenü",
     "searchPlaceholder": "Unterhaltungen durchsuchen",
     "noSearchResults": "Keine Unterhaltung passt zur Suche",
     "now": "jetzt"
@@ -47,7 +47,7 @@
     "messageDeleted": "Nachricht gelöscht",
     "deleteError": "Nachricht konnte nicht gelöscht werden",
     "sendError": "SMS konnte nicht gesendet werden",
-    "sendMessage": "Send message"
+    "sendMessage": "Nachricht senden"
   },
   "sendDialog": {
     "send": "{label} senden",

+ 1 - 1
messages/de/navigation.json

@@ -112,7 +112,7 @@
     "reports": "Berichte",
     "timesheets": "Stundenzettel",
     "settings": "Einstellungen",
-    "superAdmin": "Super Admin",
+    "superAdmin": "Super-Admin",
     "adminPanel": "Admin-Panel",
     "organizations": "Organisationen",
     "noOrganization": "Keine Organisation",

+ 1 - 1
messages/de/notifications.json

@@ -7,5 +7,5 @@
     "delete": "Löschen",
     "cancel": "Abbrechen"
   },
-  "openNotifications": "Open notifications"
+  "openNotifications": "Benachrichtigungen öffnen"
 }

+ 6 - 6
messages/de/pdf.json

@@ -32,8 +32,8 @@
     "total": "Gesamt",
     "labor": "Arbeitsleistung",
     "hours": "Stunden",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "Std.",
+    "unit": "Einh.",
     "rate": "Stundensatz",
     "ratePerHour": "{rate}/Std.",
     "subtotal": "Zwischensumme",
@@ -75,7 +75,7 @@
     "professionalWorkshop": "Professionelle Werkstattverwaltung",
     "tel": "Tel: {phone}",
     "org": "Org: {org}",
-    "qtyOrHours": "Unit / Hours",
+    "qtyOrHours": "Einheit / Stunden",
     "customFieldsTitle": "Zusätzliche Informationen",
     "telegramConnect": "Chatten Sie mit uns auf Telegram",
     "taxRegistrationLabel": "{name}-Nr."
@@ -96,8 +96,8 @@
     "total": "Gesamt",
     "labor": "Arbeitsleistung",
     "hours": "Stunden",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "Std.",
+    "unit": "Einh.",
     "rate": "Stundensatz",
     "ratePerHour": "{rate}/Std.",
     "subtotal": "Zwischensumme",
@@ -115,7 +115,7 @@
     "validityFooter30": "Dieses Angebot ist 30 Tage gültig",
     "viewPortal": "Ihr Portal ansehen: {url}",
     "tel": "Tel: {phone}",
-    "qtyOrHours": "Unit / Hours",
+    "qtyOrHours": "Einheit / Stunden",
     "customFieldsTitle": "Zusätzliche Informationen",
     "quoteNumberLabel": "Angebotsnr.",
     "validUntilLabel": "Gültig bis"

+ 1 - 1
messages/de/reminders.json

@@ -8,7 +8,7 @@
   "searchVehicle": "Fahrzeuge suchen...",
   "noVehicle": "Keine Fahrzeuge gefunden.",
   "pickDate": "Datum auswählen",
-  "openMenu": "Open menu",
+  "openMenu": "Menü öffnen",
   "relatesTo": "Bezieht sich auf (optional)",
   "selectCustomer": "Kunde (optional)",
   "noneOption": "Keiner",

+ 80 - 80
messages/de/reports.json

@@ -329,94 +329,94 @@
     "jobsClocked": "Erfasste Aufträge"
   },
   "pdf": {
-    "reportTitle": "Business Report",
-    "revenueSection": "Revenue Report",
-    "taxSection": "Tax Report",
-    "pastDueSection": "Past Due Invoices",
-    "servicesSection": "Services Report",
-    "customersSection": "Customers Report",
-    "techniciansSection": "Technicians Report",
-    "partsSection": "Parts Usage Report",
-    "jobAnalyticsSection": "Job Analytics",
-    "retentionSection": "Customer Retention",
-    "inventorySection": "Inventory Report",
+    "reportTitle": "Geschäftsbericht",
+    "revenueSection": "Umsatzbericht",
+    "taxSection": "Steuerbericht",
+    "pastDueSection": "Überfällige Rechnungen",
+    "servicesSection": "Dienstleistungsbericht",
+    "customersSection": "Kundenbericht",
+    "techniciansSection": "Technikerbericht",
+    "partsSection": "Bericht zum Teileverbrauch",
+    "jobAnalyticsSection": "Auftragsanalyse",
+    "retentionSection": "Kundenbindung",
+    "inventorySection": "Lagerbestandsbericht",
     "monthlyBreakdown": "Monatliche Übersicht",
-    "revenueByType": "Revenue by Type",
-    "taxByRate": "Tax by Rate",
-    "servicesByStatus": "By Status",
-    "servicesByType": "By Type",
-    "topCustomers": "Top Customers",
-    "topServiceTypes": "Top Service Types",
-    "topReturning": "Top Returning Customers",
-    "dayOfWeek": "Jobs by Day of Week",
-    "monthlyTrend": "Monthly Trend",
-    "lowStock": "Low Stock Items",
-    "revenue": "Revenue",
-    "collected": "Collected",
-    "outstanding": "Outstanding",
-    "services": "Services",
-    "partsCost": "Parts Cost",
+    "revenueByType": "Umsatz nach Typ",
+    "taxByRate": "Steuer nach Satz",
+    "servicesByStatus": "Nach Status",
+    "servicesByType": "Nach Typ",
+    "topCustomers": "Top-Kunden",
+    "topServiceTypes": "Häufigste Dienstleistungstypen",
+    "topReturning": "Top-Stammkunden",
+    "dayOfWeek": "Aufträge nach Wochentag",
+    "monthlyTrend": "Monatlicher Verlauf",
+    "lowStock": "Artikel mit niedrigem Bestand",
+    "revenue": "Umsatz",
+    "collected": "Eingezogen",
+    "outstanding": "Ausstehend",
+    "services": "Dienstleistungen",
+    "partsCost": "Teilekosten",
     "partsNetProfit": "Teile-Nettogewinn",
     "laborRevenue": "Arbeit",
-    "netProfit": "Net Profit",
-    "month": "Month",
-    "count": "Count",
-    "type": "Type",
+    "netProfit": "Nettogewinn",
+    "month": "Monat",
+    "count": "Anzahl",
+    "type": "Typ",
     "status": "Status",
     "name": "Name",
-    "company": "Company",
-    "totalSpent": "Total Spent",
-    "customer": "Customer",
-    "invoiceNumber": "Invoice #",
-    "totalAmount": "Total Amount",
-    "amountDue": "Amount Due",
-    "dueDate": "Due Date",
-    "daysPastDue": "Days Past Due",
-    "totalPastDue": "Total Past Due",
-    "totalAmountDue": "Total Amount Due",
-    "over30": "Over 30 Days",
-    "over60": "Over 60 Days",
-    "over90": "Over 90 Days",
-    "taxCollected": "Tax Collected",
-    "taxableAmount": "Taxable Amount",
-    "taxRate": "Tax Rate",
-    "invoiceCount": "Invoice Count",
-    "invoices": "Invoices",
-    "totalServices": "Total Services",
-    "totalCustomers": "Total Customers",
-    "activeCustomers": "Active Customers",
-    "technician": "Technician",
-    "jobs": "Jobs",
-    "totalRevenue": "Total Revenue",
-    "avgRevenue": "Avg Revenue",
-    "totalHours": "Total Hours",
-    "avgHours": "Avg Hours",
-    "totalJobs": "Total Jobs",
-    "partName": "Part Name",
-    "partNumber": "Part #",
-    "usageCount": "Usage Count",
-    "totalQty": "Total Qty",
-    "totalPartsRevenue": "Parts Revenue",
+    "company": "Unternehmen",
+    "totalSpent": "Gesamtausgaben",
+    "customer": "Kunde",
+    "invoiceNumber": "Rechnungsnr.",
+    "totalAmount": "Gesamtbetrag",
+    "amountDue": "Fälliger Betrag",
+    "dueDate": "Fälligkeitsdatum",
+    "daysPastDue": "Tage überfällig",
+    "totalPastDue": "Gesamt überfällig",
+    "totalAmountDue": "Gesamtbetrag fällig",
+    "over30": "Über 30 Tage",
+    "over60": "Über 60 Tage",
+    "over90": "Über 90 Tage",
+    "taxCollected": "Eingenommene Steuer",
+    "taxableAmount": "Steuerpflichtiger Betrag",
+    "taxRate": "Steuersatz",
+    "invoiceCount": "Anzahl Rechnungen",
+    "invoices": "Rechnungen",
+    "totalServices": "Dienstleistungen gesamt",
+    "totalCustomers": "Kunden gesamt",
+    "activeCustomers": "Aktive Kunden",
+    "technician": "Techniker",
+    "jobs": "Aufträge",
+    "totalRevenue": "Gesamtumsatz",
+    "avgRevenue": "Ø Umsatz",
+    "totalHours": "Stunden gesamt",
+    "avgHours": "Ø Stunden",
+    "totalJobs": "Aufträge gesamt",
+    "partName": "Teilename",
+    "partNumber": "Teilenr.",
+    "usageCount": "Verwendungen",
+    "totalQty": "Gesamtmenge",
+    "totalPartsRevenue": "Teileumsatz",
     "totalPartsCost": "Teilekosten",
     "totalPartsNetProfit": "Nettogewinn",
-    "totalPartsUsed": "Parts Used",
-    "serviceType": "Service Type",
-    "avgValue": "Avg Value",
-    "avgJobValue": "Avg Job Value",
-    "returningCustomers": "Returning",
+    "totalPartsUsed": "Verwendete Teile",
+    "serviceType": "Dienstleistungstyp",
+    "avgValue": "Ø Wert",
+    "avgJobValue": "Ø Auftragswert",
+    "returningCustomers": "Wiederkehrend",
     "newCustomers": "New",
-    "totalActive": "Total Active",
-    "avgTimeBetweenVisits": "Avg Days Between Visits",
-    "avgDaysBetweenVisits": "Avg Days",
-    "visits": "Visits",
-    "days": "days",
-    "totalParts": "Total Parts",
-    "totalItems": "Total Items",
-    "totalValue": "Total Value",
-    "totalSellValue": "Sell Value",
+    "totalActive": "Aktiv gesamt",
+    "avgTimeBetweenVisits": "Ø Tage zwischen Besuchen",
+    "avgDaysBetweenVisits": "Ø Tage",
+    "visits": "Besuche",
+    "days": "Tage",
+    "totalParts": "Teile gesamt",
+    "totalItems": "Artikel gesamt",
+    "totalValue": "Gesamtwert",
+    "totalSellValue": "Verkaufswert",
     "quantity": "Qty",
     "minQuantity": "Min Qty",
-    "unitCost": "Unit Cost",
+    "unitCost": "Stückkosten",
     "vehiclesSection": "Fahrzeugbericht",
     "vehicleLabel": "Fahrzeug",
     "totalCost": "Gesamtkosten",
@@ -427,7 +427,7 @@
   },
   "empty": "Noch keine Daten geladen. Klicken Sie auf Aktualisieren, um den Bericht zu laden.",
   "pagination": {
-    "previousPage": "Previous page",
-    "nextPage": "Next page"
+    "previousPage": "Vorherige Seite",
+    "nextPage": "Nächste Seite"
   }
 }

+ 17 - 17
messages/de/settings.json

@@ -65,7 +65,7 @@
       },
       "telegram": {
         "title": "Telegram",
-        "description": "Telegram bot & messaging"
+        "description": "Telegram-Bot & Nachrichten"
       },
       "customerPortal": {
         "title": "Kundenportal",
@@ -192,7 +192,7 @@
     "serviceTypeDescription": "Wählen Sie die Art der Dienstleistung, die Ihre Werkstatt anbietet. Dies ändert die Feldbezeichnungen in der gesamten Anwendung.",
     "automotive": "Automobil",
     "automotiveDescription": "Autos, LKWs und andere Straßenfahrzeuge",
-    "marineService": "Marine",
+    "marineService": "Maritim",
     "marineServiceDescription": "Boote, Yachten und Wasserfahrzeuge"
   },
   "account": {
@@ -418,9 +418,9 @@
     "failedRemoveMember": "Mitglied konnte nicht entfernt werden",
     "memberRoleUpdated": "Mitgliedsrolle aktualisiert",
     "failedUpdateRole": "Rolle konnte nicht aktualisiert werden",
-    "removeMember": "Remove member",
-    "cancelInvite": "Cancel invitation",
-    "editRole": "Edit role",
+    "removeMember": "Mitglied entfernen",
+    "cancelInvite": "Einladung zurückziehen",
+    "editRole": "Rolle bearbeiten",
     "technician": "Techniker",
     "technicianHint": "Kann Aufträge zugewiesen bekommen und die Techniker-App nutzen",
     "technicianFailed": "Konnte nicht geändert werden",
@@ -830,7 +830,7 @@
       "red": "Rot",
       "purple": "Lila",
       "slate": "Schiefer",
-      "rose": "Rose",
+      "rose": "Rosé",
       "indigo": "Indigo"
     },
     "layoutTitle": "Rechnungslayout",
@@ -1061,8 +1061,8 @@
     "fieldDeleted": "Benutzerdefiniertes Feld gelöscht",
     "failedSave": "Feld konnte nicht gespeichert werden",
     "failedDelete": "Konnte nicht gelöscht werden",
-    "edit": "Edit",
-    "delete": "Delete",
+    "edit": "Bearbeiten",
+    "delete": "Löschen",
     "unassigned": "Nicht zugewiesen",
     "defaultValue": "Standardwert",
     "defaultValueHint": "Wird bei neuen Einträgen vorausgefüllt und gedruckt, solange kein Wert eingegeben wurde.",
@@ -1316,7 +1316,7 @@
     "title": "Uber Torqvoice",
     "description": "Torqvoice ist Ihre komplette Lösung für die Fahrzeug-Serviceverwaltung. Verfolgen Sie Servicehistorie, Reparaturen und mehr.",
     "version": "Version",
-    "website": "Website",
+    "website": "Webseite",
     "documentation": "Dokumentation",
     "changelog": "Anderungsprotokoll"
   },
@@ -1370,7 +1370,7 @@
         "sand": "Sand"
       }
     },
-    "copyUrl": "Copy portal URL"
+    "copyUrl": "Portal-URL kopieren"
   },
   "email": {
     "title": "E-Mail-Anbieter",
@@ -1446,7 +1446,7 @@
     "failedSave": "Einstellungen konnten nicht gespeichert werden",
     "testSentTo": "Test-SMS gesendet an {phone}",
     "testFailed": "SMS-Test fehlgeschlagen",
-    "copyWebhookUrl": "Copy webhook URL"
+    "copyWebhookUrl": "Webhook-URL kopieren"
   },
   "subscription": {
     "title": "Abonnementplan",
@@ -1497,7 +1497,7 @@
     "resumeSuccess": "Abonnement erfolgreich fortgesetzt",
     "resumeError": "Abonnement konnte nicht fortgesetzt werden",
     "billingPortalError": "Abrechnungsportal konnte nicht geöffnet werden",
-    "checkoutError": "Failed to start checkout",
+    "checkoutError": "Checkout konnte nicht gestartet werden",
     "upgradeTitle": "Plan upgraden",
     "upgradeDescription": "Schalten Sie weitere Funktionen frei, indem Sie Ihren Plan upgraden.",
     "upgradeToProDescription": "Upgraden Sie, um unbegrenzte Kunden, Teammitglieder, Berichte, SMTP, API-Zugang und mehr freizuschalten.",
@@ -1557,7 +1557,7 @@
     "biweekly": "Alle 2 Wochen",
     "monthly": "Monatlich",
     "bimonthly": "Alle 2 Monate",
-    "quarterly": "Alle 4 Monate",
+    "quarterly": "Alle 3 Monate",
     "semiannually": "Alle 6 Monate",
     "yearly": "Jährlich",
     "dateRangeLabel": "Zeitraum",
@@ -1596,10 +1596,10 @@
     "deleted": "Berichtszeitplan gelöscht",
     "toggledOn": "Berichtszeitplan aktiviert",
     "toggledOff": "Berichtszeitplan deaktiviert",
-    "failedSave": "Failed to save",
-    "failedSend": "Failed to send",
-    "failedToggle": "Failed to toggle",
-    "failedDelete": "Failed to delete",
+    "failedSave": "Speichern fehlgeschlagen",
+    "failedSend": "Senden fehlgeschlagen",
+    "failedToggle": "Umschalten fehlgeschlagen",
+    "failedDelete": "Löschen fehlgeschlagen",
     "noMembers": "Keine Teammitglieder gefunden",
     "addRecipient": "Empfänger hinzufügen...",
     "searchMembers": "Mitglieder suchen...",

+ 5 - 5
messages/de/share.json

@@ -34,8 +34,8 @@
     "total": "Gesamt",
     "labor": "Arbeitsleistung",
     "hours": "Stunden",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "Std.",
+    "unit": "Einh.",
     "qtyOrHours": "Einheit / Stunden",
     "rate": "Stundensatz",
     "ratePerHour": "{rate}/Std.",
@@ -93,8 +93,8 @@
     "labor": "Arbeitsleistung",
     "laborDescription": "Beschreibung",
     "hours": "Stunden",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "Std.",
+    "unit": "Einh.",
     "qtyOrHours": "Einheit / Stunden",
     "rate": "Stundensatz",
     "ratePerHour": "{rate}/Std.",
@@ -200,7 +200,7 @@
     "privacyNotice": "Dieser Bericht wird Ihnen von der Werkstatt bereitgestellt, die die Prüfung durchgeführt hat. Er ist für jeden mit diesem Link abrufbar — bitte leiten Sie ihn nicht weiter. Wenden Sie sich an die Werkstatt, um den Link zurückzuziehen oder Ihre Daten löschen zu lassen."
   },
   "terms": {
-    "title": "Verkaufsbedingungen (Salgsvilkår)",
+    "title": "Verkaufsbedingungen",
     "contact": "Kontakt",
     "tel": "Tel: {phone}"
   },

+ 1 - 1
messages/de/statusReport.json

@@ -14,7 +14,7 @@
     "createAndSend": "Erstellen & Senden",
     "cancel": "Abbrechen",
     "uploadFailed": "Video konnte nicht hochgeladen werden",
-    "createReportFailed": "Failed to create status report",
+    "createReportFailed": "Statusbericht konnte nicht erstellt werden",
     "created": "Statusbericht erstellt",
     "noVideo": "Bitte laden Sie zuerst ein Video hoch",
     "removeVideo": "Video entfernen",

+ 3 - 3
messages/de/telegram.json

@@ -5,8 +5,8 @@
     "label": "Bot-Token",
     "placeholder": "Bot-Token von @BotFather eingeben",
     "help": "Erstellen Sie einen Bot über @BotFather auf Telegram, um Ihr Token zu erhalten.",
-    "show": "Show token",
-    "hide": "Hide token"
+    "show": "Token anzeigen",
+    "hide": "Token ausblenden"
   },
   "botUsername": {
     "label": "Bot-Benutzername",
@@ -20,7 +20,7 @@
     "title": "Kunden-Verbindungslink",
     "description": "Teilen Sie diesen Link mit Kunden, damit sie sich mit Ihrem Bot verbinden können. Ersetzen Sie den Kunden-ID-Platzhalter durch die tatsächliche Kunden-ID.",
     "copied": "Link kopiert!",
-    "copy": "Copy deep link"
+    "copy": "Deep Link kopieren"
   },
   "test": {
     "title": "Testnachricht",

+ 1 - 1
messages/de/telegramMessages.json

@@ -31,7 +31,7 @@
     "messageDeleted": "Nachricht gelöscht",
     "deleteError": "Nachricht konnte nicht gelöscht werden",
     "sendError": "Nachricht konnte nicht gesendet werden",
-    "sendMessage": "Send message"
+    "sendMessage": "Nachricht senden"
   },
   "sendDialog": {
     "send": "{label} senden",

+ 24 - 24
messages/de/vehicles.json

@@ -28,10 +28,10 @@
     "unarchiveError": "Fehler beim Wiederherstellen des Fahrzeugs",
     "deleteError": "Fehler beim Löschen des Fahrzeugs",
     "error": "Fehler beim Laden der Fahrzeuge",
-    "viewTable": "Table view",
-    "viewGrid": "Grid view",
-    "viewLargeGrid": "Large grid view",
-    "openMenu": "Open menu",
+    "viewTable": "Tabellenansicht",
+    "viewGrid": "Rasteransicht",
+    "viewLargeGrid": "Große Rasteransicht",
+    "openMenu": "Menü öffnen",
     "inspectionOverdue": "HU überfällig",
     "inspectionDue30": "Fällig in 30 Tagen",
     "inspectionDue90": "Fällig in 90 Tagen",
@@ -95,8 +95,8 @@
     "severityModerate": "Mäßig — von einigen Besitzern gemeldet",
     "severityUncommon": "Ungewöhnlich — von wenigen Besitzern gemeldet",
     "severityRare": "Selten — vereinzelte Berichte, aber kritisch wenn es auftritt",
-    "openMenu": "Open menu",
-    "dismissMaintenance": "Dismiss",
+    "openMenu": "Menü öffnen",
+    "dismissMaintenance": "Ausblenden",
     "inspectionDue": "HU fällig {date}",
     "inspectionCheckedAt": "Mit dem Register abgeglichen am {date}",
     "notRegistered": "Nicht zugelassen",
@@ -184,10 +184,10 @@
     "showing": "Zeige {start}-{end} von {total}",
     "perPage": "pro Seite",
     "page": "Seite {page} von {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Erste Seite",
+    "previousPage": "Vorherige Seite",
+    "nextPage": "Nächste Seite",
+    "lastPage": "Letzte Seite"
   },
   "notes": {
     "addNote": "Notiz hinzufügen",
@@ -213,11 +213,11 @@
     "noteCreated": "Notiz erstellt",
     "titleRequired": "Titel und Inhalt sind erforderlich",
     "saveError": "Notiz konnte nicht gespeichert werden",
-    "openMenu": "Open menu",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "openMenu": "Menü öffnen",
+    "firstPage": "Erste Seite",
+    "previousPage": "Vorherige Seite",
+    "nextPage": "Nächste Seite",
+    "lastPage": "Letzte Seite"
   },
   "findings": {
     "sectionTitle": "Beobachtungen",
@@ -266,11 +266,11 @@
     "showing": "Zeige {start}-{end} von {total}",
     "perPage": "pro Seite",
     "page": "Seite {page} von {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page",
-    "openMenu": "Open menu",
+    "firstPage": "Erste Seite",
+    "previousPage": "Vorherige Seite",
+    "nextPage": "Nächste Seite",
+    "lastPage": "Letzte Seite",
+    "openMenu": "Menü öffnen",
     "concernLabel": "Beantwortet welches Anliegen?",
     "concernNone": "Nichts, wonach der Kunde gefragt hat"
   },
@@ -373,10 +373,10 @@
     "archiveError": "Fehler beim Archivieren des Fahrzeugs"
   },
   "serviceRecords": {
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Erste Seite",
+    "previousPage": "Vorherige Seite",
+    "nextPage": "Nächste Seite",
+    "lastPage": "Letzte Seite"
   },
   "inspectionReminders": {
     "title": "HU-Erinnerungen",

+ 7 - 7
messages/de/workBoard.json

@@ -8,10 +8,10 @@
     "week": "Woche",
     "presenter": "Präsentator",
     "addTechnician": "Techniker hinzufügen",
-    "previousWeek": "Previous week",
-    "nextWeek": "Next week",
-    "previousDay": "Previous day",
-    "nextDay": "Next day",
+    "previousWeek": "Vorherige Woche",
+    "nextWeek": "Nächste Woche",
+    "previousDay": "Vorheriger Tag",
+    "nextDay": "Nächster Tag",
     "groupBy": "Spalten",
     "byTechnician": "Eine Spalte je Mechaniker",
     "byBay": "Eine Spalte je Arbeitsplatz",
@@ -20,7 +20,7 @@
     "add": "Hinzufügen",
     "addBay": "Arbeitsplatz hinzufügen",
     "weekNumber": "KW {number}",
-    "lanes": "Spalten",
+    "lanes": "Bahnen",
     "showAllLanes": "Alle anzeigen",
     "onlyBusyLanes": "Nur mit Aufträgen",
     "layout": "Ansicht",
@@ -107,8 +107,8 @@
       "waitingParts": "Warten auf Teile",
       "completed": "Abgeschlossen"
     },
-    "previous": "Previous",
-    "next": "Next",
+    "previous": "Zurück",
+    "next": "Weiter",
     "groupingUnused": "Die Statustafel gruppiert nach Status",
     "connecting": "Verbinden …"
   },

+ 1 - 1
messages/de/workOrders.json

@@ -34,7 +34,7 @@
       "total": "Gesamt"
     },
     "emailSubject": "Fahrzeugstatusupdate: {status}",
-    "changeStatus": "Change status",
+    "changeStatus": "Status ändern",
     "contextMenu": {
       "open": "Arbeitsauftrag öffnen",
       "openVehicle": "Fahrzeug öffnen",

+ 1 - 1
messages/en/settings.json

@@ -1557,7 +1557,7 @@
     "biweekly": "Every 2 Weeks",
     "monthly": "Monthly",
     "bimonthly": "Every 2 Months",
-    "quarterly": "Every 4 Months",
+    "quarterly": "Every 3 Months",
     "semiannually": "Every 6 Months",
     "yearly": "Yearly",
     "dateRangeLabel": "Date Range",

+ 1 - 1
messages/en/share.json

@@ -200,7 +200,7 @@
     "privacyNotice": "This report is shared with you by the workshop that carried out the inspection. It is available to anyone holding this link, so please do not forward it. Contact the workshop to have the link withdrawn or your data erased."
   },
   "terms": {
-    "title": "Terms of Sale (Salgsvilkår)",
+    "title": "Terms of Sale",
     "contact": "Contact",
     "tel": "Tel: {phone}"
   },

+ 2 - 2
messages/es/admin.json

@@ -31,7 +31,7 @@
     "name": "Nombre",
     "email": "Correo electrónico",
     "role": "Rol",
-    "orgs": "Orgs",
+    "orgs": "Organizaciones",
     "created": "Creado",
     "lastSeen": "Visto por última vez",
     "noResults": "Ningún usuario coincide con su búsqueda.",
@@ -117,7 +117,7 @@
     "sendgridApiKeyHint": "Obtenga su clave API de app.sendgrid.com"
   },
   "common": {
-    "openMenu": "Open menu"
+    "openMenu": "Abrir menú"
   },
   "userDetails": {
     "back": "Volver a usuarios",

+ 5 - 5
messages/es/calendar.json

@@ -80,10 +80,10 @@
   },
   "selectVehicle": "Seleccionar vehículo para orden de trabajo",
   "dateChoice": {
-    "title": "Work Order Date",
-    "description": "You have {selectedDate} selected. Which date should this work order be for?",
+    "title": "Fecha de la orden de trabajo",
+    "description": "Tiene seleccionada la fecha {selectedDate}. ¿Para qué fecha debe ser esta orden de trabajo?",
     "useSelected": "Use {date}",
-    "useToday": "Use today"
+    "useToday": "Usar hoy"
   },
   "more": "+ {count} más",
   "monthTotal": "{count} eventos",
@@ -144,6 +144,6 @@
       "readOnly": "Tiempo ocupado de un calendario conectado. Cámbialo allí y se actualizará aquí en la próxima sincronización."
     }
   },
-  "previousMonth": "Previous month",
-  "nextMonth": "Next month"
+  "previousMonth": "Mes anterior",
+  "nextMonth": "Mes siguiente"
 }

+ 2 - 2
messages/es/customers.json

@@ -27,7 +27,7 @@
     "batchDeleteTitle": "Eliminar Clientes",
     "batchDeleteDescription": "¿Eliminar {count} cliente(s)? Esto desvinculará sus vehículos.",
     "batchDeleteSuccess": "{count} cliente(s) eliminado(s)",
-    "openMenu": "Open menu"
+    "openMenu": "Abrir menú"
   },
   "detail": {
     "backToCustomers": "Volver a clientes",
@@ -95,7 +95,7 @@
     "customerCreated": "Cliente creado",
     "saveError": "Error al guardar el cliente",
     "customerNumber": "N.º de cliente",
-    "customerNumberAuto": "Auto",
+    "customerNumberAuto": "Automático",
     "sectionContact": "Contacto",
     "sectionBilling": "Facturación",
     "addScannedVehicle": "Añadir el vehículo {vehicle}",

+ 6 - 6
messages/es/dashboard.json

@@ -74,8 +74,8 @@
     "noDismissed": "No hay vehículos descartados.",
     "dismissedOn": "Descartado el {date}",
     "restore": "Restaurar",
-    "settingsAriaLabel": "Maintenance settings",
-    "dismissAriaLabel": "Dismiss"
+    "settingsAriaLabel": "Ajustes de mantenimiento",
+    "dismissAriaLabel": "Descartar"
   },
   "reminders": {
     "title": "Recordatorios pendientes",
@@ -112,7 +112,7 @@
     "createQuote": "Crear presupuesto",
     "itemsRequested": "{count, plural, one {# elemento solicitado} other {# elementos solicitados}}",
     "noData": "No hay solicitudes de presupuesto pendientes.",
-    "dismissAriaLabel": "Dismiss quote request"
+    "dismissAriaLabel": "Descartar solicitud de presupuesto"
   },
   "quoteResponses": {
     "title": "Respuestas de presupuesto de clientes",
@@ -120,11 +120,11 @@
     "accepted": "Aceptado",
     "changesRequested": "Cambios solicitados",
     "convertToWorkOrder": "Convertir en orden de trabajo",
-    "convert": "Convert",
+    "convert": "Convertir",
     "viewQuote": "Ver presupuesto",
-    "view": "View",
+    "view": "Ver",
     "noData": "No hay respuestas de clientes.",
-    "dismissAriaLabel": "Dismiss response"
+    "dismissAriaLabel": "Descartar respuesta"
   },
   "recentCompleted": {
     "title": "Completados recientemente",

+ 17 - 17
messages/es/documentLock.json

@@ -1,27 +1,27 @@
 {
   "lockedTitle": {
     "invoice": {
-      "sent": "This invoice is locked because it has been sent",
-      "paid": "This invoice is locked because it has been paid"
+      "sent": "Esta factura está bloqueada porque ya se ha enviado",
+      "paid": "Esta factura está bloqueada porque ya se ha pagado"
     },
     "quote": {
-      "sent": "This quote is locked because it has been sent",
-      "accepted": "This quote is locked because it has been accepted"
+      "sent": "Este presupuesto está bloqueado porque ya se ha enviado",
+      "accepted": "Este presupuesto está bloqueado porque ya se ha aceptado"
     }
   },
-  "lockedBody": "Its parts, labour, prices, discount, tax, number and date can no longer be changed. Payments, status changes, sending and attachments all still work.",
-  "lockedAdminHint": "As an owner or admin you can unlock it if something genuinely needs correcting. The unlock is recorded in the audit log.",
-  "lockedMemberHint": "Ask an owner or admin to unlock it if something needs correcting.",
-  "unlock": "Unlock for editing",
-  "relock": "Lock again",
-  "unlockConfirmTitle": "Unlock this document?",
+  "lockedBody": "Ya no se pueden cambiar sus piezas, mano de obra, precios, descuento, impuestos, número ni fecha. Los pagos, los cambios de estado, el envío y los adjuntos siguen funcionando.",
+  "lockedAdminHint": "Como propietario o administrador puede desbloquearlo si de verdad hay algo que corregir. El desbloqueo queda en el registro de auditoría.",
+  "lockedMemberHint": "Pida a un propietario o administrador que lo desbloquee si hay algo que corregir.",
+  "unlock": "Desbloquear para editar",
+  "relock": "Volver a bloquear",
+  "unlockConfirmTitle": "¿Desbloquear este documento?",
   "unlockConfirmDescription": {
-    "invoice": "It will become editable again, and the change will be recorded in the audit log with your name. Prefer a credit note where your local rules require one.",
-    "quote": "It will become editable again, and the change will be recorded in the audit log with your name."
+    "invoice": "Se podrá volver a editar, y el cambio quedará en el registro de auditoría con su nombre. Emita mejor una factura rectificativa si la normativa local lo exige.",
+    "quote": "Se podrá volver a editar, y el cambio quedará en el registro de auditoría con su nombre."
   },
-  "unlocked": "Unlocked for editing",
-  "relocked": "Locked again",
-  "reopenedTitle": "This document has been unlocked for editing",
-  "reopenedBody": "It stays editable until it is locked again.",
-  "failed": "Could not change the lock"
+  "unlocked": "Desbloqueado para editar",
+  "relocked": "Bloqueado de nuevo",
+  "reopenedTitle": "Este documento se ha desbloqueado para editarlo",
+  "reopenedBody": "Se puede editar hasta que se vuelva a bloquear.",
+  "failed": "No se pudo cambiar el bloqueo"
 }

+ 95 - 95
messages/es/integrations.json

@@ -40,19 +40,19 @@
       "conference": "Enlaces de videollamada"
     },
     "sms": {
-      "send": "Text messages out",
-      "receive": "Replies back in"
+      "send": "Envío de SMS",
+      "receive": "Recepción de respuestas"
     },
     "whatsapp": {
-      "send": "WhatsApp messages out",
-      "receive": "Replies back in"
+      "send": "Envío de mensajes de WhatsApp",
+      "receive": "Recepción de respuestas"
     },
     "telegram": {
-      "send": "Telegram messages out",
-      "receive": "Replies back in"
+      "send": "Envío de mensajes de Telegram",
+      "receive": "Recepción de respuestas"
     },
     "email": {
-      "send": "Email out"
+      "send": "Envío de correos"
     },
     "vehicle": {
       "lookup": "Consulta por matrícula y VIN",
@@ -131,19 +131,19 @@
     "lockedAi": "Conecte un proveedor de IA para usar funciones de IA en su taller.",
     "ownAppTitle": "Esta instalación usa su propia aplicación con el proveedor",
     "redirectUri": "URI de redirección que debe registrar con el proveedor:",
-    "sendTestEmail": "Send test email",
-    "testEmailSent": "Test email sent to {email}",
-    "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.",
-    "inboundUrl": "Inbound webhook URL",
-    "inboundHintSecret": "Paste this URL into the vendor's inbound message settings. It carries a secret that identifies your workshop, so keep it private.",
-    "inboundHintMeta": "Paste this URL as the callback URL in your Meta app, with the verify token you entered above, and subscribe to messages.",
+    "sendTestEmail": "Enviar correo de prueba",
+    "testEmailSent": "Correo de prueba enviado a {email}",
+    "testEmailHint": "Se envía un correo de prueba a tu propia dirección a través de este proveedor, lo que confirma la dirección de remitente y las reglas de envío que una comprobación de claves no puede verificar.",
+    "inboundUrl": "URL del webhook de entrada",
+    "inboundHintSecret": "Pega esta URL en los ajustes de mensajes entrantes del proveedor. Contiene un secreto que identifica a tu taller, así que mantenla en privado.",
+    "inboundHintMeta": "Pega esta URL como URL de callback en tu app de Meta, con el token de verificación que introdujiste arriba, y suscríbete a los mensajes.",
     "inboundHintStripe": "Añade esta URL en el panel de Stripe en Developers, Webhooks, suscrita a checkout.session.completed. Luego pega el secreto de firma que muestra Stripe en el campo de secreto del webhook aquí, para que las notificaciones puedan verificarse.",
     "inboundHintVipps": "Introduce esta URL como URL de callback en el portal de Vipps MobilePay. Vipps también exige condiciones de venta publicadas, que se configuran en Ajustes, Pago.",
     "inboundHintPaypal": "Añade esta URL en el panel de desarrollador de PayPal en Webhooks, suscrita a PAYMENT.CAPTURE.COMPLETED.",
-    "copy": "Copy",
-    "copied": "Copied",
-    "updateKeys": "Update keys",
-    "updateKeysHint": "The last check failed. Enter the keys again to try once more.",
+    "copy": "Copiar",
+    "copied": "Copiado",
+    "updateKeys": "Actualizar claves",
+    "updateKeysHint": "La última comprobación falló. Vuelve a introducir las claves para intentarlo de nuevo.",
     "inspectionSync": {
       "title": "Sincronización de inspecciones",
       "vehicles": "{count} vehículos con matrícula en este taller",
@@ -256,155 +256,155 @@
       }
     },
     "twilio-sms": {
-      "description": "Send and receive text messages through a Twilio number. Reminders, ready-for-pickup messages and the replies that come back.",
+      "description": "Envía y recibe SMS a través de un número de Twilio. Recordatorios, avisos de vehículo listo para recoger y las respuestas que llegan.",
       "fields": {
         "accountSid": "Account SID",
-        "authToken": "Auth token"
+        "authToken": "Token de autenticación"
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Enviar desde este número"
       }
     },
     "vonage-sms": {
-      "description": "Send and receive text messages through a Vonage number.",
+      "description": "Envía y recibe SMS a través de un número de Vonage.",
       "fields": {
-        "apiKey": "API key",
-        "apiSecret": "API secret",
-        "signatureSecret": "Signature secret",
-        "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."
+        "apiKey": "Clave de API",
+        "apiSecret": "Secreto de API",
+        "signatureSecret": "Secreto de firma",
+        "signatureSecretHelp": "Del panel de Vonage, en API settings. Si se indica, los mensajes entrantes solo se aceptan cuando Vonage los ha firmado. Sin él, solo se comprueba el secreto de la URL del webhook."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Enviar desde este número"
       }
     },
     "telnyx-sms": {
-      "description": "Send and receive text messages through a Telnyx number.",
+      "description": "Envía y recibe SMS a través de un número de Telnyx.",
       "fields": {
-        "apiKey": "API key",
-        "webhookPublicKey": "Webhook public key",
-        "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."
+        "apiKey": "Clave de API",
+        "webhookPublicKey": "Clave pública del webhook",
+        "webhookPublicKeyHelp": "Del portal de Telnyx, en Account settings, Keys and credentials, Public key. Si se indica, los mensajes entrantes solo se aceptan cuando Telnyx los ha firmado. Sin ella, solo se comprueba el secreto de la URL del webhook."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Enviar desde este número"
       }
     },
     "whatsapp-meta": {
-      "description": "Message customers on WhatsApp through Meta directly. Photos of what you found, and the conversation that follows.",
+      "description": "Escribe a tus clientes por WhatsApp directamente a través de Meta. Fotos de lo que has encontrado y la conversación que sigue.",
       "fields": {
-        "phoneNumberId": "Phone number ID",
-        "accessToken": "Access token",
-        "verifyToken": "Webhook verify token",
-        "appSecret": "App secret",
-        "apiVersion": "Graph API version",
-        "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."
+        "phoneNumberId": "ID del número de teléfono",
+        "accessToken": "Token de acceso",
+        "verifyToken": "Token de verificación del webhook",
+        "appSecret": "Secreto de la app",
+        "apiVersion": "Versión de Graph API",
+        "appSecretHelp": "Meta firma cada entrega con él. Hasta que se introduzca, se rechazan los mensajes enviados al webhook, ya que de lo contrario cualquiera que conozca la URL podría hacerse pasar por tus clientes."
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Enviar mensajes por este canal",
+        "phoneNumber": "Enviar desde este número",
+        "templateName": "Plantilla para reabrir una conversación",
+        "templateLanguage": "Idioma de la plantilla",
+        "templateVariables": "Valores de la plantilla, en orden",
+        "mediaTemplateName": "Plantilla para un mensaje con foto",
+        "mediaTemplateLanguage": "Idioma de la plantilla con foto",
+        "mediaTemplateVariables": "Valores de la plantilla con foto, en orden"
       }
     },
     "whatsapp-twilio": {
-      "description": "Message customers on WhatsApp through a Twilio number, if Twilio is who sold you one.",
+      "description": "Escribe a tus clientes por WhatsApp a través de un número de Twilio, si es Twilio quien te lo proporcionó.",
       "fields": {
         "accountSid": "Account SID",
-        "authToken": "Auth token",
-        "messagingServiceSid": "Messaging service SID"
+        "authToken": "Token de autenticación",
+        "messagingServiceSid": "SID del servicio de mensajería"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Enviar mensajes por este canal",
+        "phoneNumber": "Enviar desde este número",
+        "templateName": "Plantilla para reabrir una conversación",
+        "templateLanguage": "Idioma de la plantilla",
+        "templateVariables": "Valores de la plantilla, en orden",
+        "mediaTemplateName": "Plantilla para un mensaje con foto",
+        "mediaTemplateLanguage": "Idioma de la plantilla con foto",
+        "mediaTemplateVariables": "Valores de la plantilla con foto, en orden"
       }
     },
     "telegram": {
-      "description": "A Telegram bot that reaches customers who use it, and brings their replies into the inbox.",
+      "description": "Un bot de Telegram que llega a los clientes que lo usan y trae sus respuestas a la bandeja de entrada.",
       "fields": {
-        "botToken": "Bot token"
+        "botToken": "Token del bot"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "botUsername": "Bot username"
+        "enabled": "Enviar mensajes por este canal",
+        "botUsername": "Nombre de usuario del bot"
       }
     },
     "smtp": {
-      "description": "Send invoices and reminders through your own mail server, rather than the platform mail.",
+      "description": "Envía facturas y recordatorios a través de tu propio servidor de correo, en lugar del correo de la plataforma.",
       "fields": {
-        "host": "Server",
-        "port": "Port",
-        "user": "Username",
-        "pass": "Password"
+        "host": "Servidor",
+        "port": "Puerto",
+        "user": "Nombre de usuario",
+        "pass": "Contraseña"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "secure": "Connect over TLS from the start",
-        "requireTls": "Require the server to upgrade to TLS",
-        "rejectUnauthorized": "Reject a certificate that does not check out"
+        "fromEmail": "Enviar desde esta dirección",
+        "fromName": "Nombre que se muestra como remitente",
+        "secure": "Conectar por TLS desde el inicio",
+        "requireTls": "Exigir que el servidor pase a TLS",
+        "rejectUnauthorized": "Rechazar un certificado que no sea válido"
       }
     },
     "resend": {
-      "description": "Send invoices and reminders through Resend.",
+      "description": "Envía facturas y recordatorios a través de Resend.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "Clave de API"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Enviar desde esta dirección",
+        "fromName": "Nombre que se muestra como remitente"
       }
     },
     "postmark": {
-      "description": "Send invoices and reminders through Postmark.",
+      "description": "Envía facturas y recordatorios a través de Postmark.",
       "fields": {
-        "apiKey": "Server token"
+        "apiKey": "Token del servidor"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Enviar desde esta dirección",
+        "fromName": "Nombre que se muestra como remitente"
       }
     },
     "mailgun": {
-      "description": "Send invoices and reminders through Mailgun.",
+      "description": "Envía facturas y recordatorios a través de Mailgun.",
       "fields": {
-        "apiKey": "API key",
-        "domain": "Sending domain"
+        "apiKey": "Clave de API",
+        "domain": "Dominio de envío"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "region": "Region the domain is in"
+        "fromEmail": "Enviar desde esta dirección",
+        "fromName": "Nombre que se muestra como remitente",
+        "region": "Región del dominio"
       }
     },
     "sendgrid": {
-      "description": "Send invoices and reminders through SendGrid.",
+      "description": "Envía facturas y recordatorios a través de SendGrid.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "Clave de API"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Enviar desde esta dirección",
+        "fromName": "Nombre que se muestra como remitente"
       }
     },
     "amazon-ses": {
-      "description": "Send invoices and reminders through Amazon SES.",
+      "description": "Envía facturas y recordatorios a través de Amazon SES.",
       "fields": {
-        "accessKeyId": "Access key ID",
-        "secretAccessKey": "Secret access key",
-        "region": "Region"
+        "accessKeyId": "ID de clave de acceso",
+        "secretAccessKey": "Clave de acceso secreta",
+        "region": "Región"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Enviar desde esta dirección",
+        "fromName": "Nombre que se muestra como remitente"
       }
     },
     "vegvesen": {

+ 3 - 3
messages/es/inventory.json

@@ -76,7 +76,7 @@
     "editPart": "Editar pieza",
     "addNewPart": "Añadir nueva pieza",
     "supplierLink": "Enlace del proveedor",
-    "supplierLinkPlaceholder": "https://supplier.com/product/...",
+    "supplierLinkPlaceholder": "https://proveedor.com/producto/...",
     "fetch": "Obtener",
     "fetchFailed": "Error al obtener",
     "fetchError": "No se pudieron obtener los metadatos de la URL",
@@ -124,14 +124,14 @@
     "supplierPhone": "Teléfono del proveedor",
     "supplierPhonePlaceholder": "(555) 123-4567",
     "supplierEmail": "Correo del proveedor",
-    "supplierEmailPlaceholder": "orders@autoparts.com",
+    "supplierEmailPlaceholder": "pedidos@recambios.com",
     "description": "Descripción",
     "descriptionPlaceholder": "Descripción de la pieza...",
     "cancel": "Cancelar",
     "saveChanges": "Guardar cambios",
     "addPart": "Añadir pieza"
   },
-  "openMenu": "Open menu",
+  "openMenu": "Abrir menú",
   "history": {
     "title": "Historial de stock",
     "description": "Todos los cambios registrados en {name}, más recientes primero.",

+ 4 - 4
messages/es/laborPresets.json

@@ -6,7 +6,7 @@
     "description": "Descripción",
     "itemCount": "Elementos",
     "type": "Tipo",
-    "hrs": "hrs",
+    "hrs": "h",
     "units": "unidad(es)"
   },
   "empty": {
@@ -16,7 +16,7 @@
   "actions": {
     "edit": "Editar",
     "delete": "Eliminar",
-    "openMenu": "Open menu"
+    "openMenu": "Abrir menú"
   },
   "deletePreset": {
     "title": "Eliminar plantilla de mano de obra",
@@ -44,7 +44,7 @@
     "create": "Crear",
     "saveChanges": "Guardar cambios",
     "itemQty": "Qty",
-    "itemQtyOrHours": "Unit / Hours",
+    "itemQtyOrHours": "Unidad / Horas",
     "hourlyTag": "HR",
     "serviceTag": "SVC",
     "partsTitle": "Piezas",
@@ -63,7 +63,7 @@
     "noPackages": "No se encontraron plantillas de mano de obra.",
     "items": "{count} elementos",
     "totalHours": "{hours}h en total",
-    "totalUnits": "{units} unit(s)",
+    "totalUnits": "{units} unidad(es)",
     "totalParts": "{count} piezas"
   },
   "errors": {

+ 3 - 3
messages/es/messages.json

@@ -30,8 +30,8 @@
     "deleteDescription": "Se eliminarán permanentemente todos los mensajes con {name}. Esta acción no se puede deshacer.",
     "deleted": "Conversación eliminada",
     "deleteError": "No se pudo eliminar la conversación",
-    "back": "Back",
-    "conversationMenu": "Conversation menu",
+    "back": "Volver",
+    "conversationMenu": "Menú de la conversación",
     "searchPlaceholder": "Buscar conversaciones",
     "noSearchResults": "Ninguna conversación coincide con la búsqueda",
     "now": "ahora"
@@ -47,7 +47,7 @@
     "messageDeleted": "Mensaje eliminado",
     "deleteError": "No se pudo eliminar el mensaje",
     "sendError": "No se pudo enviar el SMS",
-    "sendMessage": "Send message"
+    "sendMessage": "Enviar mensaje"
   },
   "sendDialog": {
     "send": "Enviar {label}",

+ 1 - 1
messages/es/navigation.json

@@ -112,7 +112,7 @@
     "reports": "Informes",
     "timesheets": "Hojas de horas",
     "settings": "Configuración",
-    "superAdmin": "Super Admin",
+    "superAdmin": "Superadministrador",
     "adminPanel": "Panel de administración",
     "organizations": "Organizaciones",
     "noOrganization": "Sin organización",

+ 1 - 1
messages/es/notifications.json

@@ -7,5 +7,5 @@
     "delete": "Eliminar",
     "cancel": "Cancelar"
   },
-  "openNotifications": "Open notifications"
+  "openNotifications": "Abrir notificaciones"
 }

+ 6 - 6
messages/es/pdf.json

@@ -32,8 +32,8 @@
     "total": "Total",
     "labor": "Mano de obra",
     "hours": "Horas",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "h",
+    "unit": "ud.",
     "rate": "Tarifa",
     "ratePerHour": "{rate}/h",
     "subtotal": "Subtotal",
@@ -75,7 +75,7 @@
     "professionalWorkshop": "Gestión profesional de talleres",
     "tel": "Tel: {phone}",
     "org": "Org: {org}",
-    "qtyOrHours": "Unit / Hours",
+    "qtyOrHours": "Unidad / Horas",
     "customFieldsTitle": "Información adicional",
     "telegramConnect": "Chatea con nosotros en Telegram",
     "taxRegistrationLabel": "Núm. {name}"
@@ -96,8 +96,8 @@
     "total": "Total",
     "labor": "Mano de obra",
     "hours": "Horas",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "h",
+    "unit": "ud.",
     "rate": "Tarifa",
     "ratePerHour": "{rate}/h",
     "subtotal": "Subtotal",
@@ -115,7 +115,7 @@
     "validityFooter30": "Este presupuesto es válido por 30 días",
     "viewPortal": "Ver su portal: {url}",
     "tel": "Tel: {phone}",
-    "qtyOrHours": "Unit / Hours",
+    "qtyOrHours": "Unidad / Horas",
     "customFieldsTitle": "Información adicional",
     "quoteNumberLabel": "N.º de presupuesto",
     "validUntilLabel": "Válido hasta"

+ 1 - 1
messages/es/reminders.json

@@ -8,7 +8,7 @@
   "searchVehicle": "Buscar vehículos...",
   "noVehicle": "No se encontraron vehículos.",
   "pickDate": "Seleccionar fecha",
-  "openMenu": "Open menu",
+  "openMenu": "Abrir menú",
   "relatesTo": "Se refiere a (opcional)",
   "selectCustomer": "Cliente (opcional)",
   "noneOption": "Ninguno",

+ 85 - 85
messages/es/reports.json

@@ -329,94 +329,94 @@
     "jobsClocked": "Trabajos registrados"
   },
   "pdf": {
-    "reportTitle": "Business Report",
-    "revenueSection": "Revenue Report",
-    "taxSection": "Tax Report",
-    "pastDueSection": "Past Due Invoices",
-    "servicesSection": "Services Report",
-    "customersSection": "Customers Report",
-    "techniciansSection": "Technicians Report",
-    "partsSection": "Parts Usage Report",
-    "jobAnalyticsSection": "Job Analytics",
-    "retentionSection": "Customer Retention",
-    "inventorySection": "Inventory Report",
+    "reportTitle": "Informe del Negocio",
+    "revenueSection": "Informe de Ingresos",
+    "taxSection": "Informe de Impuestos",
+    "pastDueSection": "Facturas Vencidas",
+    "servicesSection": "Informe de Servicios",
+    "customersSection": "Informe de Clientes",
+    "techniciansSection": "Informe de Técnicos",
+    "partsSection": "Informe de Uso de Piezas",
+    "jobAnalyticsSection": "Análisis de Trabajos",
+    "retentionSection": "Retención de Clientes",
+    "inventorySection": "Informe de Inventario",
     "monthlyBreakdown": "Desglose Mensual",
-    "revenueByType": "Revenue by Type",
-    "taxByRate": "Tax by Rate",
-    "servicesByStatus": "By Status",
-    "servicesByType": "By Type",
-    "topCustomers": "Top Customers",
-    "topServiceTypes": "Top Service Types",
-    "topReturning": "Top Returning Customers",
-    "dayOfWeek": "Jobs by Day of Week",
-    "monthlyTrend": "Monthly Trend",
-    "lowStock": "Low Stock Items",
-    "revenue": "Revenue",
-    "collected": "Collected",
-    "outstanding": "Outstanding",
-    "services": "Services",
-    "partsCost": "Parts Cost",
+    "revenueByType": "Ingresos por Tipo",
+    "taxByRate": "Impuesto por Tasa",
+    "servicesByStatus": "Por Estado",
+    "servicesByType": "Por Tipo",
+    "topCustomers": "Principales Clientes",
+    "topServiceTypes": "Principales Tipos de Servicio",
+    "topReturning": "Principales Clientes Recurrentes",
+    "dayOfWeek": "Trabajos por Día de la Semana",
+    "monthlyTrend": "Tendencia Mensual",
+    "lowStock": "Artículos con Stock Bajo",
+    "revenue": "Ingresos",
+    "collected": "Cobrado",
+    "outstanding": "Pendiente",
+    "services": "Servicios",
+    "partsCost": "Coste de Piezas",
     "partsNetProfit": "Beneficio Neto Repuestos",
     "laborRevenue": "Mano de Obra",
-    "netProfit": "Net Profit",
-    "month": "Month",
-    "count": "Count",
-    "type": "Type",
-    "status": "Status",
-    "name": "Name",
-    "company": "Company",
-    "totalSpent": "Total Spent",
-    "customer": "Customer",
-    "invoiceNumber": "Invoice #",
-    "totalAmount": "Total Amount",
-    "amountDue": "Amount Due",
-    "dueDate": "Due Date",
-    "daysPastDue": "Days Past Due",
-    "totalPastDue": "Total Past Due",
-    "totalAmountDue": "Total Amount Due",
-    "over30": "Over 30 Days",
-    "over60": "Over 60 Days",
-    "over90": "Over 90 Days",
-    "taxCollected": "Tax Collected",
-    "taxableAmount": "Taxable Amount",
-    "taxRate": "Tax Rate",
-    "invoiceCount": "Invoice Count",
-    "invoices": "Invoices",
-    "totalServices": "Total Services",
-    "totalCustomers": "Total Customers",
-    "activeCustomers": "Active Customers",
-    "technician": "Technician",
-    "jobs": "Jobs",
-    "totalRevenue": "Total Revenue",
-    "avgRevenue": "Avg Revenue",
-    "totalHours": "Total Hours",
-    "avgHours": "Avg Hours",
-    "totalJobs": "Total Jobs",
-    "partName": "Part Name",
-    "partNumber": "Part #",
-    "usageCount": "Usage Count",
-    "totalQty": "Total Qty",
-    "totalPartsRevenue": "Parts Revenue",
+    "netProfit": "Beneficio Neto",
+    "month": "Mes",
+    "count": "Cantidad",
+    "type": "Tipo",
+    "status": "Estado",
+    "name": "Nombre",
+    "company": "Empresa",
+    "totalSpent": "Gasto Total",
+    "customer": "Cliente",
+    "invoiceNumber": "N.º Factura",
+    "totalAmount": "Monto Total",
+    "amountDue": "Monto Adeudado",
+    "dueDate": "Fecha de Vencimiento",
+    "daysPastDue": "Días Vencidos",
+    "totalPastDue": "Total Vencidas",
+    "totalAmountDue": "Monto Total Adeudado",
+    "over30": "Más de 30 Días",
+    "over60": "Más de 60 Días",
+    "over90": "Más de 90 Días",
+    "taxCollected": "Impuesto Recaudado",
+    "taxableAmount": "Monto Gravable",
+    "taxRate": "Tasa de Impuesto",
+    "invoiceCount": "Número de Facturas",
+    "invoices": "Facturas",
+    "totalServices": "Total de Servicios",
+    "totalCustomers": "Total de Clientes",
+    "activeCustomers": "Clientes Activos",
+    "technician": "Técnico",
+    "jobs": "Trabajos",
+    "totalRevenue": "Ingresos Totales",
+    "avgRevenue": "Ingreso Prom.",
+    "totalHours": "Horas Totales",
+    "avgHours": "Horas Prom.",
+    "totalJobs": "Total de Trabajos",
+    "partName": "Nombre de Pieza",
+    "partNumber": "N.º Pieza",
+    "usageCount": "Veces Utilizada",
+    "totalQty": "Cant. Total",
+    "totalPartsRevenue": "Ingresos por Piezas",
     "totalPartsCost": "Costo de Repuestos",
     "totalPartsNetProfit": "Beneficio Neto",
-    "totalPartsUsed": "Parts Used",
-    "serviceType": "Service Type",
-    "avgValue": "Avg Value",
-    "avgJobValue": "Avg Job Value",
-    "returningCustomers": "Returning",
-    "newCustomers": "New",
-    "totalActive": "Total Active",
-    "avgTimeBetweenVisits": "Avg Days Between Visits",
-    "avgDaysBetweenVisits": "Avg Days",
-    "visits": "Visits",
-    "days": "days",
-    "totalParts": "Total Parts",
-    "totalItems": "Total Items",
-    "totalValue": "Total Value",
-    "totalSellValue": "Sell Value",
-    "quantity": "Qty",
-    "minQuantity": "Min Qty",
-    "unitCost": "Unit Cost",
+    "totalPartsUsed": "Piezas Utilizadas",
+    "serviceType": "Tipo de Servicio",
+    "avgValue": "Valor Prom.",
+    "avgJobValue": "Valor Prom. de Trabajo",
+    "returningCustomers": "Recurrentes",
+    "newCustomers": "Nuevos",
+    "totalActive": "Total Activos",
+    "avgTimeBetweenVisits": "Prom. Días Entre Visitas",
+    "avgDaysBetweenVisits": "Prom. Días",
+    "visits": "Visitas",
+    "days": "días",
+    "totalParts": "Total de Piezas",
+    "totalItems": "Total de Artículos",
+    "totalValue": "Valor Total",
+    "totalSellValue": "Valor de Venta",
+    "quantity": "Cant.",
+    "minQuantity": "Cant. Mín.",
+    "unitCost": "Costo Unitario",
     "vehiclesSection": "Informe de Vehículo",
     "vehicleLabel": "Vehículo",
     "totalCost": "Costo Total",
@@ -427,7 +427,7 @@
   },
   "empty": "Aún no se han cargado datos. Haga clic en Actualizar para cargar el informe.",
   "pagination": {
-    "previousPage": "Previous page",
-    "nextPage": "Next page"
+    "previousPage": "Página anterior",
+    "nextPage": "Página siguiente"
   }
 }

+ 2 - 2
messages/es/service.json

@@ -28,7 +28,7 @@
     "tabs": {
       "details": "Detalles",
       "images": "Imágenes",
-      "video": "Video",
+      "video": "Vídeo",
       "documents": "Documentos",
       "statusReports": "Informes de estado"
     },
@@ -256,7 +256,7 @@
     "deleted": "Archivo eliminado",
     "failedDelete": "Error al eliminar",
     "images": "Imágenes ({count})",
-    "videos": "Videos ({count})",
+    "videos": "Vídeos ({count})",
     "diagnostics": "Reportes de Diagnóstico ({count})",
     "documents": "Documentos ({count})",
     "download": "Descargar",

+ 17 - 17
messages/es/settings.json

@@ -65,7 +65,7 @@
       },
       "telegram": {
         "title": "Telegram",
-        "description": "Telegram bot & messaging"
+        "description": "Bot de Telegram y mensajería"
       },
       "customerPortal": {
         "title": "Portal del cliente",
@@ -158,7 +158,7 @@
     "logoAlt": "Logo de la empresa",
     "upload": "Subir",
     "remove": "Eliminar",
-    "logoHint": "JPG, PNG, WebP, SVG — max 2MB",
+    "logoHint": "JPG, PNG, WebP, SVG, máx. 2 MB",
     "uploadingLogo": "Subiendo logo...",
     "logoUpdated": "Logo actualizado",
     "failedUploadLogo": "Error al subir el logo",
@@ -192,7 +192,7 @@
     "serviceTypeDescription": "Seleccione el tipo de servicio que ofrece su taller. Esto cambia las etiquetas de los campos en toda la aplicación.",
     "automotive": "Automotriz",
     "automotiveDescription": "Coches, camiones y otros vehículos de carretera",
-    "marineService": "Marine",
+    "marineService": "Náutico",
     "marineServiceDescription": "Barcos, yates y embarcaciones"
   },
   "account": {
@@ -418,9 +418,9 @@
     "failedRemoveMember": "Error al eliminar el miembro",
     "memberRoleUpdated": "Rol del miembro actualizado",
     "failedUpdateRole": "Error al actualizar el rol",
-    "removeMember": "Remove member",
-    "cancelInvite": "Cancel invitation",
-    "editRole": "Edit role",
+    "removeMember": "Eliminar miembro",
+    "cancelInvite": "Cancelar invitación",
+    "editRole": "Editar rol",
     "technician": "Técnico",
     "technicianHint": "Puede recibir trabajos asignados y usar la aplicación de técnico",
     "technicianFailed": "No se pudo cambiar",
@@ -1061,8 +1061,8 @@
     "fieldDeleted": "Campo personalizado eliminado",
     "failedSave": "No se pudo guardar el campo",
     "failedDelete": "No se pudo eliminar",
-    "edit": "Edit",
-    "delete": "Delete",
+    "edit": "Editar",
+    "delete": "Eliminar",
     "unassigned": "Sin asignar",
     "defaultValue": "Valor predeterminado",
     "defaultValueHint": "Se rellena automáticamente en registros nuevos y se imprime mientras no se haya introducido un valor.",
@@ -1315,7 +1315,7 @@
   "about": {
     "title": "Acerca de Torqvoice",
     "description": "Torqvoice es su solucion completa de gestión de servicios de vehículos. Rastree historial de servicio, reparaciones y mas.",
-    "version": "Version",
+    "version": "Versión",
     "website": "Sitio web",
     "documentation": "Documentacion",
     "changelog": "Registro de cambios"
@@ -1370,7 +1370,7 @@
         "sand": "Arena"
       }
     },
-    "copyUrl": "Copy portal URL"
+    "copyUrl": "Copiar URL del portal"
   },
   "email": {
     "title": "Proveedor de correo",
@@ -1446,7 +1446,7 @@
     "failedSave": "Error al guardar la configuración",
     "testSentTo": "SMS de prueba enviado a {phone}",
     "testFailed": "Prueba de SMS fallida",
-    "copyWebhookUrl": "Copy webhook URL"
+    "copyWebhookUrl": "Copiar URL del webhook"
   },
   "subscription": {
     "title": "Plan de suscripción",
@@ -1497,7 +1497,7 @@
     "resumeSuccess": "Suscripción reanudada con éxito",
     "resumeError": "Error al reanudar la suscripción",
     "billingPortalError": "Error al abrir el portal de facturación",
-    "checkoutError": "Failed to start checkout",
+    "checkoutError": "No se pudo iniciar el pago",
     "upgradeTitle": "Mejorar plan",
     "upgradeDescription": "Desbloquee más funciones mejorando su plan.",
     "upgradeToProDescription": "Mejore para desbloquear clientes ilimitados, miembros del equipo, informes, SMTP, acceso API y más.",
@@ -1557,7 +1557,7 @@
     "biweekly": "Cada 2 semanas",
     "monthly": "Mensual",
     "bimonthly": "Cada 2 meses",
-    "quarterly": "Cada 4 meses",
+    "quarterly": "Cada 3 meses",
     "semiannually": "Cada 6 meses",
     "yearly": "Anual",
     "dateRangeLabel": "Período",
@@ -1596,10 +1596,10 @@
     "deleted": "Programa de informes eliminado",
     "toggledOn": "Programa de informes activado",
     "toggledOff": "Programa de informes desactivado",
-    "failedSave": "Failed to save",
-    "failedSend": "Failed to send",
-    "failedToggle": "Failed to toggle",
-    "failedDelete": "Failed to delete",
+    "failedSave": "Error al guardar",
+    "failedSend": "Error al enviar",
+    "failedToggle": "Error al cambiar el estado",
+    "failedDelete": "Error al eliminar",
     "noMembers": "No se encontraron miembros del equipo",
     "addRecipient": "Agregar destinatario...",
     "searchMembers": "Buscar miembros...",

+ 5 - 5
messages/es/share.json

@@ -34,8 +34,8 @@
     "total": "Total",
     "labor": "Mano de obra",
     "hours": "Horas",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "h",
+    "unit": "ud.",
     "qtyOrHours": "Unidad / Horas",
     "rate": "Tarifa",
     "ratePerHour": "{rate}/h",
@@ -93,8 +93,8 @@
     "labor": "Mano de obra",
     "laborDescription": "Descripción",
     "hours": "Horas",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "h",
+    "unit": "ud.",
     "qtyOrHours": "Unidad / Horas",
     "rate": "Tarifa",
     "ratePerHour": "{rate}/h",
@@ -200,7 +200,7 @@
     "privacyNotice": "Este informe se lo facilita el taller que realizó la inspección. Cualquier persona con este enlace puede consultarlo, así que le rogamos que no lo reenvíe. Contacte con el taller para retirar el enlace o solicitar la supresión de sus datos."
   },
   "terms": {
-    "title": "Términos de venta (Salgsvilkår)",
+    "title": "Términos de venta",
     "contact": "Contacto",
     "tel": "Tel: {phone}"
   },

+ 2 - 2
messages/es/statusReport.json

@@ -14,7 +14,7 @@
     "createAndSend": "Crear y enviar",
     "cancel": "Cancelar",
     "uploadFailed": "Error al subir el vídeo",
-    "createReportFailed": "Failed to create status report",
+    "createReportFailed": "Error al crear el informe de estado",
     "created": "Informe de estado creado",
     "noVideo": "Por favor, suba un vídeo primero",
     "removeVideo": "Eliminar vídeo",
@@ -84,7 +84,7 @@
     "sentAt": "Enviado",
     "sentVia": "Enviado por",
     "messageLabel": "Mensaje",
-    "videoLabel": "Video"
+    "videoLabel": "Vídeo"
   },
   "notify": {
     "defaultMessage": "Hola {name}, tenemos una actualización de estado de su {vehicle}. Véala aquí: {url}",

+ 3 - 3
messages/es/telegram.json

@@ -5,8 +5,8 @@
     "label": "Token del bot",
     "placeholder": "Ingresa el token de @BotFather",
     "help": "Crea un bot a través de @BotFather en Telegram para obtener tu token.",
-    "show": "Show token",
-    "hide": "Hide token"
+    "show": "Mostrar token",
+    "hide": "Ocultar token"
   },
   "botUsername": {
     "label": "Nombre de usuario del bot",
@@ -20,7 +20,7 @@
     "title": "Enlace de conexión del cliente",
     "description": "Comparte este enlace con los clientes para que se conecten a tu bot. Reemplaza el marcador de ID del cliente con el ID real.",
     "copied": "¡Enlace copiado!",
-    "copy": "Copy deep link"
+    "copy": "Copiar enlace directo"
   },
   "test": {
     "title": "Mensaje de prueba",

+ 1 - 1
messages/es/telegramMessages.json

@@ -31,7 +31,7 @@
     "messageDeleted": "Mensaje eliminado",
     "deleteError": "No se pudo eliminar el mensaje",
     "sendError": "No se pudo enviar el mensaje",
-    "sendMessage": "Send message"
+    "sendMessage": "Enviar mensaje"
   },
   "sendDialog": {
     "send": "Enviar {label}",

+ 25 - 25
messages/es/vehicles.json

@@ -28,10 +28,10 @@
     "unarchiveError": "Error al desarchivar vehículo",
     "deleteError": "Error al eliminar vehículo",
     "error": "Error al cargar vehículos",
-    "viewTable": "Table view",
-    "viewGrid": "Grid view",
-    "viewLargeGrid": "Large grid view",
-    "openMenu": "Open menu",
+    "viewTable": "Vista de tabla",
+    "viewGrid": "Vista de cuadrícula",
+    "viewLargeGrid": "Vista de cuadrícula grande",
+    "openMenu": "Abrir menú",
     "inspectionOverdue": "ITV vencida",
     "inspectionDue30": "Vence en 30 días",
     "inspectionDue90": "Vence en 90 días",
@@ -95,8 +95,8 @@
     "severityModerate": "Moderado — reportado por algunos propietarios",
     "severityUncommon": "Poco común — reportado por pocos propietarios",
     "severityRare": "Raro — reportes aislados pero crítico cuando ocurre",
-    "openMenu": "Open menu",
-    "dismissMaintenance": "Dismiss",
+    "openMenu": "Abrir menú",
+    "dismissMaintenance": "Descartar",
     "inspectionDue": "ITV el {date}",
     "inspectionCheckedAt": "Comprobado en el registro el {date}",
     "notRegistered": "Sin matricular",
@@ -184,10 +184,10 @@
     "showing": "Mostrando {start}-{end} de {total}",
     "perPage": "por página",
     "page": "Página {page} de {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Primera página",
+    "previousPage": "Página anterior",
+    "nextPage": "Página siguiente",
+    "lastPage": "Última página"
   },
   "notes": {
     "addNote": "Agregar nota",
@@ -213,11 +213,11 @@
     "noteCreated": "Nota creada",
     "titleRequired": "El título y el contenido son obligatorios",
     "saveError": "Error al guardar la nota",
-    "openMenu": "Open menu",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "openMenu": "Abrir menú",
+    "firstPage": "Primera página",
+    "previousPage": "Página anterior",
+    "nextPage": "Página siguiente",
+    "lastPage": "Última página"
   },
   "findings": {
     "sectionTitle": "Observaciones",
@@ -266,11 +266,11 @@
     "showing": "Mostrando {start}-{end} de {total}",
     "perPage": "por página",
     "page": "Página {page} de {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page",
-    "openMenu": "Open menu",
+    "firstPage": "Primera página",
+    "previousPage": "Página anterior",
+    "nextPage": "Página siguiente",
+    "lastPage": "Última página",
+    "openMenu": "Abrir menú",
     "concernLabel": "¿Responde a qué punto?",
     "concernNone": "No es algo que preguntara el cliente"
   },
@@ -313,7 +313,7 @@
     "color": "Color",
     "fuelType": "Tipo de combustible",
     "gasoline": "Gasolina",
-    "diesel": "Diesel",
+    "diesel": "Diésel",
     "electric": "Electrico",
     "hybrid": "Hibrido",
     "other": "Otro",
@@ -373,10 +373,10 @@
     "archiveError": "Error al archivar vehículo"
   },
   "serviceRecords": {
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Primera página",
+    "previousPage": "Página anterior",
+    "nextPage": "Página siguiente",
+    "lastPage": "Última página"
   },
   "inspectionReminders": {
     "title": "Recordatorios de inspección",

+ 7 - 7
messages/es/workBoard.json

@@ -8,10 +8,10 @@
     "week": "Semana",
     "presenter": "Presentador",
     "addTechnician": "Agregar Técnico",
-    "previousWeek": "Previous week",
-    "nextWeek": "Next week",
-    "previousDay": "Previous day",
-    "nextDay": "Next day",
+    "previousWeek": "Semana anterior",
+    "nextWeek": "Semana siguiente",
+    "previousDay": "Día anterior",
+    "nextDay": "Día siguiente",
     "groupBy": "Columnas",
     "byTechnician": "Una columna por técnico",
     "byBay": "Una columna por puesto",
@@ -20,7 +20,7 @@
     "add": "Añadir",
     "addBay": "Añadir puesto",
     "weekNumber": "Sem. {number}",
-    "lanes": "Columnas",
+    "lanes": "Carriles",
     "showAllLanes": "Mostrar todas",
     "onlyBusyLanes": "Solo con trabajo",
     "layout": "Vista",
@@ -107,8 +107,8 @@
       "waitingParts": "Esperando Piezas",
       "completed": "Completado"
     },
-    "previous": "Previous",
-    "next": "Next",
+    "previous": "Anterior",
+    "next": "Siguiente",
     "groupingUnused": "El tablero de estado agrupa por estado",
     "connecting": "Conectando…"
   },

+ 1 - 1
messages/es/workOrders.json

@@ -34,7 +34,7 @@
       "total": "Total"
     },
     "emailSubject": "Actualización de Estado del Vehículo: {status}",
-    "changeStatus": "Change status",
+    "changeStatus": "Cambiar estado",
     "contextMenu": {
       "open": "Abrir orden de trabajo",
       "openVehicle": "Abrir vehículo",

+ 2 - 2
messages/fr/admin.json

@@ -31,7 +31,7 @@
     "name": "Nom",
     "email": "E-mail",
     "role": "Rôle",
-    "orgs": "Orgs",
+    "orgs": "Organisations",
     "created": "Créé",
     "lastSeen": "Dernière connexion",
     "noResults": "Aucun utilisateur ne correspond à votre recherche.",
@@ -117,7 +117,7 @@
     "sendgridApiKeyHint": "Obtenez votre clé API sur app.sendgrid.com"
   },
   "common": {
-    "openMenu": "Open menu"
+    "openMenu": "Ouvrir le menu"
   },
   "userDetails": {
     "back": "Retour aux utilisateurs",

+ 1 - 1
messages/fr/billing.json

@@ -85,7 +85,7 @@
     "failedDelete": "Échec de la suppression",
     "processed": "{count} facture(s) traitée(s)",
     "failedProcess": "Échec du traitement",
-    "pause": "Pause",
+    "pause": "Mettre en pause",
     "resume": "Reprendre",
     "delete": "Supprimer",
     "removeRow": "Supprimer la ligne"

+ 6 - 6
messages/fr/calendar.json

@@ -80,10 +80,10 @@
   },
   "selectVehicle": "Sélectionner un véhicule pour l’ordre de travail",
   "dateChoice": {
-    "title": "Work Order Date",
-    "description": "You have {selectedDate} selected. Which date should this work order be for?",
-    "useSelected": "Use {date}",
-    "useToday": "Use today"
+    "title": "Date de l'ordre de travail",
+    "description": "Vous avez sélectionné le {selectedDate}. À quelle date cet ordre de travail doit-il correspondre ?",
+    "useSelected": "Utiliser le {date}",
+    "useToday": "Utiliser aujourd'hui"
   },
   "more": "+ {count} de plus",
   "monthTotal": "{count} événements",
@@ -144,6 +144,6 @@
       "readOnly": "Créneau occupé venant d'un calendrier connecté. Modifiez-le là-bas, il sera mis à jour ici à la prochaine synchronisation."
     }
   },
-  "previousMonth": "Previous month",
-  "nextMonth": "Next month"
+  "previousMonth": "Mois précédent",
+  "nextMonth": "Mois suivant"
 }

+ 1 - 1
messages/fr/customers.json

@@ -27,7 +27,7 @@
     "batchDeleteTitle": "Supprimer les clients",
     "batchDeleteDescription": "Supprimer {count} client(s) ? Cela dissociera leurs véhicules.",
     "batchDeleteSuccess": "{count} client(s) supprimé(s)",
-    "openMenu": "Open menu"
+    "openMenu": "Ouvrir le menu"
   },
   "detail": {
     "backToCustomers": "Retour aux clients",

+ 7 - 7
messages/fr/dashboard.json

@@ -65,7 +65,7 @@
     "description": "Basé sur l’historique d’entretien et le kilométrage quotidien estimé",
     "overdue": "En retard",
     "approaching": "Imminent",
-    "estimated": "Est. {mileage} {unit}",
+    "estimated": "Env. {mileage} {unit}",
     "sinceLastService": "{mileage} {unit} depuis le dernier entretien",
     "certainty": "{percent} % de certitude",
     "active": "Actifs",
@@ -74,8 +74,8 @@
     "noDismissed": "Aucun véhicule ignoré.",
     "dismissedOn": "Ignoré le {date}",
     "restore": "Restaurer",
-    "settingsAriaLabel": "Maintenance settings",
-    "dismissAriaLabel": "Dismiss"
+    "settingsAriaLabel": "Paramètres de maintenance",
+    "dismissAriaLabel": "Ignorer"
   },
   "reminders": {
     "title": "Rappels à venir",
@@ -112,7 +112,7 @@
     "createQuote": "Créer un devis",
     "itemsRequested": "{count, plural, one {# élément demandé} other {# éléments demandés}}",
     "noData": "Aucune demande de devis en attente.",
-    "dismissAriaLabel": "Dismiss quote request"
+    "dismissAriaLabel": "Ignorer la demande de devis"
   },
   "quoteResponses": {
     "title": "Réponses des clients aux devis",
@@ -120,11 +120,11 @@
     "accepted": "Accepté",
     "changesRequested": "Modifications demandées",
     "convertToWorkOrder": "Convertir en ordre de travail",
-    "convert": "Convert",
+    "convert": "Convertir",
     "viewQuote": "Voir le devis",
-    "view": "View",
+    "view": "Voir",
     "noData": "Aucune réponse client.",
-    "dismissAriaLabel": "Dismiss response"
+    "dismissAriaLabel": "Ignorer la réponse"
   },
   "recentCompleted": {
     "title": "Terminés récemment",

+ 17 - 17
messages/fr/documentLock.json

@@ -1,27 +1,27 @@
 {
   "lockedTitle": {
     "invoice": {
-      "sent": "This invoice is locked because it has been sent",
-      "paid": "This invoice is locked because it has been paid"
+      "sent": "Cette facture est verrouillée car elle a été envoyée",
+      "paid": "Cette facture est verrouillée car elle a été payée"
     },
     "quote": {
-      "sent": "This quote is locked because it has been sent",
-      "accepted": "This quote is locked because it has been accepted"
+      "sent": "Ce devis est verrouillé car il a été envoyé",
+      "accepted": "Ce devis est verrouillé car il a été accepté"
     }
   },
-  "lockedBody": "Its parts, labour, prices, discount, tax, number and date can no longer be changed. Payments, status changes, sending and attachments all still work.",
-  "lockedAdminHint": "As an owner or admin you can unlock it if something genuinely needs correcting. The unlock is recorded in the audit log.",
-  "lockedMemberHint": "Ask an owner or admin to unlock it if something needs correcting.",
-  "unlock": "Unlock for editing",
-  "relock": "Lock again",
-  "unlockConfirmTitle": "Unlock this document?",
+  "lockedBody": "Ses pièces, sa main-d'œuvre, ses prix, sa remise, sa taxe, son numéro et sa date ne peuvent plus être modifiés. Les paiements, les changements de statut, l'envoi et les pièces jointes restent possibles.",
+  "lockedAdminHint": "En tant que propriétaire ou administrateur, vous pouvez le déverrouiller si une correction est vraiment nécessaire. Le déverrouillage est consigné dans le journal d'audit.",
+  "lockedMemberHint": "Demandez à un propriétaire ou à un administrateur de le déverrouiller si une correction est nécessaire.",
+  "unlock": "Déverrouiller pour modifier",
+  "relock": "Verrouiller à nouveau",
+  "unlockConfirmTitle": "Déverrouiller ce document ?",
   "unlockConfirmDescription": {
-    "invoice": "It will become editable again, and the change will be recorded in the audit log with your name. Prefer a credit note where your local rules require one.",
-    "quote": "It will become editable again, and the change will be recorded in the audit log with your name."
+    "invoice": "Il redeviendra modifiable, et le changement sera consigné dans le journal d'audit avec votre nom. Préférez un avoir lorsque la réglementation locale l'exige.",
+    "quote": "Il redeviendra modifiable, et le changement sera consigné dans le journal d'audit avec votre nom."
   },
-  "unlocked": "Unlocked for editing",
-  "relocked": "Locked again",
-  "reopenedTitle": "This document has been unlocked for editing",
-  "reopenedBody": "It stays editable until it is locked again.",
-  "failed": "Could not change the lock"
+  "unlocked": "Déverrouillé pour modification",
+  "relocked": "Verrouillé à nouveau",
+  "reopenedTitle": "Ce document a été déverrouillé pour modification",
+  "reopenedBody": "Il reste modifiable jusqu'à ce qu'il soit à nouveau verrouillé.",
+  "failed": "Impossible de modifier le verrouillage"
 }

+ 94 - 94
messages/fr/integrations.json

@@ -40,19 +40,19 @@
       "conference": "Liens d'appel vidéo"
     },
     "sms": {
-      "send": "Text messages out",
-      "receive": "Replies back in"
+      "send": "SMS sortants",
+      "receive": "Réponses entrantes"
     },
     "whatsapp": {
-      "send": "WhatsApp messages out",
-      "receive": "Replies back in"
+      "send": "Messages WhatsApp sortants",
+      "receive": "Réponses entrantes"
     },
     "telegram": {
-      "send": "Telegram messages out",
-      "receive": "Replies back in"
+      "send": "Messages Telegram sortants",
+      "receive": "Réponses entrantes"
     },
     "email": {
-      "send": "Email out"
+      "send": "E-mails sortants"
     },
     "vehicle": {
       "lookup": "Recherche par plaque et VIN",
@@ -131,19 +131,19 @@
     "lockedAi": "Connectez un fournisseur d'IA pour utiliser les fonctions d'IA dans votre atelier.",
     "ownAppTitle": "Cette installation utilise votre propre application auprès du fournisseur",
     "redirectUri": "URI de redirection à enregistrer auprès du fournisseur :",
-    "sendTestEmail": "Send test email",
-    "testEmailSent": "Test email sent to {email}",
-    "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.",
-    "inboundUrl": "Inbound webhook URL",
-    "inboundHintSecret": "Paste this URL into the vendor's inbound message settings. It carries a secret that identifies your workshop, so keep it private.",
-    "inboundHintMeta": "Paste this URL as the callback URL in your Meta app, with the verify token you entered above, and subscribe to messages.",
+    "sendTestEmail": "Envoyer un e-mail de test",
+    "testEmailSent": "E-mail de test envoyé à {email}",
+    "testEmailHint": "Un e-mail de test part vers votre propre adresse via ce fournisseur. Il valide l'adresse d'expédition et les règles d'envoi, ce qu'une simple vérification des clés ne peut pas faire.",
+    "inboundUrl": "URL du webhook entrant",
+    "inboundHintSecret": "Collez cette URL dans les réglages des messages entrants du fournisseur. Elle contient un secret qui identifie votre atelier : gardez-la privée.",
+    "inboundHintMeta": "Collez cette URL comme URL de rappel dans votre application Meta, avec le jeton de vérification saisi ci-dessus, et abonnez-vous aux messages.",
     "inboundHintStripe": "Ajoutez cette URL dans le tableau de bord Stripe sous Developers, Webhooks, abonnée à checkout.session.completed. Collez ensuite le secret de signature affiché par Stripe dans le champ secret du webhook ici, pour que les notifications puissent être vérifiées.",
     "inboundHintVipps": "Saisissez cette URL comme URL de rappel dans le portail Vipps MobilePay. Vipps exige aussi des conditions de vente publiées, à renseigner sous Paramètres, Paiement.",
     "inboundHintPaypal": "Ajoutez cette URL dans le tableau de bord développeur PayPal sous Webhooks, abonnée à PAYMENT.CAPTURE.COMPLETED.",
-    "copy": "Copy",
-    "copied": "Copied",
-    "updateKeys": "Update keys",
-    "updateKeysHint": "The last check failed. Enter the keys again to try once more.",
+    "copy": "Copier",
+    "copied": "Copié",
+    "updateKeys": "Mettre à jour les clés",
+    "updateKeysHint": "La dernière vérification a échoué. Saisissez à nouveau les clés pour réessayer.",
     "inspectionSync": {
       "title": "Synchronisation des contrôles",
       "vehicles": "{count} véhicules avec plaque dans cet atelier",
@@ -256,155 +256,155 @@
       }
     },
     "twilio-sms": {
-      "description": "Send and receive text messages through a Twilio number. Reminders, ready-for-pickup messages and the replies that come back.",
+      "description": "Envoyez et recevez des SMS via un numéro Twilio. Rappels, messages « prêt à récupérer » et les réponses qui reviennent.",
       "fields": {
         "accountSid": "Account SID",
-        "authToken": "Auth token"
+        "authToken": "Jeton d'authentification"
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Envoyer depuis ce numéro"
       }
     },
     "vonage-sms": {
-      "description": "Send and receive text messages through a Vonage number.",
+      "description": "Envoyez et recevez des SMS via un numéro Vonage.",
       "fields": {
-        "apiKey": "API key",
-        "apiSecret": "API secret",
-        "signatureSecret": "Signature secret",
-        "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."
+        "apiKey": "Clé API",
+        "apiSecret": "Secret API",
+        "signatureSecret": "Secret de signature",
+        "signatureSecretHelp": "Dans le tableau de bord Vonage, sous API settings. S'il est renseigné, les messages entrants ne sont acceptés que s'ils sont signés par Vonage. Sans lui, seul le secret contenu dans l'URL du webhook est vérifié."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Envoyer depuis ce numéro"
       }
     },
     "telnyx-sms": {
-      "description": "Send and receive text messages through a Telnyx number.",
+      "description": "Envoyez et recevez des SMS via un numéro Telnyx.",
       "fields": {
-        "apiKey": "API key",
-        "webhookPublicKey": "Webhook public key",
-        "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."
+        "apiKey": "Clé API",
+        "webhookPublicKey": "Clé publique du webhook",
+        "webhookPublicKeyHelp": "Dans le portail Telnyx, sous Account settings, Keys and credentials, Public key. Si elle est renseignée, les messages entrants ne sont acceptés que s'ils sont signés par Telnyx. Sans elle, seul le secret contenu dans l'URL du webhook est vérifié."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Envoyer depuis ce numéro"
       }
     },
     "whatsapp-meta": {
-      "description": "Message customers on WhatsApp through Meta directly. Photos of what you found, and the conversation that follows.",
+      "description": "Écrivez à vos clients sur WhatsApp directement via Meta. Les photos de ce que vous avez trouvé, et la conversation qui suit.",
       "fields": {
-        "phoneNumberId": "Phone number ID",
-        "accessToken": "Access token",
-        "verifyToken": "Webhook verify token",
-        "appSecret": "App secret",
-        "apiVersion": "Graph API version",
-        "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."
+        "phoneNumberId": "ID du numéro de téléphone",
+        "accessToken": "Jeton d'accès",
+        "verifyToken": "Jeton de vérification du webhook",
+        "appSecret": "Secret de l'application",
+        "apiVersion": "Version de la Graph API",
+        "appSecretHelp": "Meta signe chaque envoi avec ce secret. Tant qu'il n'est pas saisi, les messages envoyés au webhook sont refusés, car sinon toute personne connaissant l'URL pourrait se faire passer pour vos clients."
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Envoyer des messages sur ce canal",
+        "phoneNumber": "Envoyer depuis ce numéro",
+        "templateName": "Modèle pour rouvrir une conversation",
+        "templateLanguage": "Langue du modèle",
+        "templateVariables": "Valeurs du modèle, dans l'ordre",
+        "mediaTemplateName": "Modèle pour un message avec photo",
+        "mediaTemplateLanguage": "Langue du modèle avec photo",
+        "mediaTemplateVariables": "Valeurs du modèle avec photo, dans l'ordre"
       }
     },
     "whatsapp-twilio": {
-      "description": "Message customers on WhatsApp through a Twilio number, if Twilio is who sold you one.",
+      "description": "Écrivez à vos clients sur WhatsApp via un numéro Twilio, si c'est Twilio qui vous l'a fourni.",
       "fields": {
         "accountSid": "Account SID",
-        "authToken": "Auth token",
-        "messagingServiceSid": "Messaging service SID"
+        "authToken": "Jeton d'authentification",
+        "messagingServiceSid": "SID du service de messagerie"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Envoyer des messages sur ce canal",
+        "phoneNumber": "Envoyer depuis ce numéro",
+        "templateName": "Modèle pour rouvrir une conversation",
+        "templateLanguage": "Langue du modèle",
+        "templateVariables": "Valeurs du modèle, dans l'ordre",
+        "mediaTemplateName": "Modèle pour un message avec photo",
+        "mediaTemplateLanguage": "Langue du modèle avec photo",
+        "mediaTemplateVariables": "Valeurs du modèle avec photo, dans l'ordre"
       }
     },
     "telegram": {
-      "description": "A Telegram bot that reaches customers who use it, and brings their replies into the inbox.",
+      "description": "Un bot Telegram qui joint les clients qui l'utilisent et ramène leurs réponses dans la messagerie.",
       "fields": {
-        "botToken": "Bot token"
+        "botToken": "Jeton du bot"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "botUsername": "Bot username"
+        "enabled": "Envoyer des messages sur ce canal",
+        "botUsername": "Nom d'utilisateur du bot"
       }
     },
     "smtp": {
-      "description": "Send invoices and reminders through your own mail server, rather than the platform mail.",
+      "description": "Envoyez factures et rappels via votre propre serveur de messagerie, plutôt que par la messagerie de la plateforme.",
       "fields": {
-        "host": "Server",
+        "host": "Serveur",
         "port": "Port",
-        "user": "Username",
-        "pass": "Password"
+        "user": "Nom d'utilisateur",
+        "pass": "Mot de passe"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "secure": "Connect over TLS from the start",
-        "requireTls": "Require the server to upgrade to TLS",
-        "rejectUnauthorized": "Reject a certificate that does not check out"
+        "fromEmail": "Envoyer depuis cette adresse",
+        "fromName": "Nom affiché comme expéditeur",
+        "secure": "Se connecter en TLS dès le départ",
+        "requireTls": "Exiger que le serveur passe en TLS",
+        "rejectUnauthorized": "Refuser un certificat qui n'est pas valide"
       }
     },
     "resend": {
-      "description": "Send invoices and reminders through Resend.",
+      "description": "Envoyez factures et rappels via Resend.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "Clé API"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Envoyer depuis cette adresse",
+        "fromName": "Nom affiché comme expéditeur"
       }
     },
     "postmark": {
-      "description": "Send invoices and reminders through Postmark.",
+      "description": "Envoyez factures et rappels via Postmark.",
       "fields": {
-        "apiKey": "Server token"
+        "apiKey": "Jeton du serveur"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Envoyer depuis cette adresse",
+        "fromName": "Nom affiché comme expéditeur"
       }
     },
     "mailgun": {
-      "description": "Send invoices and reminders through Mailgun.",
+      "description": "Envoyez factures et rappels via Mailgun.",
       "fields": {
-        "apiKey": "API key",
-        "domain": "Sending domain"
+        "apiKey": "Clé API",
+        "domain": "Domaine d'envoi"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "region": "Region the domain is in"
+        "fromEmail": "Envoyer depuis cette adresse",
+        "fromName": "Nom affiché comme expéditeur",
+        "region": "Région du domaine"
       }
     },
     "sendgrid": {
-      "description": "Send invoices and reminders through SendGrid.",
+      "description": "Envoyez factures et rappels via SendGrid.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "Clé API"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Envoyer depuis cette adresse",
+        "fromName": "Nom affiché comme expéditeur"
       }
     },
     "amazon-ses": {
-      "description": "Send invoices and reminders through Amazon SES.",
+      "description": "Envoyez factures et rappels via Amazon SES.",
       "fields": {
-        "accessKeyId": "Access key ID",
-        "secretAccessKey": "Secret access key",
-        "region": "Region"
+        "accessKeyId": "ID de clé d'accès",
+        "secretAccessKey": "Clé d'accès secrète",
+        "region": "Région"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Envoyer depuis cette adresse",
+        "fromName": "Nom affiché comme expéditeur"
       }
     },
     "vegvesen": {

+ 2 - 2
messages/fr/inventory.json

@@ -76,7 +76,7 @@
     "editPart": "Modifier la pièce",
     "addNewPart": "Ajouter une nouvelle pièce",
     "supplierLink": "Lien fournisseur",
-    "supplierLinkPlaceholder": "https://supplier.com/product/...",
+    "supplierLinkPlaceholder": "https://fournisseur.com/produit/...",
     "fetch": "Récupérer",
     "fetchFailed": "Échec de la récupération",
     "fetchError": "Impossible de récupérer les métadonnées de l'URL",
@@ -131,7 +131,7 @@
     "saveChanges": "Enregistrer les modifications",
     "addPart": "Ajouter une pièce"
   },
-  "openMenu": "Open menu",
+  "openMenu": "Ouvrir le menu",
   "history": {
     "title": "Historique du stock",
     "description": "Toutes les modifications enregistrées de {name}, les plus récentes d'abord.",

+ 6 - 6
messages/fr/laborPresets.json

@@ -16,7 +16,7 @@
   "actions": {
     "edit": "Modifier",
     "delete": "Supprimer",
-    "openMenu": "Open menu"
+    "openMenu": "Ouvrir le menu"
   },
   "deletePreset": {
     "title": "Supprimer le modèle de main-d'œuvre",
@@ -43,10 +43,10 @@
     "cancel": "Annuler",
     "create": "Créer",
     "saveChanges": "Enregistrer les modifications",
-    "itemQty": "Qty",
-    "itemQtyOrHours": "Unit / Hours",
-    "hourlyTag": "HR",
-    "serviceTag": "SVC",
+    "itemQty": "Qté",
+    "itemQtyOrHours": "Unité / Heures",
+    "hourlyTag": "H",
+    "serviceTag": "SERV",
     "partsTitle": "Pièces",
     "addPart": "Ajouter une pièce",
     "partName": "Nom de la pièce",
@@ -63,7 +63,7 @@
     "noPackages": "Aucun modèle de main-d'œuvre trouvé.",
     "items": "{count} éléments",
     "totalHours": "{hours}h au total",
-    "totalUnits": "{units} unit(s)",
+    "totalUnits": "{units} unité(s)",
     "totalParts": "{count} pièces"
   },
   "errors": {

+ 3 - 3
messages/fr/messages.json

@@ -30,8 +30,8 @@
     "deleteDescription": "Tous les messages avec {name} seront définitivement supprimés. Cette action est irréversible.",
     "deleted": "Conversation supprimée",
     "deleteError": "Impossible de supprimer la conversation",
-    "back": "Back",
-    "conversationMenu": "Conversation menu",
+    "back": "Retour",
+    "conversationMenu": "Menu de la conversation",
     "searchPlaceholder": "Rechercher des conversations",
     "noSearchResults": "Aucune conversation ne correspond à la recherche",
     "now": "maintenant"
@@ -47,7 +47,7 @@
     "messageDeleted": "Message supprimé",
     "deleteError": "Impossible de supprimer le message",
     "sendError": "Impossible d'envoyer le SMS",
-    "sendMessage": "Send message"
+    "sendMessage": "Envoyer le message"
   },
   "sendDialog": {
     "send": "Envoyer {label}",

+ 1 - 1
messages/fr/navigation.json

@@ -112,7 +112,7 @@
     "reports": "Rapports",
     "timesheets": "Feuilles de temps",
     "settings": "Paramètres",
-    "superAdmin": "Super Admin",
+    "superAdmin": "Super administrateur",
     "adminPanel": "Panneau d'administration",
     "organizations": "Organisations",
     "noOrganization": "Aucune organisation",

+ 1 - 1
messages/fr/notifications.json

@@ -7,5 +7,5 @@
     "delete": "Supprimer",
     "cancel": "Annuler"
   },
-  "openNotifications": "Open notifications"
+  "openNotifications": "Ouvrir les notifications"
 }

+ 2 - 2
messages/fr/quotes.json

@@ -94,8 +94,8 @@
     "addService": "Ajouter une prestation",
     "qty": "Qté",
     "qtyOrHours": "Unité / Heures",
-    "hourlyTag": "HR",
-    "serviceTag": "SVC",
+    "hourlyTag": "H",
+    "serviceTag": "SERV",
     "switchToHourlyHint": "À l'heure : facturé selon les heures travaillées (heures × taux/h). Cliquez pour changer.",
     "switchToServiceHint": "Forfait : facturé au prix fixe par unité. Cliquez pour changer.",
     "deleteRow": "Supprimer la ligne",

+ 1 - 1
messages/fr/reminders.json

@@ -8,7 +8,7 @@
   "searchVehicle": "Rechercher des véhicules...",
   "noVehicle": "Aucun véhicule trouvé.",
   "pickDate": "Choisir une date",
-  "openMenu": "Open menu",
+  "openMenu": "Ouvrir le menu",
   "relatesTo": "Concerne (optionnel)",
   "selectCustomer": "Client (optionnel)",
   "noneOption": "Aucun",

+ 83 - 83
messages/fr/reports.json

@@ -329,94 +329,94 @@
     "jobsClocked": "Travaux pointés"
   },
   "pdf": {
-    "reportTitle": "Business Report",
-    "revenueSection": "Revenue Report",
-    "taxSection": "Tax Report",
-    "pastDueSection": "Past Due Invoices",
-    "servicesSection": "Services Report",
-    "customersSection": "Customers Report",
-    "techniciansSection": "Technicians Report",
-    "partsSection": "Parts Usage Report",
-    "jobAnalyticsSection": "Job Analytics",
-    "retentionSection": "Customer Retention",
-    "inventorySection": "Inventory Report",
+    "reportTitle": "Rapport d'Activité",
+    "revenueSection": "Rapport des Revenus",
+    "taxSection": "Rapport des Taxes",
+    "pastDueSection": "Factures en Retard",
+    "servicesSection": "Rapport des Services",
+    "customersSection": "Rapport des Clients",
+    "techniciansSection": "Rapport des Techniciens",
+    "partsSection": "Rapport d'Utilisation des Pièces",
+    "jobAnalyticsSection": "Analyse des Travaux",
+    "retentionSection": "Fidélisation des Clients",
+    "inventorySection": "Rapport d'Inventaire",
     "monthlyBreakdown": "Répartition Mensuelle",
-    "revenueByType": "Revenue by Type",
-    "taxByRate": "Tax by Rate",
-    "servicesByStatus": "By Status",
-    "servicesByType": "By Type",
-    "topCustomers": "Top Customers",
-    "topServiceTypes": "Top Service Types",
-    "topReturning": "Top Returning Customers",
-    "dayOfWeek": "Jobs by Day of Week",
-    "monthlyTrend": "Monthly Trend",
-    "lowStock": "Low Stock Items",
-    "revenue": "Revenue",
-    "collected": "Collected",
-    "outstanding": "Outstanding",
+    "revenueByType": "Revenus par Type",
+    "taxByRate": "Taxe par Taux",
+    "servicesByStatus": "Par Statut",
+    "servicesByType": "Par Type",
+    "topCustomers": "Meilleurs Clients",
+    "topServiceTypes": "Principaux Types de Service",
+    "topReturning": "Meilleurs Clients Récurrents",
+    "dayOfWeek": "Travaux par Jour de la Semaine",
+    "monthlyTrend": "Tendance Mensuelle",
+    "lowStock": "Articles en Stock Bas",
+    "revenue": "Revenus",
+    "collected": "Encaissé",
+    "outstanding": "En attente",
     "services": "Services",
-    "partsCost": "Parts Cost",
+    "partsCost": "Coût des Pièces",
     "partsNetProfit": "Bénéfice Net Pièces",
     "laborRevenue": "Main-d'œuvre",
-    "netProfit": "Net Profit",
-    "month": "Month",
-    "count": "Count",
+    "netProfit": "Bénéfice Net",
+    "month": "Mois",
+    "count": "Nombre",
     "type": "Type",
-    "status": "Status",
-    "name": "Name",
-    "company": "Company",
-    "totalSpent": "Total Spent",
-    "customer": "Customer",
-    "invoiceNumber": "Invoice #",
-    "totalAmount": "Total Amount",
-    "amountDue": "Amount Due",
-    "dueDate": "Due Date",
-    "daysPastDue": "Days Past Due",
-    "totalPastDue": "Total Past Due",
-    "totalAmountDue": "Total Amount Due",
-    "over30": "Over 30 Days",
-    "over60": "Over 60 Days",
-    "over90": "Over 90 Days",
-    "taxCollected": "Tax Collected",
-    "taxableAmount": "Taxable Amount",
-    "taxRate": "Tax Rate",
-    "invoiceCount": "Invoice Count",
-    "invoices": "Invoices",
-    "totalServices": "Total Services",
-    "totalCustomers": "Total Customers",
-    "activeCustomers": "Active Customers",
-    "technician": "Technician",
-    "jobs": "Jobs",
-    "totalRevenue": "Total Revenue",
-    "avgRevenue": "Avg Revenue",
-    "totalHours": "Total Hours",
-    "avgHours": "Avg Hours",
-    "totalJobs": "Total Jobs",
-    "partName": "Part Name",
-    "partNumber": "Part #",
-    "usageCount": "Usage Count",
-    "totalQty": "Total Qty",
-    "totalPartsRevenue": "Parts Revenue",
+    "status": "Statut",
+    "name": "Nom",
+    "company": "Entreprise",
+    "totalSpent": "Total Dépensé",
+    "customer": "Client",
+    "invoiceNumber": "N° Facture",
+    "totalAmount": "Montant Total",
+    "amountDue": "Montant Dû",
+    "dueDate": "Date d'Échéance",
+    "daysPastDue": "Jours de Retard",
+    "totalPastDue": "Total en Retard",
+    "totalAmountDue": "Montant Total Dû",
+    "over30": "Plus de 30 Jours",
+    "over60": "Plus de 60 Jours",
+    "over90": "Plus de 90 Jours",
+    "taxCollected": "Taxe Perçue",
+    "taxableAmount": "Montant Taxable",
+    "taxRate": "Taux de Taxe",
+    "invoiceCount": "Nombre de Factures",
+    "invoices": "Factures",
+    "totalServices": "Total des Services",
+    "totalCustomers": "Total des Clients",
+    "activeCustomers": "Clients Actifs",
+    "technician": "Technicien",
+    "jobs": "Travaux",
+    "totalRevenue": "Revenus Totaux",
+    "avgRevenue": "Revenus Moy.",
+    "totalHours": "Heures Totales",
+    "avgHours": "Heures Moy.",
+    "totalJobs": "Total Travaux",
+    "partName": "Nom de Pièce",
+    "partNumber": "N° Pièce",
+    "usageCount": "Nombre d'Utilisations",
+    "totalQty": "Qté Totale",
+    "totalPartsRevenue": "Revenus Pièces",
     "totalPartsCost": "Coût des Pièces",
     "totalPartsNetProfit": "Bénéfice Net",
-    "totalPartsUsed": "Parts Used",
-    "serviceType": "Service Type",
-    "avgValue": "Avg Value",
-    "avgJobValue": "Avg Job Value",
-    "returningCustomers": "Returning",
-    "newCustomers": "New",
-    "totalActive": "Total Active",
-    "avgTimeBetweenVisits": "Avg Days Between Visits",
-    "avgDaysBetweenVisits": "Avg Days",
-    "visits": "Visits",
-    "days": "days",
-    "totalParts": "Total Parts",
-    "totalItems": "Total Items",
-    "totalValue": "Total Value",
-    "totalSellValue": "Sell Value",
-    "quantity": "Qty",
-    "minQuantity": "Min Qty",
-    "unitCost": "Unit Cost",
+    "totalPartsUsed": "Pièces Utilisées",
+    "serviceType": "Type de Service",
+    "avgValue": "Valeur Moy.",
+    "avgJobValue": "Valeur Moy. du Travail",
+    "returningCustomers": "Récurrents",
+    "newCustomers": "Nouveaux",
+    "totalActive": "Total Actifs",
+    "avgTimeBetweenVisits": "Moy. Jours Entre Visites",
+    "avgDaysBetweenVisits": "Moy. Jours",
+    "visits": "Visites",
+    "days": "jours",
+    "totalParts": "Total des Pièces",
+    "totalItems": "Total des Articles",
+    "totalValue": "Valeur Totale",
+    "totalSellValue": "Valeur de Vente",
+    "quantity": "Qté",
+    "minQuantity": "Qté Min.",
+    "unitCost": "Coût Unitaire",
     "vehiclesSection": "Rapport Véhicule",
     "vehicleLabel": "Véhicule",
     "totalCost": "Coût Total",
@@ -427,7 +427,7 @@
   },
   "empty": "Aucune donnée chargée. Cliquez sur Actualiser pour charger le rapport.",
   "pagination": {
-    "previousPage": "Previous page",
-    "nextPage": "Next page"
+    "previousPage": "Page précédente",
+    "nextPage": "Page suivante"
   }
 }

+ 2 - 2
messages/fr/service.json

@@ -157,8 +157,8 @@
     "addExisting": "Voir existantes ({count})",
     "qty": "Qté",
     "qtyOrHours": "Unité / Heures",
-    "hourlyTag": "HR",
-    "serviceTag": "SVC",
+    "hourlyTag": "H",
+    "serviceTag": "SERV",
     "switchToHourlyHint": "À l'heure : facturé selon les heures travaillées (heures × taux/h). Cliquez pour changer.",
     "switchToServiceHint": "Forfait : facturé au prix fixe par unité. Cliquez pour changer.",
     "deleteRow": "Supprimer la ligne",

+ 18 - 18
messages/fr/settings.json

@@ -3,7 +3,7 @@
   "subtitle": "Gerez votre atelier, factures et preferences",
   "nav": {
     "categories": {
-      "general": "General",
+      "general": "Général",
       "billing": "Facturation et documents",
       "communications": "Communications",
       "workshop": "Atelier",
@@ -65,7 +65,7 @@
       },
       "telegram": {
         "title": "Telegram",
-        "description": "Telegram bot & messaging"
+        "description": "Bot Telegram et messagerie"
       },
       "customerPortal": {
         "title": "Portail client",
@@ -84,7 +84,7 @@
         "description": "Intervalles de service predits"
       },
       "ai": {
-        "title": "AI",
+        "title": "IA",
         "description": "Fournisseur IA et fonctionnalités"
       },
       "reportSchedule": {
@@ -262,7 +262,7 @@
     "backupCodesTitle": "Sauvegarder les codes de secours",
     "backupCodesDescription": "Conservez ces codes dans un endroit sur. Vous pouvez les utiliser pour vous connecter si vous perdez l'accès a votre application d'authentification. Chaque code ne peut être utilise qu'une seule fois.",
     "copyCodes": "Copier les codes",
-    "copied": "Copie",
+    "copied": "Copié",
     "backupCodesCopied": "Codes de secours copies dans le presse-papiers",
     "savedBackupCodes": "J'ai sauvegarde mes codes de secours",
     "twoFactorEnabledSuccess": "Authentification a deux facteurs activee",
@@ -418,9 +418,9 @@
     "failedRemoveMember": "Échec du retrait du membre",
     "memberRoleUpdated": "Role du membre mis a jour",
     "failedUpdateRole": "Échec de la mise a jour du role",
-    "removeMember": "Remove member",
-    "cancelInvite": "Cancel invitation",
-    "editRole": "Edit role",
+    "removeMember": "Retirer le membre",
+    "cancelInvite": "Annuler l'invitation",
+    "editRole": "Modifier le rôle",
     "technician": "Technicien",
     "technicianHint": "Peut se voir attribuer des travaux et utiliser l’application technicien",
     "technicianFailed": "Modification impossible",
@@ -1061,8 +1061,8 @@
     "fieldDeleted": "Champ personnalisé supprimé",
     "failedSave": "Impossible d'enregistrer le champ",
     "failedDelete": "Impossible de supprimer",
-    "edit": "Edit",
-    "delete": "Delete",
+    "edit": "Modifier",
+    "delete": "Supprimer",
     "unassigned": "Non assigné",
     "defaultValue": "Valeur par défaut",
     "defaultValueHint": "Préremplie sur les nouvelles fiches et imprimée tant qu'aucune valeur n'a été saisie.",
@@ -1096,7 +1096,7 @@
     "unitsDescription": "Choisissez entre metrique (km, litres) et imperial (miles, gallons).",
     "unitSystem": "Système d'unites",
     "metric": "Metrique (km, litres)",
-    "imperial": "Imperial (miles, gallons)",
+    "imperial": "Impérial (miles, gallons)",
     "distanceLabel": "Distance",
     "volumeLabel": "Volume",
     "kilometers": "kilometres (km)",
@@ -1370,7 +1370,7 @@
         "sand": "Sable"
       }
     },
-    "copyUrl": "Copy portal URL"
+    "copyUrl": "Copier l'URL du portail"
   },
   "email": {
     "title": "Fournisseur de messagerie",
@@ -1446,7 +1446,7 @@
     "failedSave": "Échec de l'enregistrement des paramètres",
     "testSentTo": "SMS de test envoye a {phone}",
     "testFailed": "Échec du test SMS",
-    "copyWebhookUrl": "Copy webhook URL"
+    "copyWebhookUrl": "Copier l'URL du webhook"
   },
   "subscription": {
     "title": "Plan d'abonnement",
@@ -1497,7 +1497,7 @@
     "resumeSuccess": "Abonnement repris avec succès",
     "resumeError": "Échec de la reprise de l'abonnement",
     "billingPortalError": "Impossible d'ouvrir le portail de facturation",
-    "checkoutError": "Failed to start checkout",
+    "checkoutError": "Impossible de lancer le paiement",
     "upgradeTitle": "Améliorer le plan",
     "upgradeDescription": "Débloquez plus de fonctionnalités en améliorant votre plan.",
     "upgradeToProDescription": "Améliorez pour débloquer des clients illimités, des membres d'équipe, des rapports, SMTP, l'accès API et plus encore.",
@@ -1557,7 +1557,7 @@
     "biweekly": "Toutes les 2 semaines",
     "monthly": "Mensuel",
     "bimonthly": "Tous les 2 mois",
-    "quarterly": "Tous les 4 mois",
+    "quarterly": "Tous les 3 mois",
     "semiannually": "Tous les 6 mois",
     "yearly": "Annuel",
     "dateRangeLabel": "Période",
@@ -1596,10 +1596,10 @@
     "deleted": "Planning de rapports supprimé",
     "toggledOn": "Planning de rapports activé",
     "toggledOff": "Planning de rapports désactivé",
-    "failedSave": "Failed to save",
-    "failedSend": "Failed to send",
-    "failedToggle": "Failed to toggle",
-    "failedDelete": "Failed to delete",
+    "failedSave": "Échec de l'enregistrement",
+    "failedSend": "Échec de l'envoi",
+    "failedToggle": "Échec de l'activation ou de la désactivation",
+    "failedDelete": "Échec de la suppression",
     "noMembers": "Aucun membre trouvé",
     "addRecipient": "Ajouter un destinataire...",
     "searchMembers": "Rechercher des membres...",

+ 5 - 5
messages/fr/share.json

@@ -34,8 +34,8 @@
     "total": "Total",
     "labor": "Main-d'œuvre",
     "hours": "Heures",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "h",
+    "unit": "unité",
     "qtyOrHours": "Unité / Heures",
     "rate": "Taux",
     "ratePerHour": "{rate}/h",
@@ -93,8 +93,8 @@
     "labor": "Main-d'œuvre",
     "laborDescription": "Description",
     "hours": "Heures",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "h",
+    "unit": "unité",
     "qtyOrHours": "Unité / Heures",
     "rate": "Taux",
     "ratePerHour": "{rate}/h",
@@ -200,7 +200,7 @@
     "privacyNotice": "Ce rapport vous est communiqué par l'atelier qui a réalisé le contrôle. Toute personne disposant de ce lien peut le consulter : merci de ne pas le transmettre. Contactez l'atelier pour faire retirer le lien ou effacer vos données."
   },
   "terms": {
-    "title": "Conditions de vente (Salgsvilkår)",
+    "title": "Conditions de vente",
     "contact": "Contact",
     "tel": "Tél. : {phone}"
   },

+ 1 - 1
messages/fr/statusReport.json

@@ -14,7 +14,7 @@
     "createAndSend": "Créer et envoyer",
     "cancel": "Annuler",
     "uploadFailed": "Échec du téléversement de la vidéo",
-    "createReportFailed": "Failed to create status report",
+    "createReportFailed": "Échec de la création du rapport d'état",
     "created": "Rapport d'état créé",
     "noVideo": "Veuillez d'abord téléverser une vidéo",
     "removeVideo": "Supprimer la vidéo",

+ 3 - 3
messages/fr/telegram.json

@@ -5,8 +5,8 @@
     "label": "Token du bot",
     "placeholder": "Entrez le token de @BotFather",
     "help": "Créez un bot via @BotFather sur Telegram pour obtenir votre token.",
-    "show": "Show token",
-    "hide": "Hide token"
+    "show": "Afficher le jeton",
+    "hide": "Masquer le jeton"
   },
   "botUsername": {
     "label": "Nom d'utilisateur du bot",
@@ -20,7 +20,7 @@
     "title": "Lien de connexion client",
     "description": "Partagez ce lien avec les clients pour qu'ils se connectent à votre bot. Remplacez l'espace réservé de l'ID client par l'ID réel.",
     "copied": "Lien copié !",
-    "copy": "Copy deep link"
+    "copy": "Copier le lien de connexion"
   },
   "test": {
     "title": "Message test",

+ 1 - 1
messages/fr/telegramMessages.json

@@ -31,7 +31,7 @@
     "messageDeleted": "Message supprimé",
     "deleteError": "Échec de la suppression du message",
     "sendError": "Échec de l'envoi du message",
-    "sendMessage": "Send message"
+    "sendMessage": "Envoyer le message"
   },
   "sendDialog": {
     "send": "Envoyer {label}",

+ 1 - 1
messages/fr/timeTracking.json

@@ -23,7 +23,7 @@
     "openTimesheets": "Ouvrir les feuilles de temps"
   },
   "source": {
-    "app": "App",
+    "app": "Application",
     "web": "Web",
     "manual": "Manuel",
     "editedBy": "Ajusté par {name}"

+ 24 - 24
messages/fr/vehicles.json

@@ -28,10 +28,10 @@
     "unarchiveError": "Échec de la désarchivation du véhicule",
     "deleteError": "Échec de la suppression du véhicule",
     "error": "Échec du chargement des véhicules",
-    "viewTable": "Table view",
-    "viewGrid": "Grid view",
-    "viewLargeGrid": "Large grid view",
-    "openMenu": "Open menu",
+    "viewTable": "Vue tableau",
+    "viewGrid": "Vue grille",
+    "viewLargeGrid": "Vue grande grille",
+    "openMenu": "Ouvrir le menu",
     "inspectionOverdue": "Contrôle en retard",
     "inspectionDue30": "Dans 30 jours",
     "inspectionDue90": "Dans 90 jours",
@@ -95,8 +95,8 @@
     "severityModerate": "Modéré — signalé par certains propriétaires",
     "severityUncommon": "Peu courant — signalé par peu de propriétaires",
     "severityRare": "Rare — signalements isolés mais critique lorsqu'il survient",
-    "openMenu": "Open menu",
-    "dismissMaintenance": "Dismiss",
+    "openMenu": "Ouvrir le menu",
+    "dismissMaintenance": "Ignorer",
     "inspectionDue": "Contrôle le {date}",
     "inspectionCheckedAt": "Vérifié auprès du registre le {date}",
     "notRegistered": "Non immatriculé",
@@ -184,10 +184,10 @@
     "showing": "Affichage de {start}-{end} sur {total}",
     "perPage": "par page",
     "page": "Page {page} sur {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Première page",
+    "previousPage": "Page précédente",
+    "nextPage": "Page suivante",
+    "lastPage": "Dernière page"
   },
   "notes": {
     "addNote": "Ajouter une note",
@@ -213,11 +213,11 @@
     "noteCreated": "Note créée",
     "titleRequired": "Le titre et le contenu sont obligatoires",
     "saveError": "Échec de l'enregistrement de la note",
-    "openMenu": "Open menu",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "openMenu": "Ouvrir le menu",
+    "firstPage": "Première page",
+    "previousPage": "Page précédente",
+    "nextPage": "Page suivante",
+    "lastPage": "Dernière page"
   },
   "findings": {
     "sectionTitle": "Observations",
@@ -266,11 +266,11 @@
     "showing": "Affichage de {start}-{end} sur {total}",
     "perPage": "par page",
     "page": "Page {page} sur {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page",
-    "openMenu": "Open menu",
+    "firstPage": "Première page",
+    "previousPage": "Page précédente",
+    "nextPage": "Page suivante",
+    "lastPage": "Dernière page",
+    "openMenu": "Ouvrir le menu",
     "concernLabel": "Répond à quel point ?",
     "concernNone": "Rien que le client ait signalé"
   },
@@ -373,10 +373,10 @@
     "archiveError": "Échec de l'archivage du véhicule"
   },
   "serviceRecords": {
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Première page",
+    "previousPage": "Page précédente",
+    "nextPage": "Page suivante",
+    "lastPage": "Dernière page"
   },
   "inspectionReminders": {
     "title": "Rappels de contrôle technique",

+ 7 - 7
messages/fr/workBoard.json

@@ -8,10 +8,10 @@
     "week": "Semaine",
     "presenter": "Présentateur",
     "addTechnician": "Ajouter un Technicien",
-    "previousWeek": "Previous week",
-    "nextWeek": "Next week",
-    "previousDay": "Previous day",
-    "nextDay": "Next day",
+    "previousWeek": "Semaine précédente",
+    "nextWeek": "Semaine suivante",
+    "previousDay": "Jour précédent",
+    "nextDay": "Jour suivant",
     "groupBy": "Colonnes",
     "byTechnician": "Une colonne par technicien",
     "byBay": "Une colonne par poste",
@@ -20,7 +20,7 @@
     "add": "Ajouter",
     "addBay": "Ajouter un poste",
     "weekNumber": "Sem. {number}",
-    "lanes": "Colonnes",
+    "lanes": "Couloirs",
     "showAllLanes": "Tout afficher",
     "onlyBusyLanes": "Seulement avec du travail",
     "layout": "Affichage",
@@ -107,8 +107,8 @@
       "waitingParts": "En Attente de Pièces",
       "completed": "Complété"
     },
-    "previous": "Previous",
-    "next": "Next",
+    "previous": "Précédent",
+    "next": "Suivant",
     "groupingUnused": "Le tableau de statut regroupe par statut",
     "connecting": "Connexion…"
   },

+ 1 - 1
messages/fr/workOrders.json

@@ -34,7 +34,7 @@
       "total": "Total"
     },
     "emailSubject": "Mise à jour du Statut du Véhicule: {status}",
-    "changeStatus": "Change status",
+    "changeStatus": "Changer le statut",
     "contextMenu": {
       "open": "Ouvrir l'ordre de travail",
       "openVehicle": "Ouvrir le véhicule",

+ 2 - 2
messages/it/admin.json

@@ -97,7 +97,7 @@
     "requireTlsUpgrade": "Richiedi aggiornamento TLS",
     "requireTlsUpgradeHint": "Forza l'aggiornamento TLS sulle connessioni STARTTLS",
     "apiKey": "Chiave API",
-    "serverToken": "Server Token",
+    "serverToken": "Token del server",
     "domain": "Dominio",
     "region": "Regione",
     "awsRegion": "Regione AWS",
@@ -117,7 +117,7 @@
     "sendgridApiKeyHint": "Ottieni la tua chiave API da app.sendgrid.com"
   },
   "common": {
-    "openMenu": "Open menu"
+    "openMenu": "Apri menu"
   },
   "userDetails": {
     "back": "Torna agli utenti",

+ 5 - 5
messages/it/calendar.json

@@ -80,10 +80,10 @@
   },
   "selectVehicle": "Seleziona veicolo per ordine di lavoro",
   "dateChoice": {
-    "title": "Work Order Date",
-    "description": "You have {selectedDate} selected. Which date should this work order be for?",
+    "title": "Data dell'ordine di lavoro",
+    "description": "Hai selezionato {selectedDate}. A quale data deve riferirsi questo ordine di lavoro?",
     "useSelected": "Use {date}",
-    "useToday": "Use today"
+    "useToday": "Usa oggi"
   },
   "more": "+ {count} altri",
   "monthTotal": "{count} eventi",
@@ -144,6 +144,6 @@
       "readOnly": "Tempo occupato da un calendario collegato. Modificalo lì e qui si aggiorna alla prossima sincronizzazione."
     }
   },
-  "previousMonth": "Previous month",
-  "nextMonth": "Next month"
+  "previousMonth": "Mese precedente",
+  "nextMonth": "Mese successivo"
 }

+ 2 - 2
messages/it/customers.json

@@ -27,7 +27,7 @@
     "batchDeleteTitle": "Elimina clienti",
     "batchDeleteDescription": "Eliminare {count} cliente/i? I veicoli verranno scollegati.",
     "batchDeleteSuccess": "{count} cliente/i eliminato/i",
-    "openMenu": "Open menu"
+    "openMenu": "Apri menu"
   },
   "detail": {
     "backToCustomers": "Torna ai clienti",
@@ -95,7 +95,7 @@
     "customerCreated": "Cliente creato",
     "saveError": "Salvataggio del cliente non riuscito",
     "customerNumber": "N. cliente",
-    "customerNumberAuto": "Auto",
+    "customerNumberAuto": "Automatico",
     "sectionContact": "Contatto",
     "sectionBilling": "Fatturazione",
     "addScannedVehicle": "Aggiungi il veicolo {vehicle}",

+ 7 - 7
messages/it/dashboard.json

@@ -74,8 +74,8 @@
     "noDismissed": "Nessun veicolo ignorato.",
     "dismissedOn": "Ignorato il {date}",
     "restore": "Ripristina",
-    "settingsAriaLabel": "Maintenance settings",
-    "dismissAriaLabel": "Dismiss"
+    "settingsAriaLabel": "Impostazioni manutenzione",
+    "dismissAriaLabel": "Ignora"
   },
   "reminders": {
     "title": "Promemoria in scadenza",
@@ -112,7 +112,7 @@
     "createQuote": "Crea preventivo",
     "itemsRequested": "{count, plural, one {# elemento richiesto} other {# elementi richiesti}}",
     "noData": "Nessuna richiesta di preventivo in sospeso.",
-    "dismissAriaLabel": "Dismiss quote request"
+    "dismissAriaLabel": "Ignora richiesta di preventivo"
   },
   "quoteResponses": {
     "title": "Risposte ai preventivi dei clienti",
@@ -120,11 +120,11 @@
     "accepted": "Accettato",
     "changesRequested": "Modifiche richieste",
     "convertToWorkOrder": "Converti in ordine di lavoro",
-    "convert": "Convert",
+    "convert": "Converti",
     "viewQuote": "Visualizza preventivo",
-    "view": "View",
+    "view": "Visualizza",
     "noData": "Nessuna risposta dai clienti.",
-    "dismissAriaLabel": "Dismiss response"
+    "dismissAriaLabel": "Ignora risposta"
   },
   "recentCompleted": {
     "title": "Completati di recente",
@@ -232,7 +232,7 @@
     "options": {
       "maintenance": "Manutenzione",
       "repair": "Riparazione",
-      "upgrade": "Upgrade",
+      "upgrade": "Aggiornamento",
       "inspection": "Ispezione",
       "pending": "In attesa",
       "in-progress": "In corso",

+ 17 - 17
messages/it/documentLock.json

@@ -1,27 +1,27 @@
 {
   "lockedTitle": {
     "invoice": {
-      "sent": "This invoice is locked because it has been sent",
-      "paid": "This invoice is locked because it has been paid"
+      "sent": "Questa fattura è bloccata perché è stata inviata",
+      "paid": "Questa fattura è bloccata perché è stata pagata"
     },
     "quote": {
-      "sent": "This quote is locked because it has been sent",
-      "accepted": "This quote is locked because it has been accepted"
+      "sent": "Questo preventivo è bloccato perché è stato inviato",
+      "accepted": "Questo preventivo è bloccato perché è stato accettato"
     }
   },
-  "lockedBody": "Its parts, labour, prices, discount, tax, number and date can no longer be changed. Payments, status changes, sending and attachments all still work.",
-  "lockedAdminHint": "As an owner or admin you can unlock it if something genuinely needs correcting. The unlock is recorded in the audit log.",
-  "lockedMemberHint": "Ask an owner or admin to unlock it if something needs correcting.",
-  "unlock": "Unlock for editing",
-  "relock": "Lock again",
-  "unlockConfirmTitle": "Unlock this document?",
+  "lockedBody": "Ricambi, manodopera, prezzi, sconto, imposta, numero e data non possono più essere modificati. Pagamenti, cambi di stato, invio e allegati funzionano ancora.",
+  "lockedAdminHint": "Come proprietario o amministratore puoi sbloccarlo se qualcosa deve davvero essere corretto. Lo sblocco viene registrato nel registro attività.",
+  "lockedMemberHint": "Chiedi a un proprietario o a un amministratore di sbloccarlo se qualcosa deve essere corretto.",
+  "unlock": "Sblocca per modificare",
+  "relock": "Blocca di nuovo",
+  "unlockConfirmTitle": "Sbloccare questo documento?",
   "unlockConfirmDescription": {
-    "invoice": "It will become editable again, and the change will be recorded in the audit log with your name. Prefer a credit note where your local rules require one.",
-    "quote": "It will become editable again, and the change will be recorded in the audit log with your name."
+    "invoice": "Tornerà modificabile e la modifica verrà registrata nel registro attività con il tuo nome. Preferisci una nota di credito dove le norme locali la richiedono.",
+    "quote": "Tornerà modificabile e la modifica verrà registrata nel registro attività con il tuo nome."
   },
-  "unlocked": "Unlocked for editing",
-  "relocked": "Locked again",
-  "reopenedTitle": "This document has been unlocked for editing",
-  "reopenedBody": "It stays editable until it is locked again.",
-  "failed": "Could not change the lock"
+  "unlocked": "Sbloccato per la modifica",
+  "relocked": "Bloccato di nuovo",
+  "reopenedTitle": "Questo documento è stato sbloccato per la modifica",
+  "reopenedBody": "Resta modificabile finché non viene bloccato di nuovo.",
+  "failed": "Impossibile modificare il blocco"
 }

+ 93 - 93
messages/it/integrations.json

@@ -40,19 +40,19 @@
       "conference": "Link per videochiamate"
     },
     "sms": {
-      "send": "Text messages out",
-      "receive": "Replies back in"
+      "send": "SMS in uscita",
+      "receive": "Risposte in entrata"
     },
     "whatsapp": {
-      "send": "WhatsApp messages out",
-      "receive": "Replies back in"
+      "send": "Messaggi WhatsApp in uscita",
+      "receive": "Risposte in entrata"
     },
     "telegram": {
-      "send": "Telegram messages out",
-      "receive": "Replies back in"
+      "send": "Messaggi Telegram in uscita",
+      "receive": "Risposte in entrata"
     },
     "email": {
-      "send": "Email out"
+      "send": "Email in uscita"
     },
     "vehicle": {
       "lookup": "Ricerca per targa e VIN",
@@ -131,19 +131,19 @@
     "lockedAi": "Collega un fornitore di IA per usare le funzioni di IA nella tua officina.",
     "ownAppTitle": "Questa installazione usa la tua app presso il provider",
     "redirectUri": "URI di reindirizzamento da registrare presso il provider:",
-    "sendTestEmail": "Send test email",
-    "testEmailSent": "Test email sent to {email}",
-    "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.",
-    "inboundUrl": "Inbound webhook URL",
-    "inboundHintSecret": "Paste this URL into the vendor's inbound message settings. It carries a secret that identifies your workshop, so keep it private.",
-    "inboundHintMeta": "Paste this URL as the callback URL in your Meta app, with the verify token you entered above, and subscribe to messages.",
+    "sendTestEmail": "Invia email di prova",
+    "testEmailSent": "Email di prova inviata a {email}",
+    "testEmailHint": "Un'email di prova arriva al tuo indirizzo tramite questo provider: così verifichi l'indirizzo mittente e le regole di invio, cosa che il controllo delle chiavi non può fare.",
+    "inboundUrl": "URL del webhook in entrata",
+    "inboundHintSecret": "Incolla questo URL nelle impostazioni dei messaggi in entrata del provider. Contiene un segreto che identifica la tua officina, quindi tienilo riservato.",
+    "inboundHintMeta": "Incolla questo URL come URL di callback nella tua app Meta, con il token di verifica inserito sopra, e iscriviti ai messaggi.",
     "inboundHintStripe": "Aggiungi questo URL nella dashboard di Stripe sotto Developers, Webhooks, iscritto a checkout.session.completed. Poi incolla il segreto di firma mostrato da Stripe nel campo segreto del webhook qui, così le notifiche possono essere verificate.",
     "inboundHintVipps": "Inserisci questo URL come URL di callback nel portale Vipps MobilePay. Vipps richiede anche condizioni di vendita pubblicate, impostate in Impostazioni, Pagamento.",
     "inboundHintPaypal": "Aggiungi questo URL nella dashboard sviluppatori di PayPal sotto Webhooks, iscritto a PAYMENT.CAPTURE.COMPLETED.",
-    "copy": "Copy",
-    "copied": "Copied",
-    "updateKeys": "Update keys",
-    "updateKeysHint": "The last check failed. Enter the keys again to try once more.",
+    "copy": "Copia",
+    "copied": "Copiato",
+    "updateKeys": "Aggiorna le chiavi",
+    "updateKeysHint": "L'ultimo controllo non è riuscito. Inserisci di nuovo le chiavi per riprovare.",
     "inspectionSync": {
       "title": "Sincronizzazione revisioni",
       "vehicles": "{count} veicoli con targa in questa officina",
@@ -244,8 +244,8 @@
       "description": "Aggiungi una riunione Zoom a un ordine di lavoro programmato e tieni il link sull'ordine, per una diagnosi a distanza o per illustrare i risultati al cliente.",
       "tenantHelp": "Nello Zoom App Marketplace crea un'app General (user-managed), aggiungi l'URI di reindirizzamento qui sotto, aggiungi gli scope meeting:write:meeting, meeting:update:meeting, meeting:delete:meeting, meeting:read:meeting e user:read:user, quindi incolla qui client ID e secret.",
       "fields": {
-        "clientId": "Client ID",
-        "clientSecret": "Client secret"
+        "clientId": "ID client",
+        "clientSecret": "Segreto client"
       },
       "settings": {
         "autoCreate": "Crea automaticamente una riunione Zoom per ogni ordine di lavoro programmato",
@@ -256,155 +256,155 @@
       }
     },
     "twilio-sms": {
-      "description": "Send and receive text messages through a Twilio number. Reminders, ready-for-pickup messages and the replies that come back.",
+      "description": "Invia e ricevi SMS tramite un numero Twilio. Promemoria, avvisi di veicolo pronto per il ritiro e le risposte dei clienti.",
       "fields": {
         "accountSid": "Account SID",
         "authToken": "Auth token"
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Invia da questo numero"
       }
     },
     "vonage-sms": {
-      "description": "Send and receive text messages through a Vonage number.",
+      "description": "Invia e ricevi SMS tramite un numero Vonage.",
       "fields": {
-        "apiKey": "API key",
-        "apiSecret": "API secret",
-        "signatureSecret": "Signature secret",
-        "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."
+        "apiKey": "Chiave API",
+        "apiSecret": "Segreto API",
+        "signatureSecret": "Segreto di firma",
+        "signatureSecretHelp": "Dalla dashboard di Vonage, sotto API settings. Se impostato, i messaggi in entrata vengono accettati solo se firmati da Vonage. Senza di esso, viene controllato solo il segreto nell'URL del webhook."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Invia da questo numero"
       }
     },
     "telnyx-sms": {
-      "description": "Send and receive text messages through a Telnyx number.",
+      "description": "Invia e ricevi SMS tramite un numero Telnyx.",
       "fields": {
-        "apiKey": "API key",
-        "webhookPublicKey": "Webhook public key",
-        "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."
+        "apiKey": "Chiave API",
+        "webhookPublicKey": "Chiave pubblica del webhook",
+        "webhookPublicKeyHelp": "Dal portale Telnyx, sotto Account settings, Keys and credentials, Public key. Se impostata, i messaggi in entrata vengono accettati solo se firmati da Telnyx. Senza di essa, viene controllato solo il segreto nell'URL del webhook."
       },
       "settings": {
-        "phoneNumber": "Send from this number"
+        "phoneNumber": "Invia da questo numero"
       }
     },
     "whatsapp-meta": {
-      "description": "Message customers on WhatsApp through Meta directly. Photos of what you found, and the conversation that follows.",
+      "description": "Scrivi ai clienti su WhatsApp direttamente tramite Meta. Le foto di ciò che hai trovato e la conversazione che segue.",
       "fields": {
-        "phoneNumberId": "Phone number ID",
-        "accessToken": "Access token",
-        "verifyToken": "Webhook verify token",
-        "appSecret": "App secret",
-        "apiVersion": "Graph API version",
-        "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."
+        "phoneNumberId": "ID del numero di telefono",
+        "accessToken": "Token di accesso",
+        "verifyToken": "Token di verifica del webhook",
+        "appSecret": "Chiave segreta dell'app",
+        "apiVersion": "Versione della Graph API",
+        "appSecretHelp": "Meta firma ogni consegna con questa chiave. Finché non viene inserita, i messaggi inviati al webhook vengono rifiutati, perché altrimenti chiunque conosca l'URL potrebbe scrivere a nome dei tuoi clienti."
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Invia messaggi su questo canale",
+        "phoneNumber": "Invia da questo numero",
+        "templateName": "Modello per riaprire una conversazione",
+        "templateLanguage": "Lingua del modello",
+        "templateVariables": "Valori del modello, in ordine",
+        "mediaTemplateName": "Modello per un messaggio con foto",
+        "mediaTemplateLanguage": "Lingua del modello con foto",
+        "mediaTemplateVariables": "Valori del modello con foto, in ordine"
       }
     },
     "whatsapp-twilio": {
-      "description": "Message customers on WhatsApp through a Twilio number, if Twilio is who sold you one.",
+      "description": "Scrivi ai clienti su WhatsApp tramite un numero Twilio, se è Twilio ad avertelo fornito.",
       "fields": {
         "accountSid": "Account SID",
         "authToken": "Auth token",
-        "messagingServiceSid": "Messaging service SID"
+        "messagingServiceSid": "SID del Messaging Service"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "phoneNumber": "Send from this number",
-        "templateName": "Template for reopening a conversation",
-        "templateLanguage": "Template language",
-        "templateVariables": "Template values, in order",
-        "mediaTemplateName": "Template for a message with a photo",
-        "mediaTemplateLanguage": "Photo template language",
-        "mediaTemplateVariables": "Photo template values, in order"
+        "enabled": "Invia messaggi su questo canale",
+        "phoneNumber": "Invia da questo numero",
+        "templateName": "Modello per riaprire una conversazione",
+        "templateLanguage": "Lingua del modello",
+        "templateVariables": "Valori del modello, in ordine",
+        "mediaTemplateName": "Modello per un messaggio con foto",
+        "mediaTemplateLanguage": "Lingua del modello con foto",
+        "mediaTemplateVariables": "Valori del modello con foto, in ordine"
       }
     },
     "telegram": {
-      "description": "A Telegram bot that reaches customers who use it, and brings their replies into the inbox.",
+      "description": "Un bot Telegram che raggiunge i clienti che lo usano e porta le loro risposte nella posta in arrivo.",
       "fields": {
-        "botToken": "Bot token"
+        "botToken": "Token del bot"
       },
       "settings": {
-        "enabled": "Send messages on this channel",
-        "botUsername": "Bot username"
+        "enabled": "Invia messaggi su questo canale",
+        "botUsername": "Nome utente del bot"
       }
     },
     "smtp": {
-      "description": "Send invoices and reminders through your own mail server, rather than the platform mail.",
+      "description": "Invia fatture e promemoria tramite il tuo server di posta, anziché la posta della piattaforma.",
       "fields": {
         "host": "Server",
-        "port": "Port",
-        "user": "Username",
+        "port": "Porta",
+        "user": "Nome utente",
         "pass": "Password"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "secure": "Connect over TLS from the start",
-        "requireTls": "Require the server to upgrade to TLS",
-        "rejectUnauthorized": "Reject a certificate that does not check out"
+        "fromEmail": "Invia da questo indirizzo",
+        "fromName": "Nome mostrato come mittente",
+        "secure": "Connetti tramite TLS fin dall'inizio",
+        "requireTls": "Richiedi che il server passi a TLS",
+        "rejectUnauthorized": "Rifiuta un certificato che non risulta valido"
       }
     },
     "resend": {
-      "description": "Send invoices and reminders through Resend.",
+      "description": "Invia fatture e promemoria tramite Resend.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "Chiave API"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Invia da questo indirizzo",
+        "fromName": "Nome mostrato come mittente"
       }
     },
     "postmark": {
-      "description": "Send invoices and reminders through Postmark.",
+      "description": "Invia fatture e promemoria tramite Postmark.",
       "fields": {
-        "apiKey": "Server token"
+        "apiKey": "Token del server"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Invia da questo indirizzo",
+        "fromName": "Nome mostrato come mittente"
       }
     },
     "mailgun": {
-      "description": "Send invoices and reminders through Mailgun.",
+      "description": "Invia fatture e promemoria tramite Mailgun.",
       "fields": {
-        "apiKey": "API key",
-        "domain": "Sending domain"
+        "apiKey": "Chiave API",
+        "domain": "Dominio di invio"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender",
-        "region": "Region the domain is in"
+        "fromEmail": "Invia da questo indirizzo",
+        "fromName": "Nome mostrato come mittente",
+        "region": "Regione del dominio"
       }
     },
     "sendgrid": {
-      "description": "Send invoices and reminders through SendGrid.",
+      "description": "Invia fatture e promemoria tramite SendGrid.",
       "fields": {
-        "apiKey": "API key"
+        "apiKey": "Chiave API"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Invia da questo indirizzo",
+        "fromName": "Nome mostrato come mittente"
       }
     },
     "amazon-ses": {
-      "description": "Send invoices and reminders through Amazon SES.",
+      "description": "Invia fatture e promemoria tramite Amazon SES.",
       "fields": {
-        "accessKeyId": "Access key ID",
-        "secretAccessKey": "Secret access key",
-        "region": "Region"
+        "accessKeyId": "ID chiave di accesso",
+        "secretAccessKey": "Chiave di accesso segreta",
+        "region": "Regione"
       },
       "settings": {
-        "fromEmail": "Send from this address",
-        "fromName": "Name shown as the sender"
+        "fromEmail": "Invia da questo indirizzo",
+        "fromName": "Nome mostrato come mittente"
       }
     },
     "vegvesen": {

+ 1 - 1
messages/it/inventory.json

@@ -131,7 +131,7 @@
     "saveChanges": "Salva modifiche",
     "addPart": "Aggiungi ricambio"
   },
-  "openMenu": "Open menu",
+  "openMenu": "Apri menu",
   "history": {
     "title": "Storico magazzino",
     "description": "Tutte le modifiche registrate a {name}, dalla più recente.",

+ 4 - 4
messages/it/laborPresets.json

@@ -16,7 +16,7 @@
   "actions": {
     "edit": "Modifica",
     "delete": "Elimina",
-    "openMenu": "Open menu"
+    "openMenu": "Apri menu"
   },
   "deletePreset": {
     "title": "Elimina modello di manodopera",
@@ -43,8 +43,8 @@
     "cancel": "Annulla",
     "create": "Crea",
     "saveChanges": "Salva modifiche",
-    "itemQty": "Qty",
-    "itemQtyOrHours": "Unit / Hours",
+    "itemQty": "Qtà",
+    "itemQtyOrHours": "Unità / Ore",
     "hourlyTag": "HR",
     "serviceTag": "SVC",
     "partsTitle": "Ricambi",
@@ -63,7 +63,7 @@
     "noPackages": "Nessun modello di manodopera trovato.",
     "items": "{count} voci",
     "totalHours": "{hours}h in totale",
-    "totalUnits": "{units} unit(s)",
+    "totalUnits": "{units} unità",
     "totalParts": "{count} ricambi"
   },
   "errors": {

+ 3 - 3
messages/it/messages.json

@@ -30,8 +30,8 @@
     "deleteDescription": "Tutti i messaggi con {name} verranno eliminati definitivamente. Questa azione non può essere annullata.",
     "deleted": "Conversazione eliminata",
     "deleteError": "Impossibile eliminare la conversazione",
-    "back": "Back",
-    "conversationMenu": "Conversation menu",
+    "back": "Indietro",
+    "conversationMenu": "Menu conversazione",
     "searchPlaceholder": "Cerca conversazioni",
     "noSearchResults": "Nessuna conversazione corrisponde alla ricerca",
     "now": "ora"
@@ -47,7 +47,7 @@
     "messageDeleted": "Messaggio eliminato",
     "deleteError": "Impossibile eliminare il messaggio",
     "sendError": "Impossibile inviare l'SMS",
-    "sendMessage": "Send message"
+    "sendMessage": "Invia messaggio"
   },
   "sendDialog": {
     "send": "Invia {label}",

+ 1 - 1
messages/it/navigation.json

@@ -112,7 +112,7 @@
     "reports": "Report",
     "timesheets": "Fogli ore",
     "settings": "Impostazioni",
-    "superAdmin": "Super Admin",
+    "superAdmin": "Super amministratore",
     "adminPanel": "Pannello di amministrazione",
     "organizations": "Organizzazioni",
     "noOrganization": "Nessuna organizzazione",

+ 1 - 1
messages/it/notifications.json

@@ -7,5 +7,5 @@
     "delete": "Elimina",
     "cancel": "Annulla"
   },
-  "openNotifications": "Open notifications"
+  "openNotifications": "Apri notifiche"
 }

+ 7 - 7
messages/it/pdf.json

@@ -32,8 +32,8 @@
     "total": "Totale",
     "labor": "Manodopera",
     "hours": "Ore",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "ore",
+    "unit": "unità",
     "rate": "Tariffa",
     "ratePerHour": "{rate}/ora",
     "subtotal": "Subtotale",
@@ -75,7 +75,7 @@
     "professionalWorkshop": "Gestione Officina Professionale",
     "tel": "Tel: {phone}",
     "org": "Org: {org}",
-    "qtyOrHours": "Unit / Hours",
+    "qtyOrHours": "Unità / Ore",
     "customFieldsTitle": "Informazioni aggiuntive",
     "telegramConnect": "Scrivici su Telegram",
     "taxRegistrationLabel": "N. {name}"
@@ -96,8 +96,8 @@
     "total": "Totale",
     "labor": "Manodopera",
     "hours": "Ore",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "ore",
+    "unit": "unità",
     "rate": "Tariffa",
     "ratePerHour": "{rate}/ora",
     "subtotal": "Subtotale",
@@ -115,7 +115,7 @@
     "validityFooter30": "Questo preventivo è valido per 30 giorni",
     "viewPortal": "Visualizza il tuo portale: {url}",
     "tel": "Tel: {phone}",
-    "qtyOrHours": "Unit / Hours",
+    "qtyOrHours": "Unità / Ore",
     "customFieldsTitle": "Informazioni aggiuntive",
     "quoteNumberLabel": "N. preventivo",
     "validUntilLabel": "Valido fino al"
@@ -193,6 +193,6 @@
     "mileageColMarine": "Ore Motore"
   },
   "common": {
-    "poweredBy": "Powered by"
+    "poweredBy": "Realizzato con"
   }
 }

+ 1 - 1
messages/it/reminders.json

@@ -8,7 +8,7 @@
   "searchVehicle": "Cerca veicoli...",
   "noVehicle": "Nessun veicolo trovato.",
   "pickDate": "Seleziona una data",
-  "openMenu": "Open menu",
+  "openMenu": "Apri menu",
   "relatesTo": "Riguarda (opzionale)",
   "selectCustomer": "Cliente (opzionale)",
   "noneOption": "Nessuno",

+ 85 - 85
messages/it/reports.json

@@ -329,94 +329,94 @@
     "jobsClocked": "Lavori registrati"
   },
   "pdf": {
-    "reportTitle": "Business Report",
-    "revenueSection": "Revenue Report",
-    "taxSection": "Tax Report",
-    "pastDueSection": "Past Due Invoices",
-    "servicesSection": "Services Report",
-    "customersSection": "Customers Report",
-    "techniciansSection": "Technicians Report",
-    "partsSection": "Parts Usage Report",
-    "jobAnalyticsSection": "Job Analytics",
-    "retentionSection": "Customer Retention",
-    "inventorySection": "Inventory Report",
+    "reportTitle": "Report Aziendale",
+    "revenueSection": "Report Ricavi",
+    "taxSection": "Report Imposte",
+    "pastDueSection": "Fatture Scadute",
+    "servicesSection": "Report Servizi",
+    "customersSection": "Report Clienti",
+    "techniciansSection": "Report Tecnici",
+    "partsSection": "Report Utilizzo Ricambi",
+    "jobAnalyticsSection": "Analisi Lavori",
+    "retentionSection": "Fidelizzazione Clienti",
+    "inventorySection": "Report Inventario",
     "monthlyBreakdown": "Ripartizione Mensile",
-    "revenueByType": "Revenue by Type",
-    "taxByRate": "Tax by Rate",
-    "servicesByStatus": "By Status",
-    "servicesByType": "By Type",
-    "topCustomers": "Top Customers",
-    "topServiceTypes": "Top Service Types",
-    "topReturning": "Top Returning Customers",
-    "dayOfWeek": "Jobs by Day of Week",
-    "monthlyTrend": "Monthly Trend",
-    "lowStock": "Low Stock Items",
-    "revenue": "Revenue",
-    "collected": "Collected",
-    "outstanding": "Outstanding",
-    "services": "Services",
-    "partsCost": "Parts Cost",
+    "revenueByType": "Ricavi per Tipo",
+    "taxByRate": "Imposte per Aliquota",
+    "servicesByStatus": "Per Stato",
+    "servicesByType": "Per Tipo",
+    "topCustomers": "Migliori Clienti",
+    "topServiceTypes": "Tipi di Servizio Principali",
+    "topReturning": "Migliori Clienti Ricorrenti",
+    "dayOfWeek": "Lavori per Giorno della Settimana",
+    "monthlyTrend": "Andamento Mensile",
+    "lowStock": "Articoli Sotto Scorta",
+    "revenue": "Ricavi",
+    "collected": "Incassato",
+    "outstanding": "In Sospeso",
+    "services": "Servizi",
+    "partsCost": "Costo Ricambi",
     "partsNetProfit": "Profitto Netto Ricambi",
     "laborRevenue": "Manodopera",
-    "netProfit": "Net Profit",
-    "month": "Month",
-    "count": "Count",
-    "type": "Type",
-    "status": "Status",
-    "name": "Name",
-    "company": "Company",
-    "totalSpent": "Total Spent",
-    "customer": "Customer",
-    "invoiceNumber": "Invoice #",
-    "totalAmount": "Total Amount",
-    "amountDue": "Amount Due",
-    "dueDate": "Due Date",
-    "daysPastDue": "Days Past Due",
-    "totalPastDue": "Total Past Due",
-    "totalAmountDue": "Total Amount Due",
-    "over30": "Over 30 Days",
-    "over60": "Over 60 Days",
-    "over90": "Over 90 Days",
-    "taxCollected": "Tax Collected",
-    "taxableAmount": "Taxable Amount",
-    "taxRate": "Tax Rate",
-    "invoiceCount": "Invoice Count",
-    "invoices": "Invoices",
-    "totalServices": "Total Services",
-    "totalCustomers": "Total Customers",
-    "activeCustomers": "Active Customers",
-    "technician": "Technician",
-    "jobs": "Jobs",
-    "totalRevenue": "Total Revenue",
-    "avgRevenue": "Avg Revenue",
-    "totalHours": "Total Hours",
-    "avgHours": "Avg Hours",
-    "totalJobs": "Total Jobs",
-    "partName": "Part Name",
-    "partNumber": "Part #",
-    "usageCount": "Usage Count",
-    "totalQty": "Total Qty",
-    "totalPartsRevenue": "Parts Revenue",
+    "netProfit": "Profitto Netto",
+    "month": "Mese",
+    "count": "Conteggio",
+    "type": "Tipo",
+    "status": "Stato",
+    "name": "Nome",
+    "company": "Azienda",
+    "totalSpent": "Totale Speso",
+    "customer": "Cliente",
+    "invoiceNumber": "N. Fattura",
+    "totalAmount": "Importo Totale",
+    "amountDue": "Importo Dovuto",
+    "dueDate": "Data di Scadenza",
+    "daysPastDue": "Giorni di Ritardo",
+    "totalPastDue": "Totale Scaduto",
+    "totalAmountDue": "Importo Totale Dovuto",
+    "over30": "Oltre 30 Giorni",
+    "over60": "Oltre 60 Giorni",
+    "over90": "Oltre 90 Giorni",
+    "taxCollected": "Imposta Riscossa",
+    "taxableAmount": "Imponibile",
+    "taxRate": "Aliquota",
+    "invoiceCount": "Numero Fatture",
+    "invoices": "Fatture",
+    "totalServices": "Totale Servizi",
+    "totalCustomers": "Clienti Totali",
+    "activeCustomers": "Clienti Attivi",
+    "technician": "Tecnico",
+    "jobs": "Lavori",
+    "totalRevenue": "Ricavi Totali",
+    "avgRevenue": "Ricavo Medio",
+    "totalHours": "Ore Totali",
+    "avgHours": "Ore Medie",
+    "totalJobs": "Totale Lavori",
+    "partName": "Nome Ricambio",
+    "partNumber": "N. Ricambio",
+    "usageCount": "Utilizzi",
+    "totalQty": "Qtà Totale",
+    "totalPartsRevenue": "Ricavi Ricambi",
     "totalPartsCost": "Costo Ricambi",
     "totalPartsNetProfit": "Profitto Netto",
-    "totalPartsUsed": "Parts Used",
-    "serviceType": "Service Type",
-    "avgValue": "Avg Value",
-    "avgJobValue": "Avg Job Value",
-    "returningCustomers": "Returning",
-    "newCustomers": "New",
-    "totalActive": "Total Active",
-    "avgTimeBetweenVisits": "Avg Days Between Visits",
-    "avgDaysBetweenVisits": "Avg Days",
-    "visits": "Visits",
-    "days": "days",
-    "totalParts": "Total Parts",
-    "totalItems": "Total Items",
-    "totalValue": "Total Value",
-    "totalSellValue": "Sell Value",
-    "quantity": "Qty",
-    "minQuantity": "Min Qty",
-    "unitCost": "Unit Cost",
+    "totalPartsUsed": "Ricambi Utilizzati",
+    "serviceType": "Tipo di Servizio",
+    "avgValue": "Valore Medio",
+    "avgJobValue": "Valore Medio Lavoro",
+    "returningCustomers": "Ricorrenti",
+    "newCustomers": "Nuovi",
+    "totalActive": "Totale Attivi",
+    "avgTimeBetweenVisits": "Media Giorni tra le Visite",
+    "avgDaysBetweenVisits": "Giorni Medi",
+    "visits": "Visite",
+    "days": "giorni",
+    "totalParts": "Ricambi Totali",
+    "totalItems": "Articoli Totali",
+    "totalValue": "Valore Totale",
+    "totalSellValue": "Valore di Vendita",
+    "quantity": "Qtà",
+    "minQuantity": "Qtà Min",
+    "unitCost": "Costo Unitario",
     "vehiclesSection": "Report Veicolo",
     "vehicleLabel": "Veicolo",
     "totalCost": "Costo Totale",
@@ -427,7 +427,7 @@
   },
   "empty": "Nessun dato caricato. Clicca su Aggiorna per caricare il report.",
   "pagination": {
-    "previousPage": "Previous page",
-    "nextPage": "Next page"
+    "previousPage": "Pagina precedente",
+    "nextPage": "Pagina successiva"
   }
 }

+ 15 - 15
messages/it/settings.json

@@ -65,7 +65,7 @@
       },
       "telegram": {
         "title": "Telegram",
-        "description": "Telegram bot & messaging"
+        "description": "Bot Telegram e messaggistica"
       },
       "customerPortal": {
         "title": "Portale clienti",
@@ -192,7 +192,7 @@
     "serviceTypeDescription": "Seleziona il tipo di servizio offerto dalla tua officina. Questo cambia le etichette dei campi in tutta l'applicazione.",
     "automotive": "Automobilistico",
     "automotiveDescription": "Auto, camion e altri veicoli stradali",
-    "marineService": "Marine",
+    "marineService": "Nautico",
     "marineServiceDescription": "Barche, yacht e imbarcazioni"
   },
   "account": {
@@ -418,9 +418,9 @@
     "failedRemoveMember": "Rimozione membro non riuscita",
     "memberRoleUpdated": "Ruolo membro aggiornato",
     "failedUpdateRole": "Aggiornamento ruolo non riuscito",
-    "removeMember": "Remove member",
-    "cancelInvite": "Cancel invitation",
-    "editRole": "Edit role",
+    "removeMember": "Rimuovi membro",
+    "cancelInvite": "Annulla invito",
+    "editRole": "Modifica ruolo",
     "technician": "Tecnico",
     "technicianHint": "Può ricevere lavori assegnati e usare l’app tecnico",
     "technicianFailed": "Impossibile modificare",
@@ -1061,8 +1061,8 @@
     "fieldDeleted": "Campo personalizzato eliminato",
     "failedSave": "Impossibile salvare il campo",
     "failedDelete": "Impossibile eliminare",
-    "edit": "Edit",
-    "delete": "Delete",
+    "edit": "Modifica",
+    "delete": "Elimina",
     "unassigned": "Non assegnato",
     "defaultValue": "Valore predefinito",
     "defaultValueHint": "Precompilato nei nuovi record e stampato finché non viene inserito un valore.",
@@ -1370,7 +1370,7 @@
         "sand": "Sabbia"
       }
     },
-    "copyUrl": "Copy portal URL"
+    "copyUrl": "Copia URL del portale"
   },
   "email": {
     "title": "Provider e-mail",
@@ -1446,7 +1446,7 @@
     "failedSave": "Salvataggio impostazioni non riuscito",
     "testSentTo": "SMS di test inviato a {phone}",
     "testFailed": "Test SMS non riuscito",
-    "copyWebhookUrl": "Copy webhook URL"
+    "copyWebhookUrl": "Copia URL webhook"
   },
   "subscription": {
     "title": "Piano di abbonamento",
@@ -1497,7 +1497,7 @@
     "resumeSuccess": "Abbonamento ripreso con successo",
     "resumeError": "Ripresa dell'abbonamento non riuscita",
     "billingPortalError": "Impossibile aprire il portale di fatturazione",
-    "checkoutError": "Failed to start checkout",
+    "checkoutError": "Impossibile avviare il pagamento",
     "upgradeTitle": "Aggiorna piano",
     "upgradeDescription": "Sblocca più funzionalità aggiornando il tuo piano.",
     "upgradeToProDescription": "Aggiorna per sbloccare clienti illimitati, membri del team, report, SMTP, accesso API e altro.",
@@ -1557,7 +1557,7 @@
     "biweekly": "Ogni 2 settimane",
     "monthly": "Mensile",
     "bimonthly": "Ogni 2 mesi",
-    "quarterly": "Ogni 4 mesi",
+    "quarterly": "Ogni 3 mesi",
     "semiannually": "Ogni 6 mesi",
     "yearly": "Annuale",
     "dateRangeLabel": "Periodo",
@@ -1596,10 +1596,10 @@
     "deleted": "Pianificazione report eliminata",
     "toggledOn": "Pianificazione report attivata",
     "toggledOff": "Pianificazione report disattivata",
-    "failedSave": "Failed to save",
-    "failedSend": "Failed to send",
-    "failedToggle": "Failed to toggle",
-    "failedDelete": "Failed to delete",
+    "failedSave": "Salvataggio non riuscito",
+    "failedSend": "Invio non riuscito",
+    "failedToggle": "Impossibile cambiare lo stato",
+    "failedDelete": "Eliminazione non riuscita",
     "noMembers": "Nessun membro trovato",
     "addRecipient": "Aggiungi destinatario...",
     "searchMembers": "Cerca membri...",

+ 6 - 6
messages/it/share.json

@@ -34,8 +34,8 @@
     "total": "Totale",
     "labor": "Manodopera",
     "hours": "Ore",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "ore",
+    "unit": "unità",
     "qtyOrHours": "Unità / Ore",
     "rate": "Tariffa",
     "ratePerHour": "{rate}/ora",
@@ -93,8 +93,8 @@
     "labor": "Manodopera",
     "laborDescription": "Descrizione",
     "hours": "Ore",
-    "hrs": "hrs",
-    "unit": "unit",
+    "hrs": "ore",
+    "unit": "unità",
     "qtyOrHours": "Unità / Ore",
     "rate": "Tariffa",
     "ratePerHour": "{rate}/ora",
@@ -200,7 +200,7 @@
     "privacyNotice": "Questo rapporto le viene fornito dall'officina che ha eseguito il controllo. È consultabile da chiunque disponga di questo link: la preghiamo di non inoltrarlo. Contatti l'officina per revocare il link o cancellare i suoi dati."
   },
   "terms": {
-    "title": "Condizioni di Vendita (Salgsvilkår)",
+    "title": "Condizioni di Vendita",
     "contact": "Contatto",
     "tel": "Tel: {phone}"
   },
@@ -222,7 +222,7 @@
     "submitError": "Invio della richiesta non riuscito"
   },
   "common": {
-    "poweredBy": "Powered by",
+    "poweredBy": "Realizzato con",
     "termsOfSale": "Condizioni di Vendita",
     "portalMessage": "Visualizza i tuoi veicoli, fatture e altro nel tuo",
     "customerPortal": "portale clienti",

+ 1 - 1
messages/it/statusReport.json

@@ -14,7 +14,7 @@
     "createAndSend": "Crea e invia",
     "cancel": "Annulla",
     "uploadFailed": "Caricamento video non riuscito",
-    "createReportFailed": "Failed to create status report",
+    "createReportFailed": "Impossibile creare il rapporto di stato",
     "created": "Rapporto di stato creato",
     "noVideo": "Carica prima un video",
     "removeVideo": "Rimuovi video",

+ 3 - 3
messages/it/telegram.json

@@ -5,8 +5,8 @@
     "label": "Token del bot",
     "placeholder": "Inserisci il token da @BotFather",
     "help": "Crea un bot tramite @BotFather su Telegram per ottenere il tuo token.",
-    "show": "Show token",
-    "hide": "Hide token"
+    "show": "Mostra token",
+    "hide": "Nascondi token"
   },
   "botUsername": {
     "label": "Nome utente del bot",
@@ -20,7 +20,7 @@
     "title": "Link di connessione cliente",
     "description": "Condividi questo link con i clienti per connettersi al tuo bot. Sostituisci il segnaposto dell'ID cliente con l'ID reale.",
     "copied": "Link copiato!",
-    "copy": "Copy deep link"
+    "copy": "Copia link diretto"
   },
   "test": {
     "title": "Messaggio di prova",

+ 1 - 1
messages/it/telegramMessages.json

@@ -31,7 +31,7 @@
     "messageDeleted": "Messaggio eliminato",
     "deleteError": "Eliminazione messaggio fallita",
     "sendError": "Invio messaggio fallito",
-    "sendMessage": "Send message"
+    "sendMessage": "Invia messaggio"
   },
   "sendDialog": {
     "send": "Invia {label}",

+ 24 - 24
messages/it/vehicles.json

@@ -28,10 +28,10 @@
     "unarchiveError": "Impossibile ripristinare il veicolo",
     "deleteError": "Impossibile eliminare il veicolo",
     "error": "Impossibile caricare i veicoli",
-    "viewTable": "Table view",
-    "viewGrid": "Grid view",
-    "viewLargeGrid": "Large grid view",
-    "openMenu": "Open menu",
+    "viewTable": "Vista tabella",
+    "viewGrid": "Vista griglia",
+    "viewLargeGrid": "Vista griglia grande",
+    "openMenu": "Apri menu",
     "inspectionOverdue": "Revisione scaduta",
     "inspectionDue30": "Scade entro 30 giorni",
     "inspectionDue90": "Scade entro 90 giorni",
@@ -95,8 +95,8 @@
     "severityModerate": "Moderato — segnalato da alcuni proprietari",
     "severityUncommon": "Non comune — segnalato da pochi proprietari",
     "severityRare": "Raro — segnalazioni isolate ma critico quando si verifica",
-    "openMenu": "Open menu",
-    "dismissMaintenance": "Dismiss",
+    "openMenu": "Apri menu",
+    "dismissMaintenance": "Ignora",
     "inspectionDue": "Revisione il {date}",
     "inspectionCheckedAt": "Verificato nel registro il {date}",
     "notRegistered": "Non immatricolato",
@@ -184,10 +184,10 @@
     "showing": "Visualizzando {start}-{end} di {total}",
     "perPage": "per pagina",
     "page": "Pagina {page} di {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Prima pagina",
+    "previousPage": "Pagina precedente",
+    "nextPage": "Pagina successiva",
+    "lastPage": "Ultima pagina"
   },
   "notes": {
     "addNote": "Aggiungi Nota",
@@ -213,11 +213,11 @@
     "noteCreated": "Nota creata",
     "titleRequired": "Titolo e contenuto sono obbligatori",
     "saveError": "Impossibile salvare la nota",
-    "openMenu": "Open menu",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "openMenu": "Apri menu",
+    "firstPage": "Prima pagina",
+    "previousPage": "Pagina precedente",
+    "nextPage": "Pagina successiva",
+    "lastPage": "Ultima pagina"
   },
   "findings": {
     "sectionTitle": "Osservazioni",
@@ -266,11 +266,11 @@
     "showing": "Visualizzando {start}-{end} di {total}",
     "perPage": "per pagina",
     "page": "Pagina {page} di {totalPages}",
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page",
-    "openMenu": "Open menu",
+    "firstPage": "Prima pagina",
+    "previousPage": "Pagina precedente",
+    "nextPage": "Pagina successiva",
+    "lastPage": "Ultima pagina",
+    "openMenu": "Apri menu",
     "concernLabel": "A quale punto risponde?",
     "concernNone": "Non è qualcosa che ha segnalato il cliente"
   },
@@ -373,10 +373,10 @@
     "archiveError": "Impossibile archiviare il veicolo"
   },
   "serviceRecords": {
-    "firstPage": "First page",
-    "previousPage": "Previous page",
-    "nextPage": "Next page",
-    "lastPage": "Last page"
+    "firstPage": "Prima pagina",
+    "previousPage": "Pagina precedente",
+    "nextPage": "Pagina successiva",
+    "lastPage": "Ultima pagina"
   },
   "inspectionReminders": {
     "title": "Promemoria revisione",

+ 7 - 7
messages/it/workBoard.json

@@ -8,10 +8,10 @@
     "week": "Settimana",
     "presenter": "Presentatore",
     "addTechnician": "Aggiungi Tecnico",
-    "previousWeek": "Previous week",
-    "nextWeek": "Next week",
-    "previousDay": "Previous day",
-    "nextDay": "Next day",
+    "previousWeek": "Settimana precedente",
+    "nextWeek": "Settimana successiva",
+    "previousDay": "Giorno precedente",
+    "nextDay": "Giorno successivo",
     "groupBy": "Colonne",
     "byTechnician": "Una colonna per tecnico",
     "byBay": "Una colonna per postazione",
@@ -20,7 +20,7 @@
     "add": "Aggiungi",
     "addBay": "Aggiungi postazione",
     "weekNumber": "Sett. {number}",
-    "lanes": "Colonne",
+    "lanes": "Corsie",
     "showAllLanes": "Mostra tutte",
     "onlyBusyLanes": "Solo con lavoro",
     "layout": "Vista",
@@ -107,8 +107,8 @@
       "waitingParts": "In Attesa di Pezzi",
       "completed": "Completato"
     },
-    "previous": "Previous",
-    "next": "Next",
+    "previous": "Precedente",
+    "next": "Successivo",
     "groupingUnused": "La lavagna di stato raggruppa per stato",
     "connecting": "Connessione…"
   },

+ 1 - 1
messages/it/workOrders.json

@@ -34,7 +34,7 @@
       "total": "Totale"
     },
     "emailSubject": "Aggiornamento Stato Veicolo: {status}",
-    "changeStatus": "Change status",
+    "changeStatus": "Cambia stato",
     "contextMenu": {
       "open": "Apri ordine di lavoro",
       "openVehicle": "Apri veicolo",

+ 1 - 1
messages/lt/admin.json

@@ -117,7 +117,7 @@
     "sendgridApiKeyHint": "Gaukite API raktą iš app.sendgrid.com"
   },
   "common": {
-    "openMenu": "Open menu"
+    "openMenu": "Atidaryti meniu"
   },
   "userDetails": {
     "back": "Atgal į vartotojus",

+ 2 - 2
messages/lt/calendar.json

@@ -144,6 +144,6 @@
       "readOnly": "Užimtas laikas iš prijungto kalendoriaus. Keiskite jį ten, čia atsinaujins per kitą sinchronizaciją."
     }
   },
-  "previousMonth": "Previous month",
-  "nextMonth": "Next month"
+  "previousMonth": "Ankstesnis mėnuo",
+  "nextMonth": "Kitas mėnuo"
 }

+ 2 - 2
messages/lt/customers.json

@@ -20,14 +20,14 @@
     "assignNumbers": "Priskirti numerius",
     "assignNumbersTitle": "Priskirti klientų numerius?",
     "assignNumbersDescription": "{count, plural, one {# klientas dar neturi} few {# klientai dar neturi} many {# klientų dar neturi} other {# klientų dar neturi}} numerio. Kiekvienas gauna kitą numerį iš eilės, seniausi pirmi. Klientai, kurie jau turi numerį, nekeičiami.",
-    "assignNumbersDone": "Sunumeruota klientų: {count}",
+    "assignNumbersDone": "{count, plural, one {Sunumeruotas # klientas} few {Sunumeruoti # klientai} many {Sunumeruota # kliento} other {Sunumeruota # klientų}}",
     "selectedCount": "{count} pasirinkta",
     "clearSelection": "Valyti",
     "batchDelete": "Ištrinti ({count})",
     "batchDeleteTitle": "Ištrinti klientus",
     "batchDeleteDescription": "Ištrinti {count} klientą(-ų)? Bus atsiejamos jų transporto priemonės.",
     "batchDeleteSuccess": "{count} klientas(-ų) ištrintas",
-    "openMenu": "Open menu"
+    "openMenu": "Atidaryti meniu"
   },
   "detail": {
     "backToCustomers": "Grįžti prie klientų",

+ 4 - 4
messages/lt/dashboard.json

@@ -74,8 +74,8 @@
     "noDismissed": "Nėra atmestų transporto priemonių.",
     "dismissedOn": "Atmesta {date}",
     "restore": "Atkurti",
-    "settingsAriaLabel": "Maintenance settings",
-    "dismissAriaLabel": "Dismiss"
+    "settingsAriaLabel": "Priežiūros nustatymai",
+    "dismissAriaLabel": "Atmesti"
   },
   "reminders": {
     "title": "Artėjantys priminimai",
@@ -112,7 +112,7 @@
     "createQuote": "Sukurti pasiūlymą",
     "itemsRequested": "{count, plural, one {# elementas prašomas} other {# elementai prašomi}}",
     "noData": "Laukiančių pasiūlymų užklausų nėra.",
-    "dismissAriaLabel": "Dismiss quote request"
+    "dismissAriaLabel": "Atmesti pasiūlymo užklausą"
   },
   "quoteResponses": {
     "title": "Klientų atsakymai į pasiūlymus",
@@ -124,7 +124,7 @@
     "viewQuote": "Peržiūrėti pasiūlymą",
     "view": "Peržiūrėti",
     "noData": "Klientų atsakymų nėra.",
-    "dismissAriaLabel": "Dismiss response"
+    "dismissAriaLabel": "Atmesti atsakymą"
   },
   "recentCompleted": {
     "title": "Neseniai užbaigti",

+ 17 - 17
messages/lt/documentLock.json

@@ -1,27 +1,27 @@
 {
   "lockedTitle": {
     "invoice": {
-      "sent": "This invoice is locked because it has been sent",
-      "paid": "This invoice is locked because it has been paid"
+      "sent": "Ši sąskaita užrakinta, nes ji jau išsiųsta",
+      "paid": "Ši sąskaita užrakinta, nes ji jau apmokėta"
     },
     "quote": {
-      "sent": "This quote is locked because it has been sent",
-      "accepted": "This quote is locked because it has been accepted"
+      "sent": "Šis pasiūlymas užrakintas, nes jis jau išsiųstas",
+      "accepted": "Šis pasiūlymas užrakintas, nes jis jau priimtas"
     }
   },
-  "lockedBody": "Its parts, labour, prices, discount, tax, number and date can no longer be changed. Payments, status changes, sending and attachments all still work.",
-  "lockedAdminHint": "As an owner or admin you can unlock it if something genuinely needs correcting. The unlock is recorded in the audit log.",
-  "lockedMemberHint": "Ask an owner or admin to unlock it if something needs correcting.",
-  "unlock": "Unlock for editing",
-  "relock": "Lock again",
-  "unlockConfirmTitle": "Unlock this document?",
+  "lockedBody": "Dalių, darbų, kainų, nuolaidos, mokesčių, numerio ir datos nebegalima keisti. Mokėjimai, būsenos keitimai, siuntimas ir priedai vis dar veikia.",
+  "lockedAdminHint": "Kaip savininkas ar administratorius galite atrakinti dokumentą, jei tikrai reikia ką nors pataisyti. Atrakinimas įrašomas į audito žurnalą.",
+  "lockedMemberHint": "Jei reikia ką nors pataisyti, paprašykite savininko ar administratoriaus atrakinti dokumentą.",
+  "unlock": "Atrakinti redagavimui",
+  "relock": "Vėl užrakinti",
+  "unlockConfirmTitle": "Atrakinti šį dokumentą?",
   "unlockConfirmDescription": {
-    "invoice": "It will become editable again, and the change will be recorded in the audit log with your name. Prefer a credit note where your local rules require one.",
-    "quote": "It will become editable again, and the change will be recorded in the audit log with your name."
+    "invoice": "Dokumentą vėl bus galima redaguoti, o pakeitimas bus įrašytas į audito žurnalą su jūsų vardu. Jei to reikalauja vietinės taisyklės, verčiau išrašykite kreditinę sąskaitą.",
+    "quote": "Dokumentą vėl bus galima redaguoti, o pakeitimas bus įrašytas į audito žurnalą su jūsų vardu."
   },
-  "unlocked": "Unlocked for editing",
-  "relocked": "Locked again",
-  "reopenedTitle": "This document has been unlocked for editing",
-  "reopenedBody": "It stays editable until it is locked again.",
-  "failed": "Could not change the lock"
+  "unlocked": "Atrakinta redagavimui",
+  "relocked": "Vėl užrakinta",
+  "reopenedTitle": "Šis dokumentas atrakintas redagavimui",
+  "reopenedBody": "Jį bus galima redaguoti, kol jis vėl bus užrakintas.",
+  "failed": "Nepavyko pakeisti užrakto"
 }

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů