feat: add Polish (pl) locale
Full Polish translation covering all UI modules — tasks, calendar, shopping, meals, budget, notes, contacts, birthdays, recipes, documents, housekeeping, and settings. Polish is now selectable in Settings → Language. Bumps to v0.50.0. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.50.0] - 2026-05-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- **Polish locale**: full Polish (`pl`) translation added, covering all UI strings across all modules (tasks, calendar, shopping, meals, budget, notes, contacts, birthdays, recipes, documents, housekeeping, settings, and more). Polish is now selectable in Settings → Language.
|
||||||
|
|
||||||
## [0.49.0] - 2026-05-08
|
## [0.49.0] - 2026-05-08
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ The goal is a single, private place for everything that keeps a household runnin
|
|||||||
- **PWA** — installable on any device, works offline, dark mode, responsive from phone to desktop
|
- **PWA** — installable on any device, works offline, dark mode, responsive from phone to desktop
|
||||||
- **Privacy First** — SQLCipher AES-256 encrypted database, fully self-hosted, zero telemetry
|
- **Privacy First** — SQLCipher AES-256 encrypted database, fully self-hosted, zero telemetry
|
||||||
- **Zero Build Step** — pure ES modules, no bundler, no transpiler, no framework
|
- **Zero Build Step** — pure ES modules, no bundler, no transpiler, no framework
|
||||||
- **Multilingual** — 15 languages with automatic locale detection (de, en, es, fr, it, sv, el, ru, tr, zh, ja, ar, hi, pt, uk)
|
- **Multilingual** — 16 languages with automatic locale detection (de, en, es, fr, it, sv, el, ru, tr, zh, ja, ar, hi, pt, uk, pl)
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -572,7 +572,7 @@ User management and app configuration. Logged-in users only.
|
|||||||
- **Calendar Sync:** connect/disconnect Google Calendar (OAuth 2.0); manage multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal) with per-account calendar selection via checkboxes, two-way sync, and optional outbound event target; manage ICS URL subscriptions (add, delete, sync now, set color and visibility); configure sync interval
|
- **Calendar Sync:** connect/disconnect Google Calendar (OAuth 2.0); manage multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal) with per-account calendar selection via checkboxes, two-way sync, and optional outbound event target; manage ICS URL subscriptions (add, delete, sync now, set color and visibility); configure sync interval
|
||||||
- **Contact Sync:** manage multiple CardDAV accounts (iCloud, Nextcloud, Radicale, Baikal); per-addressbook enable/disable; manual sync trigger; real-time status badges (success, error, syncing with animated spinner)
|
- **Contact Sync:** manage multiple CardDAV accounts (iCloud, Nextcloud, Radicale, Baikal); per-addressbook enable/disable; manual sync trigger; real-time status badges (success, error, syncing with animated spinner)
|
||||||
- **Weather:** configure OpenWeatherMap location
|
- **Weather:** configure OpenWeatherMap location
|
||||||
- **Language:** System (follows `navigator.language`), German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese, Japanese, Arabic, Hindi, Portuguese - via `oikos-locale-picker` web component; switch without page reload
|
- **Language:** System (follows `navigator.language`), German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese, Japanese, Arabic, Hindi, Portuguese, Ukrainian, Polish - via `oikos-locale-picker` web component; switch without page reload
|
||||||
- **API Tokens (admin):** create named Bearer / X-API-Key tokens for external integrations; the full token value is shown only once immediately after creation; tokens can be revoked at any time; support optional expiry and track last-used timestamp
|
- **API Tokens (admin):** create named Bearer / X-API-Key tokens for external integrations; the full token value is shown only once immediately after creation; tokens can be revoked at any time; support optional expiry and track last-used timestamp
|
||||||
- **Backup Management (admin):** download the current database as a file (`GET /api/v1/backup/database`) or restore from a backup file (`POST /api/v1/backup/restore`, drag-and-drop supported). Validates that the uploaded file is a valid Oikos database. A rollback copy is created automatically before restore. **Automatic scheduled backups:** configurable via `.env` (`BACKUP_ENABLED`, `BACKUP_SCHEDULE`, `BACKUP_DIR`, `BACKUP_KEEP`); default 2 AM daily, keeps last 7 copies; Settings → Backup shows scheduler status, schedule, retention policy, last backup timestamp, and a manual trigger button.
|
- **Backup Management (admin):** download the current database as a file (`GET /api/v1/backup/database`) or restore from a backup file (`POST /api/v1/backup/restore`, drag-and-drop supported). Validates that the uploaded file is a valid Oikos database. A rollback copy is created automatically before restore. **Automatic scheduled backups:** configurable via `.env` (`BACKUP_ENABLED`, `BACKUP_SCHEDULE`, `BACKUP_DIR`, `BACKUP_KEEP`); default 2 AM daily, keeps last 7 copies; Settings → Backup shows scheduler status, schedule, retention policy, last backup timestamp, and a manual trigger button.
|
||||||
- **Tab navigation:** Settings is organized in nine tabs (General, Meals, Budget, Shopping, Synchronization, Family, API Tokens, Backup, Account). Admin-only tabs: Family, API Tokens, Backup. Sticky tab bar, active tab persists in sessionStorage, Synchronization tab auto-activates after OAuth callbacks.
|
- **Tab navigation:** Settings is organized in nine tabs (General, Meals, Budget, Shopping, Synchronization, Family, API Tokens, Backup, Account). Admin-only tabs: Family, API Tokens, Backup. Sticky tab bar, active tab persists in sessionStorage, Synchronization tab auto-activates after OAuth callbacks.
|
||||||
@@ -791,7 +791,7 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
|
|||||||
### Architecture
|
### Architecture
|
||||||
|
|
||||||
- **Module:** `public/i18n.js` - exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)`
|
- **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`, `public/locales/es.json`, `public/locales/fr.json`, `public/locales/it.json`, `public/locales/sv.json`, `public/locales/el.json`, `public/locales/ru.json`, `public/locales/tr.json`, `public/locales/zh.json`, `public/locales/ja.json`, `public/locales/ar.json`, `public/locales/hi.json`, `public/locales/pt.json` - structure: `{ "module.camelCaseKey": "Value" }`
|
- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json`, `public/locales/es.json`, `public/locales/fr.json`, `public/locales/it.json`, `public/locales/sv.json`, `public/locales/el.json`, `public/locales/ru.json`, `public/locales/tr.json`, `public/locales/zh.json`, `public/locales/ja.json`, `public/locales/ar.json`, `public/locales/hi.json`, `public/locales/pt.json`, `public/locales/uk.json`, `public/locales/pl.json` - structure: `{ "module.camelCaseKey": "Value" }`
|
||||||
- **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })`
|
- **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })`
|
||||||
- **Fallback chain:** active locale → German (`de`) → key itself
|
- **Fallback chain:** active locale → German (`de`) → key itself
|
||||||
- **Date format:** `Intl.DateTimeFormat` with current locale - use `formatDate()` and `formatTime()` from `i18n.js`
|
- **Date format:** `Intl.DateTimeFormat` with current locale - use `formatDate()` and `formatTime()` from `i18n.js`
|
||||||
@@ -820,6 +820,8 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
|
|||||||
| `ar` | Arabic | Full translation (added v0.19.0) |
|
| `ar` | Arabic | Full translation (added v0.19.0) |
|
||||||
| `hi` | Hindi | Full translation (added v0.19.0) |
|
| `hi` | Hindi | Full translation (added v0.19.0) |
|
||||||
| `pt` | Portuguese | Full translation (added v0.19.0) |
|
| `pt` | Portuguese | Full translation (added v0.19.0) |
|
||||||
|
| `uk` | Ukrainian | Full translation (added v0.19.0) |
|
||||||
|
| `pl` | Polish | Full translation (added v0.50.0) |
|
||||||
|
|
||||||
### Adding a New Language
|
### Adding a New Language
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "oikos",
|
"name": "oikos",
|
||||||
"version": "0.49.0",
|
"version": "0.50.0",
|
||||||
"description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.",
|
"description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.",
|
||||||
"main": "server/index.js",
|
"main": "server/index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ const LOCALE_LABELS = {
|
|||||||
hi: 'हिन्दी',
|
hi: 'हिन्दी',
|
||||||
pt: 'Português',
|
pt: 'Português',
|
||||||
uk: 'Українська',
|
uk: 'Українська',
|
||||||
|
pl: 'Polski',
|
||||||
};
|
};
|
||||||
|
|
||||||
class OikosLocalePicker extends HTMLElement {
|
class OikosLocalePicker extends HTMLElement {
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
* Dependencies: none (vanilla JS, Fetch API, Intl API)
|
* Dependencies: none (vanilla JS, Fetch API, Intl API)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const SUPPORTED_LOCALES = ['de', 'en', 'es', 'fr', 'it', 'sv', 'el', 'ru', 'tr', 'zh', 'ja', 'ar', 'hi', 'pt', 'uk'];
|
const SUPPORTED_LOCALES = ['de', 'en', 'es', 'fr', 'it', 'sv', 'el', 'ru', 'tr', 'zh', 'ja', 'ar', 'hi', 'pt', 'uk', 'pl'];
|
||||||
const DEFAULT_LOCALE = 'de';
|
const DEFAULT_LOCALE = 'de';
|
||||||
const STORAGE_KEY = 'oikos-locale';
|
const STORAGE_KEY = 'oikos-locale';
|
||||||
const DATE_FORMAT_KEY = 'oikos-date-format';
|
const DATE_FORMAT_KEY = 'oikos-date-format';
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user