diff --git a/BACKLOG.md b/BACKLOG.md index 0af27ba..8ce01d2 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -33,6 +33,7 @@ New suggestion? → [Open an issue](https://github.com/ulsklyc/oikos/issues/new? | - | Calendar: Fix all-day RFC 5545 DTEND, DURATION support, birthday sync | v0.5.6 | | - | Calendar: RRULE expansion fix (strip RRULE: prefix), YEARLY support | v0.5.7 | | - | Italian (it) localization (497 keys) | v0.5.8 | +| - | Swedish (sv) localization (548 keys) - contributed by @olsson82 | v0.11.3 | | - | Security hardening: XSS, rate limiter bypass, OAuth CSRF, CSV injection, session invalidation | v0.5.9 | | - | Budget: Fix update failing when category changes | v0.6.0 | | - | Upgrade bcrypt 5 → 6, ESM migration, structured logger, remove SESSION_SECRET fallback | v0.7.0 | diff --git a/README.md b/README.md index 8f4780a..9285c7b 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ **PWA Native Feel:** Installable on any device, works offline, dark mode, responsive from phone to desktop -**Multilingual:** German and English UI with automatic locale detection +**Multilingual:** German, English, Italian, and Swedish UI with automatic locale detection ## Quick Start diff --git a/docs/SPEC.md b/docs/SPEC.md index 0699ac9..536ccff 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -234,7 +234,7 @@ User management and app configuration. Logged-in users only. - **User management (admin):** create new users, edit/delete existing users, assign roles (admin/member) - **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval - **Weather:** configure OpenWeatherMap location -- **Language:** System (follows `navigator.language`), German, English - via `oikos-locale-picker` web component; switch without page reload +- **Language:** System (follows `navigator.language`), German, English, Italian, Swedish - via `oikos-locale-picker` web component; switch without page reload - **App info:** version, license ### Budget (`/budget`) @@ -327,7 +327,7 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o ### Architecture - **Module:** `public/i18n.js` - exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)` -- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json` - structure: `{ "module.camelCaseKey": "Value" }` +- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json`, `public/locales/it.json`, `public/locales/sv.json` - structure: `{ "module.camelCaseKey": "Value" }` - **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })` - **Fallback chain:** active locale → German (`de`) → key itself - **Date format:** `Intl.DateTimeFormat` with current locale - use `formatDate()` and `formatTime()` from `i18n.js` @@ -345,6 +345,7 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o | `de` | German | Reference locale (all keys defined here) | | `en` | English | Full translation | | `it` | Italian | Full translation (added v0.5.8) | +| `sv` | Swedish | Full translation (added v0.11.3) | ### Adding a New Language