Add a language-switch system with per-language files

Introduce a hand-rolled i18n layer across all three UIs, each reading its
text from per-language JSON files (English base + Polish + Danish). Nothing
in the converted screens hardcodes English any more.

- Web App (Vue): src/i18n/{en,pl,da}.json + index.js exposing t()/tSplit(),
  reactive to the signed-in profile locale. Every view, component, form and
  the status labels in lib/format.js go through t().
- API Server panel (Vue): src/i18n/ with its own localStorage-persisted
  language (the panel has no user profile) and a header language picker.
  Chrome, cards, login and API section titles translated; endpoint reference
  descriptions intentionally kept in English. Rebuilt embedded dist.
- Phone App (Flutter): assets/i18n/ + lib/i18n.dart loaded at startup,
  driven by AppSettings.locale. Nav, login, lock, dashboard, the full
  Settings panel (incl. language picker) and format.dart status labels
  translated; remaining detail screens fall back to English.

Language = the language half of the existing BCP-47 locale; the region half
still drives date/number/currency formatting. Missing keys fall back to
English, and plurals use Intl.PluralRules / Intl.plural so Polish gets the
correct one/few/many forms. Settings flags languages without a translation.

Tests updated to assert the localized (Polish) status wording; all pass.
See TRANSLATIONS.md for the format and how to add a language.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
tajniak81andClaude Opus 4.8 committed 2026-07-17 20:07:48 +02:00
1 parent ee28b522c7
commit b6bb6b1df0
54 files changed
+4191 -979

No files matched your search

+640
View File
@@ -0,0 +1,640 @@
{
"errors": {
"sessionExpired": "Sesja wygasła — zaloguj się ponownie."
},
"common": {
"cancel": "Anuluj",
"save": "Zapisz",
"saveChanges": "Zapisz zmiany",
"saving": "Zapisywanie…",
"saved": "Zapisano ✓",
"loading": "Ładowanie…",
"edit": "Edytuj",
"remove": "Usuń",
"delete": "Usuń",
"done": "Gotowe",
"undo": "Cofnij",
"download": "Pobierz",
"empty": "—",
"yes": "Tak",
"no": "Nie"
},
"nav": {
"garage": "Garaż",
"settings": "Ustawienia",
"users": "Użytkownicy",
"lightMode": "Tryb jasny",
"darkMode": "Tryb ciemny",
"signedIn": "Zalogowano",
"logOut": "Wyloguj się"
},
"login": {
"title": "Zaloguj się",
"tagline": "Twój samochód pod kontrolą.",
"email": "E-mail",
"password": "Hasło",
"showPassword": "Pokaż hasło",
"hidePassword": "Ukryj hasło",
"submit": "Zaloguj się",
"submitting": "Logowanie…",
"failed": "Logowanie nie powiodło się",
"serverSettings": "Ustawienia serwera",
"apiServerUrl": "Adres serwera API",
"leaveBlank": "Pozostaw puste, aby użyć domyślnego ({url}).",
"resetToDefault": "Przywróć domyślny"
},
"dashboard": {
"eyebrow": "Garaż",
"title": "Twoje samochody",
"subtitle": "Przegląd serwisowy i historia napraw.",
"addCar": "Dodaj samochód",
"empty": "Nie masz jeszcze samochodów. Kliknij {action}, aby zacząć.",
"shared": "Udostępniony",
"sharedReadOnly": "Udostępniony · tylko do odczytu",
"serviceLife": "Zużycie okresu serwisowego",
"lastService": "Ostatni serwis",
"odometer": "Przebieg",
"nextDue": "Następny termin",
"nextDueKm": "Następny przebieg",
"serviceRecords": {
"one": "{n} wpis serwisowy",
"few": "{n} wpisy serwisowe",
"many": "{n} wpisów serwisowych",
"other": "{n} wpisu serwisowego"
}
},
"admin": {
"eyebrow": "Administracja",
"title": "Użytkownicy",
"subtitleAll": "Konta ze wszystkich organizacji.",
"subtitleOrg": "Konta w Twojej organizacji.",
"subtitleOrgsNote": "Organizacje przypisuje się w panelu API.",
"addUser": "Dodaj użytkownika",
"colEmail": "E-mail",
"colName": "Imię i nazwisko",
"colOrganization": "Organizacja",
"colRole": "Rola",
"colCreated": "Utworzono",
"you": "(Ty)",
"resetPassword": "Zresetuj hasło",
"confirmDelete": "Usunąć użytkownika {name}? Tej operacji nie można cofnąć.",
"cantDeleteSelf": "Nie możesz usunąć własnego konta.",
"onlySuperadminDeletes": "Tylko superadministrator może usunąć superadministratora.",
"cantChangeOwnRole": "Nie możesz zmienić własnej roli.",
"onlySuperadminEdits": "Tylko superadministrator może edytować superadministratora.",
"createTitle": "Dodaj użytkownika",
"emailRequired": "E-mail *",
"passwordRequired": "Hasło *",
"minChars": "(min. 8)",
"creating": "Tworzenie…",
"createUser": "Utwórz użytkownika",
"resetTitle": "Reset hasła — {email}",
"newPassword": "Nowe hasło",
"setPassword": "Ustaw hasło",
"roles": {
"user": "użytkownik",
"admin": "administrator",
"superadmin": "superadministrator"
}
},
"settings": {
"eyebrow": "Konto",
"title": "Ustawienia",
"subtitle": "Zarządzaj kontem, wyglądem i danymi.",
"account": {
"title": "Konto",
"name": "Imię i nazwisko",
"email": "E-mail",
"verified": "Zweryfikowany",
"notVerified": "Niezweryfikowany",
"resendVerification": "Wyślij ponownie e-mail weryfikacyjny",
"sending": "Wysyłanie…",
"verificationRequested": "Zamówiono e-mail weryfikacyjny.",
"changePassword": "Zmień hasło",
"currentPassword": "Obecne hasło",
"newPassword": "Nowe hasło",
"confirmNewPassword": "Potwierdź nowe hasło",
"mismatchYet": "Hasła jeszcze się nie zgadzają.",
"tooShort": "Nowe hasło musi mieć co najmniej 8 znaków.",
"mismatch": "Nowe hasło i potwierdzenie nie są takie same.",
"updating": "Aktualizowanie…",
"passwordUpdated": "Hasło zaktualizowane ✓",
"updatePassword": "Zaktualizuj hasło"
},
"appearance": {
"title": "Wygląd",
"theme": "Motyw",
"themeLight": "jasny",
"themeDark": "ciemny",
"themeSystem": "systemowy",
"language": "Język",
"languageHint": "Tekst aplikacji oraz nazwy miesięcy i dni.",
"languageFallbackHint": "Ten język nie jest jeszcze przetłumaczony — tekst aplikacji pozostanie po angielsku.",
"region": "Region",
"regionHint": "Format liczb i waluty.",
"dateFormat": "Format daty",
"dateExample": "Przykład: {example}",
"currency": "Waluta",
"currencyExample": "Przykład: {example} — tylko wyświetlanie, kwoty nie są przeliczane.",
"fontSize": "Rozmiar czcionki",
"fontSmall": "mała",
"fontMedium": "średnia",
"fontLarge": "duża"
},
"profile": {
"title": "Profil",
"avatarAlt": "Awatar",
"uploading": "Przesyłanie…",
"uploadPhoto": "Prześlij zdjęcie",
"bio": "O mnie",
"bioPlaceholder": "Krótka notatka widoczna dla innych osób w Twoim gospodarstwie domowym.",
"saveBio": "Zapisz opis"
},
"privacy": {
"title": "Prywatność i bezpieczeństwo",
"signOut": "Wyloguj się",
"body": "Uwierzytelnianie dwuskładnikowe nie jest jeszcze dostępne. Sesje opierają się na tokenach wydawanych przez serwer, które wygasają samoczynnie, więc wylogowanie tutaj kończy tylko sesję na tym urządzeniu — nie ma listy urządzeń do unieważnienia. Aby wylogować wszystkie urządzenia, zmień hasło powyżej."
},
"advanced": {
"title": "Zaawansowane",
"exportTitle": "Eksportuj swoje dane",
"exportBody": "Pobierz swój profil oraz wszystkie samochody, wpisy serwisowe i części w formacie JSON.",
"preparing": "Przygotowywanie…",
"exportAction": "Eksportuj dane",
"importTitle": "Importuj swoje dane",
"importBody": "Dodaj samochody z wcześniej wyeksportowanego pliku JSON. Tworzy to nowe wpisy — nic nie jest scalane ani nadpisywane.",
"importing": "Importowanie…",
"importAction": "Importuj dane",
"notJson": "Ten plik nie jest poprawnym plikiem JSON.",
"notExport": "Ten plik nie wygląda na eksport z DriverVault (brak listy \"cars\").",
"confirmImport": "Zaimportować samochody z tego pliku ({count})? Zostaną dodane nowe wpisy — istniejące samochody nie zostaną scalone ani nadpisane.",
"imported": "Zaimportowano: samochody ({cars}), wpisy serwisowe ({services}), części ({parts})."
},
"danger": {
"title": "Strefa niebezpieczna",
"body": "Usunięcie konta usuwa Twój login i profil. Nie usuwa samochodów ani historii serwisowej współdzielonych w gospodarstwie domowym. Obowiązuje 3-dniowy okres karencji, zanim usunięcie stanie się ostateczne — do tego czasu możesz je anulować.",
"deleteAccount": "Usuń moje konto",
"typeToConfirm": "Wpisz {email}, aby potwierdzić",
"requesting": "Wysyłanie żądania…",
"requestDeletion": "Zażądaj usunięcia",
"requestedOn": "Żądanie usunięcia konta złożono {date}.",
"canStillCancel": "Nadal możesz je anulować — stanie się ostateczne po 3-dniowym okresie karencji.",
"cooldownPassed": "Okres karencji minął. Możesz teraz dokończyć usuwanie.",
"cancelRequest": "Anuluj żądanie usunięcia",
"finalize": "Trwale usuń moje konto",
"confirmFinalize": "To trwale usunie Twoje konto. Tej operacji nie można cofnąć. Kontynuować?"
}
},
"car": {
"allCars": "← Wszystkie samochody",
"share": "Udostępnij",
"shared": "Udostępniony",
"sharedReadOnly": "Udostępniony · tylko do odczytu",
"tabs": {
"info": "Informacje",
"services": "Historia serwisowa",
"technical": "Historia przeglądów",
"maintenance": "Naprawy",
"fuel": "Paliwo",
"documents": "Dokumenty",
"parts": "Katalog części",
"reminders": "Przypomnienia"
},
"info": {
"oilSpec": "Specyfikacja oleju silnikowego",
"transmissionOil": "Olej przekładniowy",
"differentialOil": "Olej mostu napędowego",
"brakeFluid": "Płyn hamulcowy",
"coolant": "Płyn chłodniczy",
"odometer": "Przebieg",
"serviceInterval": "Interwał serwisowy",
"nextDue": "Następny termin",
"registrationPlate": "Numer rejestracyjny",
"registrationCountry": "Kraj rejestracji",
"vin": "VIN",
"fuelType": "Rodzaj paliwa",
"buildDate": "Data produkcji",
"firstRegistration": "Pierwsza rejestracja"
},
"services": {
"title": "Historia serwisowa",
"add": "Dodaj serwis",
"empty": "Brak wpisów serwisowych.",
"colDate": "Data",
"colKm": "Km",
"colNextDate": "Następna data",
"colNextKm": "Następny przebieg",
"colOil": "Olej i filtr oleju",
"colEngineFilter": "Filtr powietrza silnika",
"colCabinFilter": "Filtr kabinowy",
"colNotes": "Notatki",
"colFile": "Plik",
"confirmDelete": "Usunąć ten wpis serwisowy?"
},
"technical": {
"title": "Historia przeglądów technicznych",
"subtitle": "Obowiązkowe badania techniczne. Powtarzają się wyłącznie w oparciu o czas, niezależnie od przebiegu.",
"add": "Dodaj przegląd",
"empty": "Brak przeglądów technicznych.",
"colDate": "Data",
"colResult": "Wynik",
"colNextCheck": "Następny przegląd",
"colStatus": "Status",
"colStation": "Stacja",
"colCost": "Koszt",
"colNotes": "Notatki",
"colFile": "Plik",
"passed": "Pozytywny",
"failed": "Negatywny",
"confirmDelete": "Usunąć ten przegląd techniczny?"
},
"maintenance": {
"title": "Naprawy",
"subtitle": "Wizyty w warsztacie i naprawy. Rutynowa obsługa znajduje się w Historii serwisowej.",
"add": "Zapisz wizytę",
"empty": "Brak zapisanych wizyt w warsztacie.",
"colDate": "Data",
"colKm": "Km",
"colType": "Rodzaj",
"colWork": "Wykonane prace",
"colWorkshop": "Warsztat",
"colStatus": "Status",
"colCost": "Koszt",
"colFile": "Plik",
"underWarranty": "Na gwarancji · pozostało {days} dni",
"confirmDelete": "Usunąć tę wizytę w warsztacie?"
},
"fuel": {
"title": "Paliwo",
"subtitle": "Zużycie liczone jest między pełnymi bakami.",
"add": "Zapisz tankowanie",
"empty": "Brak zapisanych tankowań.",
"average": "Średnie",
"best": "Najlepsze",
"worst": "Najgorsze",
"costPerKm": "Koszt na km",
"refills": "Tankowania",
"totalLiters": "Łącznie litrów",
"totalSpent": "Łącznie wydano",
"trackedDistance": "Zmierzony dystans",
"avgPrice": "Śr. cena {price}/l",
"needTwoTanks": "Zapisz co najmniej dwa pełne baki, aby zobaczyć zużycie.",
"colDate": "Data",
"colKm": "Km",
"colLiters": "Litry",
"colCost": "Koszt",
"colPerLiter": "Za litr",
"colDistance": "Dystans",
"colConsumption": "Zużycie",
"colStation": "Stacja",
"colFile": "Plik",
"partial": "częściowe",
"gap": "luka",
"confirmDelete": "Usunąć to tankowanie?"
},
"documents": {
"title": "Dokumenty",
"subtitle": "Ubezpieczenie, zaświadczenia i inne dokumenty z terminami odnowienia.",
"add": "Dodaj dokument",
"empty": "Brak dokumentów.",
"colType": "Rodzaj",
"colTitle": "Nazwa",
"colProvider": "Wystawca",
"colIssued": "Wystawiono",
"colRenewal": "Odnowienie",
"colStatus": "Status",
"colFile": "Plik",
"confirmDelete": "Usunąć ten dokument?"
},
"reminders": {
"title": "Przypomnienia",
"subtitle": "Przypomnienia o odnowieniach i serwisach dodawane są automatycznie na podstawie dokumentów i historii serwisowej.",
"add": "Dodaj przypomnienie",
"empty": "Nie ma jeszcze o czym przypominać.",
"automatic": "Automatyczne",
"repeats": "Powtarza się",
"at": "przy {km}",
"doneRollForward": "Gotowe · przenieś dalej",
"markDone": "Oznacz jako gotowe",
"reopen": "Otwórz ponownie",
"confirmDelete": "Usunąć to przypomnienie?"
},
"parts": {
"title": "Katalog części",
"add": "Dodaj część",
"empty": "Brak części.",
"colPart": "Część",
"colPartNumber": "Numer części",
"colNotes": "Notatki",
"colFile": "Plik",
"confirmDelete": "Usunąć tę część?"
},
"delete": {
"title": "Usunąć ten samochód?",
"body": "To trwale usunie {name} i wszystko, co zostało w nim zapisane — {services}, {maintenance}, {fuel}, {documents} i {parts}. Tej operacji nie można cofnąć.",
"services": {
"one": "{n} wpis serwisowy",
"few": "{n} wpisy serwisowe",
"many": "{n} wpisów serwisowych",
"other": "{n} wpisu serwisowego"
},
"maintenance": {
"one": "{n} wizyta w warsztacie",
"few": "{n} wizyty w warsztacie",
"many": "{n} wizyt w warsztacie",
"other": "{n} wizyty w warsztacie"
},
"fuel": {
"one": "{n} tankowanie",
"few": "{n} tankowania",
"many": "{n} tankowań",
"other": "{n} tankowania"
},
"documents": {
"one": "{n} dokument",
"few": "{n} dokumenty",
"many": "{n} dokumentów",
"other": "{n} dokumentu"
},
"parts": {
"one": "{n} część",
"few": "{n} części",
"many": "{n} części",
"other": "{n} części"
},
"typeToConfirm": "Wpisz {name}, aby potwierdzić",
"deleting": "Usuwanie…",
"confirm": "Usuń trwale"
}
},
"attachment": {
"legend": "Załącznik",
"hint": "PDF lub obraz, do 10 MB.",
"attached": "Załączono: {name}",
"willBeRemoved": "Załącznik zostanie usunięty przy zapisie."
},
"forms": {
"car": {
"addTitle": "Dodaj samochód",
"editTitle": "Edytuj samochód",
"name": "Nazwa *",
"make": "Marka",
"model": "Model",
"year": "Rok",
"registration": "Numer rejestracyjny",
"registrationCountry": "Kraj rejestracji",
"registrationCountryPlaceholder": "Polska",
"vin": "VIN",
"vinPlaceholder": "Numer identyfikacyjny pojazdu",
"fuelType": "Rodzaj paliwa",
"buildDate": "Data produkcji",
"firstRegistration": "Pierwsza rejestracja",
"oilSpec": "Specyfikacja oleju silnikowego",
"currentKm": "Aktualny przebieg (km)",
"transmissionOilSpec": "Specyfikacja oleju przekładniowego",
"differentialOilSpec": "Specyfikacja oleju mostu napędowego",
"brakeFluidSpec": "Specyfikacja płynu hamulcowego",
"coolantSpec": "Specyfikacja płynu chłodniczego",
"serviceIntervalDays": "Interwał serwisowy (dni)",
"serviceIntervalKm": "Interwał serwisowy (km)",
"technicalCheckIntervalDays": "Interwał przeglądu technicznego (dni)",
"technicalCheckHint": "Wstępnie wypełnia termin następnego przeglądu. Każdy przegląd może go nadpisać datą z zaświadczenia.",
"submit": "Dodaj samochód"
},
"service": {
"addTitle": "Dodaj wpis serwisowy",
"editTitle": "Edytuj wpis serwisowy",
"date": "Data *",
"odometer": "Przebieg (km)",
"changedParts": "Wymienione części",
"oil": "Olej i filtr oleju",
"engineFilter": "Filtr powietrza silnika",
"cabinFilter": "Filtr kabinowy",
"attachmentLegend": "Paragon lub strona książki serwisowej",
"notes": "Notatki",
"autoHint": "Data (+{days} dni) i przebieg (+{km}) następnego serwisu są obliczane automatycznie.",
"submit": "Dodaj serwis"
},
"technical": {
"addTitle": "Dodaj przegląd techniczny",
"editTitle": "Edytuj przegląd techniczny",
"date": "Data przeglądu *",
"result": "Wynik *",
"passed": "Pozytywny",
"failed": "Negatywny",
"validUntil": "Ważny do",
"failedHint": "Negatywny przegląd niczego nie potwierdza, więc nie wyznacza następnego terminu.",
"derivedHint": "Pozostaw puste, aby użyć interwału samochodu (+{days} dni → {date}). Wpisz datę z zaświadczenia, jeśli jest inna.",
"cost": "Koszt",
"station": "Stacja",
"stationPlaceholder": "Stacja Kontroli Pojazdów",
"attachmentLegend": "Zaświadczenie o przeglądzie",
"notes": "Notatki",
"submit": "Dodaj przegląd"
},
"part": {
"addTitle": "Dodaj część",
"editTitle": "Edytuj część",
"name": "Nazwa części *",
"namePlaceholder": "Filtr oleju",
"partNumber": "Numer części",
"notes": "Notatki",
"notesPlaceholder": "Pasuje do 2015–2020 · kupować parami",
"attachmentLegend": "Zdjęcie lub karta katalogowa",
"submit": "Dodaj część"
},
"fuel": {
"addTitle": "Zapisz tankowanie",
"editTitle": "Edytuj tankowanie",
"date": "Data *",
"odometer": "Przebieg (km) *",
"liters": "Litry *",
"cost": "Koszt całkowity",
"pricePerLiter": "Cena za litr: {price}",
"tank": "Bak",
"fullTank": "Zatankowano do pełna",
"missedFill": "Nie zapisałem tankowania przed tym",
"tankHint": "Zużycie liczone jest między pełnymi bakami, więc tankowania częściowe wliczają się do następnego pełnego. Oznaczenie pominiętego tankowania wyklucza ten odcinek z obliczeń, zamiast pokazywać nierealnie niskie spalanie.",
"station": "Stacja",
"notes": "Notatki",
"attachmentLegend": "Paragon",
"submit": "Zapisz tankowanie"
},
"maintenance": {
"addTitle": "Zapisz wizytę w warsztacie",
"editTitle": "Edytuj wizytę w warsztacie",
"date": "Data *",
"odometer": "Przebieg (km)",
"type": "Rodzaj",
"status": "Status",
"description": "Co zostało zrobione *",
"descriptionPlaceholder": "Wymiana alternatora i paska napędowego",
"workshop": "Warsztat",
"location": "Lokalizacja",
"partsUsed": "Wymienione części",
"partsUsedPlaceholder": "Alternator 27060-0T010, pasek 90916-02660",
"laborCost": "Koszt robocizny",
"partsCost": "Koszt części",
"total": "Razem: {total}",
"invoiceNumber": "Numer faktury",
"warrantyUntil": "Gwarancja do",
"attachmentLegend": "Faktura",
"notes": "Notatki",
"submit": "Zapisz wizytę"
},
"document": {
"addTitle": "Dodaj dokument",
"editTitle": "Edytuj dokument",
"type": "Rodzaj",
"title": "Nazwa *",
"titlePlaceholder": "OC 2026",
"provider": "Wystawca",
"reference": "Nr polisy / zaświadczenia",
"issued": "Wystawiono",
"renewalDate": "Data odnowienia",
"renewalHint": "Pozostaw datę odnowienia pustą dla dokumentu bezterminowego. Ustawienie jej automatycznie doda przypomnienie.",
"cost": "Koszt",
"attachmentLegend": "Skan lub zdjęcie",
"notes": "Notatki",
"submit": "Dodaj dokument"
},
"reminder": {
"addTitle": "Dodaj przypomnienie",
"editTitle": "Edytuj przypomnienie",
"title": "Nazwa *",
"titlePlaceholder": "Zmiana na opony zimowe",
"type": "Rodzaj",
"remindMe": "Przypomnij mi",
"onDate": "W dniu",
"atOdometer": "Przy przebiegu (km)",
"triggerHint": "Ustaw jedno lub oba — przy obu liczy się to, co nastąpi wcześniej.",
"currentKm": "Samochód ma teraz {km}.",
"repeat": "Powtarzanie (opcjonalnie)",
"everyDays": "Co … dni",
"everyKm": "Co … km",
"recurringHint": "Oznaczenie jako gotowe przeniesie je dalej, zamiast zamknąć.",
"oneOffHint": "Pozostaw puste dla jednorazowego przypomnienia, które zamknie się po oznaczeniu jako gotowe.",
"notes": "Notatki",
"noTrigger": "Ustaw datę, przebieg lub oba.",
"submit": "Dodaj przypomnienie"
},
"share": {
"title": "Udostępnij {name}",
"body": "Daj innemu użytkownikowi dostęp do tego samochodu. Tylko do odczytu pozwala na podgląd; odczyt i zapis pozwala też edytować samochód oraz jego wpisy serwisowe i części.",
"userEmail": "E-mail użytkownika",
"read": "Tylko do odczytu",
"write": "Odczyt i zapis",
"submit": "Udostępnij",
"peopleWithAccess": "Osoby z dostępem",
"notShared": "Jeszcze nikomu nie udostępniono."
}
},
"enums": {
"fuelType": {
"petrol": "Benzyna",
"petrol_lpg": "Benzyna + LPG",
"diesel": "Diesel",
"diesel_lpg": "Diesel + LPG",
"hybrid": "Hybryda",
"electric": "Elektryczny",
"hydrogen": "Wodór"
},
"maintenanceType": {
"repair": "Naprawa",
"inspection": "Przegląd",
"bodywork": "Blacharka",
"tyres": "Opony",
"diagnostics": "Diagnostyka",
"recall": "Akcja serwisowa",
"warranty": "Naprawa gwarancyjna",
"other": "Inne"
},
"maintenanceStatus": {
"scheduled": "Zaplanowana",
"in_progress": "W trakcie",
"completed": "Zakończona"
},
"documentType": {
"insurance": "Ubezpieczenie",
"pollution": "Zaświadczenie o emisji spalin",
"registration": "Dowód rejestracyjny",
"inspection": "Przegląd",
"roadTax": "Podatek drogowy",
"warranty": "Gwarancja",
"other": "Inne"
},
"reminderTypeShort": {
"maintenance": "Naprawa",
"document": "Dokument",
"service": "Serwis",
"inspection": "Przegląd",
"other": "Inne"
},
"reminderType": {
"maintenance": "Naprawa",
"document": "Odnowienie dokumentu",
"service": "Serwis",
"inspection": "Przegląd",
"other": "Inne"
}
},
"status": {
"noData": "Brak danych",
"serviceOverdueDays": "Serwis zaległy {days} dni",
"dueInDays": "Termin za {days} dni",
"okDays": "OK · {days} dni",
"noKm": "Brak przebiegu",
"serviceOverdueKm": "Serwis zaległy {km} km",
"inKm": "Za {km} km",
"kmLeft": "Pozostało {km} km",
"expiredAgo": "Wygasło {days} dni temu",
"expiresToday": "Wygasa dzisiaj",
"renewInDays": "Odnowienie za {days} dni",
"validDays": "Ważne · {days} dni",
"noExpiry": "Bezterminowe",
"done": "Gotowe",
"noTrigger": "Brak wyzwalacza",
"overdue": "Zaległe",
"overdueBy": "Zaległe {parts}",
"dueIn": "Termin za {parts}",
"upcoming": "Nadchodzące",
"today": "dzisiaj",
"days": "{days} dni",
"km": "{km} km"
}
}