Files
DriverVault/README.md
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

99 lines
4.5 KiB
Markdown

# Car Control Project
A car control & service tracking system. Built incrementally — starting with a
**car maintenance tracker** (modeled on `Car Service.xlsx`) and growing toward
live integration with the car via an ESP32 device.
## Architecture
All clients communicate with the database **only through the API Server**
nothing talks to PocketBase directly.
```
┌──────────────────┐
Web App (Vue) ─────▶│ │
Phone App (Flutter)▶│ API Server │────▶ PocketBase
Home Assistant ────▶│ (Go, stdlib) │ (10.2.1.10:8027)
ESP32 device ──────▶│ │
└──────────────────┘
```
| Component | Stack | Status | Docs |
|---|---|---|---|
| **API Server** | Go (stdlib) | ✅ built, running, verified | [API Server/README.md](API%20Server/README.md) |
| **Database** | PocketBase | ✅ running, schema + seed done | — |
| **Web App** | Vue 3 + Vite + Tailwind v4 | ✅ full feature set (below) | [Web App/README.md](Web%20App/README.md) |
| **Phone App** | Flutter (Android) | ✅ web parity + biometric login | [Phone App/README.md](Phone%20App/README.md) |
| **Home Assistant Plugin** | — | ⬜ later | — |
| **Car Agent Device** | ESP32 | ⬜ later | — |
The Web and Phone apps are at feature parity (the phone omits only data
export/import).
## Features
- **Maintenance tracking** — cars, service history (date/odometer + which parts
were changed), and a per-car parts catalog, with next-due date/km status.
- **Accounts & sessions** — JWT login, per-device active sessions with remote
logout, profile + appearance preferences (theme/locale/date/font), email
verification, and account deletion.
- **Translated UI** — the interface reads its text from per-language files
(English, Polish, Danish today), driven by the language half of the user's
locale, with English as the fallback for any untranslated string. See
[TRANSLATIONS.md](TRANSLATIONS.md) for the format and how to add a language.
- **Per-user ownership & sharing** — each car has an owner and can be shared with
other users as read or write; the UI mirrors the server's access checks.
- **Admin** — role-gated user management (create / role / reset password / delete).
- **Phone biometric login & app lock** — fingerprint / face sign-in with an
app-lock that requires an unlock on relaunch (with a short grace period for
quick app-switches). See the Phone App README.
## Auth model
All three apps share one auth model: login via `POST /api/auth/login` returns a
JWT issued by the API Server (after verifying against PocketBase `users`), and
every other endpoint requires `Authorization: Bearer <token>`. Each login also
creates a server-side session whose id is embedded in the token, so sessions can
be listed and revoked. Access to cars/records/parts is gated by per-user
ownership and shares; admin endpoints require the admin role.
## Domain (from `Car Service.xlsx`)
- **Cars** — one per vehicle (was: one spreadsheet sheet), with spec fields
(engine / transmission / differential oil, brake fluid, coolant, VIN, …) and
configurable service intervals.
- **Service records** — date + odometer per service, plus which parts were
changed (oil & oil filter, engine air filter, cabin air filter).
- **Parts** — per-car catalog of part numbers.
Key spreadsheet formulas, reproduced by the API Server on read:
```
Next Service Date = service date + serviceIntervalDays (default 365; Excel: =A+365)
Next Service Km = service km + serviceIntervalKm (default 15 000; Excel: =B+15000)
```
Intervals are configurable per car.
## Getting started
Bring up the stack in this order — each app's README has the details:
1. **[API Server](API%20Server/README.md)** — configure `.env`, run
`setup-pocketbase.mjs`, start the server. This must be running for either app.
2. **[Web App](Web%20App/README.md)** — `npm install && npm run dev`
(proxies `/api` to the server).
3. **[Phone App](Phone%20App/README.md)** — `flutter build apk` /
`flutter run` with `--dart-define=API_BASE=http://<server-ip>:8080/api`.
## Layout
```
Car Control Project/
├── API Server/ # Go gateway to PocketBase (the only DB client)
├── Web App/ # Vue 3 + Vite + Tailwind v4
├── Phone App/ # Flutter (Android)
├── Home Assistant Plugin/ # later phase
└── Car Agent Device/ # ESP32, later phase
```