Procházet zdrojové kódy

added links to documentation (#245)

Bernt Christian Egeland před 3 měsíci
rodič
revize
b9e73f32b7
63 změnil soubory, kde provedl 521 přidání a 441 odebrání
  1. 3 3
      messages/de/billing.json
  2. 1 0
      messages/de/navigation.json
  3. 43 43
      messages/de/settings.json
  4. 9 8
      messages/de/statusReport.json
  5. 2 2
      messages/de/vehicles.json
  6. 1 0
      messages/en/navigation.json
  7. 8 7
      messages/en/statusReport.json
  8. 3 3
      messages/en/vehicles.json
  9. 4 4
      messages/es/billing.json
  10. 1 0
      messages/es/navigation.json
  11. 18 18
      messages/es/settings.json
  12. 9 8
      messages/es/statusReport.json
  13. 8 8
      messages/es/vehicles.json
  14. 3 3
      messages/fr/billing.json
  15. 1 0
      messages/fr/navigation.json
  16. 14 14
      messages/fr/settings.json
  17. 9 8
      messages/fr/statusReport.json
  18. 3 3
      messages/fr/vehicles.json
  19. 4 4
      messages/it/billing.json
  20. 1 0
      messages/it/navigation.json
  21. 1 1
      messages/it/settings.json
  22. 9 8
      messages/it/statusReport.json
  23. 2 2
      messages/it/vehicles.json
  24. 4 4
      messages/lt/billing.json
  25. 1 0
      messages/lt/navigation.json
  26. 1 0
      messages/lt/statusReport.json
  27. 3 3
      messages/lt/vehicles.json
  28. 3 3
      messages/nb/billing.json
  29. 1 0
      messages/nb/navigation.json
  30. 35 35
      messages/nb/settings.json
  31. 9 8
      messages/nb/statusReport.json
  32. 44 44
      messages/nb/vehicles.json
  33. 4 4
      messages/nl/billing.json
  34. 1 0
      messages/nl/navigation.json
  35. 1 1
      messages/nl/settings.json
  36. 9 8
      messages/nl/statusReport.json
  37. 2 2
      messages/nl/vehicles.json
  38. 4 4
      messages/pl/billing.json
  39. 1 0
      messages/pl/navigation.json
  40. 107 107
      messages/pl/settings.json
  41. 9 8
      messages/pl/statusReport.json
  42. 2 2
      messages/pl/vehicles.json
  43. 4 4
      messages/pt-BR/billing.json
  44. 1 0
      messages/pt-BR/navigation.json
  45. 7 7
      messages/pt-BR/settings.json
  46. 9 8
      messages/pt-BR/statusReport.json
  47. 3 3
      messages/pt-BR/vehicles.json
  48. 4 4
      messages/ru/billing.json
  49. 1 0
      messages/ru/navigation.json
  50. 1 1
      messages/ru/settings.json
  51. 9 8
      messages/ru/statusReport.json
  52. 2 2
      messages/ru/vehicles.json
  53. 4 4
      messages/tr/billing.json
  54. 1 0
      messages/tr/navigation.json
  55. 5 5
      messages/tr/settings.json
  56. 9 8
      messages/tr/statusReport.json
  57. 2 2
      messages/tr/vehicles.json
  58. 46 0
      src/components/page-header.tsx
  59. 11 1
      src/features/status-reports/Components/StatusReportList.tsx
  60. 1 1
      src/features/vehicles/Components/FindingForm.tsx
  61. 1 1
      src/features/vehicles/Components/NoteForm.tsx
  62. 1 1
      src/features/vehicles/Components/ReminderForm.tsx
  63. 1 1
      src/features/vehicles/Components/ReminderFormDialog.tsx

+ 3 - 3
messages/de/billing.json

@@ -80,8 +80,8 @@
     "processed": "{count} Rechnung(en) verarbeitet",
     "failedProcess": "Verarbeitung fehlgeschlagen",
     "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "resume": "Fortsetzen",
+    "delete": "Löschen",
+    "removeRow": "Zeile entfernen"
   }
 }

+ 1 - 0
messages/de/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Suchen...",
   "shortcut": "Ctrl+K",
+  "readMore": "Mehr erfahren",
   "newWorkOrder": "Neuer Arbeitsauftrag",
   "quickCreate": {
     "title": "Hinzufügen",

+ 43 - 43
messages/de/settings.json

@@ -184,12 +184,12 @@
     "profileUpdated": "Profil aktualisiert",
     "failedUpdateProfile": "Profil konnte nicht aktualisiert werden",
     "failedUpdateEmail": "E-Mail konnte nicht aktualisiert werden",
-    "changePasswordTitle": "Passwort andern",
+    "changePasswordTitle": "Passwort ändern",
     "changePasswordDescription": "Geben Sie Ihr aktuelles Passwort ein und wahlen Sie ein neues.",
     "currentPassword": "Aktuelles Passwort",
     "newPassword": "Neues Passwort",
     "confirmNewPassword": "Neues Passwort bestatigen",
-    "changePassword": "Passwort andern",
+    "changePassword": "Passwort ändern",
     "passwordChanged": "Passwort geandert",
     "passwordsNoMatch": "Passworter stimmen nicht uberein",
     "passwordMinLength": "Passwort muss mindestens 8 Zeichen lang sein",
@@ -218,7 +218,7 @@
     "back": "Zuruck",
     "verify": "Verifizieren",
     "enterCodeError": "Bitte geben Sie den Code aus Ihrer Authenticator-App ein",
-    "invalidCode": "Ungueltiger Code. Bitte versuchen Sie es erneut.",
+    "invalidCode": "Ungültiger Code. Bitte versuchen Sie es erneut.",
     "verificationFailed": "Verifizierung fehlgeschlagen",
     "backupCodesTitle": "Backup-Codes speichern",
     "backupCodesDescription": "Bewahren Sie diese Codes an einem sicheren Ort auf. Sie konnen sie verwenden, um sich anzumelden, wenn Sie den Zugang zu Ihrer Authenticator-App verlieren. Jeder Code kann nur einmal verwendet werden.",
@@ -228,21 +228,21 @@
     "savedBackupCodes": "Ich habe meine Backup-Codes gespeichert",
     "twoFactorEnabledSuccess": "Zwei-Faktor-Authentifizierung aktiviert",
     "dangerZone": "Gefahrenzone",
-    "deleteContentTitle": "Inhalte loschen",
-    "deleteContentDescription": "Organisationsdaten wie Fahrzeuge, Kunden, Angebote oder Inventar selektiv loschen. Ihr Konto und Ihre Einstellungen bleiben erhalten.",
-    "deleteContentButton": "Inhalte loschen",
-    "deleteAccountTitle": "Konto loschen",
-    "deleteAccountDescription": "Loschen Sie Ihr Konto und alle zugehorigen Daten dauerhaft, einschliesslich Fahrzeuge, Servicedaten, Arbeitsauftrage, Rechnungen, Kunden, Dateien und Zahlungen. Diese Aktion kann nicht ruckgangig gemacht werden.",
-    "deleteAccountButton": "Konto loschen",
-    "deleteAccountDialogTitle": "Konto loschen",
-    "deleteAccountDialogDescription": "Dies loscht Ihr Konto und alle zugehorigen Daten dauerhaft. Diese Aktion ist unwiderruflich. Alle Ihre Fahrzeuge, Servicedaten, Arbeitsauftrage, Angebote, Kunden, Dateien und Zahlungshistorie werden dauerhaft entfernt.",
+    "deleteContentTitle": "Inhalte löschen",
+    "deleteContentDescription": "Organisationsdaten wie Fahrzeuge, Kunden, Angebote oder Inventar selektiv löschen. Ihr Konto und Ihre Einstellungen bleiben erhalten.",
+    "deleteContentButton": "Inhalte löschen",
+    "deleteAccountTitle": "Konto löschen",
+    "deleteAccountDescription": "Löschen Sie Ihr Konto und alle zugehörigen Daten dauerhaft, einschließlich Fahrzeuge, Servicedaten, Arbeitsaufträge, Rechnungen, Kunden, Dateien und Zahlungen. Diese Aktion kann nicht rückgängig gemacht werden.",
+    "deleteAccountButton": "Konto löschen",
+    "deleteAccountDialogTitle": "Konto löschen",
+    "deleteAccountDialogDescription": "Dies löscht Ihr Konto und alle zugehörigen Daten dauerhaft. Diese Aktion ist unwiderruflich. Alle Ihre Fahrzeuge, Servicedaten, Arbeitsaufträge, Angebote, Kunden, Dateien und Zahlungshistorie werden dauerhaft entfernt.",
     "deleteAccountConfirmPhrase": "delete me",
     "deleteAccountConfirmPrompt": "Geben Sie <bold>delete me</bold> zur Bestatigung ein",
-    "permanentlyDelete": "Dauerhaft loschen",
+    "permanentlyDelete": "Dauerhaft löschen",
     "deleting": "Wird geloscht...",
     "failedDeleteAccount": "Konto konnte nicht geloscht werden",
-    "deleteContentDialogTitle": "Inhalte loschen",
-    "deleteContentDialogDescription": "Wahlen Sie die Inhalte aus, die Sie dauerhaft loschen mochten. Diese Aktion kann nicht ruckgangig gemacht werden.",
+    "deleteContentDialogTitle": "Inhalte löschen",
+    "deleteContentDialogDescription": "Wählen Sie die Inhalte aus, die Sie dauerhaft löschen möchten. Diese Aktion kann nicht rückgängig gemacht werden.",
     "contentVehicles": "Fahrzeuge",
     "contentVehiclesDescription": "Alle Fahrzeuge und deren Servicedaten, Notizen, Erinnerungen, Kraftstoffprotokolle und wiederkehrende Rechnungen",
     "contentCustomers": "Kunden",
@@ -265,7 +265,7 @@
     "contentCustomFieldsDescription": "Alle benutzerdefinierten Felddefinitionen und Werte",
     "deleteContentConfirmPhrase": "delete my data",
     "deleteContentConfirmPrompt": "Geben Sie <bold>delete my data</bold> zur Bestatigung ein",
-    "deleteSelected": "{count} ausgewahlte loschen",
+    "deleteSelected": "{count} ausgewählte löschen",
     "contentDeleted": "Ausgewahlte Inhalte wurden dauerhaft geloscht",
     "failedDeleteContent": "Inhalte konnten nicht geloscht werden",
     "passkey": {
@@ -323,7 +323,7 @@
     "invite": "Einladen",
     "invited": "Mitglied erfolgreich eingeladen.",
     "userNotFoundTitle": "Benutzer nicht gefunden",
-    "userNotFoundDescription": "Kein Konto fur \"{email}\" gefunden. Eine Einladungs-E-Mail senden, um sich anzumelden und Ihrem Team beizutreten?",
+    "userNotFoundDescription": "Kein Konto für \"{email}\" gefunden. Eine Einladungs-E-Mail senden, um sich anzumelden und Ihrem Team beizutreten?",
     "sendInvitation": "Einladung senden",
     "invitationSentTitle": "Einladung gesendet",
     "invitationSentDescription": "Eine Einladungs-E-Mail wurde an {email} gesendet.",
@@ -350,21 +350,21 @@
     "roleCreated": "Rolle erstellt",
     "roleUpdated": "Rolle aktualisiert",
     "failedSaveRole": "Rolle konnte nicht gespeichert werden",
-    "deleteRole": "Rolle loschen",
-    "deleteRoleDescription": "Die Rolle \"{name}\" loschen? Mitglieder mit dieser Rolle verlieren ihre benutzerdefinierten Berechtigungen.",
+    "deleteRole": "Rolle löschen",
+    "deleteRoleDescription": "Die Rolle \"{name}\" löschen? Mitglieder mit dieser Rolle verlieren ihre benutzerdefinierten Berechtigungen.",
     "roleDeleted": "Rolle geloscht",
     "failedDeleteRole": "Rolle konnte nicht geloscht werden",
     "fullAccess": "Voller Zugriff",
     "permissionCount": "{count} Berechtigung",
     "permissionCountPlural": "{count} Berechtigungen",
-    "noCustomRoles": "Noch keine benutzerdefinierten Rollen. Erstellen Sie eine, um granulare Berechtigungen fur Teammitglieder zu definieren.",
+    "noCustomRoles": "Noch keine benutzerdefinierten Rollen. Erstellen Sie eine, um granulare Berechtigungen für Teammitglieder zu definieren.",
     "presetAll": "Alle",
     "presetViewOnly": "Nur Ansicht",
     "presetWriteAll": "Lesen & Schreiben",
     "presetNone": "Keine",
     "builtInRoles": "Integrierte Rollen",
     "ownerLabel": "Eigentumer",
-    "ownerDescription": "Voller Zugriff. Kann Mitglieder verwalten, Rollen andern und die Organisation loschen.",
+    "ownerDescription": "Voller Zugriff. Kann Mitglieder verwalten, Rollen ändern und die Organisation löschen.",
     "adminLabel": "Administrator",
     "adminDescription": "Kann Mitglieder einladen/entfernen und gemeinsame Daten verwalten.",
     "memberLabel": "Mitglied",
@@ -391,9 +391,9 @@
       "customFields": "Benutzerdefinierte Felder"
     },
     "invoiceNumberFormat": "Rechnungsnummernformat",
-    "invoiceNumberFormatHint": "Verwenden Sie <code>{year}</code> fur das aktuelle Jahr. Vorschau: <bold>{preview}</bold>",
+    "invoiceNumberFormatHint": "Verwenden Sie <code>{year}</code> für das aktuelle Jahr. Vorschau: <bold>{preview}</bold>",
     "quoteNumberFormat": "Angebotsnummernformat",
-    "quoteNumberFormatHint": "Verwenden Sie <code>{year}</code> fur das aktuelle Jahr. Vorschau: <bold>{preview}</bold>",
+    "quoteNumberFormatHint": "Verwenden Sie <code>{year}</code> für das aktuelle Jahr. Vorschau: <bold>{preview}</bold>",
     "quoteValidDays": "Angebotsgültigkeit (Tage)",
     "quoteValidDaysHint": "Neue Angebote erhalten ein Gültig-bis-Datum so viele Tage im Voraus. 0 deaktiviert dies.",
     "sectionInvoices": "Rechnungen",
@@ -413,7 +413,7 @@
     "organizationNumber": "Organisationsnummer",
     "organizationNumberHint": "Org.-Nr. im Rechnungskopf anzeigen",
     "customFooter": "Benutzerdefinierte Rechnungsfusszeile",
-    "footerPlaceholder": "Vielen Dank fur Ihren Auftrag!",
+    "footerPlaceholder": "Vielen Dank für Ihren Auftrag!",
     "footerHint": "Dieser Text erscheint am Ende jeder Rechnung",
     "partsMarkupTitle": "Teile-Aufschlag",
     "partsMarkupDescription": "Aufschlag auf den Einkaufspreis beim Hinzufügen von Teilen. Nur intern — der Kunde sieht weder Kosten noch Aufschlag, nur den Endpreis.",
@@ -502,7 +502,7 @@
       "layout": "Layout"
     },
     "presets": "Vorlagen-Presets",
-    "primaryColor": "Primarfarbe",
+    "primaryColor": "Primärfarbe",
     "fontAndLayout": "Schrift & Layout",
     "fontFamily": "Schriftfamilie",
     "helveticaDefault": "Helvetica (Standard)",
@@ -514,8 +514,8 @@
     "compact": "Kompakt",
     "modern": "Modern",
     "preview": "{name} Vorschau",
-    "billTo": "Rechnungsempfanger",
-    "preparedFor": "Erstellt fur",
+    "billTo": "Rechnungsempfänger",
+    "preparedFor": "Erstellt für",
     "vehicle": "Fahrzeug",
     "part": "Teil",
     "qty": "Menge",
@@ -538,8 +538,8 @@
     "quotationTemplateSaved": "Angebotsvorlageneinstellungen gespeichert",
     "failedSave": "Einstellungen konnten nicht gespeichert werden",
     "smsTemplates": "SMS-Nachrichtenvorlagen",
-    "smsTemplatesDescription": "Passen Sie die Textnachrichten an Kunden an. Verwenden Sie Variablen wie <code>'{companyName}'</code>, um dynamische Werte einzufugen.",
-    "reset": "Zurucksetzen",
+    "smsTemplatesDescription": "Passen Sie die Textnachrichten an Kunden an. Verwenden Sie Variablen wie <code>'{companyName}'</code>, um dynamische Werte einzufügen.",
+    "reset": "Zurücksetzen",
     "invoiceReady": "Rechnung bereit",
     "invoiceReadyDescription": "Wird gesendet, wenn eine Rechnung mit einem Kunden geteilt wird.",
     "quoteReady": "Angebot bereit",
@@ -555,7 +555,7 @@
     "statusCompleted": "Status: Abgeschlossen",
     "statusCompletedDescription": "Wird gesendet, wenn der Arbeitsauftragsstatus auf Abgeschlossen wechselt.",
     "paymentReceived": "Zahlung eingegangen",
-    "paymentReceivedDescription": "Wird gesendet, wenn eine Zahlung fur eine Rechnung verbucht wird.",
+    "paymentReceivedDescription": "Wird gesendet, wenn eine Zahlung für eine Rechnung verbucht wird.",
     "saveSmsTemplates": "SMS-Vorlagen speichern",
     "smsTemplateSaved": "SMS-Vorlageneinstellungen gespeichert",
     "smsDefaults": {
@@ -590,7 +590,7 @@
     "detailsDescription": "Bankkonto und Zahlungsbedingungen auf Rechnungen.",
     "bankAccount": "Bankkonto (IBAN)",
     "bankAccountPlaceholder": "NO93 8601 1117 947",
-    "bankAccountHint": "Ihre Bankkontonummer oder IBAN fur den Zahlungsempfang",
+    "bankAccountHint": "Ihre Bankkontonummer oder IBAN für den Zahlungsempfang",
     "paymentTerms": "Zahlungsbedingungen",
     "paymentTermsPlaceholder": "Netto 14 Tage",
     "paymentTermsHint": "Zahlungsbedingungen auf Rechnungen (z.B. \"Netto 14 Tage\", \"Zahlbar bei Erhalt\")",
@@ -657,7 +657,7 @@
   },
   "currency": {
     "title": "Wahrung & Steuer",
-    "description": "Standardwahrung und Steuersatz fur Rechnungen und Servicedaten.",
+    "description": "Standardwährung und Steuersatz für Rechnungen und Servicedaten.",
     "currencyLabel": "Wahrung",
     "searchCurrency": "Währung suchen...",
     "noCurrencyFound": "Keine Währung gefunden.",
@@ -809,7 +809,7 @@
     "defaultLaborRate": "Standard-Stundensatz",
     "laborRatePlaceholder": "75,00",
     "unitsTitle": "Einheiten",
-    "unitsDescription": "Wahlen Sie zwischen metrisch (km, Liter) und imperial (Meilen, Gallonen).",
+    "unitsDescription": "Wählen Sie zwischen metrisch (km, Liter) und imperial (Meilen, Gallonen).",
     "unitSystem": "Einheitensystem",
     "metric": "Metrisch (km, Liter)",
     "imperial": "Imperial (Meilen, Gallonen)",
@@ -889,7 +889,7 @@
     "title": "Datenverwaltung",
     "description": "Exportieren Sie Ihre Daten als Backup oder importieren Sie eine zuvor exportierte Datei.",
     "exportTitle": "Daten exportieren",
-    "exportDescription": "Laden Sie Ihre Daten als ZIP-Datei herunter. Wahlen Sie die Kategorien fur das Backup aus.",
+    "exportDescription": "Laden Sie Ihre Daten als ZIP-Datei herunter. Wählen Sie die Kategorien für das Backup aus.",
     "includeInBackup": "Im Backup enthalten:",
     "selectAll": "Alle auswahlen",
     "deselectAll": "Alle abwahlen",
@@ -926,14 +926,14 @@
     "exportFailed": "Export fehlgeschlagen",
     "exportFailedMessage": "Ihre Daten konnten nicht exportiert werden. Bitte versuchen Sie es erneut.",
     "importTitle": "Daten importieren",
-    "importWarning": "Der Import wird <bold>alle vorhandenen Daten ersetzen</bold> durch den Inhalt der Backup-Datei. Diese Aktion kann nicht ruckgangig gemacht werden.",
+    "importWarning": "Der Import wird <bold>alle vorhandenen Daten ersetzen</bold> durch den Inhalt der Backup-Datei. Diese Aktion kann nicht rückgängig gemacht werden.",
     "importFileHint": "Unterstutzt sowohl .zip (v2) als auch .json (v1) Backup-Dateien.",
     "uploadRestore": "Hochladen & Wiederherstellen",
     "importComplete": "Import abgeschlossen",
     "importCompleteMessage": "Alle Daten wurden aus der Backup-Datei wiederhergestellt.",
     "importFailed": "Import fehlgeschlagen",
     "importFromOther": "Von anderen Diensten importieren",
-    "importFromOtherDescription": "Migrieren Sie Ihre Daten von einer anderen Plattform. Wahlen Sie einen Dienst, um zu beginnen.",
+    "importFromOtherDescription": "Migrieren Sie Ihre Daten von einer anderen Plattform. Wählen Sie einen Dienst, um zu beginnen.",
     "lubelogTitle": "Von LubeLog importieren",
     "lubelogExportSteps": "So exportieren Sie Ihre LubeLog-Daten:",
     "lubelogStep1": "Offnen Sie Ihre LubeLog-Instanz",
@@ -980,16 +980,16 @@
     "active": "Aktiv",
     "inactive": "Inaktiv",
     "lastChecked": "Zuletzt gepruft: {date}",
-    "enterLicenseKey": "Lizenzschlussel eingeben",
+    "enterLicenseKey": "Lizenzschlüssel eingeben",
     "validate": "Validieren",
     "validated": "Lizenz erfolgreich validiert",
-    "invalid": "Ungueltiger Lizenzschlussel",
+    "invalid": "Ungültiger Lizenzschlüssel",
     "failedValidate": "Lizenz konnte nicht validiert werden",
-    "keyHint": "Jeder Lizenzschlussel ist an diese Organisation gebunden und kann nicht fur mehrere Organisationen verwendet werden."
+    "keyHint": "Jeder Lizenzschlüssel ist an diese Organisation gebunden und kann nicht für mehrere Organisationen verwendet werden."
   },
   "about": {
     "title": "Uber Torqvoice",
-    "description": "Torqvoice ist Ihre komplette Losung fur die Fahrzeug-Serviceverwaltung. Verfolgen Sie Servicehistorie, Reparaturen und mehr.",
+    "description": "Torqvoice ist Ihre komplette Lösung für die Fahrzeug-Serviceverwaltung. Verfolgen Sie Servicehistorie, Reparaturen und mehr.",
     "version": "Version",
     "website": "Website",
     "documentation": "Dokumentation",
@@ -1066,9 +1066,9 @@
     "fromName": "Absendername",
     "fromNamePlaceholder": "Ihre Werkstatt",
     "tlsConnection": "TLS-Verbindung (Port 465)",
-    "tlsConnectionHint": "Aktivieren fur implizites TLS. Deaktivieren fur STARTTLS (Port 587/25).",
+    "tlsConnectionHint": "Aktivieren für implizites TLS. Deaktivieren für STARTTLS (Port 587/25).",
     "verifyTlsCerts": "TLS-Zertifikate verifizieren",
-    "verifyTlsCertsHint": "Deaktivieren, um selbstsignierte Zertifikate zuzulassen (nicht fur Produktion empfohlen)",
+    "verifyTlsCertsHint": "Deaktivieren, um selbstsignierte Zertifikate zuzulassen (nicht für Produktion empfohlen)",
     "requireTlsUpgrade": "TLS-Upgrade erzwingen",
     "requireTlsUpgradeHint": "TLS-Upgrade bei STARTTLS-Verbindungen erzwingen",
     "apiKey": "API-Schlussel",
@@ -1096,7 +1096,7 @@
   },
   "sms": {
     "title": "SMS-Anbieter",
-    "description": "Konfigurieren Sie Ihren SMS-Anbieter fur bidirektionale Nachrichten mit Kunden. Jede Organisation verwendet ihren eigenen SMS-Anbieter und ihre eigene Telefonnummer.",
+    "description": "Konfigurieren Sie Ihren SMS-Anbieter für bidirektionale Nachrichten mit Kunden. Jede Organisation verwendet ihren eigenen SMS-Anbieter und ihre eigene Telefonnummer.",
     "enableLabel": "SMS-Nachrichten aktivieren",
     "enableHint": "SMS-Nachrichten mit Kunden senden und empfangen",
     "disabledInfo": "SMS-Nachrichten sind deaktiviert. Aktivieren Sie sie, um Textnachrichten mit Ihren Kunden zu senden und zu empfangen.",
@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "KI-Assistent",
-    "readMore": "Read More",
+    "readMore": "Mehr erfahren",
     "description": "Konfigurieren Sie KI, um automatisch Servicenotizen zu erstellen und Fahrzeughistorien zusammenzufassen.",
     "enableLabel": "KI aktivieren",
     "enableHint": "KI-gestutzte Funktionen in der gesamten Anwendung nutzen",

+ 9 - 8
messages/de/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Statusberichte",
+    "readMore": "Mehr erfahren",
     "newReport": "Neuer Statusbericht",
     "empty": "Noch keine Statusberichte",
     "emptyDescription": "Erstellen Sie einen Statusbericht, um Ihren Kunden über den Fahrzeugstatus zu informieren.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Statusbericht löschen",
     "deleteFailed": "Statusbericht konnte nicht gelöscht werden",
     "cancel": "Abbrechen",
-  "feedback": "Feedback",
-  "hasComment": "Erhalten",
-  "noFeedback": "Noch kein Feedback",
-  "sentAt": "Gesendet",
-  "sentVia": "Gesendet über",
-  "messageLabel": "Nachricht",
-  "videoLabel": "Video"
+    "feedback": "Feedback",
+    "hasComment": "Erhalten",
+    "noFeedback": "Noch kein Feedback",
+    "sentAt": "Gesendet",
+    "sentVia": "Gesendet über",
+    "messageLabel": "Nachricht",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Hallo {name}, wir haben ein Status-Update zu Ihrem {vehicle}. Hier ansehen: {url}",
     "emailSubject": "Fahrzeug-Statusbericht - {vehicle}",
-  "viewReport": "Bericht hier ansehen: {url}"
+    "viewReport": "Bericht hier ansehen: {url}"
   }
 }

+ 2 - 2
messages/de/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "z.B. 50000",
     "reminderUpdated": "Erinnerung aktualisiert",
     "reminderCreated": "Erinnerung erstellt",
-    "saveError": "Fehler beim {action} der Erinnerung",
+    "saveError": "Erinnerung konnte nicht gespeichert werden",
     "notifyLabel": "Bei Fälligkeit benachrichtigen",
     "notifyInApp": "In-App-Benachrichtigung",
     "notifyEmail": "E-Mail"
@@ -201,7 +201,7 @@
     "noteUpdated": "Notiz aktualisiert",
     "noteCreated": "Notiz erstellt",
     "titleRequired": "Titel und Inhalt sind erforderlich",
-    "saveError": "Fehler beim {action} der Notiz",
+    "saveError": "Notiz konnte nicht gespeichert werden",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",

+ 1 - 0
messages/en/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Search...",
   "shortcut": "Ctrl+K",
+  "readMore": "Read more",
   "newWorkOrder": "New Work Order",
   "quickCreate": {
     "title": "Quick Add",

+ 8 - 7
messages/en/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Status Reports",
+    "readMore": "Read more",
     "newReport": "New Status Report",
     "empty": "No status reports yet",
     "emptyDescription": "Create a status report to update your customer on the vehicle status.",
@@ -76,13 +77,13 @@
     "deleteTitle": "Delete Status Report",
     "deleteFailed": "Failed to delete status report",
     "cancel": "Cancel",
-  "feedback": "Feedback",
-  "hasComment": "Received",
-  "noFeedback": "No feedback yet",
-  "sentAt": "Sent",
-  "sentVia": "Sent via",
-  "messageLabel": "Message",
-  "videoLabel": "Video"
+    "feedback": "Feedback",
+    "hasComment": "Received",
+    "noFeedback": "No feedback yet",
+    "sentAt": "Sent",
+    "sentVia": "Sent via",
+    "messageLabel": "Message",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Hi {name}, we have a status update on your {vehicle}. View it here: {url}",

+ 3 - 3
messages/en/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "e.g. 50000",
     "reminderUpdated": "Reminder updated",
     "reminderCreated": "Reminder created",
-    "saveError": "Failed to {action} reminder",
+    "saveError": "Failed to save reminder",
     "notifyLabel": "Notify me when due",
     "notifyInApp": "In-app notification",
     "notifyEmail": "Email"
@@ -201,7 +201,7 @@
     "noteUpdated": "Note updated",
     "noteCreated": "Note created",
     "titleRequired": "Title and content are required",
-    "saveError": "Failed to {action} note",
+    "saveError": "Failed to save note",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",
@@ -249,7 +249,7 @@
     "findingUpdated": "Observation updated",
     "findingResolved": "Observation resolved",
     "findingDeleted": "Observation deleted",
-    "saveError": "Failed to {action} observation",
+    "saveError": "Failed to save observation",
     "deleteError": "Failed to delete observation",
     "resolveError": "Failed to resolve observation",
     "showing": "Showing {start}-{end} of {total}",

+ 4 - 4
messages/es/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Error al eliminar",
     "processed": "{count} factura(s) procesada(s)",
     "failedProcess": "Error al procesar",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Pausar",
+    "resume": "Reanudar",
+    "delete": "Eliminar",
+    "removeRow": "Quitar fila"
   }
 }

+ 1 - 0
messages/es/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Buscar...",
   "shortcut": "Ctrl+K",
+  "readMore": "Más información",
   "newWorkOrder": "Nueva orden de trabajo",
   "quickCreate": {
     "title": "Agregar",

+ 18 - 18
messages/es/settings.json

@@ -357,7 +357,7 @@
     "fullAccess": "Acceso completo",
     "permissionCount": "{count} permiso",
     "permissionCountPlural": "{count} permisos",
-    "noCustomRoles": "Aun no hay roles personalizados. Cree uno para definir permisos granulares para los miembros del equipo.",
+    "noCustomRoles": "Aún no hay roles personalizados. Cree uno para definir permisos granulares para los miembros del equipo.",
     "presetAll": "Todos",
     "presetViewOnly": "Solo lectura",
     "presetWriteAll": "Lectura y escritura",
@@ -499,12 +499,12 @@
       "quotation": "Cotización",
       "inspections": "Inspecciones",
       "sms": "SMS",
-      "layout": "Disposicion"
+      "layout": "Disposición"
     },
     "presets": "Presets de plantilla",
     "primaryColor": "Color primario",
     "fontAndLayout": "Fuente y diseño",
-    "fontFamily": "Familia tipografica",
+    "fontFamily": "Familia tipográfica",
     "helveticaDefault": "Helvetica (Predeterminado)",
     "timesRoman": "Times Roman",
     "courier": "Courier",
@@ -538,24 +538,24 @@
     "quotationTemplateSaved": "Configuración de plantilla de cotización guardada",
     "failedSave": "Error al guardar la configuración",
     "smsTemplates": "Plantillas de mensajes SMS",
-    "smsTemplatesDescription": "Personalice los mensajes de texto enviados a los clientes. Use variables como <code>'{companyName}'</code> para insertar valores dinamicos.",
+    "smsTemplatesDescription": "Personalice los mensajes de texto enviados a los clientes. Use variables como <code>'{companyName}'</code> para insertar valores dinámicos.",
     "reset": "Restablecer",
     "invoiceReady": "Factura lista",
-    "invoiceReadyDescription": "Se envia al compartir una factura con un cliente.",
+    "invoiceReadyDescription": "Se envía al compartir una factura con un cliente.",
     "quoteReady": "Cotización lista",
-    "quoteReadyDescription": "Se envia al compartir una cotización con un cliente.",
+    "quoteReadyDescription": "Se envía al compartir una cotización con un cliente.",
     "inspectionReady": "Inspección lista",
-    "inspectionReadyDescription": "Se envia al compartir un informe de inspección con un cliente.",
+    "inspectionReadyDescription": "Se envía al compartir un informe de inspección con un cliente.",
     "statusInProgress": "Estado: En progreso",
-    "statusInProgressDescription": "Se envia cuando el estado de una orden de trabajo cambia a En progreso.",
+    "statusInProgressDescription": "Se envía cuando el estado de una orden de trabajo cambia a En progreso.",
     "statusWaitingParts": "Estado: Esperando piezas",
-    "statusWaitingPartsDescription": "Se envia cuando el estado cambia a Esperando piezas.",
+    "statusWaitingPartsDescription": "Se envía cuando el estado cambia a Esperando piezas.",
     "statusReady": "Estado: Listo para recoger",
-    "statusReadyDescription": "Se envia cuando el estado cambia a Listo.",
+    "statusReadyDescription": "Se envía cuando el estado cambia a Listo.",
     "statusCompleted": "Estado: Completado",
-    "statusCompletedDescription": "Se envia cuando el estado cambia a Completado.",
+    "statusCompletedDescription": "Se envía cuando el estado cambia a Completado.",
     "paymentReceived": "Pago recibido",
-    "paymentReceivedDescription": "Se envia cuando se registra un pago para una factura.",
+    "paymentReceivedDescription": "Se envía cuando se registra un pago para una factura.",
     "saveSmsTemplates": "Guardar plantillas SMS",
     "smsTemplateSaved": "Configuración de plantillas SMS guardada",
     "smsDefaults": {
@@ -569,18 +569,18 @@
       "paymentReceived": "Pago de {amount} recibido para la factura {invoice_number}. ¡Gracias!"
     },
     "colorPresets": {
-      "amber": "Ambar",
+      "amber": "Ámbar",
       "blue": "Azul",
       "emerald": "Esmeralda",
       "red": "Rojo",
-      "purple": "Purpura",
+      "purple": "Púrpura",
       "slate": "Pizarra",
       "rose": "Rosa",
-      "indigo": "Indigo"
+      "indigo": "Índigo"
     },
-    "layoutTitle": "Disposicion de factura",
+    "layoutTitle": "Disposición de factura",
     "layoutDescription": "Personaliza el orden y la visibilidad de las secciones en tus facturas y presupuestos.",
-    "layoutSaved": "Disposicion guardada correctamente",
+    "layoutSaved": "Disposición guardada correctamente",
     "layoutDocInvoice": "Factura",
     "layoutDocQuote": "Presupuesto"
   },
@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "Asistente de IA",
-    "readMore": "Read More",
+    "readMore": "Más información",
     "description": "Configure la IA para generar automáticamente notas de servicio y resumir el historial del vehículo.",
     "enableLabel": "Habilitar IA",
     "enableHint": "Usar funciones impulsadas por IA en toda la aplicación",

+ 9 - 8
messages/es/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Informes de estado",
+    "readMore": "Más información",
     "newReport": "Nuevo informe",
     "empty": "Sin informes de estado",
     "emptyDescription": "Crea un informe de estado para actualizar a tu cliente sobre el estado del vehículo.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Eliminar informe de estado",
     "deleteFailed": "No se pudo eliminar el informe de estado",
     "cancel": "Cancelar",
-  "feedback": "Comentario",
-  "hasComment": "Recibido",
-  "noFeedback": "Sin comentarios aún",
-  "sentAt": "Enviado",
-  "sentVia": "Enviado por",
-  "messageLabel": "Mensaje",
-  "videoLabel": "Video"
+    "feedback": "Comentario",
+    "hasComment": "Recibido",
+    "noFeedback": "Sin comentarios aún",
+    "sentAt": "Enviado",
+    "sentVia": "Enviado por",
+    "messageLabel": "Mensaje",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Hola {name}, tenemos una actualización de estado de su {vehicle}. Véala aquí: {url}",
     "emailSubject": "Actualización de estado del vehículo - {vehicle}",
-  "viewReport": "Ver el informe aquí: {url}"
+    "viewReport": "Ver el informe aquí: {url}"
   }
 }

+ 8 - 8
messages/es/vehicles.json

@@ -6,7 +6,7 @@
     "addVehicle": "Agregar vehículo",
     "emptySearch": "Ningún vehículo coincide con su búsqueda.",
     "emptyArchived": "No hay vehículos archivados.",
-    "empty": "Aun no hay vehículos.",
+    "empty": "Aún no hay vehículos.",
     "table": {
       "plate": "Placa",
       "vehicle": "Vehículo",
@@ -103,7 +103,7 @@
   },
   "inspections": {
     "newInspection": "Nueva inspección",
-    "empty": "Aun no hay inspecciones",
+    "empty": "Aún no hay inspecciones",
     "template": "Plantilla",
     "progress": "Progreso",
     "status": "Estado",
@@ -118,7 +118,7 @@
     "addReminder": "Agregar recordatorio",
     "emptyActive": "No hay recordatorios activos",
     "emptyCompleted": "No hay recordatorios completados",
-    "empty": "Aun no hay recordatorios",
+    "empty": "Aún no hay recordatorios",
     "overdue": "Vencido",
     "dueSoon": "Vence pronto",
     "due": "Vence el {date}",
@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "ej. 50000",
     "reminderUpdated": "Recordatorio actualizado",
     "reminderCreated": "Recordatorio creado",
-    "saveError": "Error al {action} recordatorio",
+    "saveError": "Error al guardar el recordatorio",
     "notifyLabel": "Notificarme al vencer",
     "notifyInApp": "Notificación en la app",
     "notifyEmail": "Correo electrónico"
@@ -169,7 +169,7 @@
       }
     },
     "emptyFiltered": "Ningún registro de servicio coincide con sus filtros.",
-    "empty": "Aun no hay registros de servicio.",
+    "empty": "Aún no hay registros de servicio.",
     "showing": "Mostrando {start}-{end} de {total}",
     "perPage": "por página",
     "page": "Página {page} de {totalPages}",
@@ -185,7 +185,7 @@
       "content": "Contenido",
       "date": "Fecha"
     },
-    "empty": "Aun no hay notas.",
+    "empty": "Aún no hay notas.",
     "pin": "Fijar",
     "unpin": "Desfijar",
     "delete": "Eliminar",
@@ -201,7 +201,7 @@
     "noteUpdated": "Nota actualizada",
     "noteCreated": "Nota creada",
     "titleRequired": "El título y el contenido son obligatorios",
-    "saveError": "Error al {action} nota",
+    "saveError": "Error al guardar la nota",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",
@@ -249,7 +249,7 @@
     "findingUpdated": "Observación actualizada",
     "findingResolved": "Observación resuelta",
     "findingDeleted": "Observación eliminada",
-    "saveError": "Error al {action} observación",
+    "saveError": "Error al guardar la observación",
     "deleteError": "Error al eliminar observación",
     "resolveError": "Error al resolver observación",
     "showing": "Mostrando {start}-{end} de {total}",

+ 3 - 3
messages/fr/billing.json

@@ -80,8 +80,8 @@
     "processed": "{count} facture(s) traitée(s)",
     "failedProcess": "Échec du traitement",
     "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "resume": "Reprendre",
+    "delete": "Supprimer",
+    "removeRow": "Supprimer la ligne"
   }
 }

+ 1 - 0
messages/fr/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Rechercher…",
   "shortcut": "Ctrl+K",
+  "readMore": "En savoir plus",
   "newWorkOrder": "Nouvel ordre de travail",
   "quickCreate": {
     "title": "Ajouter",

+ 14 - 14
messages/fr/settings.json

@@ -514,14 +514,14 @@
     "compact": "Compact",
     "modern": "Moderne",
     "preview": "Aperçu {name}",
-    "billTo": "Facturer a",
-    "preparedFor": "Prepare pour",
+    "billTo": "Facturer à",
+    "preparedFor": "Préparé pour",
     "vehicle": "Véhicule",
     "part": "Pièce",
     "qty": "Qte",
     "price": "Prix",
     "total": "Total",
-    "labor": "Main-d'oeuvre",
+    "labor": "Main-d'œuvre",
     "hours": "Heures",
     "rate": "Taux",
     "subtotal": "Sous-total",
@@ -541,21 +541,21 @@
     "smsTemplatesDescription": "Personnalisez les messages texte envoyés aux clients. Utilisez des variables comme <code>'{companyName}'</code> pour inserer des valeurs dynamiques.",
     "reset": "Réinitialiser",
     "invoiceReady": "Facture prête",
-    "invoiceReadyDescription": "Envoye lors du partage d'une facture avec un client.",
+    "invoiceReadyDescription": "Envoyé lors du partage d'une facture avec un client.",
     "quoteReady": "Devis prêt",
-    "quoteReadyDescription": "Envoye lors du partage d'un devis avec un client.",
+    "quoteReadyDescription": "Envoyé lors du partage d'un devis avec un client.",
     "inspectionReady": "Inspection prête",
-    "inspectionReadyDescription": "Envoye lors du partage d'un rapport d'inspection avec un client.",
+    "inspectionReadyDescription": "Envoyé lors du partage d'un rapport d'inspection avec un client.",
     "statusInProgress": "Statut : En cours",
-    "statusInProgressDescription": "Envoye lorsque le statut d'un ordre de travail passe a En cours.",
+    "statusInProgressDescription": "Envoyé lorsque le statut d'un ordre de travail passe à En cours.",
     "statusWaitingParts": "Statut : En attente de pièces",
-    "statusWaitingPartsDescription": "Envoye lorsque le statut passe a En attente de pièces.",
+    "statusWaitingPartsDescription": "Envoyé lorsque le statut passe à En attente de pièces.",
     "statusReady": "Statut : Prêt a récupérer",
-    "statusReadyDescription": "Envoye lorsque le statut passe a Prêt.",
-    "statusCompleted": "Statut : Termine",
-    "statusCompletedDescription": "Envoye lorsque le statut passe a Termine.",
+    "statusReadyDescription": "Envoyé lorsque le statut passe à Prêt.",
+    "statusCompleted": "Statut : Terminé",
+    "statusCompletedDescription": "Envoyé lorsque le statut passe à Terminé.",
     "paymentReceived": "Paiement reçu",
-    "paymentReceivedDescription": "Envoye lorsqu'un paiement est enregistre pour une facture.",
+    "paymentReceivedDescription": "Envoyé lorsqu'un paiement est enregistré pour une facture.",
     "saveSmsTemplates": "Enregistrer les modèles SMS",
     "smsTemplateSaved": "Paramètres des modèles SMS enregistrés",
     "smsDefaults": {
@@ -571,7 +571,7 @@
     "colorPresets": {
       "amber": "Ambre",
       "blue": "Bleu",
-      "emerald": "Emeraude",
+      "emerald": "Émeraude",
       "red": "Rouge",
       "purple": "Violet",
       "slate": "Ardoise",
@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "Assistant IA",
-    "readMore": "Read More",
+    "readMore": "En savoir plus",
     "description": "Configurez l'IA pour générer automatiquement des notes de service et resumer l'historique du véhicule.",
     "enableLabel": "Activer l'IA",
     "enableHint": "Utiliser les fonctionnalités alimentees par l'IA dans toute l'application",

+ 9 - 8
messages/fr/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Rapports d'état",
+    "readMore": "En savoir plus",
     "newReport": "Nouveau rapport",
     "empty": "Aucun rapport d'état",
     "emptyDescription": "Créez un rapport d'état pour informer votre client de l'état du véhicule.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Supprimer le rapport d'état",
     "deleteFailed": "Échec de la suppression du rapport d'état",
     "cancel": "Annuler",
-  "feedback": "Commentaire",
-  "hasComment": "Reçu",
-  "noFeedback": "Aucun commentaire",
-  "sentAt": "Envoyé",
-  "sentVia": "Envoyé via",
-  "messageLabel": "Message",
-  "videoLabel": "Vidéo"
+    "feedback": "Commentaire",
+    "hasComment": "Reçu",
+    "noFeedback": "Aucun commentaire",
+    "sentAt": "Envoyé",
+    "sentVia": "Envoyé via",
+    "messageLabel": "Message",
+    "videoLabel": "Vidéo"
   },
   "notify": {
     "defaultMessage": "Bonjour {name}, nous avons une mise à jour de l'état de votre {vehicle}. Consultez-la ici : {url}",
     "emailSubject": "Mise à jour de l'état du véhicule - {vehicle}",
-  "viewReport": "Voir le rapport ici : {url}"
+    "viewReport": "Voir le rapport ici : {url}"
   }
 }

+ 3 - 3
messages/fr/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "ex. 50000",
     "reminderUpdated": "Rappel mis à jour",
     "reminderCreated": "Rappel créé",
-    "saveError": "Échec de {action} du rappel",
+    "saveError": "Échec de l'enregistrement du rappel",
     "notifyLabel": "Me notifier à l'échéance",
     "notifyInApp": "Notification dans l'app",
     "notifyEmail": "E-mail"
@@ -201,7 +201,7 @@
     "noteUpdated": "Note mise à jour",
     "noteCreated": "Note créée",
     "titleRequired": "Le titre et le contenu sont obligatoires",
-    "saveError": "Échec de {action} de la note",
+    "saveError": "Échec de l'enregistrement de la note",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",
@@ -249,7 +249,7 @@
     "findingUpdated": "Observation mise à jour",
     "findingResolved": "Observation résolue",
     "findingDeleted": "Observation supprimée",
-    "saveError": "Échec de l'observation",
+    "saveError": "Échec de l'enregistrement de l'observation",
     "deleteError": "Échec de suppression",
     "resolveError": "Échec de résolution",
     "showing": "Affichage de {start}-{end} sur {total}",

+ 4 - 4
messages/it/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Eliminazione fallita",
     "processed": "{count} fattura/e elaborata/e",
     "failedProcess": "Elaborazione fallita",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Pausa",
+    "resume": "Riprendi",
+    "delete": "Elimina",
+    "removeRow": "Rimuovi riga"
   }
 }

+ 1 - 0
messages/it/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Cerca...",
   "shortcut": "Ctrl+K",
+  "readMore": "Scopri di più",
   "newWorkOrder": "Nuovo ordine di lavoro",
   "quickCreate": {
     "title": "Aggiungi",

+ 1 - 1
messages/it/settings.json

@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "Assistente IA",
-    "readMore": "Read More",
+    "readMore": "Scopri di più",
     "description": "Configura l'IA per generare automaticamente note di servizio e riassumere la cronologia del veicolo.",
     "enableLabel": "Abilita IA",
     "enableHint": "Usa le funzionalita basate sull'IA in tutta l'applicazione",

+ 9 - 8
messages/it/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Rapporti di stato",
+    "readMore": "Scopri di più",
     "newReport": "Nuovo rapporto",
     "empty": "Nessun rapporto di stato",
     "emptyDescription": "Crea un rapporto di stato per aggiornare il cliente sullo stato del veicolo.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Elimina rapporto di stato",
     "deleteFailed": "Impossibile eliminare il rapporto di stato",
     "cancel": "Annulla",
-  "feedback": "Commento",
-  "hasComment": "Ricevuto",
-  "noFeedback": "Nessun commento",
-  "sentAt": "Inviato",
-  "sentVia": "Inviato tramite",
-  "messageLabel": "Messaggio",
-  "videoLabel": "Video"
+    "feedback": "Commento",
+    "hasComment": "Ricevuto",
+    "noFeedback": "Nessun commento",
+    "sentAt": "Inviato",
+    "sentVia": "Inviato tramite",
+    "messageLabel": "Messaggio",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Ciao {name}, abbiamo un aggiornamento sullo stato del suo {vehicle}. Visualizzalo qui: {url}",
     "emailSubject": "Aggiornamento stato veicolo - {vehicle}",
-  "viewReport": "Visualizza il rapporto qui: {url}"
+    "viewReport": "Visualizza il rapporto qui: {url}"
   }
 }

+ 2 - 2
messages/it/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "es. 50000",
     "reminderUpdated": "Promemoria aggiornato",
     "reminderCreated": "Promemoria creato",
-    "saveError": "Impossibile {action} il promemoria",
+    "saveError": "Impossibile salvare il promemoria",
     "notifyLabel": "Avvisami alla scadenza",
     "notifyInApp": "Notifica in app",
     "notifyEmail": "E-mail"
@@ -201,7 +201,7 @@
     "noteUpdated": "Nota aggiornata",
     "noteCreated": "Nota creata",
     "titleRequired": "Titolo e contenuto sono obbligatori",
-    "saveError": "Impossibile {action} la nota",
+    "saveError": "Impossibile salvare la nota",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",

+ 4 - 4
messages/lt/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Nepavyko ištrinti",
     "processed": "Apdorota {count} sąskaita(-ų)",
     "failedProcess": "Nepavyko apdoroti",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Pristabdyti",
+    "resume": "Tęsti",
+    "delete": "Ištrinti",
+    "removeRow": "Pašalinti eilutę"
   }
 }

+ 1 - 0
messages/lt/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Ieškoti...",
   "shortcut": "Ctrl+K",
+  "readMore": "Skaityti daugiau",
   "newWorkOrder": "Naujas darbo užsakymas",
   "quickCreate": {
     "title": "Greitas pridėjimas",

+ 1 - 0
messages/lt/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Būsenos ataskaitos",
+    "readMore": "Skaityti daugiau",
     "newReport": "Nauja būsenos ataskaita",
     "empty": "Būsenos ataskaitų dar nėra",
     "emptyDescription": "Sukurkite būsenos ataskaitą, kad informuotumėte klientą apie transporto priemonės būseną.",

+ 3 - 3
messages/lt/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "pvz., 50000",
     "reminderUpdated": "Priminimas atnaujintas",
     "reminderCreated": "Priminimas sukurtas",
-    "saveError": "Nepavyko {action} priminimo",
+    "saveError": "Nepavyko išsaugoti priminimo",
     "notifyLabel": "Pranešti suėjus terminui",
     "notifyInApp": "Pranešimas programoje",
     "notifyEmail": "El. paštas"
@@ -201,7 +201,7 @@
     "noteUpdated": "Pastaba atnaujinta",
     "noteCreated": "Pastaba sukurta",
     "titleRequired": "Pavadinimas ir turinys yra privalomi",
-    "saveError": "Nepavyko {action} pastabos",
+    "saveError": "Nepavyko išsaugoti pastabos",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",
@@ -249,7 +249,7 @@
     "findingUpdated": "Pastebėjimas atnaujintas",
     "findingResolved": "Pastebėjimas išspręstas",
     "findingDeleted": "Pastebėjimas ištrintas",
-    "saveError": "Nepavyko {action} pastebėjimo",
+    "saveError": "Nepavyko išsaugoti pastebėjimo",
     "deleteError": "Nepavyko ištrinti pastebėjimo",
     "resolveError": "Nepavyko išspręsti pastebėjimo",
     "showing": "Rodoma {start}–{end} iš {total}",

+ 3 - 3
messages/nb/billing.json

@@ -80,8 +80,8 @@
     "processed": "{count} faktura(er) behandlet",
     "failedProcess": "Kunne ikke behandle",
     "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "resume": "Gjenoppta",
+    "delete": "Slett",
+    "removeRow": "Fjern rad"
   }
 }

+ 1 - 0
messages/nb/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Søk...",
   "shortcut": "Ctrl+K",
+  "readMore": "Les mer",
   "newWorkOrder": "Ny arbeidsordre",
   "quickCreate": {
     "title": "Legg til",

+ 35 - 35
messages/nb/settings.json

@@ -185,7 +185,7 @@
     "failedUpdateProfile": "Kunne ikke oppdatere profil",
     "failedUpdateEmail": "Kunne ikke oppdatere e-post",
     "changePasswordTitle": "Endre passord",
-    "changePasswordDescription": "Skriv inn ditt navarende passord og velg et nytt.",
+    "changePasswordDescription": "Skriv inn ditt nåværende passord og velg et nytt.",
     "currentPassword": "Navarende passord",
     "newPassword": "Nytt passord",
     "confirmNewPassword": "Bekreft nytt passord",
@@ -229,13 +229,13 @@
     "twoFactorEnabledSuccess": "Tofaktorautentisering aktivert",
     "dangerZone": "Faresone",
     "deleteContentTitle": "Slett innhold",
-    "deleteContentDescription": "Slett selektivt organisasjonsdata som kjoretoy, kunder, tilbud eller inventar. Kontoen og innstillingene dine forblir intakte.",
+    "deleteContentDescription": "Slett selektivt organisasjonsdata som kjøretøy, kunder, tilbud eller inventar. Kontoen og innstillingene dine forblir intakte.",
     "deleteContentButton": "Slett innhold",
     "deleteAccountTitle": "Slett konto",
-    "deleteAccountDescription": "Slett kontoen din og alle tilknyttede data permanent, inkludert kjoretoy, servicehistorikk, arbeidsordrer, fakturaer, kunder, filer og betalinger. Denne handlingen kan ikke angres.",
+    "deleteAccountDescription": "Slett kontoen din og alle tilknyttede data permanent, inkludert kjøretøy, servicehistorikk, arbeidsordrer, fakturaer, kunder, filer og betalinger. Denne handlingen kan ikke angres.",
     "deleteAccountButton": "Slett konto",
     "deleteAccountDialogTitle": "Slett konto",
-    "deleteAccountDialogDescription": "Dette vil permanent slette kontoen din og alle tilknyttede data. Denne handlingen er irreversibel. Alle kjoretoy, servicehistorikk, arbeidsordrer, tilbud, kunder, filer og betalingshistorikk vil bli permanent fjernet.",
+    "deleteAccountDialogDescription": "Dette vil permanent slette kontoen din og alle tilknyttede data. Denne handlingen er irreversibel. Alle kjøretøy, servicehistorikk, arbeidsordrer, tilbud, kunder, filer og betalingshistorikk vil bli permanent fjernet.",
     "deleteAccountConfirmPhrase": "delete me",
     "deleteAccountConfirmPrompt": "Skriv <bold>delete me</bold> for a bekrefte",
     "permanentlyDelete": "Slett permanent",
@@ -243,10 +243,10 @@
     "failedDeleteAccount": "Kunne ikke slette konto",
     "deleteContentDialogTitle": "Slett innhold",
     "deleteContentDialogDescription": "Velg innholdet du vil slette permanent. Denne handlingen kan ikke angres.",
-    "contentVehicles": "Kjoretoy",
-    "contentVehiclesDescription": "Alle kjoretoy og deres servicehistorikk, notater, paminnelser, drivstofflogger og gjentakende fakturaer",
+    "contentVehicles": "Kjøretøy",
+    "contentVehiclesDescription": "Alle kjøretøy og deres servicehistorikk, notater, påminnelser, drivstofflogger og gjentakende fakturaer",
     "contentCustomers": "Kunder",
-    "contentCustomersDescription": "Alle kunderegistre. Kjoretoy knyttet til slettede kunder vil bli frakoblet.",
+    "contentCustomersDescription": "Alle kunderegistre. Kjøretøy knyttet til slettede kunder vil bli frakoblet.",
     "contentQuotes": "Tilbud",
     "contentQuotesDescription": "Alle tilbud og deres linjer",
     "contentInventory": "Inventar",
@@ -357,7 +357,7 @@
     "fullAccess": "Full tilgang",
     "permissionCount": "{count} tillatelse",
     "permissionCountPlural": "{count} tillatelser",
-    "noCustomRoles": "Ingen egendefinerte roller enna. Opprett en for a definere detaljerte tillatelser for teammedlemmer.",
+    "noCustomRoles": "Ingen egendefinerte roller ennå. Opprett en for å definere detaljerte tillatelser for teammedlemmer.",
     "presetAll": "Alle",
     "presetViewOnly": "Kun visning",
     "presetWriteAll": "Les og skriv",
@@ -491,7 +491,7 @@
   },
   "templates": {
     "title": "Maler",
-    "invoiceDescription": "Tilpass utseendet pa PDF-fakturaer og tilbud.",
+    "invoiceDescription": "Tilpass utseendet på PDF-fakturaer og tilbud.",
     "inspectionsDescription": "Administrer inspeksjonssjekklister og flerpunktsmaler.",
     "smsDescription": "Tilpass SMS-meldingene som sendes til kunder.",
     "tabs": {
@@ -501,8 +501,8 @@
       "sms": "SMS",
       "layout": "Oppsett"
     },
-    "presets": "Malforandsvisninger",
-    "primaryColor": "Primarfarge",
+    "presets": "Malforhåndsvisninger",
+    "primaryColor": "Primærfarge",
     "fontAndLayout": "Skrift og layout",
     "fontFamily": "Skriftfamilie",
     "helveticaDefault": "Helvetica (Standard)",
@@ -513,10 +513,10 @@
     "standard": "Standard",
     "compact": "Kompakt",
     "modern": "Moderne",
-    "preview": "{name} forhandsvisning",
+    "preview": "{name} forhåndsvisning",
     "billTo": "Faktureres til",
     "preparedFor": "Utarbeidet for",
-    "vehicle": "Kjoretoy",
+    "vehicle": "Kjøretøy",
     "part": "Del",
     "qty": "Ant.",
     "price": "Pris",
@@ -538,24 +538,24 @@
     "quotationTemplateSaved": "Tilbudsmalinnstillinger lagret",
     "failedSave": "Kunne ikke lagre innstillinger",
     "smsTemplates": "SMS-meldingsmaler",
-    "smsTemplatesDescription": "Tilpass tekstmeldingene som sendes til kunder. Bruk variabler som <code>'{companyName}'</code> for a sette inn dynamiske verdier.",
+    "smsTemplatesDescription": "Tilpass tekstmeldingene som sendes til kunder. Bruk variabler som <code>'{companyName}'</code> for å sette inn dynamiske verdier.",
     "reset": "Tilbakestill",
     "invoiceReady": "Faktura klar",
-    "invoiceReadyDescription": "Sendes nar en faktura deles med en kunde.",
+    "invoiceReadyDescription": "Sendes når en faktura deles med en kunde.",
     "quoteReady": "Tilbud klart",
-    "quoteReadyDescription": "Sendes nar et tilbud deles med en kunde.",
+    "quoteReadyDescription": "Sendes når et tilbud deles med en kunde.",
     "inspectionReady": "Inspeksjon klar",
-    "inspectionReadyDescription": "Sendes nar en inspeksjonsrapport deles med en kunde.",
+    "inspectionReadyDescription": "Sendes når en inspeksjonsrapport deles med en kunde.",
     "statusInProgress": "Status: Under arbeid",
-    "statusInProgressDescription": "Sendes nar en arbeidsordre endres til Under arbeid.",
-    "statusWaitingParts": "Status: Venter pa deler",
-    "statusWaitingPartsDescription": "Sendes nar status endres til Venter pa deler.",
+    "statusInProgressDescription": "Sendes når en arbeidsordre endres til Under arbeid.",
+    "statusWaitingParts": "Status: Venter på deler",
+    "statusWaitingPartsDescription": "Sendes når status endres til Venter på deler.",
     "statusReady": "Status: Klar for henting",
-    "statusReadyDescription": "Sendes nar status endres til Klar.",
-    "statusCompleted": "Status: Fullfort",
-    "statusCompletedDescription": "Sendes nar status endres til Fullfort.",
+    "statusReadyDescription": "Sendes når status endres til Klar.",
+    "statusCompleted": "Status: Fullført",
+    "statusCompletedDescription": "Sendes når status endres til Fullført.",
     "paymentReceived": "Betaling mottatt",
-    "paymentReceivedDescription": "Sendes nar en betaling registreres for en faktura.",
+    "paymentReceivedDescription": "Sendes når en betaling registreres for en faktura.",
     "saveSmsTemplates": "Lagre SMS-maler",
     "smsTemplateSaved": "SMS-malinnstillinger lagret",
     "layoutTitle": "Fakturaoppsett",
@@ -575,9 +575,9 @@
     },
     "colorPresets": {
       "amber": "Rav",
-      "blue": "Bla",
+      "blue": "Blå",
       "emerald": "Smaragd",
-      "red": "Rod",
+      "red": "Rød",
       "purple": "Lilla",
       "slate": "Skifer",
       "rose": "Rosa",
@@ -843,7 +843,7 @@
   },
   "maintenance": {
     "title": "Predikert vedlikehold",
-    "description": "Forutsi hvert kjoretoyes navarende kilometerstand fra servicehistorikken og vis kjoretoy som trenger eller narmer seg neste service.",
+    "description": "Forutsi hvert kjøretøys nåværende kilometerstand fra servicehistorikken og vis kjøretøy som trenger eller nærmer seg neste service.",
     "enablePredicted": "Aktiver predikert vedlikehold",
     "enablePredictedHint": "Vis prediksjoner pa kjoretoysdetaljer og dashbord",
     "serviceInterval": "Serviceintervall ({unit})",
@@ -897,8 +897,8 @@
     "optSettingsDesc": "Verkstedinfo, fakturaoppsett, betalingsleverandorer",
     "optCustomers": "Kunder",
     "optCustomersDesc": "Kundeposter og kontaktinformasjon",
-    "optVehicles": "Kjoretoy og servicedata",
-    "optVehiclesDesc": "Kjoretoy, notater, drivstofflogger, paminnelser, servicedata",
+    "optVehicles": "Kjøretøy og servicedata",
+    "optVehiclesDesc": "Kjøretøy, notater, drivstofflogger, påminnelser, servicedata",
     "optQuotes": "Tilbud",
     "optQuotesDesc": "Tilbud med deler og arbeid",
     "optInventory": "Inventar",
@@ -921,7 +921,7 @@
     "optFilesDesc": "Bilder, servicevedlegg, logo",
     "filesWarning": "Inkluderer opplastede filer — sikkerhetskopi kan bli storre",
     "downloadBackup": "Last ned sikkerhetskopi",
-    "exportComplete": "Eksport fullfort",
+    "exportComplete": "Eksport fullført",
     "exportCompleteMessage": "Sikkerhetskopifilen din er lastet ned.",
     "exportFailed": "Eksport mislyktes",
     "exportFailedMessage": "Kunne ikke eksportere dataene dine. Vennligst prov igjen.",
@@ -929,7 +929,7 @@
     "importWarning": "Importering vil <bold>erstatte alle eksisterende data</bold> med innholdet i sikkerhetskopifilen. Denne handlingen kan ikke angres.",
     "importFileHint": "Stotter bade .zip (v2) og .json (v1) sikkerhetskopifiler.",
     "uploadRestore": "Last opp og gjenopprett",
-    "importComplete": "Import fullfort",
+    "importComplete": "Import fullført",
     "importCompleteMessage": "Alle data er gjenopprettet fra sikkerhetskopifilen.",
     "importFailed": "Import mislyktes",
     "importFromOther": "Importer fra andre tjenester",
@@ -942,11 +942,11 @@
     "lubelogStep4": "Last opp den nedlastede zip-filen nedenfor",
     "lubelogAddNote": "Dette vil <bold>legge til data ved siden av</bold> eksisterende poster — ingenting vil bli slettet.",
     "lubelogImported": "Hva som importeres:",
-    "lubelogVehicles": "Kjoretoy",
+    "lubelogVehicles": "Kjøretøy",
     "lubelogServiceRecords": "Servicedata med vedlegg",
     "lubelogNotes": "Notater",
     "lubelogFileHint": "Filer opp til 200MB stottet.",
-    "lubelogImportComplete": "LubeLog-import fullfort",
+    "lubelogImportComplete": "LubeLog-import fullført",
     "cancel": "Avbryt",
     "import": "Importer",
     "invoiceNinjaTitle": "Importer fra Invoice Ninja",
@@ -963,7 +963,7 @@
     "invoiceNinjaDocuments": "Dokumenter og vedlegg",
     "invoiceNinjaPayments": "Betalinger",
     "invoiceNinjaFileHint": "Last opp en Invoice Ninja zip-eksportfil. Filer opp til 200MB stottet.",
-    "invoiceNinjaImportComplete": "Invoice Ninja-import fullfort",
+    "invoiceNinjaImportComplete": "Invoice Ninja-import fullført",
     "backupStatus": {
       "title": "Databeskyttelse",
       "description": "Vi tar dataene dine på alvor. Alle organisasjonens data, inkludert kunder, kjøretøy, arbeidsordrer, fakturaer og opplastede filer, sikkerhetskopieres automatisk hver time. Sikkerhetskopiene beskyttes med AES-256-kryptering før de forlater infrastrukturen vår og lagres på et separat, sikkert sted, slik at ingen utenforstående kan lese dem.",
@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "AI-assistent",
-    "readMore": "Read More",
+    "readMore": "Les mer",
     "description": "Konfigurer AI for automatisk generering av servicenotater og oppsummering av kjøretøyhistorikk.",
     "enableLabel": "Aktiver AI",
     "enableHint": "Bruk AI-drevne funksjoner i applikasjonen",

+ 9 - 8
messages/nb/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Statusrapporter",
+    "readMore": "Les mer",
     "newReport": "Ny statusrapport",
     "empty": "Ingen statusrapporter ennå",
     "emptyDescription": "Opprett en statusrapport for å oppdatere kunden om kjøretøyets tilstand.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Slett statusrapport",
     "deleteFailed": "Kunne ikke slette statusrapport",
     "cancel": "Avbryt",
-  "feedback": "Tilbakemelding",
-  "hasComment": "Mottatt",
-  "noFeedback": "Ingen tilbakemelding ennå",
-  "sentAt": "Sendt",
-  "sentVia": "Sendt via",
-  "messageLabel": "Melding",
-  "videoLabel": "Video"
+    "feedback": "Tilbakemelding",
+    "hasComment": "Mottatt",
+    "noFeedback": "Ingen tilbakemelding ennå",
+    "sentAt": "Sendt",
+    "sentVia": "Sendt via",
+    "messageLabel": "Melding",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Hei {name}, vi har en statusoppdatering på din {vehicle}. Se den her: {url}",
     "emailSubject": "Statusoppdatering for kjøretøy - {vehicle}",
-  "viewReport": "Se rapporten her: {url}"
+    "viewReport": "Se rapporten her: {url}"
   }
 }

+ 44 - 44
messages/nb/vehicles.json

@@ -3,13 +3,13 @@
     "active": "Aktive",
     "archived": "Arkivert",
     "searchPlaceholder": "Sok etter skilt, merke, modell, VIN...",
-    "addVehicle": "Legg til kjoretoy",
-    "emptySearch": "Ingen kjoretoy samsvarer med soket ditt.",
-    "emptyArchived": "Ingen arkiverte kjoretoy.",
-    "empty": "Ingen kjoretoy enna.",
+    "addVehicle": "Legg til kjøretøy",
+    "emptySearch": "Ingen kjøretøy samsvarer med søket ditt.",
+    "emptyArchived": "Ingen arkiverte kjøretøy.",
+    "empty": "Ingen kjøretøy ennå.",
     "table": {
       "plate": "Skilt",
-      "vehicle": "Kjoretoy",
+      "vehicle": "Kjøretøy",
       "customer": "Kunde",
       "mileage": "Kilometerstand",
       "mileageMarine": "Motortimer",
@@ -19,14 +19,14 @@
     "archive": "Arkiver",
     "unarchive": "Gjenopprett",
     "delete": "Slett",
-    "deleteTitle": "Slett kjoretoy",
-    "deleteDescription": "Slette {name}? Dette vil fjerne alle tilknyttede serviceoppforinger og notater.",
-    "unarchiveTitle": "Gjenopprett kjoretoy",
-    "unarchiveDescription": "Gjenopprette {name} til listen over aktive kjoretoy?",
-    "vehicleUnarchived": "Kjoretoy gjenopprettet",
-    "unarchiveError": "Kunne ikke gjenopprette kjoretoy",
-    "deleteError": "Kunne ikke slette kjoretoy",
-    "error": "Kunne ikke laste kjoretoy",
+    "deleteTitle": "Slett kjøretøy",
+    "deleteDescription": "Slette {name}? Dette vil fjerne alle tilknyttede serviceoppføringer og notater.",
+    "unarchiveTitle": "Gjenopprett kjøretøy",
+    "unarchiveDescription": "Gjenopprette {name} til listen over aktive kjøretøy?",
+    "vehicleUnarchived": "Kjøretøy gjenopprettet",
+    "unarchiveError": "Kunne ikke gjenopprette kjøretøy",
+    "deleteError": "Kunne ikke slette kjøretøy",
+    "error": "Kunne ikke laste kjøretøy",
     "viewTable": "Table view",
     "viewGrid": "Grid view",
     "viewLargeGrid": "Large grid view",
@@ -34,13 +34,13 @@
   },
   "detail": {
     "vehicleArchived": "Dette kjoretoyet er arkivert",
-    "backToVehicles": "Tilbake til kjoretoy",
+    "backToVehicles": "Tilbake til kjøretøy",
     "newWorkOrder": "Ny arbeidsordre",
-    "editVehicle": "Rediger kjoretoy",
+    "editVehicle": "Rediger kjøretøy",
     "unarchive": "Gjenopprett",
     "archive": "Arkiver",
     "delete": "Slett",
-    "notFound": "Kjoretoy ikke funnet",
+    "notFound": "Kjøretøy ikke funnet",
     "predictedKm": "Beregnet km",
     "predictedMileage": "Beregnet kilometerstand",
     "predictedHours": "Beregnede Timer",
@@ -63,12 +63,12 @@
     "noteDeleteError": "Kunne ikke slette",
     "reminderDeleted": "Paminnelse slettet",
     "reminderDeleteError": "Kunne ikke slette",
-    "vehicleUnarchived": "Kjoretoy gjenopprettet",
+    "vehicleUnarchived": "Kjøretøy gjenopprettet",
     "unarchiveError": "Kunne ikke gjenopprette",
-    "vehicleDeleted": "Kjoretoy slettet",
-    "vehicleDeleteError": "Kunne ikke slette kjoretoy",
-    "deleteTitle": "Slette kjoretoy?",
-    "deleteDescription": "Dette vil permanent slette {name} og alle tilknyttede serviceoppforinger, notater og paminnelser. Denne handlingen kan ikke angres.",
+    "vehicleDeleted": "Kjøretøy slettet",
+    "vehicleDeleteError": "Kunne ikke slette kjøretøy",
+    "deleteTitle": "Slette kjøretøy?",
+    "deleteDescription": "Dette vil permanent slette {name} og alle tilknyttede serviceoppføringer, notater og påminnelser. Denne handlingen kan ikke angres.",
     "edit": "Rediger",
     "aiSummary": "AI-sammendrag",
     "aiSummaryTitle": "Servicehistorikk-sammendrag",
@@ -103,28 +103,28 @@
   },
   "inspections": {
     "newInspection": "Ny inspeksjon",
-    "empty": "Ingen inspeksjoner enna",
+    "empty": "Ingen inspeksjoner ennå",
     "template": "Mal",
     "progress": "Fremdrift",
     "status": "Status",
     "date": "Dato",
-    "completed": "Fullfort",
+    "completed": "Fullført",
     "inProgress": "Under arbeid"
   },
   "reminders": {
     "active": "Aktive",
-    "completed": "Fullforte",
+    "completed": "Fullførte",
     "all": "Alle",
-    "addReminder": "Legg til paminnelse",
-    "emptyActive": "Ingen aktive paminnelser",
-    "emptyCompleted": "Ingen fullforte paminnelser",
-    "empty": "Ingen paminnelser enna",
+    "addReminder": "Legg til påminnelse",
+    "emptyActive": "Ingen aktive påminnelser",
+    "emptyCompleted": "Ingen fullførte påminnelser",
+    "empty": "Ingen påminnelser ennå",
     "overdue": "Forfalt",
     "dueSoon": "Forfaller snart",
     "due": "Forfaller {date}",
     "dueAt": "Forfaller ved {mileage} {unit}",
-    "editTitle": "Rediger paminnelse",
-    "addTitle": "Legg til paminnelse",
+    "editTitle": "Rediger påminnelse",
+    "addTitle": "Legg til påminnelse",
     "titleLabel": "Tittel *",
     "titlePlaceholder": "f.eks. Oljeskift",
     "descriptionLabel": "Beskrivelse",
@@ -132,9 +132,9 @@
     "dueDateLabel": "Forfallsdato",
     "dueMileageLabel": "Kilometerstand ved forfall",
     "dueMileagePlaceholder": "f.eks. 50000",
-    "reminderUpdated": "Paminnelse oppdatert",
-    "reminderCreated": "Paminnelse opprettet",
-    "saveError": "Kunne ikke {action} paminnelse",
+    "reminderUpdated": "Påminnelse oppdatert",
+    "reminderCreated": "Påminnelse opprettet",
+    "saveError": "Kunne ikke lagre påminnelse",
     "notifyLabel": "Varsle meg ved forfall",
     "notifyInApp": "Varsel i appen",
     "notifyEmail": "E-post"
@@ -168,8 +168,8 @@
         "none": "N/A"
       }
     },
-    "emptyFiltered": "Ingen serviceoppforinger samsvarer med filtrene dine.",
-    "empty": "Ingen serviceoppforinger enna.",
+    "emptyFiltered": "Ingen serviceoppføringer samsvarer med filtrene dine.",
+    "empty": "Ingen serviceoppføringer ennå.",
     "showing": "Viser {start}-{end} av {total}",
     "perPage": "per side",
     "page": "Side {page} av {totalPages}",
@@ -185,7 +185,7 @@
       "content": "Innhold",
       "date": "Dato"
     },
-    "empty": "Ingen notater enna.",
+    "empty": "Ingen notater ennå.",
     "pin": "Fest",
     "unpin": "Losgior",
     "delete": "Slett",
@@ -201,7 +201,7 @@
     "noteUpdated": "Notat oppdatert",
     "noteCreated": "Notat opprettet",
     "titleRequired": "Tittel og innhold er pakrevd",
-    "saveError": "Kunne ikke {action} notat",
+    "saveError": "Kunne ikke lagre notat",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",
@@ -276,8 +276,8 @@
     }
   },
   "form": {
-    "editTitle": "Rediger kjoretoy",
-    "addTitle": "Legg til nytt kjoretoy",
+    "editTitle": "Rediger kjøretøy",
+    "addTitle": "Legg til nytt kjøretøy",
     "photo": "Bilde",
     "clickToUpload": "Klikk for a laste opp et bilde",
     "imageFormats": "JPEG, PNG, WebP opptil 5 MB",
@@ -319,17 +319,17 @@
     "twoStroke": "Totakt",
     "vinMarine": "HIN",
     "licensePlateMarine": "Registreringsnummer",
-    "vehicleUpdated": "Kjoretoy oppdatert",
-    "vehicleAdded": "Kjoretoy lagt til",
-    "saveError": "Kunne ikke lagre kjoretoy"
+    "vehicleUpdated": "Kjøretøy oppdatert",
+    "vehicleAdded": "Kjøretøy lagt til",
+    "saveError": "Kunne ikke lagre kjøretøy"
   },
   "archiveDialog": {
-    "title": "Arkiver kjoretoy",
+    "title": "Arkiver kjøretøy",
     "description": "Arkivere <span>{name}</span>? Det vil bli skjult fra hovedlisten, men all servicehistorikk vil bli bevart.",
     "reasonLabel": "Arsak (valgfritt)",
     "reasonPlaceholder": "f.eks. Solgt, kondemnert, tatt ut av drift...",
     "archived": "{name} arkivert",
-    "archiveError": "Kunne ikke arkivere kjoretoy"
+    "archiveError": "Kunne ikke arkivere kjøretøy"
   },
   "serviceRecords": {
     "firstPage": "First page",

+ 4 - 4
messages/nl/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Verwijderen mislukt",
     "processed": "{count} factuur/facturen verwerkt",
     "failedProcess": "Verwerking mislukt",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Pauzeren",
+    "resume": "Hervatten",
+    "delete": "Verwijderen",
+    "removeRow": "Rij verwijderen"
   }
 }

+ 1 - 0
messages/nl/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Zoeken...",
   "shortcut": "Ctrl+K",
+  "readMore": "Meer lezen",
   "newWorkOrder": "Nieuwe werkorder",
   "quickCreate": {
     "title": "Toevoegen",

+ 1 - 1
messages/nl/settings.json

@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "AI-assistent",
-    "readMore": "Read More",
+    "readMore": "Meer lezen",
     "description": "Configureer AI om automatisch servicenotities te genereren en voertuiggeschiedenis samen te vatten.",
     "enableLabel": "AI inschakelen",
     "enableHint": "Gebruik AI-functies in de hele applicatie",

+ 9 - 8
messages/nl/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Statusrapporten",
+    "readMore": "Meer lezen",
     "newReport": "Nieuw rapport",
     "empty": "Nog geen statusrapporten",
     "emptyDescription": "Maak een statusrapport om uw klant te informeren over de voertuigstatus.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Statusrapport verwijderen",
     "deleteFailed": "Kan statusrapport niet verwijderen",
     "cancel": "Annuleren",
-  "feedback": "Feedback",
-  "hasComment": "Ontvangen",
-  "noFeedback": "Nog geen feedback",
-  "sentAt": "Verzonden",
-  "sentVia": "Verzonden via",
-  "messageLabel": "Bericht",
-  "videoLabel": "Video"
+    "feedback": "Feedback",
+    "hasComment": "Ontvangen",
+    "noFeedback": "Nog geen feedback",
+    "sentAt": "Verzonden",
+    "sentVia": "Verzonden via",
+    "messageLabel": "Bericht",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Hallo {name}, we hebben een statusupdate over uw {vehicle}. Bekijk het hier: {url}",
     "emailSubject": "Voertuig statusupdate - {vehicle}",
-  "viewReport": "Bekijk het rapport hier: {url}"
+    "viewReport": "Bekijk het rapport hier: {url}"
   }
 }

+ 2 - 2
messages/nl/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "bijv. 50000",
     "reminderUpdated": "Herinnering bijgewerkt",
     "reminderCreated": "Herinnering aangemaakt",
-    "saveError": "{action} van herinnering mislukt",
+    "saveError": "Kan herinnering niet opslaan",
     "notifyLabel": "Waarschuw mij bij vervaldatum",
     "notifyInApp": "In-app melding",
     "notifyEmail": "E-mail"
@@ -201,7 +201,7 @@
     "noteUpdated": "Notitie bijgewerkt",
     "noteCreated": "Notitie aangemaakt",
     "titleRequired": "Titel en inhoud zijn verplicht",
-    "saveError": "{action} van notitie mislukt",
+    "saveError": "Kan notitie niet opslaan",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",

+ 4 - 4
messages/pl/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Nie udało się usunąć",
     "processed": "Przetworzono {count} faktur(ę/y)",
     "failedProcess": "Nie udało się przetworzyć",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Wstrzymaj",
+    "resume": "Wznów",
+    "delete": "Usuń",
+    "removeRow": "Usuń wiersz"
   }
 }

+ 1 - 0
messages/pl/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Szukaj...",
   "shortcut": "Ctrl+K",
+  "readMore": "Dowiedz się więcej",
   "newWorkOrder": "Nowe zlecenie",
   "quickCreate": {
     "title": "Dodaj",

+ 107 - 107
messages/pl/settings.json

@@ -21,7 +21,7 @@
       },
       "account": {
         "title": "Konto",
-        "description": "Nazwa, e-mail i haslo"
+        "description": "Nazwa, e-mail i hasło"
       },
       "team": {
         "title": "Zespol",
@@ -123,7 +123,7 @@
     "pro": "PRO"
   },
   "readOnly": {
-    "banner": "Masz dostęp tylko do odczytu ustawień. Skontaktuj sie z administratorem, aby wprowadzić zmiany."
+    "banner": "Masz dostęp tylko do odczytu ustawień. Skontaktuj się z administratorem, aby wprowadzić zmiany."
   },
   "featureLocked": {
     "requiresPro": "Wymaga licencji Pro",
@@ -138,7 +138,7 @@
     "logoHint": "JPG, PNG, WebP, SVG — maks. 2MB",
     "uploadingLogo": "Przesylanie logo...",
     "logoUpdated": "Logo zaktualizowane",
-    "failedUploadLogo": "Nie udalo sie przeslac logo",
+    "failedUploadLogo": "Nie udało się przesłać logo",
     "detailsTitle": "Dane firmy",
     "shopName": "Nazwa firmy / warsztatu",
     "shopNamePlaceholder": "Warsztat Samochodowy Kowalski",
@@ -157,7 +157,7 @@
     "cancel": "Anuluj",
     "createCompany": "Utwórz firmę",
     "settingsSaved": "Ustawienia firmy zapisane",
-    "failedSave": "Nie udalo sie zapisać ustawień",
+    "failedSave": "Nie udało się zapisać ustawień",
     "companyCreated": "Firma utworzona pomyślnie",
     "serviceType": "Typ Usługi",
     "serviceTypeDescription": "Wybierz typ usługi oferowanej przez Twój warsztat. Zmienia to etykiety pól w całej aplikacji.",
@@ -182,51 +182,51 @@
     "emailPlaceholder": "Twój e-mail",
     "saveProfile": "Zapisz profil",
     "profileUpdated": "Profil zaktualizowany",
-    "failedUpdateProfile": "Nie udalo sie zaktualizować profilu",
-    "failedUpdateEmail": "Nie udalo sie zaktualizować e-maila",
-    "changePasswordTitle": "Zmień haslo",
-    "changePasswordDescription": "Wprowadź aktualne haslo i wybierz nowe.",
-    "currentPassword": "Aktualne haslo",
-    "newPassword": "Nowe haslo",
-    "confirmNewPassword": "Potwierdź nowe haslo",
-    "changePassword": "Zmień haslo",
+    "failedUpdateProfile": "Nie udało się zaktualizować profilu",
+    "failedUpdateEmail": "Nie udało się zaktualizować e-maila",
+    "changePasswordTitle": "Zmień hasło",
+    "changePasswordDescription": "Wprowadź aktualne hasło i wybierz nowe.",
+    "currentPassword": "Aktualne hasło",
+    "newPassword": "Nowe hasło",
+    "confirmNewPassword": "Potwierdź nowe hasło",
+    "changePassword": "Zmień hasło",
     "passwordChanged": "Haslo zmienione",
     "passwordsNoMatch": "Hasla nie sa zgodne",
     "passwordMinLength": "Haslo musi mieć co najmniej 8 znaków",
-    "failedChangePassword": "Nie udalo sie zmienić hasla",
-    "twoFactorTitle": "Uwierzytelnianie dwuskladnikowe",
-    "twoFactorEnabled": "Uwierzytelnianie dwuskladnikowe jest wlaczone",
-    "twoFactorDisablePrompt": "Wprowadź haslo, aby wylaczyc uwierzytelnianie dwuskladnikowe.",
-    "twoFactorEnablePrompt": "Dodaj dodatkowa warstwe bezpieczeństwa do swojego konta, wlaczajac uwierzytelnianie dwuskladnikowe z aplikacja uwierzytelniajaca.",
+    "failedChangePassword": "Nie udało się zmienić hasła",
+    "twoFactorTitle": "Uwierzytelnianie dwuskładnikowe",
+    "twoFactorEnabled": "Uwierzytelnianie dwuskładnikowe jest włączone",
+    "twoFactorDisablePrompt": "Wprowadź hasło, aby wyłączyć uwierzytelnianie dwuskładnikowe.",
+    "twoFactorEnablePrompt": "Dodaj dodatkową warstwę bezpieczeństwa do swojego konta, włączając uwierzytelnianie dwuskładnikowe z aplikacją uwierzytelniającą.",
     "password": "Haslo",
-    "enterPassword": "Wprowadź haslo",
-    "disable2FA": "Wylacz 2FA",
-    "enable2FA": "Wlacz 2FA",
-    "twoFactorDisabled": "Uwierzytelnianie dwuskladnikowe wylaczone",
-    "failedEnable2FA": "Nie udalo sie wlaczyc 2FA",
-    "failedDisable2FA": "Nie udalo sie wylaczyc 2FA",
-    "enterPasswordError": "Proszę wprowadzić haslo",
-    "setupDialogTitle": "Wlacz uwierzytelnianie dwuskladnikowe",
-    "setupDialogDescription": "Wprowadź haslo, aby rozpocząć konfiguracje 2FA z aplikacja uwierzytelniajaca.",
+    "enterPassword": "Wprowadź hasło",
+    "disable2FA": "Wyłącz 2FA",
+    "enable2FA": "Włącz 2FA",
+    "twoFactorDisabled": "Uwierzytelnianie dwuskładnikowe wyłączone",
+    "failedEnable2FA": "Nie udało się włączyć 2FA",
+    "failedDisable2FA": "Nie udało się wyłączyć 2FA",
+    "enterPasswordError": "Proszę wprowadzić hasło",
+    "setupDialogTitle": "Włącz uwierzytelnianie dwuskładnikowe",
+    "setupDialogDescription": "Wprowadź hasło, aby rozpocząć konfigurację 2FA z aplikacją uwierzytelniającą.",
     "continue": "Kontynuuj",
     "scanQRTitle": "Zeskanuj kod QR",
-    "scanQRDescription": "Zeskanuj ten kod QR aplikacja uwierzytelniajaca (Google Authenticator, Authy itp.)",
+    "scanQRDescription": "Zeskanuj ten kod QR aplikacją uwierzytelniającą (Google Authenticator, Authy itp.)",
     "verifyCodeTitle": "Zweryfikuj kod",
-    "verifyCodeDescription": "Wprowadź 6-cyfrowy kod z aplikacji uwierzytelniającej, aby potwierdzić poprawna konfiguracje.",
+    "verifyCodeDescription": "Wprowadź 6-cyfrowy kod z aplikacji uwierzytelniającej, aby potwierdzić poprawną konfigurację.",
     "authCode": "Kod uwierzytelniania",
     "authCodePlaceholder": "000000",
     "back": "Wstecz",
     "verify": "Zweryfikuj",
     "enterCodeError": "Proszę wprowadzić kod z aplikacji uwierzytelniającej",
     "invalidCode": "Nieprawidlowy kod. Spróbuj ponownie.",
-    "verificationFailed": "Weryfikacja nie powiodla sie",
+    "verificationFailed": "Weryfikacja nie powiodła się",
     "backupCodesTitle": "Zapisz kody zapasowe",
-    "backupCodesDescription": "Zapisz te kody w bezpiecznym miejscu. Możesz ich użyć do zalogowania sie, jeśli stracisz dostęp do aplikacji uwierzytelniającej. Każdy kod może byc uzyty tylko raz.",
+    "backupCodesDescription": "Zapisz te kody w bezpiecznym miejscu. Możesz ich użyć do zalogowania się, jeśli stracisz dostęp do aplikacji uwierzytelniającej. Każdy kod może być użyty tylko raz.",
     "copyCodes": "Kopiuj kody",
     "copied": "Skopiowano",
     "backupCodesCopied": "Kody zapasowe skopiowane do schowka",
     "savedBackupCodes": "Zapisalem moje kody zapasowe",
-    "twoFactorEnabledSuccess": "Uwierzytelnianie dwuskladnikowe wlaczone",
+    "twoFactorEnabledSuccess": "Uwierzytelnianie dwuskładnikowe włączone",
     "dangerZone": "Strefa niebezpieczenstwa",
     "deleteContentTitle": "Usuń zawartość",
     "deleteContentDescription": "Selektywnie usuń dane organizacji, takie jak pojazdy, klienci, wyceny lub inwentarz. Twoje konto i ustawienia pozostana nienaruszone.",
@@ -240,7 +240,7 @@
     "deleteAccountConfirmPrompt": "Wpisz <bold>delete me</bold> aby potwierdzić",
     "permanentlyDelete": "Usuń trwale",
     "deleting": "Usuwanie...",
-    "failedDeleteAccount": "Nie udalo sie usunąć konta",
+    "failedDeleteAccount": "Nie udało się usunąć konta",
     "deleteContentDialogTitle": "Usuń zawartość",
     "deleteContentDialogDescription": "Wybierz zawartość, ktora chcesz trwale usunąć. Tej akcji nie można cofnąć.",
     "contentVehicles": "Pojazdy",
@@ -267,7 +267,7 @@
     "deleteContentConfirmPrompt": "Wpisz <bold>delete my data</bold> aby potwierdzić",
     "deleteSelected": "Usuń {count} wybranych",
     "contentDeleted": "Wybrana zawartość zostala trwale usunięta",
-    "failedDeleteContent": "Nie udalo sie usunąć zawartosci",
+    "failedDeleteContent": "Nie udało się usunąć zawartości",
     "passkey": {
       "title": "Passkeys",
       "description": "Loguj się za pomocą biometrii lub klucza bezpieczeństwa zamiast hasła.",
@@ -308,12 +308,12 @@
     "noOrgDescription": "Utwórz zespol, aby dzielic dane z innymi użytkownikami.",
     "orgDescription": "Zarządzaj czlonkami organizacji i ich rolami.",
     "createOrg": "Utwórz organizacje",
-    "createOrgDescription": "Utwórz organizacje, aby zaprosic czlonkow zespolu. Będziesz wlascicielem.",
+    "createOrgDescription": "Utwórz organizacje, aby zaprosić czlonkow zespolu. Będziesz wlascicielem.",
     "orgName": "Nazwa organizacji",
     "orgNamePlaceholder": "Moj warsztat",
     "create": "Utwórz",
     "orgCreated": "Organizacja utworzona",
-    "failedCreateOrg": "Nie udalo sie utworzyć organizacji",
+    "failedCreateOrg": "Nie udało się utworzyć organizacji",
     "memberCount": "{count} czlonek",
     "memberCountPlural": "{count} czlonkow",
     "admin": "Administrator",
@@ -327,8 +327,8 @@
     "sendInvitation": "Wyślij zaproszenie",
     "invitationSentTitle": "Zaproszenie wyslane",
     "invitationSentDescription": "E-mail z zaproszeniem zostal wyslany do {email}.",
-    "failedInvite": "Nie udalo sie zaprosic czlonka",
-    "failedSendInvitation": "Nie udalo sie wyslac zaproszenia",
+    "failedInvite": "Nie udało się zaprosić członka",
+    "failedSendInvitation": "Nie udało się wysłać zaproszenia",
     "pendingInvitations": "Oczekujące zaproszenia",
     "invitedAs": "Zaproszony jako {role}",
     "expires": "Wygasa {date}",
@@ -338,7 +338,7 @@
     "cancelInvitation": "Anuluj zaproszenie",
     "cancelInvitationDescription": "Anulować zaproszenie dla {email}? Nie będą mogli użyć tego linku.",
     "invitationCancelled": "Zaproszenie anulowane",
-    "failedCancelInvitation": "Nie udalo sie anulować zaproszenia",
+    "failedCancelInvitation": "Nie udało się anulować zaproszenia",
     "customRoles": "Role niestandardowe",
     "newRole": "Nowa rola",
     "roleName": "Nazwa roli",
@@ -349,11 +349,11 @@
     "updateRole": "Zaktualizuj role",
     "roleCreated": "Rola utworzona",
     "roleUpdated": "Rola zaktualizowana",
-    "failedSaveRole": "Nie udalo sie zapisać roli",
+    "failedSaveRole": "Nie udało się zapisać roli",
     "deleteRole": "Usuń role",
     "deleteRoleDescription": "Usunąć role \"{name}\"? Czlonkowie z ta rola stracą swoje niestandardowe uprawnienia.",
     "roleDeleted": "Rola usunięta",
-    "failedDeleteRole": "Nie udalo sie usunąć roli",
+    "failedDeleteRole": "Nie udało się usunąć roli",
     "fullAccess": "Pelny dostęp",
     "permissionCount": "{count} uprawnienie",
     "permissionCountPlural": "{count} uprawnien",
@@ -370,21 +370,21 @@
     "memberLabel": "Czlonek",
     "memberDescription": "Uprawnienia okreslone przez przypisana role niestandardowa. Brak roli niestandardowej oznacza dostęp tylko do odczytu.",
     "roleAssigned": "Rola zaktualizowana",
-    "failedAssignRole": "Nie udalo sie zaktualizować roli",
-    "removeMemberTitle": "Usuń czlonka",
+    "failedAssignRole": "Nie udało się zaktualizować roli",
+    "removeMemberTitle": "Usuń członka",
     "removeMemberDescription": "Usunąć {name} z zespolu? Straci dostęp do wspoldzielonych danych.",
     "removeButton": "Usuń",
     "memberRemoved": "Czlonek usunięty",
-    "failedRemoveMember": "Nie udalo sie usunąć czlonka",
-    "memberRoleUpdated": "Rola czlonka zaktualizowana",
-    "failedUpdateRole": "Nie udalo sie zaktualizować roli",
+    "failedRemoveMember": "Nie udało się usunąć członka",
+    "memberRoleUpdated": "Rola członka zaktualizowana",
+    "failedUpdateRole": "Nie udało się zaktualizować roli",
     "removeMember": "Remove member",
     "cancelInvite": "Cancel invitation",
     "editRole": "Edit role"
   },
   "invoice": {
-    "title": "Uklad faktury",
-    "description": "Skonfiguruj, co pojawią sie na generowanych fakturach PDF.",
+    "title": "Układ faktury",
+    "description": "Skonfiguruj, co pojawi się na generowanych fakturach PDF.",
     "tabs": {
       "general": "Ogólne",
       "layout": "Układ",
@@ -414,7 +414,7 @@
     "organizationNumberHint": "Pokaż numer organizacji w naglowku faktury",
     "customFooter": "Niestandardowa stopka faktury",
     "footerPlaceholder": "Dziękujemy za zamowienie!",
-    "footerHint": "Ten tekst pojawią sie na dole każdej faktury",
+    "footerHint": "Ten tekst pojawi się na dole każdej faktury",
     "partsMarkupTitle": "Marża na Części",
     "partsMarkupDescription": "Marża doliczana do ceny zakupu przy dodawaniu części. Tylko wewnętrznie — klient nigdy nie widzi kosztu ani marży, tylko cenę końcową.",
     "defaultMarkupPercent": "Domyślna Marża %",
@@ -493,22 +493,22 @@
     "title": "Szablony",
     "invoiceDescription": "Dostosuj wygląd faktur i wycen PDF.",
     "inspectionsDescription": "Zarządzaj listami kontrolnymi inspekcji i szablonami wielopunktowymi.",
-    "smsDescription": "Dostosuj wiadomości SMS wysylane do klientów.",
+    "smsDescription": "Dostosuj wiadomości SMS wysyłane do klientów.",
     "tabs": {
       "invoice": "Faktura",
       "quotation": "Wycena",
       "inspections": "Inspekcje",
       "sms": "SMS",
-      "layout": "Uklad"
+      "layout": "Układ"
     },
     "presets": "Gotowe szablony",
-    "primaryColor": "Kolor glowny",
+    "primaryColor": "Kolor główny",
     "fontAndLayout": "Czcionka i uklad",
     "fontFamily": "Rodzina czcionek",
     "helveticaDefault": "Helvetica (Domyślna)",
     "timesRoman": "Times Roman",
     "courier": "Courier",
-    "headerStyle": "Styl naglowka",
+    "headerStyle": "Styl nagłówka",
     "logoSize": "Rozmiar logo",
     "standard": "Standardowy",
     "compact": "Kompaktowy",
@@ -536,26 +536,26 @@
     "saveQuotationTemplate": "Zapisz szablon wyceny",
     "invoiceTemplateSaved": "Ustawienia szablonu faktury zapisane",
     "quotationTemplateSaved": "Ustawienia szablonu wyceny zapisane",
-    "failedSave": "Nie udalo sie zapisać ustawień",
+    "failedSave": "Nie udało się zapisać ustawień",
     "smsTemplates": "Szablony wiadomości SMS",
-    "smsTemplatesDescription": "Dostosuj wiadomości tekstowe wysylane do klientów. Użyj zmiennych jak <code>'{companyName}'</code> aby wstawic dynamiczne wartości.",
+    "smsTemplatesDescription": "Dostosuj wiadomości tekstowe wysyłane do klientów. Użyj zmiennych jak <code>'{companyName}'</code> aby wstawić dynamiczne wartości.",
     "reset": "Resetuj",
     "invoiceReady": "Faktura gotowa",
-    "invoiceReadyDescription": "Wysylana przy udostepnianiu faktury klientowi.",
+    "invoiceReadyDescription": "Wysyłana przy udostepnianiu faktury klientowi.",
     "quoteReady": "Wycena gotowa",
-    "quoteReadyDescription": "Wysylana przy udostepnianiu wyceny klientowi.",
+    "quoteReadyDescription": "Wysyłana przy udostepnianiu wyceny klientowi.",
     "inspectionReady": "Inspekcja gotowa",
-    "inspectionReadyDescription": "Wysylana przy udostepnianiu raportu inspekcji klientowi.",
+    "inspectionReadyDescription": "Wysyłana przy udostepnianiu raportu inspekcji klientowi.",
     "statusInProgress": "Status: W toku",
-    "statusInProgressDescription": "Wysylana gdy status zlecenia zmieni sie na W toku.",
+    "statusInProgressDescription": "Wysyłana gdy status zlecenia zmieni się na W toku.",
     "statusWaitingParts": "Status: Oczekiwanie na części",
-    "statusWaitingPartsDescription": "Wysylana gdy status zmieni sie na Oczekiwanie na części.",
+    "statusWaitingPartsDescription": "Wysyłana gdy status zmieni się na Oczekiwanie na części.",
     "statusReady": "Status: Gotowy do odbioru",
-    "statusReadyDescription": "Wysylana gdy status zmieni sie na Gotowy.",
+    "statusReadyDescription": "Wysyłana gdy status zmieni się na Gotowy.",
     "statusCompleted": "Status: Zakończony",
-    "statusCompletedDescription": "Wysylana gdy status zmieni sie na Zakończony.",
+    "statusCompletedDescription": "Wysyłana gdy status zmieni się na Zakończony.",
     "paymentReceived": "Platnosc otrzymana",
-    "paymentReceivedDescription": "Wysylana gdy platnosc zostanie zarejestrowana dla faktury.",
+    "paymentReceivedDescription": "Wysyłana gdy platnosc zostanie zarejestrowana dla faktury.",
     "saveSmsTemplates": "Zapisz szablony SMS",
     "smsTemplateSaved": "Ustawienia szablonów SMS zapisane",
     "smsDefaults": {
@@ -574,13 +574,13 @@
       "emerald": "Szmaragdowy",
       "red": "Czerwony",
       "purple": "Fioletowy",
-      "slate": "Lupkowy",
-      "rose": "Rozowy",
+      "slate": "Łupkowy",
+      "rose": "Różowy",
       "indigo": "Indygo"
     },
-    "layoutTitle": "Uklad faktury",
+    "layoutTitle": "Układ faktury",
     "layoutDescription": "Dostosuj kolejność i widoczność sekcji w fakturach i wycenach.",
-    "layoutSaved": "Uklad zapisany pomyślnie",
+    "layoutSaved": "Układ zapisany pomyślnie",
     "layoutDocInvoice": "Faktura",
     "layoutDocQuote": "Wycena"
   },
@@ -595,7 +595,7 @@
     "paymentTermsPlaceholder": "14 dni netto",
     "paymentTermsHint": "Tekst warunkow platnosci na fakturach (np. \"14 dni netto\", \"Platne przy odbiorze\")",
     "onlinePayments": "Platnosci online",
-    "onlinePaymentsDescription": "Pozwol klientom placic faktury online przez udostępnione linki do faktur.",
+    "onlinePaymentsDescription": "Pozwól klientom płacić faktury online przez udostępnione linki do faktur.",
     "stripe": "Stripe",
     "stripeDescription": "Akceptuj platnosci karta kredytowa/debetowa",
     "secretKey": "Klucz tajny",
@@ -662,18 +662,18 @@
     "searchCurrency": "Szukaj waluty...",
     "noCurrencyFound": "Nie znaleziono waluty.",
     "previewLabel": "Podgląd: {value}",
-    "enableTax": "Wlacz podatek",
+    "enableTax": "Włącz podatek",
     "enableTaxHint": "Pokaż obliczanie podatku na fakturach i rekordach serwisowych",
     "defaultTaxRate": "Domyślna stawka podatkowa (%)",
     "defaultTaxRateHint": "Automatycznie wypelniana przy tworzeniu nowych rekordów serwisowych",
     "applyTaxToExistingLabel": "Zastosuj podatek do istniejących rekordów",
-    "applyTaxToExistingHint": "Stosuje domyślna stawkę podatku do istniejących zleceń serwisowych i ofert bez ustawionej stawki. Kwalifikujące sie: {serviceRecords} zleceń, {quotes} ofert.",
+    "applyTaxToExistingHint": "Stosuje domyślną stawkę podatku do istniejących zleceń serwisowych i ofert bez ustawionej stawki. Kwalifikujące się: {serviceRecords} zleceń, {quotes} ofert.",
     "applyTaxToExistingButton": "Zastosuj podatek do istniejących rekordów",
     "applyTaxConfirmTitle": "Zastosować podatek do istniejących rekordów?",
     "applyTaxConfirmDescription": "Ustawi to stawkę podatku na {rate}% dla {serviceRecords} zleceń serwisowych i {quotes} ofert, które obecnie nie maja ustawionej stawki, i przeliczy ich sumy. Rekordy z wlasna stawka podatku nie zostaną zmienione. Tej operacji nie można cofnąć.",
     "applyTaxConfirmLabel": "Zastosuj podatek",
     "applyTaxSuccess": "Zaktualizowano {serviceRecords} zleceń serwisowych i {quotes} ofert.",
-    "applyTaxFailed": "Nie udalo sie zastosować podatku do istniejących rekordów",
+    "applyTaxFailed": "Nie udało się zastosować podatku do istniejących rekordów",
     "applyTaxNoRecords": "Żadne rekordy nie wymagają domyślnej stawki podatku.",
     "saveSettings": "Zapisz ustawienia",
     "saved": "Ustawienia zapisane",
@@ -843,13 +843,13 @@
   },
   "maintenance": {
     "title": "Przewidywana konserwacja",
-    "description": "Przewiduj aktualny przebieg każdego pojazdu na podstawie historii serwisowej i wyswietlaj pojazdy wymagajace lub zblizajace sie do nastepnego serwisu.",
-    "enablePredicted": "Wlacz przewidywana konserwacje",
+    "description": "Przewiduj aktualny przebieg każdego pojazdu na podstawie historii serwisowej i wyświetlaj pojazdy wymagające lub zbliżające się do następnego serwisu.",
+    "enablePredicted": "Włącz przewidywaną konserwację",
     "enablePredictedHint": "Pokaż prognozy na szczegolach pojazdu i pulpicie",
     "serviceInterval": "Interwal serwisowy ({unit})",
     "serviceIntervalHint": "Odleglosc między zalecanymi serwisami",
     "approachingThreshold": "Próg zblizania ({unit})",
-    "approachingThresholdHint": "Pokaż ostrzezenie w tej odleglosci od nastepnego serwisu",
+    "approachingThresholdHint": "Pokaż ostrzezenie w tej odleglosci od następnego serwisu",
     "saveMaintenance": "Zapisz ustawienia konserwacji",
     "saved": "Ustawienia konserwacji zapisane"
   },
@@ -919,23 +919,23 @@
     "optCustomFieldsDesc": "Definicje i wartości pol niestandardowych",
     "optFiles": "Przeslane pliki",
     "optFilesDesc": "Zdjęcia, zalaczniki serwisowe, logo",
-    "filesWarning": "Zawiera przeslane pliki — kopia zapasowa może byc wieksza",
+    "filesWarning": "Zawiera przeslane pliki — kopia zapasowa może być wieksza",
     "downloadBackup": "Pobierz kopie zapasowa",
     "exportComplete": "Eksport zakończony",
     "exportCompleteMessage": "Plik kopii zapasowej zostal pobrany.",
-    "exportFailed": "Eksport nie powiodl sie",
-    "exportFailedMessage": "Nie udalo sie wyeksportowac danych. Spróbuj ponownie.",
+    "exportFailed": "Eksport nie powiódł się",
+    "exportFailedMessage": "Nie udało się wyeksportować danych. Spróbuj ponownie.",
     "importTitle": "Importuj dane",
     "importWarning": "Import <bold>zastapi wszystkie istniejące dane</bold> zawartoscia pliku kopii zapasowej. Tej akcji nie można cofnąć.",
     "importFileHint": "Obsluguje pliki kopii zapasowej .zip (v2) i .json (v1).",
     "uploadRestore": "Prześlij i przywróć",
     "importComplete": "Import zakończony",
     "importCompleteMessage": "Wszystkie dane zostaly przywrocone z pliku kopii zapasowej.",
-    "importFailed": "Import nie powiodl sie",
+    "importFailed": "Import nie powiódł się",
     "importFromOther": "Importuj z innych uslug",
     "importFromOtherDescription": "Migruj dane z innej platformy. Wybierz usluge, aby rozpocząć.",
     "lubelogTitle": "Importuj z LubeLog",
-    "lubelogExportSteps": "Jak wyeksportowac dane z LubeLog:",
+    "lubelogExportSteps": "Jak wyeksportować dane z LubeLog:",
     "lubelogStep1": "Otwórz instancje LubeLog",
     "lubelogStep2": "Przejdź do <bold>Settings</bold>",
     "lubelogStep3": "Kliknij <bold>Make Backup</bold> aby pobrać plik zip",
@@ -950,7 +950,7 @@
     "cancel": "Anuluj",
     "import": "Importuj",
     "invoiceNinjaTitle": "Importuj z Invoice Ninja",
-    "invoiceNinjaExportSteps": "Jak wyeksportowac dane z Invoice Ninja:",
+    "invoiceNinjaExportSteps": "Jak wyeksportować dane z Invoice Ninja:",
     "invoiceNinjaStep1": "Otwórz instancje Invoice Ninja",
     "invoiceNinjaStep2": "Przejdź do <bold>Settings > Import | Export</bold>",
     "invoiceNinjaStep3": "Kliknij <bold>Export</bold> aby pobrać plik zip",
@@ -984,8 +984,8 @@
     "validate": "Zweryfikuj",
     "validated": "Licencja zweryfikowana pomyślnie",
     "invalid": "Nieprawidlowy klucz licencji",
-    "failedValidate": "Nie udalo sie zweryfikować licencji",
-    "keyHint": "Każdy klucz licencji jest powiazany z ta organizacja i nie może byc wspoldzielony między wieloma organizacjami."
+    "failedValidate": "Nie udało się zweryfikować licencji",
+    "keyHint": "Każdy klucz licencji jest powiazany z ta organizacja i nie może być wspoldzielony między wieloma organizacjami."
   },
   "about": {
     "title": "O Torqvoice",
@@ -997,21 +997,21 @@
   },
   "portal": {
     "title": "Portal klienta",
-    "description": "Pozwol swoim klientom logować sie i przeglądać swoje pojazdy, faktury, wyceny i inspekcje. Klienci mogą również wysylac zapytania serwisowe.",
-    "enablePortal": "Wlacz portal klienta",
-    "enablePortalHint": "Klienci z adresem e-mail mogą logować sie za pomocą magicznego linku",
+    "description": "Pozwól swoim klientom logować się i przeglądać swoje pojazdy, faktury, wyceny i inspekcje. Klienci mogą również wysyłać zapytania serwisowe.",
+    "enablePortal": "Włącz portal klienta",
+    "enablePortalHint": "Klienci z adresem e-mail mogą logować się za pomocą magicznego linku",
     "enabled": "Portal klienta wlaczony",
     "disabled": "Portal klienta wylaczony",
-    "failedUpdate": "Nie udalo sie zaktualizować ustawienia",
+    "failedUpdate": "Nie udało się zaktualizować ustawienia",
     "customSlug": "Niestandardowy slug portalu",
     "save": "Zapisz",
     "slugSaved": "Slug portalu zapisany",
     "slugRemoved": "Slug portalu usunięty",
-    "failedUpdateSlug": "Nie udalo sie zaktualizować sluga",
-    "slugHint": "Male litery, cyfry, myslniki i podkreślenia. 3-48 znaków. Pozostaw puste, aby użyć domyslnego URL.",
+    "failedUpdateSlug": "Nie udało się zaktualizować sluga",
+    "slugHint": "Małe litery, cyfry, myślniki i podkreślenia. 3-48 znaków. Pozostaw puste, aby użyć domyślnego URL.",
     "portalUrl": "URL portalu",
     "urlCopied": "URL portalu skopiowany",
-    "shareHint": "Udostępnij ten link swoim klientom, aby mogli zalogować sie do swojego portalu.",
+    "shareHint": "Udostępnij ten link swoim klientom, aby mogli zalogować się do swojego portalu.",
     "serviceRequestAlertsHint": "Zgłoszenia serwisowe z portalu zawsze pojawiają się w dzwonku powiadomień. Możesz je otrzymywać także e-mailem.",
     "serviceRequestAlertsLink": "Ustawienia powiadomień →",
     "descriptionLabel": "O Twoim warsztacie",
@@ -1049,10 +1049,10 @@
   },
   "email": {
     "title": "Dostawca poczty e-mail",
-    "description": "Skonfiguruj dostawcę poczty e-mail swojej organizacji do wysylania faktur i ofert. Jeśli nie skonfigurowano, zostanie uzyty domyślny dostawca poczty e-mail platformy.",
-    "useCustomLabel": "Użyj wlasnego dostawcy poczty e-mail",
-    "useCustomHint": "Wlacz, aby skonfigurować wlasnego dostawcę poczty e-mail zamiast domyslnego platformy",
-    "platformDefaultInfo": "Twoja organizacja korzysta z domyslnego dostawcy poczty e-mail platformy. Faktury i oferty będą wysylane przy uzyciu skonfigurowanych ustawień poczty e-mail platformy.",
+    "description": "Skonfiguruj dostawcę poczty e-mail swojej organizacji do wysylania faktur i ofert. Jeśli nie skonfigurowano, zostanie użyty domyślny dostawca poczty e-mail platformy.",
+    "useCustomLabel": "Użyj własnego dostawcy poczty e-mail",
+    "useCustomHint": "Włącz, aby skonfigurować własnego dostawcę poczty e-mail zamiast domyślnego platformy",
+    "platformDefaultInfo": "Twoja organizacja korzysta z domyślnego dostawcy poczty e-mail platformy. Faktury i oferty będą wysyłane przy użyciu skonfigurowanych ustawień poczty e-mail platformy.",
     "smtpHost": "Host SMTP",
     "smtpHostPlaceholder": "smtp.example.com",
     "smtpPort": "Port SMTP",
@@ -1066,9 +1066,9 @@
     "fromName": "Nazwa nadawcy",
     "fromNamePlaceholder": "Twój Warsztat",
     "tlsConnection": "Polaczenie TLS (Port 465)",
-    "tlsConnectionHint": "Wlacz dla niejawnego TLS. Wylacz dla STARTTLS (port 587/25).",
+    "tlsConnectionHint": "Włącz dla niejawnego TLS. Wyłącz dla STARTTLS (port 587/25).",
     "verifyTlsCerts": "Weryfikuj certyfikaty TLS",
-    "verifyTlsCertsHint": "Wylacz, aby zezwolić na samopodpisane certyfikaty (niezalecane w produkcji)",
+    "verifyTlsCertsHint": "Wyłącz, aby zezwolić na samopodpisane certyfikaty (niezalecane w produkcji)",
     "requireTlsUpgrade": "Wymagaj aktualizacji TLS",
     "requireTlsUpgradeHint": "Wymuś aktualizacje TLS na polaczeniach STARTTLS",
     "apiKey": "Klucz API",
@@ -1090,16 +1090,16 @@
     "saveSettings": "Zapisz ustawienia",
     "savedDefault": "Ustawienia poczty e-mail zapisane — użyto domyslnych platformy",
     "saved": "Ustawienia poczty e-mail zapisane",
-    "failedSave": "Nie udalo sie zapisać ustawień",
+    "failedSave": "Nie udało się zapisać ustawień",
     "testSentTo": "Testowy e-mail wyslany do {email}",
-    "testFailed": "Test e-mail nie powiodl sie"
+    "testFailed": "Test e-mail nie powiódł się"
   },
   "sms": {
     "title": "Dostawca SMS",
-    "description": "Skonfiguruj dostawcę SMS do dwukierunkowej komunikacji z klientami. Każda organizacja uzywa wlasnego dostawcy SMS i numeru telefonu.",
-    "enableLabel": "Wlacz wiadomości SMS",
+    "description": "Skonfiguruj dostawcę SMS do dwukierunkowej komunikacji z klientami. Każda organizacja używa własnego dostawcy SMS i numeru telefonu.",
+    "enableLabel": "Włącz wiadomości SMS",
     "enableHint": "Wysylaj i odbieraj wiadomości SMS z klientami",
-    "disabledInfo": "Wiadomości SMS sa wylaczone. Wlacz, aby wysylac i odbierać wiadomości tekstowe ze swoimi klientami.",
+    "disabledInfo": "Wiadomości SMS są wyłączone. Włącz, aby wysyłać i odbierać wiadomości tekstowe ze swoimi klientami.",
     "phoneNumber": "Numer telefonu",
     "phoneNumberPlaceholder": "+48123456789",
     "phoneNumberHint": "Twój numer telefonu z obsluga SMS w formacie E.164 (np. +48123456789)",
@@ -1113,14 +1113,14 @@
     "testPhoneNumber": "Testowy numer telefonu",
     "testPhonePlaceholder": "+48987654321",
     "sendTestSms": "Wyślij testowy SMS",
-    "testSmsHint": "Najpierw zapisz ustawienia, a następnie wprowadź numer odbiorcy, aby wyslac testowy SMS",
-    "enterTestPhone": "Wprowadź numer telefonu, aby wyslac testowy SMS",
+    "testSmsHint": "Najpierw zapisz ustawienia, a następnie wprowadź numer odbiorcy, aby wysłać testowy SMS",
+    "enterTestPhone": "Wprowadź numer telefonu, aby wysłać testowy SMS",
     "saveSettings": "Zapisz ustawienia",
     "savedDisabled": "Ustawienia SMS zapisane — SMS wylaczony",
     "saved": "Ustawienia SMS zapisane",
-    "failedSave": "Nie udalo sie zapisać ustawień",
+    "failedSave": "Nie udało się zapisać ustawień",
     "testSentTo": "Testowy SMS wyslany do {phone}",
-    "testFailed": "Test SMS nie powiodl sie",
+    "testFailed": "Test SMS nie powiódł się",
     "copyWebhookUrl": "Copy webhook URL"
   },
   "subscription": {
@@ -1191,11 +1191,11 @@
   },
   "ai": {
     "title": "Asystent AI",
-    "readMore": "Read More",
+    "readMore": "Dowiedz się więcej",
     "description": "Skonfiguruj AI do automatycznego generowania notatek serwisowych i podsumowywania historii pojazdu.",
-    "enableLabel": "Wlacz AI",
+    "enableLabel": "Włącz AI",
     "enableHint": "Korzystaj z funkcji opartych na AI w calej aplikacji",
-    "disabledInfo": "Wlacz AI, aby korzystac z funkcji takich jak automatycznie generowane opisy serwisowe i podsumowania historii pojazdu.",
+    "disabledInfo": "Włącz AI, aby korzystać z funkcji takich jak automatycznie generowane opisy serwisowe i podsumowania historii pojazdu.",
     "provider": "Dostawca AI",
     "apiKey": "Klucz API",
     "apiKeyHint": "Twój klucz API {provider}. Przechowywany bezpiecznie i nigdy nieudostepniany.",
@@ -1204,7 +1204,7 @@
     "testSuccess": "Polaczenie AI udane!",
     "testFailed": "Polaczenie nieudane. Sprawdź klucz API i model.",
     "saved": "Ustawienia AI zapisane",
-    "failedSave": "Nie udalo sie zapisać ustawień AI",
+    "failedSave": "Nie udało się zapisać ustawień AI",
     "saveSettings": "Zapisz ustawienia",
     "featuresTitle": "Zawarte funkcje AI:",
     "featureServiceNotes": "Automatyczne generowanie profesjonalnych opisow serwisowych z części i robocizny",

+ 9 - 8
messages/pl/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Raporty statusu",
+    "readMore": "Dowiedz się więcej",
     "newReport": "Nowy raport",
     "empty": "Brak raportów statusu",
     "emptyDescription": "Utwórz raport statusu, aby poinformować klienta o stanie pojazdu.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Usuń raport statusu",
     "deleteFailed": "Nie udało się usunąć raportu statusu",
     "cancel": "Anuluj",
-  "feedback": "Komentarz",
-  "hasComment": "Otrzymano",
-  "noFeedback": "Brak komentarzy",
-  "sentAt": "Wysłano",
-  "sentVia": "Wysłano przez",
-  "messageLabel": "Wiadomość",
-  "videoLabel": "Wideo"
+    "feedback": "Komentarz",
+    "hasComment": "Otrzymano",
+    "noFeedback": "Brak komentarzy",
+    "sentAt": "Wysłano",
+    "sentVia": "Wysłano przez",
+    "messageLabel": "Wiadomość",
+    "videoLabel": "Wideo"
   },
   "notify": {
     "defaultMessage": "Witaj {name}, mamy aktualizację statusu Twojego {vehicle}. Zobacz tutaj: {url}",
     "emailSubject": "Aktualizacja statusu pojazdu - {vehicle}",
-  "viewReport": "Zobacz raport tutaj: {url}"
+    "viewReport": "Zobacz raport tutaj: {url}"
   }
 }

+ 2 - 2
messages/pl/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "np. 50000",
     "reminderUpdated": "Przypomnienie zaktualizowane",
     "reminderCreated": "Przypomnienie utworzone",
-    "saveError": "Nie udało się {action} przypomnienia",
+    "saveError": "Nie udało się zapisać przypomnienia",
     "notifyLabel": "Powiadom mnie w terminie",
     "notifyInApp": "Powiadomienie w aplikacji",
     "notifyEmail": "E-mail"
@@ -201,7 +201,7 @@
     "noteUpdated": "Notatka zaktualizowana",
     "noteCreated": "Notatka utworzona",
     "titleRequired": "Tytuł i treść są wymagane",
-    "saveError": "Nie udało się {action} notatki",
+    "saveError": "Nie udało się zapisać notatki",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",

+ 4 - 4
messages/pt-BR/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Falha ao excluir",
     "processed": "{count} fatura(s) processada(s)",
     "failedProcess": "Falha ao processar",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Pausar",
+    "resume": "Retomar",
+    "delete": "Excluir",
+    "removeRow": "Remover linha"
   }
 }

+ 1 - 0
messages/pt-BR/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Buscar...",
   "shortcut": "Ctrl+K",
+  "readMore": "Saiba mais",
   "newWorkOrder": "Nova Ordem de Serviço",
   "quickCreate": {
     "title": "Adicionar",

+ 7 - 7
messages/pt-BR/settings.json

@@ -502,9 +502,9 @@
       "layout": "Layout"
     },
     "presets": "Presets de modelo",
-    "primaryColor": "Cor primaria",
+    "primaryColor": "Cor primária",
     "fontAndLayout": "Fonte e layout",
-    "fontFamily": "Familia de fontes",
+    "fontFamily": "Família de fontes",
     "helveticaDefault": "Helvetica (Padrão)",
     "timesRoman": "Times Roman",
     "courier": "Courier",
@@ -538,7 +538,7 @@
     "quotationTemplateSaved": "Configurações do modelo de orçamento salvas",
     "failedSave": "Falha ao salvar configurações",
     "smsTemplates": "Modelos de mensagens SMS",
-    "smsTemplatesDescription": "Personalize as mensagens de texto enviadas aos clientes. Use variaveis como <code>'{companyName}'</code> para inserir valores dinamicos.",
+    "smsTemplatesDescription": "Personalize as mensagens de texto enviadas aos clientes. Use variáveis como <code>'{companyName}'</code> para inserir valores dinâmicos.",
     "reset": "Redefinir",
     "invoiceReady": "Fatura pronta",
     "invoiceReadyDescription": "Enviada ao compartilhar uma fatura com um cliente.",
@@ -555,7 +555,7 @@
     "statusCompleted": "Status: Concluído",
     "statusCompletedDescription": "Enviada quando o status muda para Concluído.",
     "paymentReceived": "Pagamento recebido",
-    "paymentReceivedDescription": "Enviada quando um pagamento e registrado para uma fatura.",
+    "paymentReceivedDescription": "Enviada quando um pagamento é registrado para uma fatura.",
     "saveSmsTemplates": "Salvar modelos SMS",
     "smsTemplateSaved": "Configurações dos modelos SMS salvas",
     "smsDefaults": {
@@ -569,14 +569,14 @@
       "paymentReceived": "Pagamento de {amount} recebido para a fatura {invoice_number}. Obrigado!"
     },
     "colorPresets": {
-      "amber": "Ambar",
+      "amber": "Âmbar",
       "blue": "Azul",
       "emerald": "Esmeralda",
       "red": "Vermelho",
       "purple": "Roxo",
       "slate": "Ardósia",
       "rose": "Rosa",
-      "indigo": "Indigo"
+      "indigo": "Índigo"
     },
     "layoutTitle": "Layout da fatura",
     "layoutDescription": "Personalize a ordem e visibilidade das seções nas suas faturas e orçamentos.",
@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "Assistente de IA",
-    "readMore": "Read More",
+    "readMore": "Saiba mais",
     "description": "Configure a IA para gerar automaticamente notas de serviço e resumir o histórico do veículo.",
     "enableLabel": "Ativar IA",
     "enableHint": "Usar recursos de IA em toda a aplicacao",

+ 9 - 8
messages/pt-BR/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Relatórios de status",
+    "readMore": "Saiba mais",
     "newReport": "Novo relatório",
     "empty": "Nenhum relatório de status",
     "emptyDescription": "Crie um relatório de status para atualizar seu cliente sobre o estado do veículo.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Excluir relatório de status",
     "deleteFailed": "Falha ao excluir relatório de status",
     "cancel": "Cancelar",
-  "feedback": "Comentário",
-  "hasComment": "Recebido",
-  "noFeedback": "Sem comentários ainda",
-  "sentAt": "Enviado",
-  "sentVia": "Enviado por",
-  "messageLabel": "Mensagem",
-  "videoLabel": "Vídeo"
+    "feedback": "Comentário",
+    "hasComment": "Recebido",
+    "noFeedback": "Sem comentários ainda",
+    "sentAt": "Enviado",
+    "sentVia": "Enviado por",
+    "messageLabel": "Mensagem",
+    "videoLabel": "Vídeo"
   },
   "notify": {
     "defaultMessage": "Olá {name}, temos uma atualização de status do seu {vehicle}. Veja aqui: {url}",
     "emailSubject": "Atualização de status do veículo - {vehicle}",
-  "viewReport": "Veja o relatório aqui: {url}"
+    "viewReport": "Veja o relatório aqui: {url}"
   }
 }

+ 3 - 3
messages/pt-BR/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "ex. 50000",
     "reminderUpdated": "Lembrete atualizado",
     "reminderCreated": "Lembrete criado",
-    "saveError": "Falha ao {action} lembrete",
+    "saveError": "Falha ao salvar o lembrete",
     "notifyLabel": "Notificar no vencimento",
     "notifyInApp": "Notificação no app",
     "notifyEmail": "E-mail"
@@ -201,7 +201,7 @@
     "noteUpdated": "Nota atualizada",
     "noteCreated": "Nota criada",
     "titleRequired": "Título e conteúdo são obrigatórios",
-    "saveError": "Falha ao {action} nota",
+    "saveError": "Falha ao salvar a nota",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",
@@ -249,7 +249,7 @@
     "findingUpdated": "Observação atualizada",
     "findingResolved": "Observação resolvida",
     "findingDeleted": "Observação excluída",
-    "saveError": "Falha ao {action} observação",
+    "saveError": "Falha ao salvar a observação",
     "deleteError": "Falha ao excluir observação",
     "resolveError": "Falha ao resolver observação",
     "showing": "Exibindo {start}-{end} de {total}",

+ 4 - 4
messages/ru/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Не удалось удалить",
     "processed": "Обработано счетов: {count}",
     "failedProcess": "Не удалось обработать",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Пауза",
+    "resume": "Возобновить",
+    "delete": "Удалить",
+    "removeRow": "Удалить строку"
   }
 }

+ 1 - 0
messages/ru/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Поиск...",
   "shortcut": "Ctrl+K",
+  "readMore": "Подробнее",
   "newWorkOrder": "Новый заказ-наряд",
   "quickCreate": {
     "title": "Добавить",

+ 1 - 1
messages/ru/settings.json

@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "ИИ-ассистент",
-    "readMore": "Read More",
+    "readMore": "Подробнее",
     "description": "Настройте ИИ для автоматического создания описаний обслуживания и обобщения истории транспортных средств.",
     "enableLabel": "Включить ИИ",
     "enableHint": "Используйте функции ИИ по всему приложению",

+ 9 - 8
messages/ru/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Отчёты о состоянии",
+    "readMore": "Подробнее",
     "newReport": "Новый отчёт",
     "empty": "Отчётов пока нет",
     "emptyDescription": "Создайте отчёт о состоянии, чтобы информировать клиента о статусе транспортного средства.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Удалить отчёт о состоянии",
     "deleteFailed": "Не удалось удалить отчёт о состоянии",
     "cancel": "Отмена",
-  "feedback": "Отзыв",
-  "hasComment": "Получен",
-  "noFeedback": "Отзывов пока нет",
-  "sentAt": "Отправлено",
-  "sentVia": "Отправлено через",
-  "messageLabel": "Сообщение",
-  "videoLabel": "Видео"
+    "feedback": "Отзыв",
+    "hasComment": "Получен",
+    "noFeedback": "Отзывов пока нет",
+    "sentAt": "Отправлено",
+    "sentVia": "Отправлено через",
+    "messageLabel": "Сообщение",
+    "videoLabel": "Видео"
   },
   "notify": {
     "defaultMessage": "Здравствуйте, {name}, у нас есть обновление по статусу вашего {vehicle}. Посмотрите здесь: {url}",
     "emailSubject": "Обновление статуса транспортного средства - {vehicle}",
-  "viewReport": "Посмотреть отчёт здесь: {url}"
+    "viewReport": "Посмотреть отчёт здесь: {url}"
   }
 }

+ 2 - 2
messages/ru/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "напр. 50000",
     "reminderUpdated": "Напоминание обновлено",
     "reminderCreated": "Напоминание создано",
-    "saveError": "Не удалось {action} напоминание",
+    "saveError": "Не удалось сохранить напоминание",
     "notifyLabel": "Уведомить при наступлении срока",
     "notifyInApp": "Уведомление в приложении",
     "notifyEmail": "Эл. почта"
@@ -201,7 +201,7 @@
     "noteUpdated": "Заметка обновлена",
     "noteCreated": "Заметка создана",
     "titleRequired": "Название и содержание обязательны",
-    "saveError": "Не удалось {action} заметку",
+    "saveError": "Не удалось сохранить заметку",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",

+ 4 - 4
messages/tr/billing.json

@@ -79,9 +79,9 @@
     "failedDelete": "Silme başarısız",
     "processed": "{count} fatura işlendi",
     "failedProcess": "İşleme başarısız",
-    "pause": "Pause",
-    "resume": "Resume",
-    "delete": "Delete",
-    "removeRow": "Remove row"
+    "pause": "Duraklat",
+    "resume": "Devam Et",
+    "delete": "Sil",
+    "removeRow": "Satırı kaldır"
   }
 }

+ 1 - 0
messages/tr/navigation.json

@@ -57,6 +57,7 @@
   },
   "search": "Ara...",
   "shortcut": "Ctrl+K",
+  "readMore": "Daha fazla bilgi",
   "newWorkOrder": "Yeni İş Emri",
   "quickCreate": {
     "title": "Ekle",

+ 5 - 5
messages/tr/settings.json

@@ -499,7 +499,7 @@
       "quotation": "Teklif",
       "inspections": "Muayeneler",
       "sms": "SMS",
-      "layout": "Duzen"
+      "layout": "Düzen"
     },
     "presets": "Şablon Hazır Ayarları",
     "primaryColor": "Ana Renk",
@@ -578,9 +578,9 @@
       "rose": "Gül",
       "indigo": "İndigo"
     },
-    "layoutTitle": "Fatura Duzeni",
-    "layoutDescription": "Fatura ve tekliflerinizdeki bolumlerin sirasini ve gorunurlugunu ozellestirin.",
-    "layoutSaved": "Duzen basariyla kaydedildi",
+    "layoutTitle": "Fatura Düzeni",
+    "layoutDescription": "Fatura ve tekliflerinizdeki bölümlerin sırasını ve görünürlüğünü özelleştirin.",
+    "layoutSaved": "Düzen başarıyla kaydedildi",
     "layoutDocInvoice": "Fatura",
     "layoutDocQuote": "Teklif"
   },
@@ -1191,7 +1191,7 @@
   },
   "ai": {
     "title": "Yapay Zeka Asistani",
-    "readMore": "Read More",
+    "readMore": "Daha fazla bilgi",
     "description": "Servis notlarini otomatik olusturmak ve arac gecmisini ozetlemek icin yapay zekayi yapilandirin.",
     "enableLabel": "Yapay zekayi etkinlestir",
     "enableHint": "Uygulama genelinde yapay zeka destekli ozellikleri kullanin",

+ 9 - 8
messages/tr/statusReport.json

@@ -55,6 +55,7 @@
   },
   "list": {
     "title": "Durum Raporları",
+    "readMore": "Daha fazla bilgi",
     "newReport": "Yeni Rapor",
     "empty": "Henüz durum raporu yok",
     "emptyDescription": "Müşterinizi araç durumu hakkında bilgilendirmek için bir durum raporu oluşturun.",
@@ -76,17 +77,17 @@
     "deleteTitle": "Durum raporunu sil",
     "deleteFailed": "Durum raporu silinemedi",
     "cancel": "İptal",
-  "feedback": "Geri Bildirim",
-  "hasComment": "Alındı",
-  "noFeedback": "Henüz geri bildirim yok",
-  "sentAt": "Gönderildi",
-  "sentVia": "Gönderim yolu",
-  "messageLabel": "Mesaj",
-  "videoLabel": "Video"
+    "feedback": "Geri Bildirim",
+    "hasComment": "Alındı",
+    "noFeedback": "Henüz geri bildirim yok",
+    "sentAt": "Gönderildi",
+    "sentVia": "Gönderim yolu",
+    "messageLabel": "Mesaj",
+    "videoLabel": "Video"
   },
   "notify": {
     "defaultMessage": "Merhaba {name}, {vehicle} aracınız hakkında bir durum güncellemesi var. Buradan görüntüleyin: {url}",
     "emailSubject": "Araç Durum Güncellemesi - {vehicle}",
-  "viewReport": "Raporu buradan görüntüleyin: {url}"
+    "viewReport": "Raporu buradan görüntüleyin: {url}"
   }
 }

+ 2 - 2
messages/tr/vehicles.json

@@ -134,7 +134,7 @@
     "dueMileagePlaceholder": "örn. 50000",
     "reminderUpdated": "Hatırlatıcı güncellendi",
     "reminderCreated": "Hatırlatıcı oluşturuldu",
-    "saveError": "Hatırlatıcı {action} başarısız oldu",
+    "saveError": "Hatırlatıcı kaydedilemedi",
     "notifyLabel": "Vadesi geldiğinde bildir",
     "notifyInApp": "Uygulama içi bildirim",
     "notifyEmail": "E-posta"
@@ -201,7 +201,7 @@
     "noteUpdated": "Not güncellendi",
     "noteCreated": "Not oluşturuldu",
     "titleRequired": "Başlık ve içerik gereklidir",
-    "saveError": "Not {action} başarısız oldu",
+    "saveError": "Not kaydedilemedi",
     "openMenu": "Open menu",
     "firstPage": "First page",
     "previousPage": "Previous page",

+ 46 - 0
src/components/page-header.tsx

@@ -41,6 +41,40 @@ function SearchTrigger() {
 
 type BreadcrumbSegment = { key: string; href?: string }
 
+/**
+ * Pages that have a documentation page of their own, so the header can offer a
+ * "Read more" link straight to it. The docs site resolves the reader's language
+ * itself, so these stay locale-free.
+ */
+const docsMap: Record<string, string> = {
+  '/work-orders': '/docs/features/work-orders',
+  '/inventory': '/docs/features/inventory',
+  '/messages': '/docs/features/messages',
+  '/reminders': '/docs/features/reminders',
+  // No anchor: heading slugs are translated, so an English one would not match
+  // on a localized page.
+  '/observations': '/docs/features/work-orders',
+  '/billing/recurring': '/docs/features/recurring-invoices',
+  '/settings/templates': '/docs/configuration/templates',
+  '/calendar': '/docs/features/calendar',
+  '/customers': '/docs/features/customers',
+  '/vehicles': '/docs/features/vehicles',
+  '/quotes': '/docs/features/quotes',
+  '/billing': '/docs/features/invoices',
+  '/inspections': '/docs/features/inspections',
+  '/reports': '/docs/features/reports',
+  '/work-board': '/docs/configuration/work-orders/work-board',
+  '/labor-presets': '/docs/configuration/work-orders/labor-presets',
+  '/audit-log': '/docs/security/audit-logging',
+  '/settings/team': '/docs/configuration/team',
+  '/settings/customer-portal': '/docs/features/portal',
+  '/settings/email': '/docs/integrations/email',
+  '/settings/sms': '/docs/integrations/sms',
+  '/settings/webhooks': '/docs/integrations/webhooks',
+  '/settings/subscription': '/docs/configuration/subscription',
+  '/settings/license': '/docs/licensing/white-label',
+}
+
 const breadcrumbMap: Record<string, BreadcrumbSegment[]> = {
   '/': [{ key: 'dashboard' }],
   '/vehicles': [{ key: 'vehicles', href: '/vehicles' }, { key: 'allVehicles' }],
@@ -88,6 +122,8 @@ export function PageHeader() {
   const t = useTranslations('navigation.breadcrumbs')
   const tn = useTranslations('navigation')
 
+  const docsHref = docsMap[pathname]
+
   // Match exact route first
   let segments = breadcrumbMap[pathname]
 
@@ -162,6 +198,16 @@ export function PageHeader() {
         </BreadcrumbList>
       </Breadcrumb>
       <div className="ml-auto flex items-center gap-2">
+        {docsHref && (
+          <a
+            href={`https://torqvoice.com${docsHref}`}
+            target="_blank"
+            rel="noopener noreferrer"
+            className="hidden shrink-0 rounded text-[11px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:inline"
+          >
+            {tn('readMore')} →
+          </a>
+        )}
         <SearchTrigger />
         <QuickCreateMenu />
         {showWhiteLabelCta && (

+ 11 - 1
src/features/status-reports/Components/StatusReportList.tsx

@@ -140,7 +140,17 @@ export function StatusReportList({
     <>
       <div className="space-y-3">
         <div className="flex items-center justify-between">
-          <h3 className="text-sm font-medium">{t("title")}</h3>
+          <div className="flex items-baseline gap-2">
+            <h3 className="text-sm font-medium">{t("title")}</h3>
+            <a
+              href="https://torqvoice.com/docs/features/status-reports"
+              target="_blank"
+              rel="noopener noreferrer"
+              className="shrink-0 rounded text-[11px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
+            >
+              {t("readMore")} →
+            </a>
+          </div>
           <Button size="sm" onClick={() => setShowCreate(true)}>
             <Plus className="mr-1.5 h-4 w-4" />
             {t("newReport")}

+ 1 - 1
src/features/vehicles/Components/FindingForm.tsx

@@ -96,7 +96,7 @@ export function FindingForm({
       modal.open(
         "error",
         "Error",
-        result.error || t("saveError", { action: isEdit ? "update" : "create" })
+        result.error || t("saveError")
       );
     }
 

+ 1 - 1
src/features/vehicles/Components/NoteForm.tsx

@@ -66,7 +66,7 @@ export function NoteForm({ vehicleId, open, onOpenChange, note }: NoteFormProps)
       onOpenChange(false);
       router.refresh();
     } else {
-      modal.open("error", "Error", result.error || t("saveError", { action: isEditing ? "update" : "create" }));
+      modal.open("error", "Error", result.error || t("saveError"));
     }
 
     setLoading(false);

+ 1 - 1
src/features/vehicles/Components/ReminderForm.tsx

@@ -93,7 +93,7 @@ export function ReminderForm({ vehicleId, open, onOpenChange, reminder }: Remind
       onOpenChange(false);
       router.refresh();
     } else {
-      modal.open("error", "Error", result.error || t("saveError", { action: isEdit ? "update" : "create" }));
+      modal.open("error", "Error", result.error || t("saveError"));
     }
 
     setLoading(false);

+ 1 - 1
src/features/vehicles/Components/ReminderFormDialog.tsx

@@ -154,7 +154,7 @@ export function ReminderFormDialog({
       onOpenChange(false);
       onSaved?.();
     } else {
-      modal.open("error", "Error", result.error || tv("saveError", { action: isEdit ? "update" : "create" }));
+      modal.open("error", "Error", result.error || tv("saveError"));
     }
     setFormLoading(false);
   };