Files
DriverVault/Phone App/assets/i18n/da.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

205 lines
7.2 KiB
JSON

{
"common": {
"save": "Gem",
"saving": "Gemmer…",
"saved": "Gemt ✓",
"cancel": "Annuller",
"remove": "Fjern",
"retry": "Prøv igen",
"required": "Påkrævet",
"confirm": "Bekræft",
"empty": "—"
},
"nav": {
"garage": "Garage",
"settings": "Indstillinger",
"users": "Brugere"
},
"login": {
"tagline": "Styr på din bil.",
"email": "E-mail",
"password": "Adgangskode",
"showPassword": "Vis adgangskode",
"hidePassword": "Skjul adgangskode",
"submit": "Log ind",
"submitting": "Logger ind…",
"or": "eller",
"signInWithFace": "Log ind med ansigtsgenkendelse",
"signInWithFingerprint": "Log ind med fingeraftryk",
"signInWithBiometrics": "Log ind med biometri",
"enrollTitle": "Aktivér biometrisk login?",
"enrollBody": "Næste gang kan du logge ind med {method} i stedet for at skrive din adgangskode.",
"enrollNotNow": "Ikke nu",
"enrollEnable": "Aktivér",
"methodFace": "ansigtsgenkendelse",
"methodFingerprint": "dit fingeraftryk",
"methodBiometrics": "biometri",
"bioReasonSignInAs": "Log ind som {email}",
"bioReasonSignIn": "Log ind på DriverVault",
"savedInvalid": "Det gemte login er ikke længere gyldigt. Log ind med din adgangskode.",
"serverSettings": "Serverindstillinger",
"apiServerUrl": "API-serverens adresse",
"leaveBlank": "Lad feltet stå tomt for at bruge standarden.",
"reset": "Nulstil",
"savedNote": "Gemt ✓",
"resetNote": "Nulstillet ✓"
},
"lock": {
"title": "DriverVault er låst",
"reason": "Lås DriverVault op",
"unlock": "Lås op",
"unlocking": "Låser op…",
"usePassword": "Brug adgangskode i stedet"
},
"dashboard": {
"eyebrow": "DINE BILER",
"title": "Garage",
"addCar": "Tilføj bil",
"lightMode": "Lys tilstand",
"darkMode": "Mørk tilstand",
"logOut": "Log ud",
"empty": "Ingen biler endnu.",
"shared": "Delt",
"sharedReadOnly": "Delt · skrivebeskyttet",
"serviceLife": "SERVICEINTERVAL BRUGT",
"lastService": "Seneste service",
"currentOdometer": "Nuværende kilometerstand",
"nextDue": "Næste service",
"nextDueKm": "Næste service (km)",
"serviceRecords": {
"one": "{n} servicepost",
"other": "{n} serviceposter"
}
},
"settings": {
"title": "Indstillinger",
"account": {
"title": "Konto",
"name": "Navn",
"nameSaved": "Navn gemt.",
"email": "E-mail",
"verified": "Bekræftet",
"notVerified": "Ikke bekræftet",
"sending": "Sender…",
"resendVerification": "Send bekræftelsesmail igen",
"verificationRequested": "Bekræftelsesmail anmodet.",
"changePassword": "Skift adgangskode",
"currentPassword": "Nuværende adgangskode",
"newPassword": "Ny adgangskode (mindst 8)",
"confirmNewPassword": "Bekræft ny adgangskode",
"tooShort": "Den nye adgangskode skal være på mindst 8 tegn.",
"mismatch": "Den nye adgangskode og bekræftelsen stemmer ikke overens.",
"passwordUpdated": "Adgangskode opdateret.",
"updating": "Opdaterer…",
"updatePassword": "Opdater adgangskode"
},
"appearance": {
"title": "Udseende",
"theme": "Tema",
"themeLight": "Lyst",
"themeDark": "Mørkt",
"themeSystem": "System",
"language": "Sprog",
"languageHint": "Appens tekst samt navne på måneder og dage.",
"languageFallbackHint": "Dette sprog er endnu ikke oversat — appens tekst forbliver på engelsk.",
"region": "Region",
"regionHint": "Tal- og valutaformat.",
"currency": "Valuta",
"currencyHint": "Eksempel: {example}. Beløb er kun til visning — intet omregnes.",
"dateFormat": "Datoformat",
"dateHint": "Eksempel: {example}",
"fontSize": "Skriftstørrelse",
"fontSmall": "Lille",
"fontMedium": "Mellem",
"fontLarge": "Stor"
},
"profile": {
"title": "Profil",
"working": "Arbejder…",
"uploadPhoto": "Upload billede",
"remove": "Fjern",
"bio": "Om mig",
"bioHint": "En kort note, som andre i din husstand kan se.",
"bioSaved": "Beskrivelse gemt.",
"saveBio": "Gem beskrivelse"
},
"security": {
"title": "Sikkerhed",
"checkingDevice": "Tjekker enhed…",
"biometricSignIn": "Biometrisk login",
"biometricAvailable": "Log ind med {method} i stedet for din adgangskode.",
"biometricUnavailable": "Der er ikke registreret biometri på denne enhed.",
"methodFaceOrFingerprint": "ansigt eller fingeraftryk",
"methodFace": "ansigtsgenkendelse",
"methodFingerprint": "fingeraftryk",
"methodBiometrics": "biometri",
"turnedOff": "Biometrisk login slået fra",
"enabled": "Biometrisk login aktiveret",
"couldNotEnable": "Kunne ikke aktivere: {error}",
"confirmPassword": "Bekræft din adgangskode",
"password": "Adgangskode"
},
"privacy": {
"title": "Privatliv og sikkerhed",
"body": "Tofaktorgodkendelse er ikke tilgængelig endnu. Sessioner bygger på tokens udstedt af serveren, som udløber af sig selv, så at logge ud afslutter kun sessionen på denne enhed. For at logge alle enheder ud skal du skifte din adgangskode ovenfor.",
"signOut": "Log ud"
},
"danger": {
"title": "Farezone",
"body": "Sletning af din konto fjerner dit login og din profil. Det sletter ikke husstandens delte biler eller servicehistorik. Der er 3 dages betænkningstid, før sletningen er endelig, og du kan annullere når som helst inden da.",
"deleteAccount": "Slet min konto",
"typeToConfirm": "Skriv {email} for at bekræfte",
"typeEmailPrompt": "Skriv din e-mail for at bekræfte.",
"requesting": "Anmoder…",
"requestDeletion": "Anmod om sletning",
"requestedOn": "Sletning af konto anmodet den {date}. {tail}",
"cooldownPassed": "Betænkningstiden er udløbet. Du kan nu gennemføre sletningen.",
"canStillCancel": "Du kan stadig annullere — det bliver permanent efter 3 dages betænkningstid.",
"cancelRequest": "Annuller anmodning om sletning",
"permanentlyDelete": "Slet permanent",
"finalizeTitle": "Slet konto?",
"finalizeBody": "Dette sletter din konto permanent. Det kan ikke fortrydes.",
"delete": "Slet"
}
},
"status": {
"noData": "Ingen data",
"serviceOverdueDays": "Service overskredet med {days} d",
"dueInDays": "Forfalder om {days} d",
"okDays": "OK · {days} d",
"noKm": "Ingen km",
"serviceOverdueKm": "Service overskredet med {km} km",
"inKm": "Om {km} km",
"kmLeft": "{km} km tilbage",
"expiredAgo": "Udløb for {days} d siden",
"expiresToday": "Udløber i dag",
"renewInDays": "Forny om {days} d",
"validDays": "Gyldig · {days} d",
"noExpiry": "Udløber ikke",
"done": "Færdig",
"noTrigger": "Ingen udløser",
"overdue": "Overskredet",
"overdueBy": "Overskredet {parts}",
"dueIn": "Forfalder om {parts}",
"upcoming": "Kommende",
"today": "i dag",
"days": "{days} d",
"km": "{km} km",
"warrantyExpiredAgo": "Garanti udløb for {days} d siden",
"warrantyEndsIn": "Garanti slutter om {days} d",
"underWarranty": "Under garanti · {days} d"
}
}