Files
DriverVault/Phone App/assets/i18n/pl.json
T
tajniak81andClaude Opus 4.8 b6bb6b1df0 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>
2026-07-17 20:07:48 +02:00

207 lines
7.6 KiB
JSON

{
"common": {
"save": "Zapisz",
"saving": "Zapisywanie…",
"saved": "Zapisano ✓",
"cancel": "Anuluj",
"remove": "Usuń",
"retry": "Ponów",
"required": "Wymagane",
"confirm": "Potwierdź",
"empty": "—"
},
"nav": {
"garage": "Garaż",
"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"
}
},
"settings": {
"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"
},
"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ń"
}
},
"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"
}
}