Brings the Flutter app to parity with the recent Web App changes, which touched features the Phone App did not yet have — so this builds the Charging and Integrations subsystems, then applies the tab/fold structure. Charging (new nav destination): split into "Public chargers" (stylized discovery map + demo session + nearby public stations) and "Home chargers" (the real Anker Solix OCPP control card — serial refresh, connector/energy tiles, start/stop, current limit, password step-up on reset — plus the user's home charger list). Gated by the per-user control mode, degrading to a Settings hint when off. Settings: split into "Personal settings" (the existing account/appearance/ profile/security/privacy/danger sections) and "Integrations". The latter holds foldable Toyota and Anker Solix cards over the superadmin -> org -> user cascade: locked fields with "inherited from" notes, org-admin scope switch, enable toggle, save/test with health result, and Anker OCPP token provisioning. Both tabs stay mounted (IndexedStack) so in-flight edits survive a switch. Adds the integration + OCPP control endpoints to api.dart, the resolved IntegrationView/Scope/Field, IntegrationHealth and AnkerControl models, and charging.*/settings.tabs.*/nav.charging strings (en/pl/da) plus settings.integrations.* (en) — mirroring the Web App's own pl/da coverage, which leaves integrations and charger control untranslated as an English fallback. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
320 lines
12 KiB
JSON
320 lines
12 KiB
JSON
{
|
|
"common": {
|
|
"save": "Save",
|
|
"saving": "Saving…",
|
|
"saved": "Saved ✓",
|
|
"cancel": "Cancel",
|
|
"remove": "Remove",
|
|
"retry": "Retry",
|
|
"required": "Required",
|
|
"confirm": "Confirm",
|
|
"empty": "—"
|
|
},
|
|
|
|
"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 ✓"
|
|
},
|
|
|
|
"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"
|
|
}
|
|
},
|
|
|
|
"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"
|
|
},
|
|
|
|
"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"
|
|
}
|
|
},
|
|
|
|
"status": {
|
|
"noData": "No data",
|
|
"serviceOverdueDays": "Service Overdue {days}d",
|
|
"dueInDays": "Due in {days}d",
|
|
"okDays": "OK · {days}d",
|
|
"noKm": "No km",
|
|
"serviceOverdueKm": "Service Overdue {km} km",
|
|
"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"
|
|
}
|
|
}
|