The climate cards landed with the endpoint migration, but only as two more folded dumps of key/value pairs. What a driver opens that tab for in January is one number, and it was three taps down inside a card called Climate. So currentTemperature and targetTemperature join the headline readings, beside the pair of electric ranges and for the same stated reason: neither figure answers the question on its own. A cabin at 12° means nothing until you know it is climbing towards 21°, and the gap between them is how long to leave the scraper in the boot. Being derived from headlineMetricSpecs, both are arrangeable the moment they exist — a car's saved order of readings can name them without anything else being told they are there, and a test now says so rather than leaving it to be noticed when a PATCH starts rejecting a key. The unit is fixed at Celsius, because Toyota Connected is the European service and there is no imperial reading to convert from. That is a default and not a claim: a payload that names its own unit is still believed over it, the way every other reading here works, so a service that one day reports Fahrenheit is labelled Fahrenheit rather than relabelled into a wrong Celsius. The two apps needed the two labels in three languages each and nothing else. That is the shape working: a section is an id the app localizes and a reading is a key it localizes, so a card added on the server arrives in both clients already folded, already arrangeable, already translated. The one thing the Web App did need was a corrected comment — the note explaining why cards fold still said Toyota reports eight sections, and it is the argument for folding them, so it should count the ten there now are. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
995 lines
37 KiB
JSON
995 lines
37 KiB
JSON
{
|
||
"common": {
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"saved": "Saved ✓",
|
||
"cancel": "Cancel",
|
||
"remove": "Remove",
|
||
"retry": "Retry",
|
||
"required": "Required",
|
||
"confirm": "Confirm",
|
||
"empty": "—",
|
||
"saveChanges": "Save changes",
|
||
"loading": "Loading…",
|
||
"edit": "Edit",
|
||
"open": "Open",
|
||
"delete": "Delete",
|
||
"done": "Done",
|
||
"undo": "Undo",
|
||
"download": "Download",
|
||
"yes": "Yes",
|
||
"no": "No"
|
||
},
|
||
"nav": {
|
||
"garage": "Garage",
|
||
"charging": "Charging",
|
||
"settings": "Settings",
|
||
"users": "Users"
|
||
},
|
||
"login": {
|
||
"tagline": "Your car, on track.",
|
||
"email": "Email",
|
||
"password": "Password",
|
||
"showPassword": "Show password",
|
||
"hidePassword": "Hide password",
|
||
"submit": "Sign in",
|
||
"submitting": "Signing in…",
|
||
"or": "or",
|
||
"signInWithFace": "Sign in with face recognition",
|
||
"signInWithFingerprint": "Sign in with fingerprint",
|
||
"signInWithBiometrics": "Sign in with biometrics",
|
||
"enrollTitle": "Enable biometric sign-in?",
|
||
"enrollBody": "Next time you can sign in with {method} instead of typing your password.",
|
||
"enrollNotNow": "Not now",
|
||
"enrollEnable": "Enable",
|
||
"methodFace": "face recognition",
|
||
"methodFingerprint": "your fingerprint",
|
||
"methodBiometrics": "biometrics",
|
||
"bioReasonSignInAs": "Sign in as {email}",
|
||
"bioReasonSignIn": "Sign in to DriverVault",
|
||
"savedInvalid": "Saved sign-in is no longer valid. Please sign in with your password.",
|
||
"serverSettings": "Server settings",
|
||
"apiServerUrl": "API server URL",
|
||
"leaveBlank": "Leave blank to use the default.",
|
||
"reset": "Reset",
|
||
"savedNote": "Saved ✓",
|
||
"resetNote": "Reset ✓"
|
||
},
|
||
"servers": {
|
||
"title": "Servers",
|
||
"home": "Default server",
|
||
"switchHint": "Switch which server the app reads from",
|
||
"add": "Add server",
|
||
"addTitle": "Add a server",
|
||
"name": "Name",
|
||
"namePlaceholder": "Home garage",
|
||
"url": "Address",
|
||
"urlHint": "The API Server's public address, e.g. https://garage.example.com — /api is added for you if you leave the path off.",
|
||
"urlHomeHint": "Leave blank to use the address this app ships with.",
|
||
"connect": "Connect",
|
||
"connecting": "Connecting…",
|
||
"connected": "Connected",
|
||
"notConnected": "Not connected — sign in to switch",
|
||
"signOut": "Sign out of this server",
|
||
"removeConfirm": "Remove {name}? The session held for it is forgotten too.",
|
||
"unknown": "Unknown server"
|
||
},
|
||
"lock": {
|
||
"title": "DriverVault is locked",
|
||
"reason": "Unlock DriverVault",
|
||
"unlock": "Unlock",
|
||
"unlocking": "Unlocking…",
|
||
"usePassword": "Use password instead"
|
||
},
|
||
"dashboard": {
|
||
"eyebrow": "YOUR CARS",
|
||
"title": "Garage",
|
||
"addCar": "Add car",
|
||
"lightMode": "Light mode",
|
||
"darkMode": "Dark mode",
|
||
"logOut": "Log out",
|
||
"empty": "No cars yet.",
|
||
"shared": "Shared",
|
||
"sharedReadOnly": "Shared · read-only",
|
||
"serviceLife": "SERVICE LIFE",
|
||
"lastService": "Last service",
|
||
"currentOdometer": "Current odometer",
|
||
"nextDue": "Next due",
|
||
"nextDueKm": "Next due km",
|
||
"serviceRecords": {
|
||
"one": "{n} service record",
|
||
"other": "{n} service records"
|
||
}
|
||
},
|
||
"carApp": {
|
||
"signIn": "Sign in on your phone to see your garage here.",
|
||
"expired": "The session has ended. Sign in again on your phone.",
|
||
"unreachable": "Could not reach the server.",
|
||
"refresh": "Refresh"
|
||
},
|
||
"charging": {
|
||
"eyebrow": "CHARGING & MAP",
|
||
"title": "Nearby chargers",
|
||
"tabs": {
|
||
"public": "Public chargers",
|
||
"home": "Home chargers"
|
||
},
|
||
"liveMap": "Live map",
|
||
"youAreHere": "You are here",
|
||
"session": {
|
||
"chargingNow": "Charging now",
|
||
"rate": "Rate",
|
||
"added": "Added",
|
||
"cost": "Cost",
|
||
"done": "Done",
|
||
"stop": "Stop charging",
|
||
"idle": "Not charging",
|
||
"idleHint": "Plug in at a station to start a session."
|
||
},
|
||
"control": {
|
||
"title": "Charger control",
|
||
"connected": "Connected",
|
||
"disconnected": "Offline",
|
||
"serialPlaceholder": "Charger serial (e.g. A5191-XXXXXXXX)",
|
||
"refresh": "Refresh",
|
||
"status": "Connector",
|
||
"meter": "Energy",
|
||
"start": "Start charging",
|
||
"stop": "Stop charging",
|
||
"limit": "Current limit",
|
||
"applyLimit": "Apply limit",
|
||
"clearLimit": "Clear limit",
|
||
"reset": "Reset charger",
|
||
"resetConfirm": "Reboot this charger now? Any active charging session will be interrupted. Re-enter your password to confirm.",
|
||
"resetPassword": "Your account password",
|
||
"connectHint": "Enter your charger's serial and refresh. The charger must be connected to DriverVault's OCPP backend (set up in Settings → Integrations)."
|
||
},
|
||
"stations": {
|
||
"heading": "Nearby",
|
||
"homeHeading": "Your chargers",
|
||
"noControlHint": "Turn on Own or Proxy CSMS in Settings → Integrations to control your home charger here.",
|
||
"count": {
|
||
"one": "{n} station",
|
||
"other": "{n} stations"
|
||
},
|
||
"free": "{avail} of {total} free",
|
||
"full": "Full",
|
||
"offPeak": "off-peak",
|
||
"homeCharger": "Home charger"
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"tabs": {
|
||
"personal": "Personal settings",
|
||
"integrations": "Integrations"
|
||
},
|
||
"integrations": {
|
||
"title": "Integrations",
|
||
"subtitle": "Connect external services to your account.",
|
||
"toyota": "Toyota Connected (MyToyota)",
|
||
"toyotaDesc": "Sign in with your MyToyota account to pull vehicle data from Toyota Connected Europe. Europe only.",
|
||
"enable": "Enable for my account",
|
||
"enableOrg": "Enable for the organization",
|
||
"unavailable": "This integration is turned off by the administrator.",
|
||
"orgDisabled": "This integration is turned off for your organization.",
|
||
"scopeMy": "My settings",
|
||
"scopeOrg": "Organization",
|
||
"scopeHint": "Organization settings apply to everyone in your organization who leaves a field blank.",
|
||
"readOnly": "You manage this integration's shared settings in the API Server panel; here it is read-only.",
|
||
"email": "MyToyota email",
|
||
"password": "MyToyota password",
|
||
"brand": "Brand",
|
||
"brandToyota": "Toyota",
|
||
"brandLexus": "Lexus",
|
||
"inherited": "Set above your level",
|
||
"inheritedFrom": "Inherited from {source}",
|
||
"sourceGlobal": "the administrator",
|
||
"sourceOrg": "your organization",
|
||
"sourceUser": "you",
|
||
"passwordKeep": "Leave blank to keep the saved password.",
|
||
"test": "Test connection",
|
||
"testing": "Testing…",
|
||
"save": "Save",
|
||
"saved": "Saved ✓",
|
||
"connected": "Connected",
|
||
"notConnected": "Not connected",
|
||
"ankerSolix": "Anker Solix (V1 Smart EV Charger)",
|
||
"ankerSolixDesc": "Sign in with your Anker account to pull EV charger data from the Anker Solix cloud.",
|
||
"ankerEmail": "Anker account email",
|
||
"ankerPassword": "Anker account password",
|
||
"country": "Country",
|
||
"countryHint": "Two-letter country code of your Anker account (e.g. DE, GB, US).",
|
||
"controlMode": "Control mode",
|
||
"controlModeHint": "How DriverVault controls the charger over OCPP.",
|
||
"controlOff": "Off (monitoring only)",
|
||
"controlOwn": "Own CSMS (full control)",
|
||
"controlProxy": "Proxy CSMS (relay + control)",
|
||
"controlTitle": "Charger control (OCPP)",
|
||
"controlOwnHint": "The charger connects directly to DriverVault as its Central System. Point the charger's OCPP backend at the endpoint below.",
|
||
"controlProxyHint": "DriverVault relays to Anker's cloud and can inject commands. Point the charger's OCPP backend at the endpoint below.",
|
||
"controlProvisionSteps": "In the Anker app (or the charger's OCPP settings), set the OCPP backend URL to the endpoint and the authorization key to the token above.",
|
||
"chargerSerial": "Charger serial",
|
||
"controlCheck": "Check status",
|
||
"controlGenerate": "Generate token",
|
||
"controlEndpoint": "OCPP endpoint",
|
||
"controlToken": "Auth token",
|
||
"controlTokenOnce": "Copy this token now — it's shown only once and can't be retrieved later.",
|
||
"controlRevoke": "Revoke token",
|
||
"controlRevokeConfirm": "Revoke this charger's control token? It will disconnect and can't reconnect until you generate a new one.",
|
||
"controlConnected": "Connected to control backend",
|
||
"controlDisconnected": "Not connected"
|
||
},
|
||
"account": {
|
||
"title": "Account",
|
||
"name": "Name",
|
||
"nameSaved": "Name saved.",
|
||
"email": "Email",
|
||
"verified": "Verified",
|
||
"notVerified": "Not verified",
|
||
"sending": "Sending…",
|
||
"resendVerification": "Resend verification email",
|
||
"verificationRequested": "Verification email requested.",
|
||
"changePassword": "Change password",
|
||
"currentPassword": "Current password",
|
||
"newPassword": "New password (min 8)",
|
||
"confirmNewPassword": "Confirm new password",
|
||
"tooShort": "New password must be at least 8 characters.",
|
||
"mismatch": "New password and confirmation don't match.",
|
||
"passwordUpdated": "Password updated.",
|
||
"updating": "Updating…",
|
||
"updatePassword": "Update password"
|
||
},
|
||
"appearance": {
|
||
"title": "Appearance",
|
||
"theme": "Theme",
|
||
"themeLight": "Light",
|
||
"themeDark": "Dark",
|
||
"themeSystem": "System",
|
||
"language": "Language",
|
||
"languageHint": "App text, and the names of months and days.",
|
||
"languageFallbackHint": "This language isn't translated yet — the app text stays in English.",
|
||
"region": "Region",
|
||
"regionHint": "Number and currency layout.",
|
||
"currency": "Currency",
|
||
"currencyHint": "Example: {example}. Amounts are display-only — nothing is converted.",
|
||
"dateFormat": "Date format",
|
||
"dateHint": "Example: {example}",
|
||
"fontSize": "Font size",
|
||
"fontSmall": "Small",
|
||
"fontMedium": "Medium",
|
||
"fontLarge": "Large"
|
||
},
|
||
"profile": {
|
||
"title": "Profile",
|
||
"working": "Working…",
|
||
"uploadPhoto": "Upload photo",
|
||
"remove": "Remove",
|
||
"bio": "Bio",
|
||
"bioHint": "A short note visible to other people in your household.",
|
||
"bioSaved": "Bio saved.",
|
||
"saveBio": "Save bio"
|
||
},
|
||
"security": {
|
||
"title": "Security",
|
||
"checkingDevice": "Checking device…",
|
||
"biometricSignIn": "Biometric sign-in",
|
||
"biometricAvailable": "Sign in with {method} instead of your password.",
|
||
"biometricUnavailable": "No biometrics are enrolled on this device.",
|
||
"methodFaceOrFingerprint": "face or fingerprint",
|
||
"methodFace": "face recognition",
|
||
"methodFingerprint": "fingerprint",
|
||
"methodBiometrics": "biometrics",
|
||
"turnedOff": "Biometric sign-in turned off",
|
||
"enabled": "Biometric sign-in enabled",
|
||
"couldNotEnable": "Could not enable: {error}",
|
||
"confirmPassword": "Confirm your password",
|
||
"password": "Password"
|
||
},
|
||
"org": {
|
||
"title": "Organization",
|
||
"titleAll": "Organizations",
|
||
"subtitleOwn": "The organization you administer",
|
||
"subtitleNone": "Create one to manage your own team",
|
||
"subtitleAll": "Tenants users belong to",
|
||
"nameLabel": "Organization name",
|
||
"namePlaceholder": "Acme Fleet",
|
||
"newOrg": "New organization",
|
||
"create": "Create organization",
|
||
"createHint": "You'll become its admin and can then add and manage users.",
|
||
"rename": "Rename",
|
||
"delete": "Delete",
|
||
"deleteTitle": "Delete organization?",
|
||
"empty": "No organizations yet.",
|
||
"confirmDelete": "Delete the organization “{name}”? This cannot be undone.",
|
||
"confirmDeleteOwn": "Delete your organization “{name}”? You'll be removed from it and become a regular user. This cannot be undone."
|
||
},
|
||
"privacy": {
|
||
"title": "Privacy & security",
|
||
"body": "Two-factor authentication isn't available yet. Sessions are held as server-issued tokens that expire on their own, so signing out ends this device's session only. To lock out every device, change your password above.",
|
||
"signOut": "Sign out"
|
||
},
|
||
"danger": {
|
||
"title": "Danger zone",
|
||
"body": "Deleting your account removes your login and profile. It does not delete your household's shared cars or service history. There's a 3-day cooldown before deletion is final, and you can cancel any time before then.",
|
||
"deleteAccount": "Delete my account",
|
||
"typeToConfirm": "Type {email} to confirm",
|
||
"typeEmailPrompt": "Type your email to confirm.",
|
||
"requesting": "Requesting…",
|
||
"requestDeletion": "Request deletion",
|
||
"requestedOn": "Account deletion requested on {date}. {tail}",
|
||
"cooldownPassed": "The cooldown has passed. You can now finalize the deletion.",
|
||
"canStillCancel": "You can still cancel — it becomes permanent after the 3-day cooldown.",
|
||
"cancelRequest": "Cancel deletion request",
|
||
"permanentlyDelete": "Permanently delete",
|
||
"finalizeTitle": "Delete account?",
|
||
"finalizeBody": "This permanently deletes your account. This cannot be undone.",
|
||
"delete": "Delete"
|
||
},
|
||
"advanced": {
|
||
"title": "Advanced",
|
||
"exportTitle": "Export your data",
|
||
"exportBody": "Download your profile and all cars, service records, and parts as JSON.",
|
||
"preparing": "Preparing…",
|
||
"exportAction": "Export data",
|
||
"importTitle": "Import your data",
|
||
"importBody": "Add cars from a previously exported JSON file. This creates new records — it doesn't merge with or overwrite anything existing.",
|
||
"importing": "Importing…",
|
||
"importAction": "Import data",
|
||
"notJson": "That file isn't valid JSON.",
|
||
"notExport": "That file doesn't look like a DriverVault export (missing a \"cars\" list).",
|
||
"confirmImport": "Import {count} car(s) from this file? This adds new records — it does not merge with or overwrite existing cars.",
|
||
"imported": "Imported {cars} car(s), {services} service record(s), {parts} part(s).",
|
||
"exported": "Saved {file}",
|
||
"open": "Open",
|
||
"openFailed": "Could not open the file."
|
||
}
|
||
},
|
||
"status": {
|
||
"noData": "No data",
|
||
"serviceOverdueDays": "Service Overdue {days}d",
|
||
"dueInDays": "Due in {days}d",
|
||
"okDays": "OK · {days}d",
|
||
"okIn": "OK · {parts}",
|
||
"noKm": "No km",
|
||
"serviceOverdueKm": "Service Overdue {km} km",
|
||
"serviceOverdueBy": "Service Overdue {parts}",
|
||
"inKm": "In {km} km",
|
||
"kmLeft": "{km} km left",
|
||
"expiredAgo": "Expired {days}d ago",
|
||
"expiresToday": "Expires today",
|
||
"renewInDays": "Renew in {days}d",
|
||
"validDays": "Valid · {days}d",
|
||
"noExpiry": "No expiry",
|
||
"done": "Done",
|
||
"noTrigger": "No trigger",
|
||
"overdue": "Overdue",
|
||
"overdueBy": "Overdue {parts}",
|
||
"dueIn": "Due in {parts}",
|
||
"upcoming": "Upcoming",
|
||
"today": "today",
|
||
"days": "{days}d",
|
||
"km": "{km} km",
|
||
"warrantyExpiredAgo": "Warranty expired {days}d ago",
|
||
"warrantyEndsIn": "Warranty ends in {days}d",
|
||
"underWarranty": "Under warranty · {days}d"
|
||
},
|
||
"car": {
|
||
"allCars": "← All cars",
|
||
"share": "Share",
|
||
"shared": "Shared",
|
||
"sharedReadOnly": "Shared · read-only",
|
||
"tabs": {
|
||
"connected": "Connected service",
|
||
"info": "Information",
|
||
"services": "Service history",
|
||
"technical": "Technical check history",
|
||
"maintenance": "Maintenance",
|
||
"fuel": "Fuel cost",
|
||
"charging": "Charging cost",
|
||
"documents": "Documents",
|
||
"parts": "Parts catalog",
|
||
"reminders": "Reminders",
|
||
"dragHint": "Drag a tab to rearrange this car's tabs."
|
||
},
|
||
"viewPicker": {
|
||
"open": "What this car's page shows",
|
||
"title": "What this car shows",
|
||
"subtitle": "Pick the sections and details this car's page shows. It applies to everyone the car is shared with.",
|
||
"tabsHeading": "Tabs",
|
||
"fieldsHeading": "Information fields",
|
||
"alwaysOn": "{tab} is always available.",
|
||
"fieldsOrderHint": "Drag the fields on the Information tab to change the order they appear in.",
|
||
"serviceColumnsHeading": "Service history columns",
|
||
"columnAlwaysOn": "{column} is always shown.",
|
||
"servicePartsHeading": "Changed parts",
|
||
"servicePartsHint": "A part switched off comes off the service form and out of the history. What is already recorded is kept, and comes back with it.",
|
||
"reorderHint": "Drag a row by its handle to change the order.",
|
||
"tabsReorder": "Tabs",
|
||
"fieldsReorder": "Information fields"
|
||
},
|
||
"provider": {
|
||
"subtitle": "Live data from your {label} account.",
|
||
"refresh": "Refresh",
|
||
"refreshing": "Refreshing…",
|
||
"updated": "Updated {time}",
|
||
"vehicle": "Vehicle",
|
||
"readings": "Current readings",
|
||
"dragHint": "Drag a reading to rearrange them.",
|
||
"noData": "{label} returned no data for this car.",
|
||
"raw": "Raw response",
|
||
"allFields": "All reported fields",
|
||
"truncated": "Only the first {n} fields are listed — the raw response below has the rest.",
|
||
"sectionEmpty": "Nothing reported.",
|
||
"sectionFailed": "Couldn't be fetched",
|
||
"own": "Only your own account is used, so credentials are never shared with a car.",
|
||
"odometerSuggest": "{label} reports {km}, ahead of this car's stored reading.",
|
||
"updateOdometer": "Update odometer",
|
||
"updatingOdometer": "Updating…",
|
||
"unlink": "Disconnect",
|
||
"unlinkConfirm": "Disconnect this car from {label}? Nothing already saved is deleted.",
|
||
"connectTitle": "Connect this car to a service",
|
||
"connectHint": "Pick the vehicle on your account that matches this car. Its data then appears here.",
|
||
"connectSubmit": "Connect vehicle",
|
||
"connecting": "Connecting…",
|
||
"noProviders": "No manufacturer account is connected. Add one in Settings › Integrations.",
|
||
"settingsLink": "Open Settings",
|
||
"sections": {
|
||
"telemetry": "Odometer & range",
|
||
"electric": "Battery & charging",
|
||
"status": "Doors, windows & lights",
|
||
"climate": "Climate",
|
||
"climateSettings": "Climate presets",
|
||
"health": "Vehicle health",
|
||
"location": "Last known location",
|
||
"serviceHistory": "Dealer service history",
|
||
"notifications": "Notifications"
|
||
},
|
||
"metrics": {
|
||
"odometer": "Odometer",
|
||
"fuelLevel": "Fuel level",
|
||
"fuelRange": "Range",
|
||
"batteryLevel": "Battery",
|
||
"evRange": "Electric range (A/C off)",
|
||
"evRangeWithAc": "Electric range (A/C on)",
|
||
"cabinTemperature": "Cabin temperature",
|
||
"targetTemperature": "Target temperature",
|
||
"chargingStatus": "Charging",
|
||
"location": "Position"
|
||
}
|
||
},
|
||
"info": {
|
||
"allHidden": "Every field is switched off for this car.",
|
||
"dragHint": "Drag a field to rearrange this car's information.",
|
||
"oilSpec": "Engine oil spec",
|
||
"transmissionOil": "Transmission oil",
|
||
"differentialOil": "Differential oil",
|
||
"brakeFluid": "Brake fluid",
|
||
"coolant": "Coolant",
|
||
"odometer": "Odometer",
|
||
"serviceInterval": "Service interval",
|
||
"nextDue": "Next due",
|
||
"registrationPlate": "Registration plate",
|
||
"registrationCountry": "Registration country",
|
||
"vin": "VIN",
|
||
"fuelType": "Fuel type",
|
||
"buildDate": "Build date",
|
||
"firstRegistration": "First registration",
|
||
"technicalCheckInterval": "Technical check interval",
|
||
"daysValue": {
|
||
"one": "{n} day",
|
||
"other": "{n} days"
|
||
}
|
||
},
|
||
"services": {
|
||
"title": "Service history",
|
||
"add": "Add service",
|
||
"empty": "No service records yet.",
|
||
"colDate": "Date",
|
||
"colKm": "Km",
|
||
"colNextDate": "Next date",
|
||
"colNextKm": "Next km",
|
||
"colOil": "Oil & Oil filter",
|
||
"colEngineFilter": "Engine air filter",
|
||
"colCabinFilter": "Cabin air filter",
|
||
"colNotes": "Notes",
|
||
"colFile": "File",
|
||
"confirmDelete": "Delete this service record?",
|
||
"chipOil": "Oil & filter",
|
||
"chipEngineFilter": "Engine air",
|
||
"chipCabinFilter": "Cabin air"
|
||
},
|
||
"technical": {
|
||
"title": "Technical check history",
|
||
"subtitle": "Mandatory roadworthiness inspections. Recurs on time alone, whatever the odometer reads.",
|
||
"add": "Add check",
|
||
"empty": "No technical checks yet.",
|
||
"colDate": "Date",
|
||
"colResult": "Result",
|
||
"colNextCheck": "Next check",
|
||
"colStatus": "Status",
|
||
"colStation": "Station",
|
||
"colCost": "Cost",
|
||
"colNotes": "Notes",
|
||
"colFile": "File",
|
||
"passed": "Passed",
|
||
"failed": "Failed",
|
||
"confirmDelete": "Delete this technical check?",
|
||
"next": "Next: {date}"
|
||
},
|
||
"maintenance": {
|
||
"title": "Maintenance",
|
||
"subtitle": "Workshop visits and repairs. Routine servicing lives under Service history.",
|
||
"add": "Log visit",
|
||
"empty": "No workshop visits logged yet.",
|
||
"colDate": "Date",
|
||
"colKm": "Km",
|
||
"colType": "Type",
|
||
"colWork": "Work done",
|
||
"colWorkshop": "Workshop",
|
||
"colStatus": "Status",
|
||
"colCost": "Cost",
|
||
"colFile": "File",
|
||
"underWarranty": "Under warranty · {days}d left",
|
||
"confirmDelete": "Delete this workshop visit?",
|
||
"partsUsed": "Parts: {parts}"
|
||
},
|
||
"fuel": {
|
||
"title": "Fuel cost",
|
||
"subtitle": "Consumption is measured between full tanks.",
|
||
"add": "Log refill",
|
||
"empty": "No refills logged yet.",
|
||
"average": "Average",
|
||
"best": "Best",
|
||
"worst": "Worst",
|
||
"costPerKm": "Cost per km",
|
||
"refills": "Refills",
|
||
"totalLiters": "Total litres",
|
||
"totalSpent": "Total spent",
|
||
"trackedDistance": "Tracked distance",
|
||
"avgPrice": "Avg. price {price}/L",
|
||
"needTwoTanks": "Log at least two full tanks to see consumption figures.",
|
||
"colDate": "Date",
|
||
"colKm": "Km",
|
||
"colLiters": "Litres",
|
||
"colCost": "Cost",
|
||
"colPerLiter": "Per litre",
|
||
"colDistance": "Distance",
|
||
"colConsumption": "Consumption",
|
||
"colStation": "Station",
|
||
"colFile": "File",
|
||
"partial": "partial",
|
||
"gap": "gap",
|
||
"confirmDelete": "Delete this refill?",
|
||
"fullTank": "Full tank",
|
||
"partialFill": "Partial fill",
|
||
"missedBefore": "Missed fill before",
|
||
"overDistance": "{consumption} · {rate} over {distance}"
|
||
},
|
||
"charging": {
|
||
"title": "Charging cost",
|
||
"subtitle": "Consumption is measured between full charges.",
|
||
"add": "Log charge",
|
||
"empty": "No charges logged yet.",
|
||
"average": "Average",
|
||
"best": "Best",
|
||
"worst": "Worst",
|
||
"costPerKm": "Cost per km",
|
||
"sessions": "Charges",
|
||
"totalKwh": "Total energy",
|
||
"totalSpent": "Total spent",
|
||
"trackedDistance": "Tracked distance",
|
||
"avgPrice": "Avg. price {price}/kWh",
|
||
"needTwoCharges": "Log at least two full charges to see consumption figures.",
|
||
"colDate": "Date",
|
||
"colKm": "Km",
|
||
"colKwh": "kWh",
|
||
"colCost": "Cost",
|
||
"colPerKwh": "Per kWh",
|
||
"colDistance": "Distance",
|
||
"colConsumption": "Consumption",
|
||
"colLocation": "Charge point",
|
||
"colFile": "File",
|
||
"partial": "partial",
|
||
"gap": "gap",
|
||
"confirmDelete": "Delete this charge?",
|
||
"fullCharge": "Full charge",
|
||
"partialCharge": "Partial charge",
|
||
"missedBefore": "Missed charge before",
|
||
"overDistance": "{consumption} · {rate} over {distance}"
|
||
},
|
||
"documents": {
|
||
"title": "Documents",
|
||
"subtitle": "Insurance, pollution certificates and other paperwork with renewal dates.",
|
||
"add": "Add document",
|
||
"empty": "No documents yet.",
|
||
"colType": "Type",
|
||
"colTitle": "Title",
|
||
"colProvider": "Provider",
|
||
"colIssued": "Issued",
|
||
"colRenewal": "Renewal",
|
||
"colStatus": "Status",
|
||
"colFile": "File",
|
||
"confirmDelete": "Delete this document?",
|
||
"issuedRenews": "Issued {issued} · Renews {renews}"
|
||
},
|
||
"reminders": {
|
||
"title": "Reminders",
|
||
"subtitle": "Renewal and service reminders are added automatically from your documents and service history.",
|
||
"add": "Add reminder",
|
||
"empty": "Nothing to be reminded about yet.",
|
||
"automatic": "Automatic",
|
||
"repeats": "Repeats",
|
||
"at": "at {km}",
|
||
"doneRollForward": "Done · roll forward",
|
||
"markDone": "Mark done",
|
||
"reopen": "Reopen",
|
||
"confirmDelete": "Delete this reminder?",
|
||
"on": "on {date}",
|
||
"repeatsEvery": "Repeats every {every}",
|
||
"autoHint": "Added automatically — edit the record it came from to change it."
|
||
},
|
||
"parts": {
|
||
"title": "Parts catalog",
|
||
"add": "Add part",
|
||
"empty": "No parts yet.",
|
||
"colPart": "Part",
|
||
"colPartNumber": "Part number",
|
||
"colNotes": "Notes",
|
||
"colFile": "File",
|
||
"confirmDelete": "Delete this part?"
|
||
},
|
||
"delete": {
|
||
"title": "Delete this car?",
|
||
"body": "This permanently deletes {name} and everything logged against it — {services}, {maintenance}, {fuel}, {charging}, {documents} and {parts}. This cannot be undone.",
|
||
"services": {
|
||
"one": "{n} service record",
|
||
"other": "{n} service records"
|
||
},
|
||
"maintenance": {
|
||
"one": "{n} workshop visit",
|
||
"other": "{n} workshop visits"
|
||
},
|
||
"fuel": {
|
||
"one": "{n} refill",
|
||
"other": "{n} refills"
|
||
},
|
||
"charging": {
|
||
"one": "{n} charge",
|
||
"other": "{n} charges"
|
||
},
|
||
"documents": {
|
||
"one": "{n} document",
|
||
"other": "{n} documents"
|
||
},
|
||
"parts": {
|
||
"one": "{n} part",
|
||
"other": "{n} parts"
|
||
},
|
||
"typeToConfirm": "Type {name} to confirm",
|
||
"deleting": "Deleting…",
|
||
"confirm": "Delete permanently"
|
||
},
|
||
"actions": {
|
||
"share": "Share car",
|
||
"edit": "Edit car",
|
||
"odometer": "Update odometer",
|
||
"delete": "Delete car"
|
||
},
|
||
"readOnlyNotice": "Shared with you (read-only). You can't make changes."
|
||
},
|
||
"forms": {
|
||
"charging": {
|
||
"addTitle": "Log charge",
|
||
"editTitle": "Edit charge",
|
||
"date": "Date",
|
||
"odometer": "Odometer (km)",
|
||
"kwh": "Energy (kWh)",
|
||
"cost": "Cost",
|
||
"pricePerKwh": "That is {price} per kWh.",
|
||
"battery": "Battery",
|
||
"fullCharge": "Charged to full",
|
||
"missedSession": "A charge before this one was not logged",
|
||
"batteryHint": "Consumption is measured between full charges. Partial charges still count towards the cost, and roll into the next full one.",
|
||
"location": "Charge point",
|
||
"locationPlaceholder": "Home",
|
||
"notes": "Notes",
|
||
"attachmentLegend": "Receipt",
|
||
"submit": "Save charge"
|
||
},
|
||
"import": {
|
||
"title": "Import a car",
|
||
"subtitle": "Create a car from a vehicle on your manufacturer account. Everything it can read is filled in for you.",
|
||
"service": "Service",
|
||
"loadingVehicles": "Loading your vehicles…",
|
||
"noVehicles": "No vehicles on this account.",
|
||
"notConnected": "Not connected",
|
||
"noProviders": "No manufacturer account is connected. Add one in Settings › Integrations.",
|
||
"alreadyInGarage": "Already in your garage",
|
||
"selectVehicle": "Vehicle",
|
||
"dataTitle": "What to import",
|
||
"dataHint": "Uncheck anything you would rather fill in yourself.",
|
||
"includeIdentity": "Make, model, year, registration and VIN",
|
||
"includeFuelType": "Fuel type",
|
||
"includeDates": "Build and first-registration dates",
|
||
"includeOdometer": "Current odometer",
|
||
"name": "Car name",
|
||
"submit": "Import car",
|
||
"importing": "Importing…",
|
||
"warningOdometer": "The service did not report an odometer reading — enter it yourself on the car.",
|
||
"moreData": "The rest of what this service reports stays available on the car's {label} tab."
|
||
},
|
||
"car": {
|
||
"addTitle": "Add a car",
|
||
"editTitle": "Edit car",
|
||
"name": "Name *",
|
||
"make": "Make",
|
||
"model": "Model",
|
||
"year": "Year",
|
||
"registration": "Registration",
|
||
"registrationCountry": "Registration country",
|
||
"registrationCountryPlaceholder": "Poland",
|
||
"vin": "VIN",
|
||
"vinPlaceholder": "Vehicle Identification Number",
|
||
"fuelType": "Fuel type",
|
||
"buildDate": "Build date",
|
||
"firstRegistration": "First registration",
|
||
"oilSpec": "Engine oil spec",
|
||
"currentKm": "Current odometer (km)",
|
||
"transmissionOilSpec": "Transmission oil spec",
|
||
"differentialOilSpec": "Differential oil spec",
|
||
"brakeFluidSpec": "Brake fluid spec",
|
||
"coolantSpec": "Coolant spec",
|
||
"serviceIntervalDays": "Service interval (days)",
|
||
"serviceIntervalKm": "Service interval (km)",
|
||
"technicalCheckIntervalDays": "Technical check interval (days)",
|
||
"technicalCheckHint": "Prefills each check's next-due date. Any check can override it with the date printed on its certificate.",
|
||
"submit": "Add car"
|
||
},
|
||
"service": {
|
||
"addTitle": "Add service record",
|
||
"editTitle": "Edit service record",
|
||
"date": "Date *",
|
||
"odometer": "Odometer (km)",
|
||
"changedParts": "Changed parts",
|
||
"oil": "Oil & Oil filter",
|
||
"engineFilter": "Engine air filter",
|
||
"cabinFilter": "Cabin air filter",
|
||
"attachmentLegend": "Receipt or service-book page",
|
||
"notes": "Notes",
|
||
"autoHint": "Next service date (+{days}d) and km (+{km}) are computed automatically.",
|
||
"submit": "Add service"
|
||
},
|
||
"technical": {
|
||
"addTitle": "Add technical check",
|
||
"editTitle": "Edit technical check",
|
||
"date": "Check date *",
|
||
"result": "Result *",
|
||
"passed": "Passed",
|
||
"failed": "Failed",
|
||
"validUntil": "Valid until",
|
||
"failedHint": "A failed check certifies nothing, so no next date is derived from it.",
|
||
"derivedHint": "Leave blank to use the car's interval (+{days}d → {date}). Enter the date on the certificate when it differs.",
|
||
"cost": "Cost",
|
||
"station": "Station",
|
||
"stationPlaceholder": "Stacja Kontroli Pojazdów",
|
||
"attachmentLegend": "Inspection certificate",
|
||
"notes": "Notes",
|
||
"submit": "Add check"
|
||
},
|
||
"part": {
|
||
"addTitle": "Add part",
|
||
"editTitle": "Edit part",
|
||
"name": "Part name *",
|
||
"namePlaceholder": "Oil Filter",
|
||
"partNumber": "Part number",
|
||
"notes": "Notes",
|
||
"notesPlaceholder": "Fits 2015–2020 · buy in pairs",
|
||
"attachmentLegend": "Photo or spec sheet",
|
||
"submit": "Add part"
|
||
},
|
||
"fuel": {
|
||
"addTitle": "Log refill",
|
||
"editTitle": "Edit refill",
|
||
"date": "Date *",
|
||
"odometer": "Odometer (km) *",
|
||
"liters": "Litres *",
|
||
"cost": "Total cost",
|
||
"pricePerLiter": "Price per litre: {price}",
|
||
"tank": "Tank",
|
||
"fullTank": "Filled to full",
|
||
"missedFill": "I missed logging a refill before this one",
|
||
"tankHint": "Consumption is measured between full tanks, so partial fills count towards the next full one. Flagging a missed refill leaves that stretch out of the figures instead of reporting it as unrealistically economical.",
|
||
"station": "Station",
|
||
"notes": "Notes",
|
||
"attachmentLegend": "Receipt",
|
||
"submit": "Log refill",
|
||
"stationPlaceholder": "Orlen"
|
||
},
|
||
"maintenance": {
|
||
"addTitle": "Log workshop visit",
|
||
"editTitle": "Edit workshop visit",
|
||
"date": "Date *",
|
||
"odometer": "Odometer (km)",
|
||
"type": "Type",
|
||
"status": "Status",
|
||
"description": "What was done *",
|
||
"descriptionPlaceholder": "Replaced alternator and drive belt",
|
||
"workshop": "Workshop",
|
||
"location": "Location",
|
||
"partsUsed": "Parts replaced",
|
||
"partsUsedPlaceholder": "Alternator 27060-0T010, belt 90916-02660",
|
||
"laborCost": "Labour cost",
|
||
"partsCost": "Parts cost",
|
||
"total": "Total: {total}",
|
||
"invoiceNumber": "Invoice number",
|
||
"warrantyUntil": "Warranty until",
|
||
"attachmentLegend": "Invoice",
|
||
"notes": "Notes",
|
||
"submit": "Log visit",
|
||
"workshopPlaceholder": "Kowalski Auto Service",
|
||
"locationPlaceholder": "Kraków"
|
||
},
|
||
"document": {
|
||
"addTitle": "Add document",
|
||
"editTitle": "Edit document",
|
||
"type": "Type",
|
||
"title": "Title *",
|
||
"titlePlaceholder": "Third-party liability 2026",
|
||
"provider": "Provider",
|
||
"reference": "Policy / certificate no.",
|
||
"issued": "Issued",
|
||
"renewalDate": "Renewal date",
|
||
"renewalHint": "Leave the renewal date blank for a document that never expires. Setting it adds a reminder automatically.",
|
||
"cost": "Cost",
|
||
"attachmentLegend": "Scan or photo",
|
||
"notes": "Notes",
|
||
"submit": "Add document",
|
||
"providerPlaceholder": "PZU"
|
||
},
|
||
"reminder": {
|
||
"addTitle": "Add reminder",
|
||
"editTitle": "Edit reminder",
|
||
"title": "Title *",
|
||
"titlePlaceholder": "Swap to winter tyres",
|
||
"type": "Type",
|
||
"remindMe": "Remind me",
|
||
"onDate": "On date",
|
||
"atOdometer": "At odometer (km)",
|
||
"triggerHint": "Set either or both — with both, whichever comes first wins.",
|
||
"currentKm": "The car is at {km} now.",
|
||
"repeat": "Repeat (optional)",
|
||
"everyDays": "Every … days",
|
||
"everyKm": "Every … km",
|
||
"recurringHint": "Marking this done will roll it forward instead of closing it.",
|
||
"oneOffHint": "Leave blank for a one-off reminder that closes when you mark it done.",
|
||
"notes": "Notes",
|
||
"noTrigger": "Set a due date, a due odometer reading, or both.",
|
||
"submit": "Add reminder"
|
||
},
|
||
"share": {
|
||
"title": "Share {name}",
|
||
"body": "Give another user access to this car. Read-only lets them view; read & write also lets them edit the car and its service records and parts.",
|
||
"userEmail": "User email",
|
||
"read": "Read-only",
|
||
"write": "Read & write",
|
||
"submit": "Share",
|
||
"peopleWithAccess": "People with access",
|
||
"notShared": "Not shared with anyone yet.",
|
||
"submitting": "Sharing…"
|
||
},
|
||
"validation": {
|
||
"odometer": "Odometer is required.",
|
||
"liters": "Litres are required.",
|
||
"kwh": "Energy (kWh) is required.",
|
||
"name": "Name is required.",
|
||
"partName": "Part name is required.",
|
||
"description": "Describe what was done.",
|
||
"title": "Title is required."
|
||
}
|
||
},
|
||
"enums": {
|
||
"fuelType": {
|
||
"petrol": "Petrol (gasoline)",
|
||
"petrol_lpg": "Petrol (gasoline) + LPG",
|
||
"diesel": "Diesel",
|
||
"diesel_lpg": "Diesel + LPG",
|
||
"hybrid": "Hybrid",
|
||
"electric": "Electric",
|
||
"hydrogen": "Hydrogen"
|
||
},
|
||
"maintenanceType": {
|
||
"repair": "Repair",
|
||
"inspection": "Inspection",
|
||
"bodywork": "Bodywork",
|
||
"tyres": "Tyres",
|
||
"diagnostics": "Diagnostics",
|
||
"recall": "Recall",
|
||
"warranty": "Warranty work",
|
||
"other": "Other"
|
||
},
|
||
"maintenanceStatus": {
|
||
"scheduled": "Scheduled",
|
||
"in_progress": "In progress",
|
||
"completed": "Completed"
|
||
},
|
||
"documentType": {
|
||
"insurance": "Insurance",
|
||
"pollution": "Pollution certificate",
|
||
"registration": "Registration",
|
||
"inspection": "Inspection",
|
||
"roadTax": "Road tax",
|
||
"warranty": "Warranty",
|
||
"other": "Other"
|
||
},
|
||
"reminderTypeShort": {
|
||
"maintenance": "Maintenance",
|
||
"document": "Document",
|
||
"service": "Service",
|
||
"inspection": "Inspection",
|
||
"other": "Other"
|
||
},
|
||
"reminderType": {
|
||
"maintenance": "Maintenance",
|
||
"document": "Document renewal",
|
||
"service": "Service",
|
||
"inspection": "Inspection",
|
||
"other": "Other"
|
||
}
|
||
},
|
||
"attachment": {
|
||
"legend": "Attachment",
|
||
"hint": "PDF or image, up to 10MB.",
|
||
"attached": "Attached: {name}",
|
||
"willBeRemoved": "Attachment will be removed on save.",
|
||
"choose": "Choose file",
|
||
"replace": "Replace",
|
||
"view": "View",
|
||
"clear": "Clear"
|
||
},
|
||
"errors": {
|
||
"sessionExpired": "Session expired — please log in again.",
|
||
"deleteFailed": "Delete failed: {error}",
|
||
"completeFailed": "Could not complete: {error}",
|
||
"attachmentFailed": "Saved, but the file did not upload: {error}",
|
||
"openFailed": "Could not open the file: {error}",
|
||
"noFile": "No file attached."
|
||
},
|
||
"admin": {
|
||
"title": "Users",
|
||
"subtitleAll": "Accounts across every organization.",
|
||
"subtitleOrg": "Accounts in your organization.",
|
||
"addUser": "Add user",
|
||
"colEmail": "Email",
|
||
"colName": "Name",
|
||
"colOrganization": "Organization",
|
||
"noOrganization": "— No organization —",
|
||
"organizationHint": "Leave unset to create an account that belongs to no organization.",
|
||
"colRole": "Role",
|
||
"colCreated": "Created",
|
||
"you": "(you)",
|
||
"resetPassword": "Reset password",
|
||
"confirmDelete": "Delete {name}? This cannot be undone.",
|
||
"cantDeleteSelf": "You can't delete your own account.",
|
||
"onlySuperadminDeletes": "Only a superadmin can delete a superadmin.",
|
||
"cantChangeOwnRole": "You can't change your own role.",
|
||
"onlySuperadminEdits": "Only a superadmin can edit a superadmin.",
|
||
"createTitle": "Add a user",
|
||
"emailRequired": "Email *",
|
||
"passwordRequired": "Password *",
|
||
"minChars": "(min 8)",
|
||
"creating": "Creating…",
|
||
"createUser": "Create user",
|
||
"resetTitle": "Reset password — {email}",
|
||
"newPassword": "New password",
|
||
"setPassword": "Set password",
|
||
"roles": {
|
||
"user": "user",
|
||
"admin": "admin",
|
||
"superadmin": "superadmin"
|
||
},
|
||
"deleteTitle": "Delete user?",
|
||
"passwordUpdated": "Password updated."
|
||
}
|
||
}
|