Files
DriverVault/Phone App/assets/i18n/en.json
T
tajniak81andClaude Opus 4.8 13f50aa9a4 Phone App: add Charging screen + Settings integration tabs
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>
2026-07-19 22:03:52 +02:00

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"
}
}