The previous commit left the car screen half translated: its tab labels went
through t(), and everything underneath them did not. A Polish user opening a
car got translated tabs over English tiles, English forms and English
dialogs, which is worse than either extreme because it reads as a bug rather
than as a missing translation.
So the whole screen and everything it opens now reads from the language
files: the record tiles, the share and delete-car dialogs, the service and
part sheets it hosts, record_form_sheets.dart, car_form_sheet.dart, and the
attachment field whose buttons surface inside all of them.
Almost none of these strings are new. The Web App has said all of this in
three languages since b6bb6b1, so forms.*, enums.*, attachment.* and errors.*
are copied out of its language files the same way car.* was, and Polish and
Danish arrive complete. What is written here is only what the phone alone
needs, and the categories are worth naming because they are the reason the
two apps' files are not identical: tooltips, because the web labels its
buttons; the tiles' running prose, because the web lays the same data out as
table columns; client-side validation, because the web leans on the browser's
`required`; and the snackbars.
Three things changed shape rather than just wording.
The per-record delete prompts were one template with a noun slotted in -
"Delete this $what?" - which does not survive translation into a language
that inflects the noun. Each collection now names its own confirmation
string, which is what the web already had.
The delete-car dialog counted with a hand-rolled `"$n $noun${n == 1 ? '' :
's'}"`. Polish has three plural forms, so that could not be translated at
all; it now goes through the CLDR plurals in car.delete.*. It also only ever
named service records and parts, while the cascade takes maintenance, fuel,
charges and documents too - the translated body names all six, so it is now
passed the whole data set rather than two counts.
The enum labels (fuel types, maintenance type/status, document and reminder
types) were four const maps duplicated between the tiles and the pickers.
They are one lookup against enums.* now, with an unknown value falling back
to the raw key rather than a blank - the server owns that enum, and a value
added there should stay legible in an app that has not caught up.
Found and fixed while testing: the view picker rendered the literal string
"car.tabs.provider" as a row label on an unlinked car. That key does not
exist by design - a linked car's tab is named after the service, an unlinked
one falls back to car.tabs.connected - and the picker was the one caller that
did not know it.
Verified by flutter analyze (clean), flutter test - 19 pass, 7 of them new -
and flutter build apk --debug. The new tests cover what the analyzer cannot
see: the lookups built from a key at render time (car.tabs.$key,
enums.fuelType.$v, the delete dialog's plural counts, the connected service's
readings) are checked to have a real label in all three languages, so a
catalogue entry with no translation fails a test instead of reaching a screen
as a raw key path. That is the check that caught the bug above. A one-off
script also confirmed all 550 static t() keys resolve in en.json.
Not verified: still nothing run against a live API Server or on a device.
Known gaps, deliberately left: admin_users_screen.dart is still English, and
settings.integrations.* / charging.control.* exist in en.json only. The
second one is not the phone's alone - the Web App has exactly the same gap,
so translating that OCPP and connector vocabulary belongs to both apps in one
pass rather than letting the phone run ahead of the app the strings are
copied from. Both are now recorded in TRANSLATIONS.md, which had claimed the
car screen as untranslated and the web app as complete.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
867 lines
34 KiB
JSON
867 lines
34 KiB
JSON
{
|
||
"common": {
|
||
"save": "Zapisz",
|
||
"saving": "Zapisywanie…",
|
||
"saved": "Zapisano ✓",
|
||
"cancel": "Anuluj",
|
||
"remove": "Usuń",
|
||
"retry": "Ponów",
|
||
"required": "Wymagane",
|
||
"confirm": "Potwierdź",
|
||
"empty": "—",
|
||
"saveChanges": "Zapisz zmiany",
|
||
"loading": "Ładowanie…",
|
||
"edit": "Edytuj",
|
||
"open": "Otwórz",
|
||
"delete": "Usuń",
|
||
"done": "Gotowe",
|
||
"undo": "Cofnij",
|
||
"download": "Pobierz",
|
||
"yes": "Tak",
|
||
"no": "Nie"
|
||
},
|
||
"nav": {
|
||
"garage": "Garaż",
|
||
"charging": "Ładowanie",
|
||
"settings": "Ustawienia",
|
||
"users": "Użytkownicy"
|
||
},
|
||
"login": {
|
||
"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…",
|
||
"or": "lub",
|
||
"signInWithFace": "Zaloguj się rozpoznawaniem twarzy",
|
||
"signInWithFingerprint": "Zaloguj się odciskiem palca",
|
||
"signInWithBiometrics": "Zaloguj się biometrią",
|
||
"enrollTitle": "Włączyć logowanie biometryczne?",
|
||
"enrollBody": "Następnym razem możesz zalogować się za pomocą {method} zamiast wpisywać hasło.",
|
||
"enrollNotNow": "Nie teraz",
|
||
"enrollEnable": "Włącz",
|
||
"methodFace": "rozpoznawania twarzy",
|
||
"methodFingerprint": "odcisku palca",
|
||
"methodBiometrics": "biometrii",
|
||
"bioReasonSignInAs": "Zaloguj się jako {email}",
|
||
"bioReasonSignIn": "Zaloguj się do DriverVault",
|
||
"savedInvalid": "Zapisane dane logowania są już nieważne. Zaloguj się hasłem.",
|
||
"serverSettings": "Ustawienia serwera",
|
||
"apiServerUrl": "Adres serwera API",
|
||
"leaveBlank": "Pozostaw puste, aby użyć domyślnego.",
|
||
"reset": "Resetuj",
|
||
"savedNote": "Zapisano ✓",
|
||
"resetNote": "Zresetowano ✓"
|
||
},
|
||
"lock": {
|
||
"title": "DriverVault jest zablokowany",
|
||
"reason": "Odblokuj DriverVault",
|
||
"unlock": "Odblokuj",
|
||
"unlocking": "Odblokowywanie…",
|
||
"usePassword": "Użyj hasła"
|
||
},
|
||
"dashboard": {
|
||
"eyebrow": "TWOJE SAMOCHODY",
|
||
"title": "Garaż",
|
||
"addCar": "Dodaj samochód",
|
||
"lightMode": "Tryb jasny",
|
||
"darkMode": "Tryb ciemny",
|
||
"logOut": "Wyloguj się",
|
||
"empty": "Nie masz jeszcze samochodów.",
|
||
"shared": "Udostępniony",
|
||
"sharedReadOnly": "Udostępniony · tylko do odczytu",
|
||
"serviceLife": "ZUŻYCIE OKRESU SERWISOWEGO",
|
||
"lastService": "Ostatni serwis",
|
||
"currentOdometer": "Aktualny 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"
|
||
}
|
||
},
|
||
"charging": {
|
||
"eyebrow": "ŁADOWANIE I MAPA",
|
||
"title": "Ładowarki w pobliżu",
|
||
"tabs": {
|
||
"public": "Ładowarki publiczne",
|
||
"home": "Ładowarki domowe"
|
||
},
|
||
"liveMap": "Mapa na żywo",
|
||
"youAreHere": "Tu jesteś",
|
||
"session": {
|
||
"chargingNow": "Ładowanie w toku",
|
||
"rate": "Moc",
|
||
"added": "Dodano",
|
||
"cost": "Koszt",
|
||
"done": "Koniec",
|
||
"stop": "Zatrzymaj ładowanie",
|
||
"idle": "Brak ładowania",
|
||
"idleHint": "Podłącz na stacji, aby rozpocząć sesję."
|
||
},
|
||
"stations": {
|
||
"heading": "W pobliżu",
|
||
"homeHeading": "Twoje ładowarki",
|
||
"noControlHint": "Włącz tryb Own lub Proxy CSMS w Ustawienia → Integracje, aby sterować domową ładowarką.",
|
||
"count": {
|
||
"one": "{n} stacja",
|
||
"few": "{n} stacje",
|
||
"many": "{n} stacji",
|
||
"other": "{n} stacji"
|
||
},
|
||
"free": "{avail} z {total} wolnych",
|
||
"full": "Zajęte",
|
||
"offPeak": "poza szczytem",
|
||
"homeCharger": "Ładowarka domowa"
|
||
}
|
||
},
|
||
"settings": {
|
||
"tabs": {
|
||
"personal": "Ustawienia osobiste",
|
||
"integrations": "Integracje"
|
||
},
|
||
"title": "Ustawienia",
|
||
"account": {
|
||
"title": "Konto",
|
||
"name": "Imię i nazwisko",
|
||
"nameSaved": "Zapisano imię i nazwisko.",
|
||
"email": "E-mail",
|
||
"verified": "Zweryfikowany",
|
||
"notVerified": "Niezweryfikowany",
|
||
"sending": "Wysyłanie…",
|
||
"resendVerification": "Wyślij ponownie e-mail weryfikacyjny",
|
||
"verificationRequested": "Zamówiono e-mail weryfikacyjny.",
|
||
"changePassword": "Zmień hasło",
|
||
"currentPassword": "Obecne hasło",
|
||
"newPassword": "Nowe hasło (min. 8)",
|
||
"confirmNewPassword": "Potwierdź nowe hasło",
|
||
"tooShort": "Nowe hasło musi mieć co najmniej 8 znaków.",
|
||
"mismatch": "Nowe hasło i potwierdzenie nie są takie same.",
|
||
"passwordUpdated": "Hasło zaktualizowane.",
|
||
"updating": "Aktualizowanie…",
|
||
"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.",
|
||
"currency": "Waluta",
|
||
"currencyHint": "Przykład: {example}. Kwoty są tylko wyświetlane — nic nie jest przeliczane.",
|
||
"dateFormat": "Format daty",
|
||
"dateHint": "Przykład: {example}",
|
||
"fontSize": "Rozmiar czcionki",
|
||
"fontSmall": "Mała",
|
||
"fontMedium": "Średnia",
|
||
"fontLarge": "Duża"
|
||
},
|
||
"profile": {
|
||
"title": "Profil",
|
||
"working": "Przetwarzanie…",
|
||
"uploadPhoto": "Prześlij zdjęcie",
|
||
"remove": "Usuń",
|
||
"bio": "O mnie",
|
||
"bioHint": "Krótka notatka widoczna dla innych osób w Twoim gospodarstwie domowym.",
|
||
"bioSaved": "Zapisano opis.",
|
||
"saveBio": "Zapisz opis"
|
||
},
|
||
"security": {
|
||
"title": "Bezpieczeństwo",
|
||
"checkingDevice": "Sprawdzanie urządzenia…",
|
||
"biometricSignIn": "Logowanie biometryczne",
|
||
"biometricAvailable": "Zaloguj się za pomocą {method} zamiast hasła.",
|
||
"biometricUnavailable": "Na tym urządzeniu nie zarejestrowano biometrii.",
|
||
"methodFaceOrFingerprint": "twarzy lub odcisku palca",
|
||
"methodFace": "rozpoznawania twarzy",
|
||
"methodFingerprint": "odcisku palca",
|
||
"methodBiometrics": "biometrii",
|
||
"turnedOff": "Logowanie biometryczne wyłączone",
|
||
"enabled": "Logowanie biometryczne włączone",
|
||
"couldNotEnable": "Nie udało się włączyć: {error}",
|
||
"confirmPassword": "Potwierdź hasło",
|
||
"password": "Hasło"
|
||
},
|
||
"org": {
|
||
"title": "Organizacja",
|
||
"titleAll": "Organizacje",
|
||
"subtitleOwn": "Organizacja, którą administrujesz",
|
||
"subtitleNone": "Utwórz ją, aby zarządzać własnym zespołem",
|
||
"subtitleAll": "Podmioty, do których należą użytkownicy",
|
||
"nameLabel": "Nazwa organizacji",
|
||
"namePlaceholder": "Acme Fleet",
|
||
"newOrg": "Nowa organizacja",
|
||
"create": "Utwórz organizację",
|
||
"createHint": "Zostaniesz jej administratorem i będziesz móc dodawać użytkowników oraz nimi zarządzać.",
|
||
"rename": "Zmień nazwę",
|
||
"delete": "Usuń",
|
||
"deleteTitle": "Usunąć organizację?",
|
||
"empty": "Brak organizacji.",
|
||
"confirmDelete": "Usunąć organizację „{name}”? Tego nie można cofnąć.",
|
||
"confirmDeleteOwn": "Usunąć Twoją organizację „{name}”? Zostaniesz z niej usunięty i staniesz się zwykłym użytkownikiem. Tego nie można cofnąć."
|
||
},
|
||
"privacy": {
|
||
"title": "Prywatność i bezpieczeństwo",
|
||
"body": "Uwierzytelnianie dwuskładnikowe nie jest jeszcze dostępne. Sesje opierają się na tokenach wydawanych przez serwer, które wygasają samoczynnie, więc wylogowanie kończy tylko sesję na tym urządzeniu. Aby wylogować wszystkie urządzenia, zmień hasło powyżej.",
|
||
"signOut": "Wyloguj się"
|
||
},
|
||
"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ć",
|
||
"typeEmailPrompt": "Wpisz swój e-mail, aby potwierdzić.",
|
||
"requesting": "Wysyłanie żądania…",
|
||
"requestDeletion": "Zażądaj usunięcia",
|
||
"requestedOn": "Żądanie usunięcia konta złożono {date}. {tail}",
|
||
"cooldownPassed": "Okres karencji minął. Możesz teraz dokończyć usuwanie.",
|
||
"canStillCancel": "Nadal możesz je anulować — stanie się ostateczne po 3-dniowym okresie karencji.",
|
||
"cancelRequest": "Anuluj żądanie usunięcia",
|
||
"permanentlyDelete": "Usuń trwale",
|
||
"finalizeTitle": "Usunąć konto?",
|
||
"finalizeBody": "To trwale usunie Twoje konto. Tej operacji nie można cofnąć.",
|
||
"delete": "Usuń"
|
||
},
|
||
"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}).",
|
||
"exported": "Zapisano {file}",
|
||
"open": "Otwórz",
|
||
"openFailed": "Nie udało się otworzyć pliku."
|
||
}
|
||
},
|
||
"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",
|
||
"warrantyExpiredAgo": "Gwarancja wygasła {days} dni temu",
|
||
"warrantyEndsIn": "Gwarancja kończy się za {days} dni",
|
||
"underWarranty": "Na gwarancji · {days} dni"
|
||
},
|
||
"car": {
|
||
"allCars": "← Wszystkie samochody",
|
||
"share": "Udostępnij",
|
||
"shared": "Udostępniony",
|
||
"sharedReadOnly": "Udostępniony · tylko do odczytu",
|
||
"tabs": {
|
||
"connected": "Połączona usługa",
|
||
"info": "Informacje",
|
||
"services": "Historia serwisowa",
|
||
"technical": "Historia przeglądów",
|
||
"maintenance": "Naprawy",
|
||
"fuel": "Koszty paliwa",
|
||
"charging": "Koszty ładowania",
|
||
"documents": "Dokumenty",
|
||
"parts": "Katalog części",
|
||
"reminders": "Przypomnienia",
|
||
"dragHint": "Przeciągnij kartę, aby zmienić kolejność kart tego samochodu."
|
||
},
|
||
"viewPicker": {
|
||
"open": "Co pokazuje strona tego samochodu",
|
||
"title": "Co pokazuje ten samochód",
|
||
"subtitle": "Wybierz sekcje i szczegóły widoczne na stronie tego samochodu. Dotyczy wszystkich, którym go udostępniono.",
|
||
"tabsHeading": "Zakładki",
|
||
"fieldsHeading": "Pola informacji",
|
||
"alwaysOn": "Zakładka {tab} jest zawsze dostępna.",
|
||
"fieldsOrderHint": "Przeciągnij pola na zakładce Informacje, aby zmienić ich kolejność.",
|
||
"reorderHint": "Przeciągnij wiersz za uchwyt, aby zmienić kolejność.",
|
||
"tabsReorder": "Zakładki",
|
||
"fieldsReorder": "Pola informacyjne"
|
||
},
|
||
"provider": {
|
||
"subtitle": "Dane na żywo z Twojego konta {label}.",
|
||
"refresh": "Odśwież",
|
||
"refreshing": "Odświeżanie…",
|
||
"updated": "Zaktualizowano {time}",
|
||
"vehicle": "Pojazd",
|
||
"readings": "Aktualne odczyty",
|
||
"dragHint": "Przeciągnij odczyt, aby zmienić ich kolejność.",
|
||
"noData": "{label} nie zwróciło żadnych danych dla tego samochodu.",
|
||
"raw": "Surowa odpowiedź",
|
||
"allFields": "Wszystkie zgłoszone pola",
|
||
"truncated": "Wypisano tylko pierwsze {n} pól — pozostałe znajdziesz w surowej odpowiedzi poniżej.",
|
||
"sectionEmpty": "Brak danych.",
|
||
"sectionFailed": "Nie udało się pobrać",
|
||
"own": "Używane jest wyłącznie Twoje własne konto, więc dane logowania nigdy nie są udostępniane wraz z samochodem.",
|
||
"odometerSuggest": "{label} podaje {km}, czyli więcej niż zapisany przebieg tego samochodu.",
|
||
"updateOdometer": "Zaktualizuj przebieg",
|
||
"updatingOdometer": "Aktualizowanie…",
|
||
"unlink": "Odłącz",
|
||
"unlinkConfirm": "Odłączyć ten samochód od {label}? Żadne zapisane dane nie zostaną usunięte.",
|
||
"connectTitle": "Połącz ten samochód z usługą",
|
||
"connectHint": "Wybierz pojazd ze swojego konta, który odpowiada temu samochodowi. Jego dane pojawią się tutaj.",
|
||
"connectSubmit": "Połącz pojazd",
|
||
"connecting": "Łączenie…",
|
||
"noProviders": "Nie połączono żadnego konta producenta. Dodaj je w Ustawieniach › Integracje.",
|
||
"settingsLink": "Otwórz Ustawienia",
|
||
"sections": {
|
||
"telemetry": "Przebieg i zasięg",
|
||
"electric": "Akumulator i ładowanie",
|
||
"status": "Drzwi, szyby i światła",
|
||
"health": "Stan pojazdu",
|
||
"location": "Ostatnia znana lokalizacja",
|
||
"serviceHistory": "Historia serwisowa u dealera",
|
||
"notifications": "Powiadomienia"
|
||
},
|
||
"metrics": {
|
||
"odometer": "Przebieg",
|
||
"fuelLevel": "Poziom paliwa",
|
||
"fuelRange": "Zasięg",
|
||
"batteryLevel": "Akumulator",
|
||
"evRange": "Zasięg elektryczny (bez klimatyzacji)",
|
||
"evRangeWithAc": "Zasięg elektryczny (z klimatyzacją)",
|
||
"chargingStatus": "Ładowanie",
|
||
"location": "Pozycja"
|
||
}
|
||
},
|
||
"info": {
|
||
"allHidden": "Wszystkie pola są wyłączone dla tego samochodu.",
|
||
"dragHint": "Przeciągnij pole, aby zmienić układ informacji o tym samochodzie.",
|
||
"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",
|
||
"technicalCheckInterval": "Interwał przeglądów technicznych",
|
||
"daysValue": {
|
||
"one": "{n} dzień",
|
||
"few": "{n} dni",
|
||
"many": "{n} dni",
|
||
"other": "{n} dni"
|
||
}
|
||
},
|
||
"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?",
|
||
"next": "Następny: {date} · {km}",
|
||
"chipOil": "Olej i filtr",
|
||
"chipEngineFilter": "Filtr powietrza",
|
||
"chipCabinFilter": "Filtr kabinowy"
|
||
},
|
||
"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?",
|
||
"next": "Następny: {date}"
|
||
},
|
||
"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?",
|
||
"partsUsed": "Części: {parts}"
|
||
},
|
||
"fuel": {
|
||
"title": "Koszty paliwa",
|
||
"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?",
|
||
"fullTank": "Pełny bak",
|
||
"partialFill": "Tankowanie częściowe",
|
||
"missedBefore": "Pominięte tankowanie",
|
||
"overDistance": "{consumption} · {rate} na dystansie {distance}"
|
||
},
|
||
"charging": {
|
||
"title": "Koszty ładowania",
|
||
"subtitle": "Zużycie liczone jest między pełnymi ładowaniami.",
|
||
"add": "Zapisz ładowanie",
|
||
"empty": "Brak zapisanych ładowań.",
|
||
"average": "Średnio",
|
||
"best": "Najlepsze",
|
||
"worst": "Najgorsze",
|
||
"costPerKm": "Koszt na km",
|
||
"sessions": "Ładowania",
|
||
"totalKwh": "Łączna energia",
|
||
"totalSpent": "Łącznie wydano",
|
||
"trackedDistance": "Zmierzony dystans",
|
||
"avgPrice": "Śr. cena {price}/kWh",
|
||
"needTwoCharges": "Zapisz co najmniej dwa pełne ładowania, aby zobaczyć zużycie.",
|
||
"colDate": "Data",
|
||
"colKm": "Km",
|
||
"colKwh": "kWh",
|
||
"colCost": "Koszt",
|
||
"colPerKwh": "Za kWh",
|
||
"colDistance": "Dystans",
|
||
"colConsumption": "Zużycie",
|
||
"colLocation": "Ładowarka",
|
||
"colFile": "Plik",
|
||
"partial": "częściowe",
|
||
"gap": "przerwa",
|
||
"confirmDelete": "Usunąć to ładowanie?",
|
||
"fullCharge": "Pełne ładowanie",
|
||
"partialCharge": "Ładowanie częściowe",
|
||
"missedBefore": "Pominięte ładowanie",
|
||
"overDistance": "{consumption} · {rate} na dystansie {distance}"
|
||
},
|
||
"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?",
|
||
"issuedRenews": "Wydano {issued} · Odnowienie {renews}"
|
||
},
|
||
"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?",
|
||
"on": "dnia {date}",
|
||
"repeatsEvery": "Powtarza się co {every}",
|
||
"autoHint": "Dodane automatycznie — aby to zmienić, edytuj wpis, z którego pochodzi."
|
||
},
|
||
"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}, {charging}, {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"
|
||
},
|
||
"charging": {
|
||
"one": "{n} ładowanie",
|
||
"other": "{n} ładowań"
|
||
},
|
||
"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"
|
||
},
|
||
"actions": {
|
||
"share": "Udostępnij samochód",
|
||
"edit": "Edytuj samochód",
|
||
"odometer": "Zaktualizuj przebieg",
|
||
"delete": "Usuń samochód"
|
||
},
|
||
"readOnlyNotice": "Udostępnione Tobie (tylko do odczytu). Nie możesz wprowadzać zmian."
|
||
},
|
||
"forms": {
|
||
"charging": {
|
||
"addTitle": "Zapisz ładowanie",
|
||
"editTitle": "Edytuj ładowanie",
|
||
"date": "Data",
|
||
"odometer": "Przebieg (km)",
|
||
"kwh": "Energia (kWh)",
|
||
"cost": "Koszt",
|
||
"pricePerKwh": "To {price} za kWh.",
|
||
"battery": "Akumulator",
|
||
"fullCharge": "Naładowany do pełna",
|
||
"missedSession": "Wcześniejsze ładowanie nie zostało zapisane",
|
||
"batteryHint": "Zużycie liczone jest między pełnymi ładowaniami. Ładowania częściowe wliczają się do kosztów i doliczają do kolejnego pełnego.",
|
||
"location": "Ładowarka",
|
||
"locationPlaceholder": "Dom",
|
||
"notes": "Notatki",
|
||
"attachmentLegend": "Paragon",
|
||
"submit": "Zapisz ładowanie"
|
||
},
|
||
"import": {
|
||
"title": "Importuj samochód",
|
||
"subtitle": "Utwórz samochód na podstawie pojazdu z Twojego konta u producenta. Wszystko, co da się odczytać, zostanie wypełnione automatycznie.",
|
||
"service": "Usługa",
|
||
"loadingVehicles": "Wczytywanie Twoich pojazdów…",
|
||
"noVehicles": "Brak pojazdów na tym koncie.",
|
||
"notConnected": "Nie połączono",
|
||
"noProviders": "Nie połączono żadnego konta producenta. Dodaj je w Ustawieniach › Integracje.",
|
||
"alreadyInGarage": "Już w Twoim garażu",
|
||
"selectVehicle": "Pojazd",
|
||
"dataTitle": "Co zaimportować",
|
||
"dataHint": "Odznacz to, co wolisz wpisać samodzielnie.",
|
||
"includeIdentity": "Marka, model, rok, rejestracja i VIN",
|
||
"includeFuelType": "Rodzaj paliwa",
|
||
"includeDates": "Data produkcji i pierwszej rejestracji",
|
||
"includeOdometer": "Aktualny przebieg",
|
||
"name": "Nazwa samochodu",
|
||
"submit": "Importuj samochód",
|
||
"importing": "Importowanie…",
|
||
"warningOdometer": "Usługa nie podała przebiegu — wpisz go samodzielnie w samochodzie.",
|
||
"moreData": "Pozostałe dane z tej usługi pozostają dostępne w karcie {label} samochodu."
|
||
},
|
||
"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",
|
||
"stationPlaceholder": "Orlen"
|
||
},
|
||
"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ę",
|
||
"workshopPlaceholder": "Auto Serwis Kowalski",
|
||
"locationPlaceholder": "Kraków"
|
||
},
|
||
"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",
|
||
"providerPlaceholder": "PZU"
|
||
},
|
||
"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.",
|
||
"submitting": "Udostępnianie…"
|
||
},
|
||
"validation": {
|
||
"odometer": "Przebieg jest wymagany.",
|
||
"liters": "Liczba litrów jest wymagana.",
|
||
"kwh": "Energia (kWh) jest wymagana.",
|
||
"name": "Nazwa jest wymagana.",
|
||
"partName": "Nazwa części jest wymagana.",
|
||
"description": "Opisz, co zostało zrobione.",
|
||
"title": "Tytuł jest wymagany."
|
||
}
|
||
},
|
||
"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"
|
||
}
|
||
},
|
||
"attachment": {
|
||
"legend": "Załącznik",
|
||
"hint": "PDF lub obraz, do 10 MB.",
|
||
"attached": "Załączono: {name}",
|
||
"willBeRemoved": "Załącznik zostanie usunięty przy zapisie.",
|
||
"choose": "Wybierz plik",
|
||
"replace": "Zamień",
|
||
"view": "Podgląd",
|
||
"clear": "Wyczyść"
|
||
},
|
||
"errors": {
|
||
"sessionExpired": "Sesja wygasła — zaloguj się ponownie.",
|
||
"deleteFailed": "Usuwanie nie powiodło się: {error}",
|
||
"completeFailed": "Nie udało się ukończyć: {error}",
|
||
"attachmentFailed": "Zapisano, ale plik nie został przesłany: {error}",
|
||
"openFailed": "Nie udało się otworzyć pliku: {error}",
|
||
"noFile": "Brak załączonego pliku."
|
||
}
|
||
}
|