diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 0000000..c236988
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,134 @@
+# Housekeeping Design
+
+## Goal
+
+Housekeeping adds a simplified mobile/PWA module for the cleaner workflow in Oikos. It keeps the existing private-network, authenticated-session security model and exposes no public endpoints.
+
+## User Experience
+
+The `/housekeeping` route is a focused module that follows the same toolbar, tab, card, and chip patterns used by the rest of Oikos:
+
+- **Dashboard**: staff-specific check-in/check-out actions, visits this month, last visit, pending/finished chores, pending payments, and a compact monthly payment chart.
+- **Tasks**: suggested chore templates, custom chore creation, urgency-sorted recurring tasks, and one-tap completion.
+- **Reports**: camera upload plus text description for maintenance occurrences.
+- **Staff**: one or more housekeeper people, contact data, profile pictures, daily rates, and payment schedules.
+
+Accessibility constraints:
+
+- Primary actions are at least 44px high.
+- Check-in/out is a compact top-toolbar action, matching the small action pattern used elsewhere in the app.
+- Status is communicated by text and color, not color alone.
+- Inputs and buttons have explicit labels or accessible names.
+- Icons use the locally bundled Lucide runtime; no external CDN is introduced.
+
+## Data Model
+
+### `housekeeping_work_sessions`
+
+Stores point/finance records:
+
+- `id`
+- `worker_id`
+- `check_in`
+- `check_out`
+- `daily_rate`
+- `extras`
+- `calendar_event_id`
+- `created_by`
+- `created_at`
+- `updated_at`
+
+Monthly amount is calculated as `SUM(daily_rate + extras)` for sessions whose `check_in` belongs to the requested month.
+Each check-in creates a linked local calendar event for the selected staff member. Check-out updates that event end time.
+
+### `housekeeping_decay_tasks`
+
+Stores dynamic recurring cleaning tasks:
+
+- `id`
+- `name`
+- `area`
+- `frequency_days`
+- `last_completed`
+- `created_by`
+- `created_at`
+- `updated_at`
+
+Urgency is computed at read time:
+
+```text
+urgency = (now - last_completed) / frequency_days
+```
+
+Status mapping:
+
+- `overdue`: due date is before today.
+- `today`: due date is today.
+- `ok`: due date is in the future.
+
+Rows with no `last_completed` are treated as overdue.
+
+### `housekeeping_supply_requests`
+
+Stores quick supply requests and links each request to an Oikos shopping item:
+
+- `id`
+- `name`
+- `quantity`
+- `shopping_item_id`
+- `created_by`
+- `created_at`
+
+The supply request transaction always appends an item to the main `shopping_items` table. If no shopping list exists, the backend creates a private authenticated list named `Housekeeping`.
+
+### `housekeeping_maintenance_log`
+
+Stores maintenance occurrences:
+
+- `id`
+- `description`
+- `photo_url`
+- `created_by`
+- `created_at`
+- `updated_at`
+
+`photo_url` accepts self-contained `data:image/png|jpeg|webp;base64,...` values only, keeping uploaded camera photos inside the authenticated Oikos database boundary.
+
+### `housekeeping_workers`
+
+Stores housekeeper-specific employment/payment settings while keeping the person unified with Oikos user/contact/birthday data:
+
+- `id`
+- `user_id`
+- `daily_rate`
+- `payment_schedule`
+- `calendar_color`
+- `notes`
+- `created_at`
+- `updated_at`
+
+The linked `users` row is excluded from normal Family Management and Family APIs through the `housekeeping_workers` association, but remains synchronized with contacts and birthdays.
+Multiple housekeepers can be registered; each has its own linked `users` row.
+`calendar_color` controls the default color used for housekeeping visit events. Visit events use the cleaning icon (`sparkles`).
+
+## REST API
+
+All endpoints are mounted under `/api/v1/housekeeping` and inherit the existing `requireAuth` and CSRF middleware.
+
+- `GET /summary?month=YYYY-MM`
+- `GET /dashboard`
+- `GET /task-templates`
+- `GET /worker`
+- `GET /workers`
+- `POST /worker`
+- `GET /work-sessions?month=YYYY-MM`
+- `POST /work-sessions/check-in`
+- `POST /work-sessions/check-out`
+- `GET /decay-tasks`
+- `POST /decay-tasks`
+- `PATCH /decay-tasks/:taskId`
+- `POST /decay-tasks/:taskId/complete`
+- `DELETE /decay-tasks/:taskId`
+- `POST /supply-requests`
+- `GET /maintenance-log`
+- `POST /maintenance-log`
diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md
new file mode 100644
index 0000000..21f87b2
--- /dev/null
+++ b/IMPLEMENTATION.md
@@ -0,0 +1,88 @@
+# Housekeeping Implementation
+
+## Backend
+
+The module is implemented in `server/routes/housekeeping.js` and registered in `server/index.js` under:
+
+```text
+/api/v1/housekeeping
+```
+
+The registration happens after the global authenticated `/api/v1` middleware, so the module follows the existing Oikos security model:
+
+- Session or API-token authentication required.
+- CSRF required for state-changing session requests.
+- API rate limiting inherited from `/api/`.
+- No unauthenticated housekeeping route.
+
+Database schema is migration `33` in `server/db.js`. The migration creates:
+
+- `housekeeping_work_sessions`
+- `housekeeping_decay_tasks`
+- `housekeeping_supply_requests`
+- `housekeeping_maintenance_log`
+
+Migration `34` adds:
+
+- `housekeeping_workers`
+- `housekeeping_work_sessions.paid_at`
+
+Migration `35` adds per-staff visit tracking:
+
+- `housekeeping_workers.calendar_color`
+- `housekeeping_work_sessions.worker_id`
+- `housekeeping_work_sessions.calendar_event_id`
+
+Each staff profile links to `users.id`. These users are hidden from the normal family list by filtering rows associated with `housekeeping_workers`, while contact and birthday sync remains shared with the existing family-member artifact flow.
+
+The quick supply endpoint uses a SQLite transaction:
+
+1. Resolve the first existing shopping list, or create `Housekeeping`.
+2. Insert a `shopping_items` row.
+3. Insert a `housekeeping_supply_requests` row linked to the shopping item.
+
+If any step fails, the transaction rolls back.
+
+## Frontend
+
+The SPA route `/housekeeping` is registered in `public/router.js` and loads:
+
+- `public/pages/housekeeping.js`
+- `public/styles/housekeeping.css`
+
+The page uses the existing API wrapper in `public/api.js`, so CSRF tokens and auth expiry behavior remain centralized. The UI now follows the standard Oikos module layout: sticky toolbar, horizontal tab chips, and regular cards.
+Check-in/check-out actions live beside each staff member on the Dashboard and are disabled until at least one staff member exists.
+
+Calendar integration creates a local calendar event at check-in, assigns it to the staff user, uses the staff calendar color, and updates the end time on check-out. Calendar event icon selection now opens a dedicated icon picker dialog instead of expanding inline inside the event modal.
+
+The UI intentionally avoids `innerHTML`; rendering uses `replaceChildren()` and `insertAdjacentHTML()` with escaped dynamic values.
+
+## Localization
+
+The module adds:
+
+- `nav.housekeeping`
+- `housekeeping.*`
+
+to every JSON locale under `public/locales`.
+
+Portuguese is the primary text for the cleaner-facing target workflow, with localized strings for the most common existing languages and English fallback text for remaining locales.
+
+## Validation
+
+Backend validation covers:
+
+- Required strings and max lengths.
+- Positive integer `frequency_days`.
+- Non-negative `daily_rate` and `extras`.
+- `YYYY-MM` month filters.
+- Maintenance photos limited to PNG, JPEG, or WebP data URLs under 6 MB.
+
+## Manual Use
+
+1. Navigate to `/housekeeping`.
+2. Use the check-in/check-out button next to the staff member on the Dashboard.
+3. Review the Dashboard metrics and payment chart.
+4. On **Tasks**, choose suggested chores or create a custom recurring chore.
+5. On **Reports**, take/upload a photo and submit a maintenance description.
+6. On **Staff**, create or update one or more housekeepers, contacts, birthdays, rates, and payment schedules.
diff --git a/public/index.html b/public/index.html
index c48f7dd..c6a0601 100644
--- a/public/index.html
+++ b/public/index.html
@@ -18,7 +18,7 @@
Oikos
-
+
diff --git a/public/locales/ar.json b/public/locales/ar.json
index f170b5b..fb0a355 100644
--- a/public/locales/ar.json
+++ b/public/locales/ar.json
@@ -54,7 +54,8 @@
"more": "المزيد",
"documents": "المستندات",
"kitchen": "المطبخ",
- "search": "بحث"
+ "search": "بحث",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "لوحة التحكم",
@@ -205,7 +206,18 @@
"kanbanArchived": "مؤرشف",
"reminderNeedsDueDate": "حدّد تاريخ استحقاق لتفعيل تذكيرات المهمة.",
"emptyAction": "إنشاء مهمة",
- "navLabelOverdue": "المهام، {{count}} متأخرة"
+ "navLabelOverdue": "المهام، {{count}} متأخرة",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "التسوق",
@@ -479,7 +491,13 @@
"colorPurple": "بنفسجي",
"colorRed": "أحمر",
"colorSkyBlue": "أزرق سماوي",
- "colorYellow": "أصفر"
+ "colorYellow": "أصفر",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "مرفق تم رفعه لحدث التقويم \"{{title}}\"."
},
"notes": {
"title": "لوحة الملاحظات",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "تخطيط عائلي. آمن. يحترم الخصوصية. مفتوح المصدر.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "مرحبًا بك في {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "التنقل والوحدات",
"step2Body": "في الأسفل يمكنك الوصول مباشرة إلى لوحة التحكم والتقويم. بزر ··· تفتح وحدات أخرى مثل المطبخ والملاحظات وجهات الاتصال.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "أفلت الملف هنا أو انقر للاختيار",
"dropzoneHint": "اسحب ملفًا إلى هذه المنطقة أو استخدم محدد الملفات.",
- "selectedFileLabel": "المحدد: {{name}}"
+ "selectedFileLabel": "المحدد: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "التنظيف المنزلي",
+ "calendarItemsFolder": "عناصر التقويم",
+ "folderBrowserTitle": "تصفح المجلدات"
},
"shortcuts": {
"goKitchen": "المطبخ",
@@ -1215,5 +1309,154 @@
"help": "اختصارات لوحة المفاتيح",
"new": "إنشاء إدخال جديد",
"search": "فتح البحث"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "تنظيف الحمامات",
+ "area": "الحمامات"
+ },
+ "mopKitchenFloor": {
+ "name": "مسح أرضية المطبخ",
+ "area": "المطبخ"
+ },
+ "dustLivingRoom": {
+ "name": "إزالة الغبار من غرفة المعيشة",
+ "area": "غرفة المعيشة"
+ },
+ "changeBedLinens": {
+ "name": "تغيير مفروشات السرير",
+ "area": "غرف النوم"
+ },
+ "cleanRefrigerator": {
+ "name": "تنظيف الثلاجة",
+ "area": "المطبخ"
+ },
+ "cleanWindows": {
+ "name": "تنظيف النوافذ",
+ "area": "المنزل كله"
+ },
+ "deepCleanOven": {
+ "name": "تنظيف الفرن بعمق",
+ "area": "المطبخ"
+ },
+ "washOutdoor": {
+ "name": "غسل الشرفة/الفناء",
+ "area": "الخارج"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/de.json b/public/locales/de.json
index 161aedb..a83729f 100644
--- a/public/locales/de.json
+++ b/public/locales/de.json
@@ -54,7 +54,8 @@
"recipes": "Rezepte",
"documents": "Dokumente",
"kitchen": "Küche",
- "search": "Suche"
+ "search": "Suche",
+ "housekeeping": "Hauspflege"
},
"search": {
"title": "Suche",
@@ -499,7 +500,10 @@
"attachmentHint": "Lokales Bild, PDF oder Dokument anhängen. Bilder werden im Ereignis-Popup angezeigt.",
"attachmentFallback": "Anhang",
"attachmentReadError": "Der Anhang konnte nicht gelesen werden.",
- "attachmentTooLarge": "Der Anhang darf höchstens 5 MB groß sein."
+ "attachmentTooLarge": "Der Anhang darf höchstens 5 MB groß sein.",
+ "iconCleaning": "Reinigung",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Anhang für Kalendereintrag \"{{title}}\" hochgeladen."
},
"notes": {
"title": "Notizen",
@@ -779,7 +783,7 @@
"tabFamily": "Familie",
"tabApiTokens": "API-Tokens",
"tabAccount": "Konto",
- "tabBackup": "Backup",
+ "tabBackup": "Backup-Verwaltung",
"tabsAriaLabel": "Einstellungsbereiche",
"sectionDesign": "Design",
"sectionAppName": "Anwendungsname",
@@ -845,7 +849,7 @@
"disconnectedToast": "{{provider}} getrennt.",
"googleOnlyAdmin": "Nur Admin kann Google Calendar verbinden.",
"appleOnlyAdmin": "Nur Admin kann Apple Calendar verbinden.",
- "caldavUrlLabel": "CalDAV-Server-URL",
+ "caldavUrlLabel": "CalDAV Server-URL",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Apple-ID (E-Mail)",
"applePasswordLabel": "App-spezifisches Passwort",
@@ -975,7 +979,6 @@
"memberBirthDateInvalid": "Bitte ein gültiges Geburtstagsdatum im ausgewählten Format verwenden.",
"memberPhoneMeta": "Telefon: {{value}}",
"memberBirthdayMeta": "Geburtstag: {{date}}",
- "tabBackup": "Backup-Verwaltung",
"sectionBackup": "Backup-Verwaltung",
"backupDownloadTitle": "Datenbank-Backup herunterladen",
"backupDownloadHint": "Erstellt ein konsistentes SQLite-Backup aller Anwendungsdaten.",
@@ -1012,8 +1015,6 @@
"caldavEmptyState": "Noch keine CalDAV-Konten verbunden. Füge dein erstes Konto hinzu, um zu starten.",
"caldavNameLabel": "Kontoname",
"caldavNamePlaceholder": "z.B. Mein Radicale, iCloud, Nextcloud",
- "caldavUrlLabel": "CalDAV Server-URL",
- "caldavUrlPlaceholder": "https://caldav.icloud.com",
"caldavUrlHint": "Die Basis-URL deines CalDAV-Servers",
"caldavUsernameLabel": "Benutzername",
"caldavPasswordLabel": "Passwort",
@@ -1030,7 +1031,6 @@
"calendarsRefreshed": "Kalender aktualisiert",
"deleteAccountConfirm": "CalDAV-Konto wirklich löschen? Alle synchronisierten Kalender werden entfernt.",
"lastSync": "Zuletzt synchronisiert",
- "cardavTitle": "CardDAV Kontakte",
"cardavDescription": "Verbinde mehrere CardDAV-Konten (iCloud, Nextcloud, Radicale, etc.) und synchronisiere deine Kontakte.",
"cardavAddAccount": "CardDAV-Konto hinzufügen",
"cardavEmptyState": "Noch keine CardDAV-Konten verbunden. Füge dein erstes Konto hinzu, um Kontakte zu synchronisieren.",
@@ -1061,7 +1061,12 @@
"helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
"helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
"emptyStateAddFirst": "Füge dein erstes Konto hinzu",
- "emptyStateNoAccounts": "Noch keine Konten verbunden"
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved."
},
"login": {
"tagline": "Familienplanung. Sicher. Datenschutzfreundlich. Open Source.",
@@ -1198,7 +1203,7 @@
"copySuffix": "Kopie"
},
"onboarding": {
- "step1Title": "Willkommen bei Oikos",
+ "step1Title": "Willkommen bei {{name}}",
"step1Body": "Dein persönlicher Familienplaner. Aufgaben, Kalender, Einkauf und mehr – alles an einem Ort.",
"step2Title": "Navigation & Module",
"step2Body": "Unten erreichst du Dashboard und Kalender direkt. Mit dem ···-Button öffnest du weitere Module wie Küche, Notizen und Kontakte.",
@@ -1292,10 +1297,166 @@
},
"dropzoneTitle": "Datei hier ablegen oder klicken",
"dropzoneHint": "Ziehe eine Datei in diesen Bereich oder nutze die Dateiauswahl.",
- "selectedFileLabel": "Ausgewählt: {{name}}"
+ "selectedFileLabel": "Ausgewählt: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Hausreinigung",
+ "calendarItemsFolder": "Kalendereinträge",
+ "folderBrowserTitle": "Ordner durchsuchen"
},
"userMultiSelect": {
"nobody": "- Niemand -",
"moreUsers": "weitere"
+ },
+ "housekeeping": {
+ "title": "Reinigungsbereich",
+ "bottomNav": "Hauspflege-Navigation",
+ "home": "Start",
+ "tasks": "Aufgaben",
+ "report": "Melden",
+ "notCheckedIn": "Nicht eingecheckt",
+ "checkedInAt": "Eingecheckt um",
+ "monthTotal": "Aktueller Monat · {{count}} Einsätze",
+ "dailyRate": "Tagessatz",
+ "extras": "Extras",
+ "checkIn": "Einchecken",
+ "checkOut": "Auschecken",
+ "quickSupply": "Produkt fehlt",
+ "supplyName": "Produktname",
+ "supplyPlaceholder": "Was fehlt?",
+ "checkedInToast": "Check-in gespeichert.",
+ "checkedOutToast": "Check-out gespeichert.",
+ "supplyAddedToast": "Zur Einkaufsliste hinzugefügt.",
+ "overdue": "Überfällig",
+ "dueToday": "Heute fällig",
+ "ok": "OK",
+ "noTasks": "Noch keine Hauspflege-Aufgaben.",
+ "everyDays": "Alle {{days}} Tage",
+ "completeTask": "{{name}} erledigen",
+ "taskDoneToast": "Aufgabe erledigt.",
+ "reportTitle": "Problem melden",
+ "problemDescription": "Problembeschreibung",
+ "problemPlaceholder": "Beispiel: Glühbirne defekt",
+ "addPhoto": "Foto hinzufügen",
+ "sendReport": "Meldung senden",
+ "reportSentToast": "Problem gemeldet.",
+ "recentReports": "Letzte Meldungen",
+ "addTask": "Aufgabe hinzufügen",
+ "taskName": "Aufgabe",
+ "taskNamePlaceholder": "Beispiel: Badezimmer reinigen",
+ "taskArea": "Bereich",
+ "taskAreaPlaceholder": "Beispiel: Bad",
+ "taskFrequency": "Häufigkeit",
+ "createTask": "Aufgabe erstellen",
+ "taskCreatedToast": "Hauspflege-Aufgabe erstellt.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Besuche im Monat",
+ "lastVisit": "Letzter Besuch",
+ "pendingChores": "Offene Aufgaben",
+ "finishedChores": "Erledigte Aufgaben",
+ "payments": "Zahlungen",
+ "pendingPayments": "Offene Zahlungen",
+ "monthlyPayments": "Monatliche Zahlungen",
+ "noPaymentData": "Noch keine Zahlungsdaten.",
+ "noVisits": "Noch keine Besuche",
+ "noWorkerTitle": "Kein Hauspflege-Profil",
+ "noWorkerHint": "Profil anlegen, um Kontakte, Tagessatz und Zahlungsrhythmus festzulegen.",
+ "taskTemplates": "Vorgeschlagene Aufgaben",
+ "addCustomTask": "Eigene Aufgabe hinzufügen",
+ "noReports": "Noch keine Meldungen.",
+ "profileTitle": "Hauspflege-Profil",
+ "profilePicture": "Profilbild",
+ "workerName": "Name",
+ "workerUsername": "Benutzername",
+ "workerPhone": "Telefon",
+ "workerEmail": "E-Mail",
+ "workerBirthDate": "Geburtstag",
+ "paymentSchedule": "Zahlungsrhythmus",
+ "scheduleDaily": "Pro Besuch",
+ "scheduleTwiceMonthly": "Zweimal monatlich",
+ "scheduleMonthly": "Monatlich",
+ "profileColor": "Profilfarbe",
+ "workerNotes": "Notizen",
+ "workerSavedToast": "Hauspflege-Profil gespeichert.",
+ "staff": "Personal",
+ "staffTitle": "Hauspflege-Personal",
+ "addWorker": "Hauspflege hinzufügen",
+ "editWorker": "Hauspflege bearbeiten",
+ "noWorkers": "Noch keine Hauspflege-Person registriert.",
+ "moreWorkers": "+{{count}} weitere",
+ "checkInDisabled": "Lege zuerst eine Hauspflege-Person an.",
+ "calendarColor": "Kalenderfarbe",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Bäder reinigen",
+ "area": "Bäder"
+ },
+ "mopKitchenFloor": {
+ "name": "Küchenboden wischen",
+ "area": "Küche"
+ },
+ "dustLivingRoom": {
+ "name": "Wohnzimmer abstauben",
+ "area": "Wohnzimmer"
+ },
+ "changeBedLinens": {
+ "name": "Bettwäsche wechseln",
+ "area": "Schlafzimmer"
+ },
+ "cleanRefrigerator": {
+ "name": "Kühlschrank reinigen",
+ "area": "Küche"
+ },
+ "cleanWindows": {
+ "name": "Fenster putzen",
+ "area": "Ganzes Haus"
+ },
+ "deepCleanOven": {
+ "name": "Backofen gründlich reinigen",
+ "area": "Küche"
+ },
+ "washOutdoor": {
+ "name": "Balkon/Terrasse waschen",
+ "area": "Außenbereich"
+ }
+ }
}
}
diff --git a/public/locales/el.json b/public/locales/el.json
index 64da05e..8e2a1ce 100644
--- a/public/locales/el.json
+++ b/public/locales/el.json
@@ -54,7 +54,8 @@
"more": "Περισσότερα",
"documents": "Έγγραφα",
"kitchen": "Κουζίνα",
- "search": "Αναζήτηση"
+ "search": "Αναζήτηση",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "Επισκόπηση",
@@ -205,7 +206,18 @@
"kanbanArchived": "Αρχειοθετημένο",
"reminderNeedsDueDate": "Ορίστε ημερομηνία λήξης για να ενεργοποιήσετε τις υπενθυμίσεις.",
"emptyAction": "Δημιουργία εργασίας",
- "navLabelOverdue": "Εργασίες, {{count}} εκπρόθεσμες"
+ "navLabelOverdue": "Εργασίες, {{count}} εκπρόθεσμες",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Αγορές",
@@ -479,7 +491,13 @@
"colorPurple": "Μοβ",
"colorRed": "Κόκκινο",
"colorSkyBlue": "Γαλάζιο",
- "colorYellow": "Κίτρινο"
+ "colorYellow": "Κίτρινο",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Συνημμένο που ανέβηκε για το συμβάν ημερολογίου \"{{title}}\"."
},
"notes": {
"title": "Σημειώσεις",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Οικογενειακός προγραμματισμός. Ασφαλής. Φιλικός προς την ιδιωτικότητα. Ανοιχτός κώδικας.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Καλώς ήρθατε στο {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Πλοήγηση & Ενότητες",
"step2Body": "Στο κάτω μέρος έχεις άμεση πρόσβαση στον Πίνακα ελέγχου και το Ημερολόγιο. Με το κουμπί ··· ανοίγεις άλλες ενότητες όπως Κουζίνα, Σημειώσεις και Επαφές.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Αφήστε το αρχείο εδώ ή κάντε κλικ για επιλογή",
"dropzoneHint": "Σύρετε ένα αρχείο σε αυτήν την περιοχή ή χρησιμοποιήστε τον επιλογέα αρχείων.",
- "selectedFileLabel": "Επιλέχθηκε: {{name}}"
+ "selectedFileLabel": "Επιλέχθηκε: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Καθαριότητα",
+ "calendarItemsFolder": "Στοιχεία ημερολογίου",
+ "folderBrowserTitle": "Περιήγηση φακέλων"
},
"shortcuts": {
"goKitchen": "Κουζίνα",
@@ -1215,5 +1309,154 @@
"help": "Συντομεύσεις πληκτρολογίου",
"new": "Δημιουργία νέας εγγραφής",
"search": "Άνοιγμα αναζήτησης"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Καθαρισμός μπάνιων",
+ "area": "Μπάνια"
+ },
+ "mopKitchenFloor": {
+ "name": "Σφουγγάρισμα δαπέδου κουζίνας",
+ "area": "Κουζίνα"
+ },
+ "dustLivingRoom": {
+ "name": "Ξεσκόνισμα σαλονιού",
+ "area": "Σαλόνι"
+ },
+ "changeBedLinens": {
+ "name": "Αλλαγή σεντονιών",
+ "area": "Υπνοδωμάτια"
+ },
+ "cleanRefrigerator": {
+ "name": "Καθαρισμός ψυγείου",
+ "area": "Κουζίνα"
+ },
+ "cleanWindows": {
+ "name": "Καθαρισμός παραθύρων",
+ "area": "Όλο το σπίτι"
+ },
+ "deepCleanOven": {
+ "name": "Βαθύς καθαρισμός φούρνου",
+ "area": "Κουζίνα"
+ },
+ "washOutdoor": {
+ "name": "Πλύσιμο μπαλκονιού/αυλής",
+ "area": "Εξωτερικός χώρος"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/en.json b/public/locales/en.json
index ade2cff..ee436b7 100644
--- a/public/locales/en.json
+++ b/public/locales/en.json
@@ -54,7 +54,8 @@
"more": "More",
"documents": "Documents",
"kitchen": "Kitchen",
- "search": "Search"
+ "search": "Search",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "Overview",
@@ -493,7 +494,10 @@
"colorPurple": "Purple",
"colorRed": "Red",
"colorSkyBlue": "Sky Blue",
- "colorYellow": "Yellow"
+ "colorYellow": "Yellow",
+ "iconCleaning": "Cleaning",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Attachment uploaded for calendar event \"{{title}}\"."
},
"notes": {
"title": "Board",
@@ -994,8 +998,6 @@
"caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
"caldavNameLabel": "Account Name",
"caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
- "caldavUrlLabel": "CalDAV Server URL",
- "caldavUrlPlaceholder": "https://caldav.icloud.com",
"caldavUrlHint": "The base URL of your CalDAV server",
"caldavUsernameLabel": "Username",
"caldavPasswordLabel": "Password",
@@ -1034,7 +1036,31 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "breadcrumbLabel": "Pfad",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Family planning. Secure. Privacy-friendly. Open source.",
@@ -1177,7 +1203,7 @@
"noResults": "No results found."
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Welcome to {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Navigation & Modules",
"step2Body": "At the bottom you can directly access Dashboard and Calendar. The ··· button opens additional modules like Kitchen, Notes and Contacts.",
@@ -1271,6 +1297,166 @@
},
"dropzoneTitle": "Drop file here or click to choose",
"dropzoneHint": "Drag a file into this area, or use the file picker.",
- "selectedFileLabel": "Selected: {{name}}"
+ "selectedFileLabel": "Selected: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "HouseKeeping",
+ "calendarItemsFolder": "Calendar items",
+ "folderBrowserTitle": "Browse folders"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Clean bathrooms",
+ "area": "Bathrooms"
+ },
+ "mopKitchenFloor": {
+ "name": "Mop kitchen floor",
+ "area": "Kitchen"
+ },
+ "dustLivingRoom": {
+ "name": "Dust living room",
+ "area": "Living room"
+ },
+ "changeBedLinens": {
+ "name": "Change bed linens",
+ "area": "Bedrooms"
+ },
+ "cleanRefrigerator": {
+ "name": "Clean refrigerator",
+ "area": "Kitchen"
+ },
+ "cleanWindows": {
+ "name": "Clean windows",
+ "area": "Whole house"
+ },
+ "deepCleanOven": {
+ "name": "Deep clean oven",
+ "area": "Kitchen"
+ },
+ "washOutdoor": {
+ "name": "Wash balcony/patio",
+ "area": "Outdoor"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
}
diff --git a/public/locales/es.json b/public/locales/es.json
index 267c851..47f8f88 100644
--- a/public/locales/es.json
+++ b/public/locales/es.json
@@ -54,7 +54,8 @@
"more": "Más",
"documents": "Documentos",
"kitchen": "Cocina",
- "search": "Buscar"
+ "search": "Buscar",
+ "housekeeping": "Limpieza"
},
"dashboard": {
"title": "Inicio",
@@ -205,7 +206,18 @@
"kanbanArchived": "Archivado",
"reminderNeedsDueDate": "Establece una fecha de vencimiento para activar los recordatorios de tareas.",
"emptyAction": "Crear tarea",
- "navLabelOverdue": "Tareas, {{count}} vencidas"
+ "navLabelOverdue": "Tareas, {{count}} vencidas",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Compras",
@@ -479,7 +491,13 @@
"colorPurple": "Morado",
"colorRed": "Rojo",
"colorSkyBlue": "Azul cielo",
- "colorYellow": "Amarillo"
+ "colorYellow": "Amarillo",
+ "iconCleaning": "Limpieza",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Archivo adjunto subido para el evento de calendario \"{{title}}\"."
},
"notes": {
"title": "Notas",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Planificación familiar. Segura. Privada. Código abierto.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Bienvenido a {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Navegación y módulos",
"step2Body": "En la parte inferior accedes directamente al Panel y el Calendario. Con el botón ··· abres más módulos como Cocina, Notas y Contactos.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Suelta el archivo aquí o haz clic para elegir",
"dropzoneHint": "Arrastra un archivo a esta área o usa el selector de archivos.",
- "selectedFileLabel": "Seleccionado: {{name}}"
+ "selectedFileLabel": "Seleccionado: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Limpieza",
+ "calendarItemsFolder": "Elementos del calendario",
+ "folderBrowserTitle": "Explorar carpetas"
},
"shortcuts": {
"goKitchen": "Cocina",
@@ -1215,5 +1309,154 @@
"help": "Atajos de teclado",
"new": "Crear nueva entrada",
"search": "Abrir búsqueda"
+ },
+ "housekeeping": {
+ "title": "Área de limpieza",
+ "bottomNav": "Navegación de limpieza",
+ "home": "Inicio",
+ "tasks": "Tareas",
+ "report": "Reportar",
+ "notCheckedIn": "Sin entrada",
+ "checkedInAt": "Entrada a las",
+ "monthTotal": "Mes actual · {{count}} jornadas",
+ "dailyRate": "Tarifa diaria",
+ "extras": "Extras",
+ "checkIn": "Entrada",
+ "checkOut": "Salida",
+ "quickSupply": "Falta producto",
+ "supplyName": "Producto",
+ "supplyPlaceholder": "¿Qué falta?",
+ "checkedInToast": "Entrada registrada.",
+ "checkedOutToast": "Salida registrada.",
+ "supplyAddedToast": "Añadido a la lista de compras.",
+ "overdue": "Atrasada",
+ "dueToday": "Hoy",
+ "ok": "OK",
+ "noTasks": "No hay tareas de limpieza.",
+ "everyDays": "Cada {{days}} días",
+ "completeTask": "Completar {{name}}",
+ "taskDoneToast": "Tarea completada.",
+ "reportTitle": "Reportar problema",
+ "problemDescription": "Descripción del problema",
+ "problemPlaceholder": "Ejemplo: bombilla fundida",
+ "addPhoto": "Agregar foto",
+ "sendReport": "Enviar reporte",
+ "reportSentToast": "Problema reportado.",
+ "recentReports": "Reportes recientes",
+ "addTask": "Agregar tarea",
+ "taskName": "Tarea",
+ "taskNamePlaceholder": "Ejemplo: limpiar baños",
+ "taskArea": "Área",
+ "taskAreaPlaceholder": "Ejemplo: baño",
+ "taskFrequency": "Frecuencia",
+ "createTask": "Crear tarea",
+ "taskCreatedToast": "Tarea de limpieza creada.",
+ "dashboard": "Panel",
+ "reports": "Reports",
+ "visitsThisMonth": "Visitas del mes",
+ "lastVisit": "Última visita",
+ "pendingChores": "Tareas pendientes",
+ "finishedChores": "Tareas completadas",
+ "payments": "Pagos",
+ "pendingPayments": "Pagos pendientes",
+ "monthlyPayments": "Pagos mensuales",
+ "noPaymentData": "Aún no hay datos de pago.",
+ "noVisits": "Sin visitas todavía",
+ "noWorkerTitle": "Sin perfil de limpieza",
+ "noWorkerHint": "Crea el perfil para definir contactos, tarifa y calendario de pago.",
+ "taskTemplates": "Tareas sugeridas",
+ "addCustomTask": "Agregar tarea personalizada",
+ "noReports": "Aún no hay reportes.",
+ "profileTitle": "Perfil de limpieza",
+ "profilePicture": "Foto de perfil",
+ "workerName": "Nombre",
+ "workerUsername": "Usuario",
+ "workerPhone": "Teléfono",
+ "workerEmail": "Email",
+ "workerBirthDate": "Cumpleaños",
+ "paymentSchedule": "Calendario de pago",
+ "scheduleDaily": "Cada visita",
+ "scheduleTwiceMonthly": "Dos veces al mes",
+ "scheduleMonthly": "Mensual",
+ "profileColor": "Color de perfil",
+ "workerNotes": "Notas",
+ "workerSavedToast": "Perfil guardado.",
+ "staff": "Personal",
+ "staffTitle": "Personal de limpieza",
+ "addWorker": "Agregar persona",
+ "editWorker": "Editar persona",
+ "noWorkers": "No hay personal de limpieza registrado.",
+ "moreWorkers": "+{{count}} más",
+ "checkInDisabled": "Agrega una persona antes de registrar entrada.",
+ "calendarColor": "Color de calendario",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Limpiar baños",
+ "area": "Baños"
+ },
+ "mopKitchenFloor": {
+ "name": "Fregar el suelo de la cocina",
+ "area": "Cocina"
+ },
+ "dustLivingRoom": {
+ "name": "Quitar el polvo de la sala",
+ "area": "Sala"
+ },
+ "changeBedLinens": {
+ "name": "Cambiar la ropa de cama",
+ "area": "Dormitorios"
+ },
+ "cleanRefrigerator": {
+ "name": "Limpiar el refrigerador",
+ "area": "Cocina"
+ },
+ "cleanWindows": {
+ "name": "Limpiar ventanas",
+ "area": "Toda la casa"
+ },
+ "deepCleanOven": {
+ "name": "Limpieza profunda del horno",
+ "area": "Cocina"
+ },
+ "washOutdoor": {
+ "name": "Lavar balcón/patio",
+ "area": "Exterior"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/fr.json b/public/locales/fr.json
index a54ade8..9765285 100644
--- a/public/locales/fr.json
+++ b/public/locales/fr.json
@@ -54,7 +54,8 @@
"more": "Plus",
"documents": "Documents",
"kitchen": "Cuisine",
- "search": "Recherche"
+ "search": "Recherche",
+ "housekeeping": "Ménage"
},
"dashboard": {
"title": "Accueil",
@@ -205,7 +206,18 @@
"kanbanArchived": "Archivé",
"reminderNeedsDueDate": "Définissez une date d'échéance pour activer les rappels de tâche.",
"emptyAction": "Créer une tâche",
- "navLabelOverdue": "Tâches, {{count}} en retard"
+ "navLabelOverdue": "Tâches, {{count}} en retard",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Courses",
@@ -479,7 +491,13 @@
"colorPurple": "Violet",
"colorRed": "Rouge",
"colorSkyBlue": "Bleu ciel",
- "colorYellow": "Jaune"
+ "colorYellow": "Jaune",
+ "iconCleaning": "Ménage",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Pièce jointe téléversée pour l’événement \"{{title}}\"."
},
"notes": {
"title": "Notes",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Planification familiale. Sécurisée. Respectueuse de la vie privée. Open source.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Bienvenue dans {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Navigation & modules",
"step2Body": "En bas, accédez directement au Tableau de bord et au Calendrier. Le bouton ··· ouvre d'autres modules comme Cuisine, Notes et Contacts.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Déposez le fichier ici ou cliquez pour choisir",
"dropzoneHint": "Glissez un fichier dans cette zone ou utilisez le sélecteur.",
- "selectedFileLabel": "Sélectionné : {{name}}"
+ "selectedFileLabel": "Sélectionné : {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Ménage",
+ "calendarItemsFolder": "Éléments du calendrier",
+ "folderBrowserTitle": "Parcourir les dossiers"
},
"shortcuts": {
"goKitchen": "Cuisine",
@@ -1215,5 +1309,154 @@
"help": "Raccourcis clavier",
"new": "Créer une nouvelle entrée",
"search": "Ouvrir la recherche"
+ },
+ "housekeeping": {
+ "title": "Espace ménage",
+ "bottomNav": "Navigation ménage",
+ "home": "Accueil",
+ "tasks": "Tâches",
+ "report": "Signaler",
+ "notCheckedIn": "Pas pointé",
+ "checkedInAt": "Pointé à",
+ "monthTotal": "Mois en cours · {{count}} sessions",
+ "dailyRate": "Tarif journalier",
+ "extras": "Extras",
+ "checkIn": "Arrivée",
+ "checkOut": "Départ",
+ "quickSupply": "Produit manquant",
+ "supplyName": "Produit",
+ "supplyPlaceholder": "Que manque-t-il ?",
+ "checkedInToast": "Arrivée enregistrée.",
+ "checkedOutToast": "Départ enregistré.",
+ "supplyAddedToast": "Ajouté à la liste de courses.",
+ "overdue": "En retard",
+ "dueToday": "Aujourd’hui",
+ "ok": "OK",
+ "noTasks": "Aucune tâche de ménage.",
+ "everyDays": "Tous les {{days}} jours",
+ "completeTask": "Terminer {{name}}",
+ "taskDoneToast": "Tâche terminée.",
+ "reportTitle": "Signaler un problème",
+ "problemDescription": "Description du problème",
+ "problemPlaceholder": "Exemple : ampoule grillée",
+ "addPhoto": "Ajouter une photo",
+ "sendReport": "Envoyer",
+ "reportSentToast": "Problème signalé.",
+ "recentReports": "Signalements récents",
+ "addTask": "Ajouter une tâche",
+ "taskName": "Tâche",
+ "taskNamePlaceholder": "Exemple : nettoyer les salles de bain",
+ "taskArea": "Zone",
+ "taskAreaPlaceholder": "Exemple : salle de bain",
+ "taskFrequency": "Fréquence",
+ "createTask": "Créer la tâche",
+ "taskCreatedToast": "Tâche de ménage créée.",
+ "dashboard": "Tableau",
+ "reports": "Reports",
+ "visitsThisMonth": "Visites du mois",
+ "lastVisit": "Dernière visite",
+ "pendingChores": "Tâches en attente",
+ "finishedChores": "Tâches terminées",
+ "payments": "Paiements",
+ "pendingPayments": "Paiements en attente",
+ "monthlyPayments": "Paiements mensuels",
+ "noPaymentData": "Aucune donnée de paiement.",
+ "noVisits": "Aucune visite",
+ "noWorkerTitle": "Aucun profil de ménage",
+ "noWorkerHint": "Créez le profil pour définir les contacts, le tarif et le rythme de paiement.",
+ "taskTemplates": "Tâches suggérées",
+ "addCustomTask": "Ajouter une tâche personnalisée",
+ "noReports": "Aucun signalement.",
+ "profileTitle": "Profil ménage",
+ "profilePicture": "Photo de profil",
+ "workerName": "Nom",
+ "workerUsername": "Identifiant",
+ "workerPhone": "Téléphone",
+ "workerEmail": "E-mail",
+ "workerBirthDate": "Anniversaire",
+ "paymentSchedule": "Rythme de paiement",
+ "scheduleDaily": "À chaque visite",
+ "scheduleTwiceMonthly": "Deux fois par mois",
+ "scheduleMonthly": "Mensuel",
+ "profileColor": "Couleur du profil",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Profil enregistré.",
+ "staff": "Équipe",
+ "staffTitle": "Équipe de ménage",
+ "addWorker": "Ajouter une personne",
+ "editWorker": "Modifier la personne",
+ "noWorkers": "Aucune personne de ménage enregistrée.",
+ "moreWorkers": "+{{count}} de plus",
+ "checkInDisabled": "Ajoutez une personne avant de pointer.",
+ "calendarColor": "Couleur du calendrier",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Nettoyer les salles de bain",
+ "area": "Salles de bain"
+ },
+ "mopKitchenFloor": {
+ "name": "Laver le sol de la cuisine",
+ "area": "Cuisine"
+ },
+ "dustLivingRoom": {
+ "name": "Dépoussiérer le salon",
+ "area": "Salon"
+ },
+ "changeBedLinens": {
+ "name": "Changer les draps",
+ "area": "Chambres"
+ },
+ "cleanRefrigerator": {
+ "name": "Nettoyer le réfrigérateur",
+ "area": "Cuisine"
+ },
+ "cleanWindows": {
+ "name": "Nettoyer les fenêtres",
+ "area": "Toute la maison"
+ },
+ "deepCleanOven": {
+ "name": "Nettoyage approfondi du four",
+ "area": "Cuisine"
+ },
+ "washOutdoor": {
+ "name": "Laver balcon/patio",
+ "area": "Extérieur"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/hi.json b/public/locales/hi.json
index 331cd74..935e3cb 100644
--- a/public/locales/hi.json
+++ b/public/locales/hi.json
@@ -54,7 +54,8 @@
"more": "और",
"documents": "दस्तावेज़",
"kitchen": "रसोई",
- "search": "खोज"
+ "search": "खोज",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "डैशबोर्ड",
@@ -205,7 +206,18 @@
"kanbanArchived": "संग्रहित",
"reminderNeedsDueDate": "कार्य अनुस्मारक सक्षम करने के लिए एक नियत तारीख निर्धारित करें।",
"emptyAction": "कार्य बनाएं",
- "navLabelOverdue": "कार्य, {{count}} अतिदेय"
+ "navLabelOverdue": "कार्य, {{count}} अतिदेय",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "खरीदारी",
@@ -479,7 +491,13 @@
"colorPurple": "बैंगनी",
"colorRed": "लाल",
"colorSkyBlue": "आसमानी नीला",
- "colorYellow": "पीला"
+ "colorYellow": "पीला",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "कैलेंडर इवेंट \"{{title}}\" के लिए अपलोड किया गया अटैचमेंट।"
},
"notes": {
"title": "नोट बोर्ड",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "पारिवारिक योजना। सुरक्षित। गोपनीयता-अनुकूल। ओपन सोर्स।",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "{{name}} में आपका स्वागत है",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "नेविगेशन और मॉड्यूल",
"step2Body": "नीचे से डैशबोर्ड और कैलेंडर तक सीधी पहुँच। ··· बटन से किचन, नोट्स और संपर्क जैसे अन्य मॉड्यूल खोलें।",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "फ़ाइल यहाँ छोड़ें या चुनने के लिए क्लिक करें",
"dropzoneHint": "फ़ाइल को इस क्षेत्र में खींचें या फ़ाइल पिकर का उपयोग करें।",
- "selectedFileLabel": "चयनित: {{name}}"
+ "selectedFileLabel": "चयनित: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "हाउसकीपिंग",
+ "calendarItemsFolder": "कैलेंडर आइटम",
+ "folderBrowserTitle": "फ़ोल्डर ब्राउज़ करें"
},
"shortcuts": {
"goKitchen": "रसोई",
@@ -1215,5 +1309,154 @@
"help": "कीबोर्ड शॉर्टकट",
"new": "नई प्रविष्टि बनाएं",
"search": "खोज खोलें"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "बाथरूम साफ करें",
+ "area": "बाथरूम"
+ },
+ "mopKitchenFloor": {
+ "name": "रसोई का फर्श पोंछें",
+ "area": "रसोई"
+ },
+ "dustLivingRoom": {
+ "name": "लिविंग रूम की धूल साफ करें",
+ "area": "लिविंग रूम"
+ },
+ "changeBedLinens": {
+ "name": "बिस्तर की चादरें बदलें",
+ "area": "बेडरूम"
+ },
+ "cleanRefrigerator": {
+ "name": "फ्रिज साफ करें",
+ "area": "रसोई"
+ },
+ "cleanWindows": {
+ "name": "खिड़कियाँ साफ करें",
+ "area": "पूरा घर"
+ },
+ "deepCleanOven": {
+ "name": "ओवन की गहरी सफाई करें",
+ "area": "रसोई"
+ },
+ "washOutdoor": {
+ "name": "बालकनी/आँगन धोएँ",
+ "area": "बाहरी क्षेत्र"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/it.json b/public/locales/it.json
index 1717950..cfd90f4 100644
--- a/public/locales/it.json
+++ b/public/locales/it.json
@@ -54,7 +54,8 @@
"more": "Altro",
"documents": "Documenti",
"kitchen": "Cucina",
- "search": "Cerca"
+ "search": "Cerca",
+ "housekeeping": "Pulizie"
},
"dashboard": {
"title": "Panoramica",
@@ -205,7 +206,18 @@
"kanbanArchived": "Archiviato",
"reminderNeedsDueDate": "Imposta una data di scadenza per abilitare i promemoria delle attività.",
"emptyAction": "Crea attività",
- "navLabelOverdue": "Attività, {{count}} in ritardo"
+ "navLabelOverdue": "Attività, {{count}} in ritardo",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Spesa",
@@ -479,7 +491,13 @@
"colorPurple": "Viola",
"colorRed": "Rosso",
"colorSkyBlue": "Azzurro",
- "colorYellow": "Giallo"
+ "colorYellow": "Giallo",
+ "iconCleaning": "Pulizie",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Allegato caricato per l’evento calendario \"{{title}}\"."
},
"notes": {
"title": "Bacheca",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Pianificazione familiare. Sicura. Rispettosa della privacy. Open source.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Benvenuto in {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Navigazione e moduli",
"step2Body": "In basso accedi direttamente alla Dashboard e al Calendario. Con il pulsante ··· apri altri moduli come Cucina, Note e Contatti.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Rilascia il file qui o fai clic per scegliere",
"dropzoneHint": "Trascina un file in quest’area oppure usa il selettore.",
- "selectedFileLabel": "Selezionato: {{name}}"
+ "selectedFileLabel": "Selezionato: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Pulizie",
+ "calendarItemsFolder": "Elementi del calendario",
+ "folderBrowserTitle": "Sfoglia cartelle"
},
"shortcuts": {
"goKitchen": "Cucina",
@@ -1215,5 +1309,154 @@
"help": "Scorciatoie da tastiera",
"new": "Crea nuova voce",
"search": "Apri ricerca"
+ },
+ "housekeeping": {
+ "title": "Area pulizie",
+ "bottomNav": "Navigazione pulizie",
+ "home": "Home",
+ "tasks": "Attività",
+ "report": "Segnala",
+ "notCheckedIn": "Non registrata",
+ "checkedInAt": "Entrata alle",
+ "monthTotal": "Mese corrente · {{count}} sessioni",
+ "dailyRate": "Tariffa giornaliera",
+ "extras": "Extra",
+ "checkIn": "Entrata",
+ "checkOut": "Uscita",
+ "quickSupply": "Prodotto mancante",
+ "supplyName": "Prodotto",
+ "supplyPlaceholder": "Cosa manca?",
+ "checkedInToast": "Entrata registrata.",
+ "checkedOutToast": "Uscita registrata.",
+ "supplyAddedToast": "Aggiunto alla lista della spesa.",
+ "overdue": "In ritardo",
+ "dueToday": "Oggi",
+ "ok": "OK",
+ "noTasks": "Nessuna attività di pulizia.",
+ "everyDays": "Ogni {{days}} giorni",
+ "completeTask": "Completa {{name}}",
+ "taskDoneToast": "Attività completata.",
+ "reportTitle": "Segnala problema",
+ "problemDescription": "Descrizione del problema",
+ "problemPlaceholder": "Esempio: lampadina bruciata",
+ "addPhoto": "Aggiungi foto",
+ "sendReport": "Invia",
+ "reportSentToast": "Problema segnalato.",
+ "recentReports": "Segnalazioni recenti",
+ "addTask": "Aggiungi attività",
+ "taskName": "Attività",
+ "taskNamePlaceholder": "Esempio: pulire i bagni",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Esempio: bagno",
+ "taskFrequency": "Frequenza",
+ "createTask": "Crea attività",
+ "taskCreatedToast": "Attività di pulizia creata.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visite del mese",
+ "lastVisit": "Ultima visita",
+ "pendingChores": "Attività aperte",
+ "finishedChores": "Attività completate",
+ "payments": "Pagamenti",
+ "pendingPayments": "Pagamenti in sospeso",
+ "monthlyPayments": "Pagamenti mensili",
+ "noPaymentData": "Nessun dato di pagamento.",
+ "noVisits": "Nessuna visita",
+ "noWorkerTitle": "Nessun profilo pulizie",
+ "noWorkerHint": "Crea il profilo per definire contatti, tariffa e calendario pagamenti.",
+ "taskTemplates": "Attività suggerite",
+ "addCustomTask": "Aggiungi attività personalizzata",
+ "noReports": "Nessuna segnalazione.",
+ "profileTitle": "Profilo pulizie",
+ "profilePicture": "Foto profilo",
+ "workerName": "Nome",
+ "workerUsername": "Nome utente",
+ "workerPhone": "Telefono",
+ "workerEmail": "E-mail",
+ "workerBirthDate": "Compleanno",
+ "paymentSchedule": "Calendario pagamenti",
+ "scheduleDaily": "Ogni visita",
+ "scheduleTwiceMonthly": "Due volte al mese",
+ "scheduleMonthly": "Mensile",
+ "profileColor": "Colore profilo",
+ "workerNotes": "Note",
+ "workerSavedToast": "Profilo salvato.",
+ "staff": "Staff",
+ "staffTitle": "Staff pulizie",
+ "addWorker": "Aggiungi persona",
+ "editWorker": "Modifica persona",
+ "noWorkers": "Nessuna persona registrata.",
+ "moreWorkers": "+{{count}} altre",
+ "checkInDisabled": "Aggiungi una persona prima dell’entrata.",
+ "calendarColor": "Colore calendario",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Pulire i bagni",
+ "area": "Bagni"
+ },
+ "mopKitchenFloor": {
+ "name": "Lavare il pavimento della cucina",
+ "area": "Cucina"
+ },
+ "dustLivingRoom": {
+ "name": "Spolverare il soggiorno",
+ "area": "Soggiorno"
+ },
+ "changeBedLinens": {
+ "name": "Cambiare la biancheria da letto",
+ "area": "Camere"
+ },
+ "cleanRefrigerator": {
+ "name": "Pulire il frigorifero",
+ "area": "Cucina"
+ },
+ "cleanWindows": {
+ "name": "Pulire le finestre",
+ "area": "Tutta la casa"
+ },
+ "deepCleanOven": {
+ "name": "Pulizia profonda del forno",
+ "area": "Cucina"
+ },
+ "washOutdoor": {
+ "name": "Lavare balcone/patio",
+ "area": "Esterno"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/ja.json b/public/locales/ja.json
index e343ec1..1c7a0e6 100644
--- a/public/locales/ja.json
+++ b/public/locales/ja.json
@@ -54,7 +54,8 @@
"more": "もっと見る",
"documents": "書類",
"kitchen": "キッチン",
- "search": "検索"
+ "search": "検索",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "ダッシュボード",
@@ -205,7 +206,18 @@
"kanbanArchived": "アーカイブ済み",
"reminderNeedsDueDate": "タスクのリマインダーを有効にするには期日を設定してください。",
"emptyAction": "タスクを作成",
- "navLabelOverdue": "タスク、{{count}}件期限超過"
+ "navLabelOverdue": "タスク、{{count}}件期限超過",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "買い物",
@@ -479,7 +491,13 @@
"colorPurple": "紫",
"colorRed": "赤",
"colorSkyBlue": "空色",
- "colorYellow": "黄"
+ "colorYellow": "黄",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "カレンダー予定「{{title}}」にアップロードされた添付ファイル。"
},
"notes": {
"title": "メモボード",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "家族計画。安全。プライバシー重視。オープンソース。",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "{{name}}へようこそ",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "ナビゲーションとモジュール",
"step2Body": "画面下部からダッシュボードとカレンダーに直接アクセスできます。···ボタンでキッチン、メモ、連絡先などの追加モジュールを開きます。",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "ここにファイルをドロップ、またはクリックして選択",
"dropzoneHint": "この領域にファイルをドラッグするか、ファイル選択を使用します。",
- "selectedFileLabel": "選択済み: {{name}}"
+ "selectedFileLabel": "選択済み: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "ハウスキーピング",
+ "calendarItemsFolder": "カレンダー項目",
+ "folderBrowserTitle": "フォルダーを参照"
},
"shortcuts": {
"goKitchen": "キッチン",
@@ -1215,5 +1309,154 @@
"help": "キーボードショートカット",
"new": "新規エントリを作成",
"search": "検索を開く"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "浴室を掃除",
+ "area": "浴室"
+ },
+ "mopKitchenFloor": {
+ "name": "キッチンの床を拭く",
+ "area": "キッチン"
+ },
+ "dustLivingRoom": {
+ "name": "リビングのほこり取り",
+ "area": "リビング"
+ },
+ "changeBedLinens": {
+ "name": "寝具を交換",
+ "area": "寝室"
+ },
+ "cleanRefrigerator": {
+ "name": "冷蔵庫を掃除",
+ "area": "キッチン"
+ },
+ "cleanWindows": {
+ "name": "窓を掃除",
+ "area": "家全体"
+ },
+ "deepCleanOven": {
+ "name": "オーブンを徹底掃除",
+ "area": "キッチン"
+ },
+ "washOutdoor": {
+ "name": "バルコニー/パティオを洗う",
+ "area": "屋外"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/pt.json b/public/locales/pt.json
index b12c0d2..e347d15 100644
--- a/public/locales/pt.json
+++ b/public/locales/pt.json
@@ -54,7 +54,8 @@
"more": "Mais",
"documents": "Documentos",
"kitchen": "Cozinha",
- "search": "Pesquisar"
+ "search": "Pesquisar",
+ "housekeeping": "Faxina"
},
"dashboard": {
"title": "Painel",
@@ -205,7 +206,18 @@
"swipedOpenToast": "Marcado como aberto.",
"reminderNeedsDueDate": "Defina uma data de vencimento para habilitar lembretes da tarefa.",
"emptyAction": "Criar tarefa",
- "navLabelOverdue": "Tarefas, {{count}} atrasadas"
+ "navLabelOverdue": "Tarefas, {{count}} atrasadas",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Compras",
@@ -479,7 +491,13 @@
"colorPurple": "Roxo",
"colorRed": "Vermelho",
"colorSkyBlue": "Azul céu",
- "colorYellow": "Amarelo"
+ "colorYellow": "Amarelo",
+ "iconCleaning": "Faxina",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Anexo enviado para o evento \"{{title}}\" do calendário."
},
"notes": {
"title": "Quadro de notas",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Faxina",
+ "housekeepingPaymentsTitle": "Tarefas de pagamento",
+ "housekeepingPaymentTasksLabel": "Criar uma tarefa de pagamento a cada entrada da faxineira",
+ "housekeepingPaymentTasksHint": "Quando ativo, cada entrada cria uma tarefa para pagar a pessoa da equipe. Ao concluir essa tarefa, o pagamento da visita é marcado como pago.",
+ "housekeepingPaymentTasksSaved": "Configuração de pagamento da faxina salva.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Planejamento familiar. Seguro. Privado. Código aberto.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Semanas"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Bem-vindo ao {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Navegação e módulos",
"step2Body": "Na parte inferior acessa diretamente o Painel e o Calendário. Com o botão ··· abre módulos adicionais como Cozinha, Notas e Contactos.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Solte o arquivo aqui ou clique para escolher",
"dropzoneHint": "Arraste um arquivo para esta area, ou use o seletor de arquivos.",
- "selectedFileLabel": "Selecionado: {{name}}"
+ "selectedFileLabel": "Selecionado: {{name}}",
+ "addFolderButton": "Adicionar pasta",
+ "allFolders": "Todas as pastas",
+ "folderLabel": "Pasta",
+ "noFolder": "Sem pasta",
+ "newFolderTitle": "Nova pasta",
+ "folderNameLabel": "Nome da pasta",
+ "createFolderAction": "Criar pasta",
+ "folderCreatedToast": "Pasta criada.",
+ "housekeepingFolder": "Faxina",
+ "calendarItemsFolder": "Itens do calendário",
+ "folderBrowserTitle": "Navegar por pastas"
},
"shortcuts": {
"goKitchen": "Cozinha",
@@ -1215,5 +1309,154 @@
"help": "Atalhos de teclado",
"new": "Criar nova entrada",
"search": "Abrir pesquisa"
+ },
+ "housekeeping": {
+ "title": "Área da faxineira",
+ "bottomNav": "Navegação da faxina",
+ "home": "Início",
+ "tasks": "Tarefas",
+ "report": "Reportar",
+ "notCheckedIn": "Ponto não iniciado",
+ "checkedInAt": "Entrada às",
+ "monthTotal": "Mês atual · {{count}} diárias",
+ "dailyRate": "Valor da diária",
+ "extras": "Extras",
+ "checkIn": "Entrar",
+ "checkOut": "Sair",
+ "quickSupply": "Faltou produto",
+ "supplyName": "Nome do produto",
+ "supplyPlaceholder": "O que faltou?",
+ "checkedInToast": "Entrada registrada.",
+ "checkedOutToast": "Saída registrada.",
+ "supplyAddedToast": "Adicionado à lista de compras.",
+ "overdue": "Atrasada",
+ "dueToday": "Hoje",
+ "ok": "Em dia",
+ "noTasks": "Nenhuma tarefa de faxina cadastrada.",
+ "everyDays": "A cada {{days}} dias",
+ "completeTask": "Concluir {{name}}",
+ "taskDoneToast": "Tarefa concluída.",
+ "reportTitle": "Reportar problema",
+ "problemDescription": "Descrição do problema",
+ "problemPlaceholder": "Ex: lâmpada queimada",
+ "addPhoto": "Adicionar foto",
+ "sendReport": "Enviar ocorrência",
+ "reportSentToast": "Problema reportado.",
+ "recentReports": "Ocorrências recentes",
+ "addTask": "Adicionar tarefa",
+ "taskName": "Tarefa",
+ "taskNamePlaceholder": "Ex: Limpar banheiros",
+ "taskArea": "Área",
+ "taskAreaPlaceholder": "Ex: Banheiro",
+ "taskFrequency": "Frequência",
+ "createTask": "Criar tarefa",
+ "taskCreatedToast": "Tarefa de faxina criada.",
+ "dashboard": "Painel",
+ "reports": "Relatórios",
+ "visitsThisMonth": "Visitas no mês",
+ "lastVisit": "Última visita",
+ "pendingChores": "Tarefas pendentes",
+ "finishedChores": "Tarefas concluídas",
+ "payments": "Pagamentos",
+ "pendingPayments": "Pagamentos pendentes",
+ "monthlyPayments": "Pagamentos mensais",
+ "noPaymentData": "Ainda não há dados de pagamento.",
+ "noVisits": "Nenhuma visita ainda",
+ "noWorkerTitle": "Nenhum perfil de faxineira",
+ "noWorkerHint": "Crie o perfil para definir contatos, diária e agenda de pagamento.",
+ "taskTemplates": "Tarefas sugeridas",
+ "addCustomTask": "Adicionar tarefa personalizada",
+ "noReports": "Nenhuma ocorrência ainda.",
+ "profileTitle": "Perfil da faxineira",
+ "profilePicture": "Foto de perfil da faxineira",
+ "workerName": "Nome",
+ "workerUsername": "Usuário",
+ "workerPhone": "Telefone",
+ "workerEmail": "E-mail",
+ "workerBirthDate": "Aniversário",
+ "paymentSchedule": "Agenda de pagamento",
+ "scheduleDaily": "A cada visita",
+ "scheduleTwiceMonthly": "Duas vezes por mês",
+ "scheduleMonthly": "Mensal",
+ "profileColor": "Cor do perfil",
+ "workerNotes": "Observações",
+ "workerSavedToast": "Perfil da faxineira salvo.",
+ "staff": "Equipe",
+ "staffTitle": "Equipe de faxina",
+ "addWorker": "Adicionar faxineira",
+ "editWorker": "Editar faxineira",
+ "noWorkers": "Nenhuma faxineira cadastrada.",
+ "moreWorkers": "+{{count}} a mais",
+ "checkInDisabled": "Cadastre uma faxineira antes de fazer check-in.",
+ "calendarColor": "Cor no calendário",
+ "visitRecordedAt": "Visita registrada às",
+ "checkedInToday": "Registrada hoje",
+ "visitReports": "Relatórios de visitas da equipe",
+ "noVisitReports": "Nenhuma visita da equipe registrada neste mês.",
+ "openVisitReport": "Abrir relatório da visita",
+ "visitReportDetails": "Relatório da visita",
+ "paymentPaid": "Pago",
+ "paymentPending": "Pendente",
+ "totalPayment": "Pagamento total",
+ "paymentStatus": "Status do pagamento",
+ "paymentTask": "Tarefa de pagamento",
+ "calendarEvent": "Evento do calendário",
+ "notAvailable": "Não disponível",
+ "calendarVisitTitle": "Faxina: {{name}}",
+ "paymentTaskTitle": "Pagar {{name}} pela faxina",
+ "paymentTaskDescription": "Visita de faxina em {{date}}. Valor devido: {{amount}}.",
+ "staffLogTitle": "Visitas de {{name}}",
+ "staffLogHint": "Edite datas, valores e registros vinculados.",
+ "filterMonth": "Mês",
+ "editVisit": "Editar visita",
+ "deleteVisit": "Excluir visita",
+ "deleteVisitConfirm": "Excluir esta visita? O evento do calendário e a tarefa de pagamento vinculados também serão removidos.",
+ "visitDeletedToast": "Visita excluída.",
+ "visitSavedToast": "Visita atualizada.",
+ "visitDate": "Data da visita",
+ "markPaid": "Marcar pago",
+ "visitPaidToast": "Pagamento marcado como pago.",
+ "receiptUploadTitle": "Enviar comprovante de pagamento",
+ "receiptUploadHint": "Anexe um comprovante de pagamento. Ele aparecerá em Documentos.",
+ "receiptDocumentName": "Comprovante - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Comprovante de pagamento da visita de faxina de {{name}} em {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Limpar banheiros",
+ "area": "Banheiros"
+ },
+ "mopKitchenFloor": {
+ "name": "Passar pano no piso da cozinha",
+ "area": "Cozinha"
+ },
+ "dustLivingRoom": {
+ "name": "Tirar pó da sala",
+ "area": "Sala"
+ },
+ "changeBedLinens": {
+ "name": "Trocar roupa de cama",
+ "area": "Quartos"
+ },
+ "cleanRefrigerator": {
+ "name": "Limpar geladeira",
+ "area": "Cozinha"
+ },
+ "cleanWindows": {
+ "name": "Limpar janelas",
+ "area": "Casa toda"
+ },
+ "deepCleanOven": {
+ "name": "Limpeza profunda do forno",
+ "area": "Cozinha"
+ },
+ "washOutdoor": {
+ "name": "Lavar varanda/pátio",
+ "area": "Área externa"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/ru.json b/public/locales/ru.json
index 10fc587..30a6543 100644
--- a/public/locales/ru.json
+++ b/public/locales/ru.json
@@ -54,7 +54,8 @@
"more": "Ещё",
"documents": "Документы",
"kitchen": "Кухня",
- "search": "Поиск"
+ "search": "Поиск",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "Обзор",
@@ -205,7 +206,18 @@
"kanbanArchived": "Архивировано",
"reminderNeedsDueDate": "Установите срок выполнения, чтобы включить напоминания о задаче.",
"emptyAction": "Создать задачу",
- "navLabelOverdue": "Задачи, {{count}} просрочено"
+ "navLabelOverdue": "Задачи, {{count}} просрочено",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Покупки",
@@ -479,7 +491,13 @@
"colorPurple": "Фиолетовый",
"colorRed": "Красный",
"colorSkyBlue": "Небесно-голубой",
- "colorYellow": "Жёлтый"
+ "colorYellow": "Жёлтый",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Вложение загружено для события календаря «{{title}}»."
},
"notes": {
"title": "Заметки",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Семейное планирование. Безопасно. С уважением к приватности. Открытый исходный код.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Добро пожаловать в {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Навигация и модули",
"step2Body": "Внизу доступны Панель управления и Календарь напрямую. Кнопка ··· открывает дополнительные модули: Кухня, Заметки и Контакты.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Перетащите файл сюда или нажмите для выбора",
"dropzoneHint": "Перетащите файл в эту область или используйте выбор файла.",
- "selectedFileLabel": "Выбрано: {{name}}"
+ "selectedFileLabel": "Выбрано: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Уборка",
+ "calendarItemsFolder": "Элементы календаря",
+ "folderBrowserTitle": "Просмотр папок"
},
"shortcuts": {
"goKitchen": "Кухня",
@@ -1215,5 +1309,154 @@
"help": "Горячие клавиши",
"new": "Создать новую запись",
"search": "Открыть поиск"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Убрать ванные комнаты",
+ "area": "Ванные комнаты"
+ },
+ "mopKitchenFloor": {
+ "name": "Вымыть пол на кухне",
+ "area": "Кухня"
+ },
+ "dustLivingRoom": {
+ "name": "Вытереть пыль в гостиной",
+ "area": "Гостиная"
+ },
+ "changeBedLinens": {
+ "name": "Сменить постельное белье",
+ "area": "Спальни"
+ },
+ "cleanRefrigerator": {
+ "name": "Почистить холодильник",
+ "area": "Кухня"
+ },
+ "cleanWindows": {
+ "name": "Помыть окна",
+ "area": "Весь дом"
+ },
+ "deepCleanOven": {
+ "name": "Глубоко очистить духовку",
+ "area": "Кухня"
+ },
+ "washOutdoor": {
+ "name": "Помыть балкон/патио",
+ "area": "Улица"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/sv.json b/public/locales/sv.json
index 3e4f571..da6afd7 100644
--- a/public/locales/sv.json
+++ b/public/locales/sv.json
@@ -54,7 +54,8 @@
"more": "Mer",
"documents": "Dokument",
"kitchen": "Kök",
- "search": "Sök"
+ "search": "Sök",
+ "housekeeping": "Städning"
},
"dashboard": {
"title": "Översikt",
@@ -205,7 +206,18 @@
"kanbanArchived": "Arkiverad",
"reminderNeedsDueDate": "Ange ett förfallodatum för att aktivera påminnelser för uppgiften.",
"emptyAction": "Skapa uppgift",
- "navLabelOverdue": "Uppgifter, {{count}} försenade"
+ "navLabelOverdue": "Uppgifter, {{count}} försenade",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Shopping",
@@ -479,7 +491,13 @@
"colorSkyBlue": "Himmelsblå",
"colorYellow": "Gul",
"colorGray": "Grå",
- "colorCyan": "Cyan"
+ "colorCyan": "Cyan",
+ "iconCleaning": "Städning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Bilaga uppladdad för kalenderhändelsen \"{{title}}\"."
},
"notes": {
"title": "Anteckningar",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Familjeplanering. Säker. Sekretessvänlig. Öppen källkod.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Veckor"
},
"onboarding": {
- "step1Title": "Välkommen till Oikos",
+ "step1Title": "Välkommen till {{name}}",
"step1Body": "Din personliga familjeplanerare. Uppgifter, kalender, shopping och mer – allt på ett ställe.",
"step2Title": "Navigering och moduler",
"step2Body": "Nere på skärmen når du direkt Översikt och Kalender. Med ···-knappen öppnar du fler moduler som Kök, Anteckningar och Kontakter.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Släpp filen här eller klicka för att välja",
"dropzoneHint": "Dra en fil till området eller använd filväljaren.",
- "selectedFileLabel": "Vald: {{name}}"
+ "selectedFileLabel": "Vald: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Städning",
+ "calendarItemsFolder": "Kalenderobjekt",
+ "folderBrowserTitle": "Bläddra bland mappar"
},
"shortcuts": {
"goKitchen": "Kök",
@@ -1215,5 +1309,154 @@
"goCal": "Kalender",
"goShop": "Inköpslista",
"goNotes": "Anteckningar"
+ },
+ "housekeeping": {
+ "title": "Städyta",
+ "bottomNav": "Städnavigation",
+ "home": "Hem",
+ "tasks": "Uppgifter",
+ "report": "Rapportera",
+ "notCheckedIn": "Inte incheckad",
+ "checkedInAt": "Incheckad kl.",
+ "monthTotal": "Aktuell månad · {{count}} pass",
+ "dailyRate": "Dagspris",
+ "extras": "Extra",
+ "checkIn": "Checka in",
+ "checkOut": "Checka ut",
+ "quickSupply": "Produkt saknas",
+ "supplyName": "Produkt",
+ "supplyPlaceholder": "Vad saknas?",
+ "checkedInToast": "Incheckning sparad.",
+ "checkedOutToast": "Utcheckning sparad.",
+ "supplyAddedToast": "Tillagd i inköpslistan.",
+ "overdue": "Försenad",
+ "dueToday": "Idag",
+ "ok": "OK",
+ "noTasks": "Inga städuppgifter ännu.",
+ "everyDays": "Var {{days}} dag",
+ "completeTask": "Slutför {{name}}",
+ "taskDoneToast": "Uppgift slutförd.",
+ "reportTitle": "Rapportera problem",
+ "problemDescription": "Problembeskrivning",
+ "problemPlaceholder": "Exempel: trasig lampa",
+ "addPhoto": "Lägg till foto",
+ "sendReport": "Skicka",
+ "reportSentToast": "Problem rapporterat.",
+ "recentReports": "Senaste rapporter",
+ "addTask": "Lägg till uppgift",
+ "taskName": "Uppgift",
+ "taskNamePlaceholder": "Exempel: städa badrum",
+ "taskArea": "Område",
+ "taskAreaPlaceholder": "Exempel: badrum",
+ "taskFrequency": "Frekvens",
+ "createTask": "Skapa uppgift",
+ "taskCreatedToast": "Städuppgift skapad.",
+ "dashboard": "Översikt",
+ "reports": "Reports",
+ "visitsThisMonth": "Besök denna månad",
+ "lastVisit": "Senaste besök",
+ "pendingChores": "Väntande uppgifter",
+ "finishedChores": "Klarmarkerade uppgifter",
+ "payments": "Betalningar",
+ "pendingPayments": "Väntande betalningar",
+ "monthlyPayments": "Månadsbetalningar",
+ "noPaymentData": "Inga betalningsdata ännu.",
+ "noVisits": "Inga besök ännu",
+ "noWorkerTitle": "Ingen städprofil",
+ "noWorkerHint": "Skapa profilen för kontakt, dagspris och betalningsschema.",
+ "taskTemplates": "Föreslagna uppgifter",
+ "addCustomTask": "Lägg till egen uppgift",
+ "noReports": "Inga rapporter ännu.",
+ "profileTitle": "Städprofil",
+ "profilePicture": "Profilbild",
+ "workerName": "Namn",
+ "workerUsername": "Användarnamn",
+ "workerPhone": "Telefon",
+ "workerEmail": "E-post",
+ "workerBirthDate": "Födelsedag",
+ "paymentSchedule": "Betalningsschema",
+ "scheduleDaily": "Varje besök",
+ "scheduleTwiceMonthly": "Två gånger per månad",
+ "scheduleMonthly": "Månadsvis",
+ "profileColor": "Profilfärg",
+ "workerNotes": "Anteckningar",
+ "workerSavedToast": "Städprofil sparad.",
+ "staff": "Personal",
+ "staffTitle": "Städpersonal",
+ "addWorker": "Lägg till person",
+ "editWorker": "Redigera person",
+ "noWorkers": "Ingen städpersonal registrerad.",
+ "moreWorkers": "+{{count}} fler",
+ "checkInDisabled": "Lägg till personal innan incheckning.",
+ "calendarColor": "Kalenderfärg",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Städa badrum",
+ "area": "Badrum"
+ },
+ "mopKitchenFloor": {
+ "name": "Moppa köksgolvet",
+ "area": "Kök"
+ },
+ "dustLivingRoom": {
+ "name": "Damma vardagsrummet",
+ "area": "Vardagsrum"
+ },
+ "changeBedLinens": {
+ "name": "Byt sängkläder",
+ "area": "Sovrum"
+ },
+ "cleanRefrigerator": {
+ "name": "Rengör kylskåpet",
+ "area": "Kök"
+ },
+ "cleanWindows": {
+ "name": "Putsa fönster",
+ "area": "Hela huset"
+ },
+ "deepCleanOven": {
+ "name": "Djuprengör ugnen",
+ "area": "Kök"
+ },
+ "washOutdoor": {
+ "name": "Tvätta balkong/uteplats",
+ "area": "Utomhus"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/tr.json b/public/locales/tr.json
index f23f427..0750b50 100644
--- a/public/locales/tr.json
+++ b/public/locales/tr.json
@@ -54,7 +54,8 @@
"more": "Daha Fazla",
"documents": "Belgeler",
"kitchen": "Mutfak",
- "search": "Ara"
+ "search": "Ara",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "Genel Bakış",
@@ -205,7 +206,18 @@
"kanbanArchived": "Arşivlenmiş",
"reminderNeedsDueDate": "Görev hatırlatıcılarını etkinleştirmek için bir son tarih belirleyin.",
"emptyAction": "Görev oluştur",
- "navLabelOverdue": "Görevler, {{count}} gecikmiş"
+ "navLabelOverdue": "Görevler, {{count}} gecikmiş",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Alışveriş",
@@ -479,7 +491,13 @@
"colorPurple": "Mor",
"colorRed": "Kırmızı",
"colorSkyBlue": "Gökyüzü mavisi",
- "colorYellow": "Sarı"
+ "colorYellow": "Sarı",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "\"{{title}}\" takvim etkinliği için ek yüklendi."
},
"notes": {
"title": "Notlar",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Aile planlaması. Güvenli. Gizlilik dostu. Açık kaynak.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "{{name}} uygulamasına hoş geldiniz",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Gezinme ve Modüller",
"step2Body": "Aşağıda Gösterge Paneli ve Takvim'e doğrudan erişebilirsiniz. ···-düğmesiyle Mutfak, Notlar ve Kişiler gibi ek modülleri açabilirsiniz.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Dosyayı buraya bırakın veya seçmek için tıklayın",
"dropzoneHint": "Bir dosyayı bu alana sürükleyin veya dosya seçiciyi kullanın.",
- "selectedFileLabel": "Seçildi: {{name}}"
+ "selectedFileLabel": "Seçildi: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Ev temizliği",
+ "calendarItemsFolder": "Takvim öğeleri",
+ "folderBrowserTitle": "Klasörlere göz at"
},
"shortcuts": {
"goKitchen": "Mutfak",
@@ -1215,5 +1309,154 @@
"help": "Klavye kısayolları",
"new": "Yeni giriş oluştur",
"search": "Aramayı aç"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Banyoları temizle",
+ "area": "Banyolar"
+ },
+ "mopKitchenFloor": {
+ "name": "Mutfak zeminini sil",
+ "area": "Mutfak"
+ },
+ "dustLivingRoom": {
+ "name": "Oturma odasının tozunu al",
+ "area": "Oturma odası"
+ },
+ "changeBedLinens": {
+ "name": "Nevresimleri değiştir",
+ "area": "Yatak odaları"
+ },
+ "cleanRefrigerator": {
+ "name": "Buzdolabını temizle",
+ "area": "Mutfak"
+ },
+ "cleanWindows": {
+ "name": "Camları temizle",
+ "area": "Tüm ev"
+ },
+ "deepCleanOven": {
+ "name": "Fırını derinlemesine temizle",
+ "area": "Mutfak"
+ },
+ "washOutdoor": {
+ "name": "Balkon/verandayı yıka",
+ "area": "Dış alan"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/uk.json b/public/locales/uk.json
index a3c1471..015686c 100644
--- a/public/locales/uk.json
+++ b/public/locales/uk.json
@@ -54,7 +54,8 @@
"more": "Більше",
"documents": "Документи",
"kitchen": "Кухня",
- "search": "Пошук"
+ "search": "Пошук",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "Огляд",
@@ -205,7 +206,18 @@
"kanbanArchived": "Архівовано",
"reminderNeedsDueDate": "Встановіть дату виконання, щоб увімкнути нагадування про завдання.",
"emptyAction": "Створити завдання",
- "navLabelOverdue": "Завдання, {{count}} прострочено"
+ "navLabelOverdue": "Завдання, {{count}} прострочено",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "Покупки",
@@ -479,7 +491,13 @@
"colorPurple": "Фіолетовий",
"colorRed": "Червоний",
"colorSkyBlue": "Небесно-блакитний",
- "colorYellow": "Жовтий"
+ "colorYellow": "Жовтий",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "Вкладення завантажено для події календаря «{{title}}»."
},
"notes": {
"title": "Нотатки",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Планування для родини. Безпечно. Конфіденційно. Відкритий код.",
@@ -1120,7 +1203,7 @@
"photoOptional": "Необов'язково: можна зберегти без фото профілю."
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "Ласкаво просимо до {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "Навігація та модулі",
"step2Body": "Унизу ви маєте прямий доступ до Панелі керування та Календаря. Кнопка ··· відкриває додаткові модулі: Кухня, Нотатки та Контакти.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Перетягніть файл сюди або натисніть для вибору",
"dropzoneHint": "Перетягніть файл у цю область або скористайтеся вибором файлу.",
- "selectedFileLabel": "Вибрано: {{name}}"
+ "selectedFileLabel": "Вибрано: {{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "Прибирання",
+ "calendarItemsFolder": "Елементи календаря",
+ "folderBrowserTitle": "Перегляд папок"
},
"shortcuts": {
"goKitchen": "Кухня",
@@ -1215,5 +1309,154 @@
"help": "Гарячі клавіші",
"new": "Створити новий запис",
"search": "Відкрити пошук"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "Прибрати ванні кімнати",
+ "area": "Ванні кімнати"
+ },
+ "mopKitchenFloor": {
+ "name": "Помити підлогу на кухні",
+ "area": "Кухня"
+ },
+ "dustLivingRoom": {
+ "name": "Витерти пил у вітальні",
+ "area": "Вітальня"
+ },
+ "changeBedLinens": {
+ "name": "Змінити постільну білизну",
+ "area": "Спальні"
+ },
+ "cleanRefrigerator": {
+ "name": "Почистити холодильник",
+ "area": "Кухня"
+ },
+ "cleanWindows": {
+ "name": "Помити вікна",
+ "area": "Увесь дім"
+ },
+ "deepCleanOven": {
+ "name": "Глибоко очистити духовку",
+ "area": "Кухня"
+ },
+ "washOutdoor": {
+ "name": "Помити балкон/патіо",
+ "area": "Надворі"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/zh.json b/public/locales/zh.json
index 5e629f9..2ce9ffb 100644
--- a/public/locales/zh.json
+++ b/public/locales/zh.json
@@ -54,7 +54,8 @@
"more": "更多",
"documents": "文档",
"kitchen": "厨房",
- "search": "搜索"
+ "search": "搜索",
+ "housekeeping": "Housekeeping"
},
"dashboard": {
"title": "概览",
@@ -205,7 +206,18 @@
"kanbanArchived": "已归档",
"reminderNeedsDueDate": "设置截止日期以启用任务提醒。",
"emptyAction": "创建任务",
- "navLabelOverdue": "任务,{{count}} 项已逾期"
+ "navLabelOverdue": "任务,{{count}} 项已逾期",
+ "bulkArchive": "Archive",
+ "bulkArchived": "Tasks archived.",
+ "bulkDelete": "Delete",
+ "bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
+ "bulkDeleted": "Tasks deleted.",
+ "bulkMarkDone": "Mark done",
+ "bulkMarkOpen": "Mark open",
+ "bulkSelect": "Bulk select",
+ "bulkSelectedCount": "{{count}} selected",
+ "bulkStatusChanged": "Status changed.",
+ "selectTask": "Select task"
},
"shopping": {
"title": "购物",
@@ -479,7 +491,13 @@
"colorPurple": "紫色",
"colorRed": "红色",
"colorSkyBlue": "天蓝色",
- "colorYellow": "黄色"
+ "colorYellow": "黄色",
+ "iconCleaning": "Cleaning",
+ "caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
+ "caldavTargetLabel": "Sync to CalDAV",
+ "caldavTargetLocal": "Store locally only",
+ "attachmentDocumentName": "{{title}} - {{name}}",
+ "attachmentDocumentDescription": "为日历事件“{{title}}”上传的附件。"
},
"notes": {
"title": "便签板",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
- "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
+ "deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
+ "sectionHousekeeping": "Housekeeping",
+ "housekeepingPaymentsTitle": "Payment tasks",
+ "housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
+ "housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
+ "housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
+ "backupSchedulerDisabled": "Disabled",
+ "backupSchedulerEnabled": "Enabled",
+ "backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
+ "backupSchedulerKeep": "Retention",
+ "backupSchedulerKeepCount": "{{count}} backups",
+ "backupSchedulerLastBackup": "Last backup",
+ "backupSchedulerLastFail": "{{date}} (failed)",
+ "backupSchedulerLastSuccess": "{{date}} (successful)",
+ "backupSchedulerNever": "No backup created yet",
+ "backupSchedulerSchedule": "Schedule",
+ "backupSchedulerStatus": "Status",
+ "backupSchedulerTitle": "Automatic Backups",
+ "backupSchedulerTrigger": "Create backup now",
+ "backupSchedulerTriggeredToast": "Backup created successfully.",
+ "backupSchedulerTriggering": "Creating backup...",
+ "breadcrumbLabel": "Pfad",
+ "caldavAccountAdded": "CalDAV account added successfully",
+ "caldavAccountDeleted": "CalDAV account removed",
+ "caldavAddAccount": "Add CalDAV Account",
+ "caldavCalendarsToggle": "Show/hide calendars",
+ "caldavConnectionFailed": "Connection to CalDAV server failed",
+ "caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
+ "caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
+ "caldavNameLabel": "Account Name",
+ "caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
+ "caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
+ "caldavPasswordLabel": "Password",
+ "caldavRefreshCalendars": "Refresh calendars",
+ "caldavSyncFailed": "CalDAV sync failed",
+ "caldavSyncSuccess": "CalDAV sync successful",
+ "caldavTitle": "CalDAV Calendars",
+ "caldavUrlHint": "The base URL of your CalDAV server",
+ "caldavUsernameLabel": "Username",
+ "calendarDisabled": "Calendar disabled",
+ "calendarEnabled": "Calendar enabled",
+ "calendarsRefreshed": "Calendars refreshed",
+ "deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
+ "emptyStateAddFirst": "Füge dein erstes Konto hinzu",
+ "emptyStateNoAccounts": "Noch keine Konten verbunden",
+ "helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
+ "helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
+ "lastSync": "Last synced",
+ "modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
+ "modulesSaved": "Module visibility saved.",
+ "modulesTitle": "Active modules",
+ "navigationLabel": "Einstellungsnavigation",
+ "sectionAdmin": "Administration",
+ "sectionCloudServices": "Cloud-Dienste",
+ "sectionModules": "Modules",
+ "sectionModulesNav": "Module",
+ "sectionOpenStandards": "CalDAV & CardDAV",
+ "sectionPersonal": "Persönlich",
+ "sectionSync": "Synchronisation",
+ "statusError": "Fehler",
+ "statusNeverSynced": "Noch nie synchronisiert",
+ "statusSynced": "Synchronisiert",
+ "statusSyncing": "Synchronisiert…",
+ "syncedAgo": "vor {{time}}",
+ "tabSyncCalendar": "Kalender",
+ "tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "家庭规划。安全。注重隐私。开源。",
@@ -1120,7 +1203,7 @@
"customWeeks": "Weeks"
},
"onboarding": {
- "step1Title": "Welcome to Oikos",
+ "step1Title": "欢迎使用{{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more – all in one place.",
"step2Title": "导航与模块",
"step2Body": "底部可直接访问仪表板和日历。点击···按钮可打开厨房、笔记和联系人等更多模块。",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "将文件拖到此处或点击选择",
"dropzoneHint": "将文件拖入此区域,或使用文件选择器。",
- "selectedFileLabel": "已选择:{{name}}"
+ "selectedFileLabel": "已选择:{{name}}",
+ "addFolderButton": "Add folder",
+ "allFolders": "All folders",
+ "folderLabel": "Folder",
+ "noFolder": "No folder",
+ "newFolderTitle": "New folder",
+ "folderNameLabel": "Folder name",
+ "createFolderAction": "Create folder",
+ "folderCreatedToast": "Folder created.",
+ "housekeepingFolder": "家政清洁",
+ "calendarItemsFolder": "日历项目",
+ "folderBrowserTitle": "浏览文件夹"
},
"shortcuts": {
"goKitchen": "厨房",
@@ -1215,5 +1309,154 @@
"help": "键盘快捷键",
"new": "创建新条目",
"search": "打开搜索"
+ },
+ "housekeeping": {
+ "title": "Cleaner workspace",
+ "bottomNav": "Housekeeping navigation",
+ "home": "Home",
+ "tasks": "Tasks",
+ "report": "Report",
+ "notCheckedIn": "Not checked in",
+ "checkedInAt": "Checked in at",
+ "monthTotal": "Current month · {{count}} sessions",
+ "dailyRate": "Daily rate",
+ "extras": "Extras",
+ "checkIn": "Check in",
+ "checkOut": "Check out",
+ "quickSupply": "Missing product",
+ "supplyName": "Product name",
+ "supplyPlaceholder": "What is missing?",
+ "checkedInToast": "Check-in recorded.",
+ "checkedOutToast": "Check-out recorded.",
+ "supplyAddedToast": "Added to the shopping list.",
+ "overdue": "Overdue",
+ "dueToday": "Due today",
+ "ok": "OK",
+ "noTasks": "No housekeeping tasks yet.",
+ "everyDays": "Every {{days}} days",
+ "completeTask": "Complete {{name}}",
+ "taskDoneToast": "Task completed.",
+ "reportTitle": "Report a problem",
+ "problemDescription": "Problem description",
+ "problemPlaceholder": "Example: burnt-out light bulb",
+ "addPhoto": "Add photo",
+ "sendReport": "Send report",
+ "reportSentToast": "Problem reported.",
+ "recentReports": "Recent reports",
+ "addTask": "Add task",
+ "taskName": "Task",
+ "taskNamePlaceholder": "Example: Clean bathrooms",
+ "taskArea": "Area",
+ "taskAreaPlaceholder": "Example: Bathroom",
+ "taskFrequency": "Frequency",
+ "createTask": "Create task",
+ "taskCreatedToast": "Housekeeping task created.",
+ "dashboard": "Dashboard",
+ "reports": "Reports",
+ "visitsThisMonth": "Visits this month",
+ "lastVisit": "Last visit",
+ "pendingChores": "Pending chores",
+ "finishedChores": "Finished chores",
+ "payments": "Payments",
+ "pendingPayments": "Pending payments",
+ "monthlyPayments": "Monthly payments",
+ "noPaymentData": "No payment data yet.",
+ "noVisits": "No visits yet",
+ "noWorkerTitle": "No housekeeper profile",
+ "noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
+ "taskTemplates": "Suggested chores",
+ "addCustomTask": "Add custom chore",
+ "noReports": "No reports yet.",
+ "profileTitle": "Housekeeper profile",
+ "profilePicture": "Housekeeper profile picture",
+ "workerName": "Name",
+ "workerUsername": "Username",
+ "workerPhone": "Phone",
+ "workerEmail": "Email",
+ "workerBirthDate": "Birthday",
+ "paymentSchedule": "Payment schedule",
+ "scheduleDaily": "Every visit",
+ "scheduleTwiceMonthly": "Twice a month",
+ "scheduleMonthly": "Monthly",
+ "profileColor": "Profile color",
+ "workerNotes": "Notes",
+ "workerSavedToast": "Housekeeper profile saved.",
+ "staff": "Staff",
+ "staffTitle": "Housekeeping staff",
+ "addWorker": "Add housekeeper",
+ "editWorker": "Edit housekeeper",
+ "noWorkers": "No housekeepers registered yet.",
+ "moreWorkers": "+{{count}} more",
+ "checkInDisabled": "Add a housekeeper before checking in.",
+ "calendarColor": "Calendar color",
+ "visitRecordedAt": "Visit recorded at",
+ "checkedInToday": "Recorded today",
+ "visitReports": "Staff visit reports",
+ "noVisitReports": "No staff visits recorded this month.",
+ "openVisitReport": "Open visit report",
+ "visitReportDetails": "Visit report",
+ "paymentPaid": "Paid",
+ "paymentPending": "Pending",
+ "totalPayment": "Total payment",
+ "paymentStatus": "Payment status",
+ "paymentTask": "Payment task",
+ "calendarEvent": "Calendar event",
+ "notAvailable": "Not available",
+ "calendarVisitTitle": "Housekeeping: {{name}}",
+ "paymentTaskTitle": "Pay {{name}} for housekeeping",
+ "paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
+ "staffLogTitle": "{{name}} visits",
+ "staffLogHint": "Edit visit dates, amounts, and linked records.",
+ "filterMonth": "Month",
+ "editVisit": "Edit visit",
+ "deleteVisit": "Delete visit",
+ "deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
+ "visitDeletedToast": "Visit deleted.",
+ "visitSavedToast": "Visit updated.",
+ "visitDate": "Visit date",
+ "markPaid": "Mark paid",
+ "visitPaidToast": "Payment marked as paid.",
+ "receiptUploadTitle": "Upload payment receipt",
+ "receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
+ "receiptDocumentName": "Receipt - {{name}} - {{date}}",
+ "receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
+ "taskTemplateData": {
+ "cleanBathrooms": {
+ "name": "清洁浴室",
+ "area": "浴室"
+ },
+ "mopKitchenFloor": {
+ "name": "拖厨房地板",
+ "area": "厨房"
+ },
+ "dustLivingRoom": {
+ "name": "客厅除尘",
+ "area": "客厅"
+ },
+ "changeBedLinens": {
+ "name": "更换床上用品",
+ "area": "卧室"
+ },
+ "cleanRefrigerator": {
+ "name": "清洁冰箱",
+ "area": "厨房"
+ },
+ "cleanWindows": {
+ "name": "擦窗户",
+ "area": "全屋"
+ },
+ "deepCleanOven": {
+ "name": "深度清洁烤箱",
+ "area": "厨房"
+ },
+ "washOutdoor": {
+ "name": "清洗阳台/露台",
+ "area": "户外"
+ }
+ }
+ },
+ "userMultiSelect": {
+ "moreUsers": "weitere",
+ "nobody": "- Niemand -"
}
-}
\ No newline at end of file
+}
diff --git a/public/pages/calendar.js b/public/pages/calendar.js
index fffc6b0..2ec6790 100644
--- a/public/pages/calendar.js
+++ b/public/pages/calendar.js
@@ -181,7 +181,7 @@ const EVENT_ICON_CATEGORIES = () => [
{ value: 'building', label: t('calendar.iconBuilding') },
{ value: 'wrench', label: t('calendar.iconRepair') },
{ value: 'hammer', label: t('calendar.iconMaintenance') },
- { value: 'paintbrush', label: t('calendar.iconDecoration') },
+ { value: 'paintbrush', label: t('calendar.iconCleaning') },
{ value: 'sofa', label: t('calendar.iconFurniture') },
{ value: 'washing-machine', label: t('calendar.iconLaundry') },
],
@@ -210,6 +210,98 @@ const CALENDAR_VIEW_STORAGE_KEY = 'oikos-calendar-view';
const HOUR_HEIGHT = 56; // px pro Stunde in Wochen-/Tagesansicht
+function renderIconPickerResults(selectedIcon, query = '') {
+ const q = query.trim().toLowerCase();
+ if (q) {
+ const filtered = EVENT_ICON_CATEGORIES()
+ .flatMap((c) => c.icons)
+ .filter((icon) => icon.label.toLowerCase().includes(q) || icon.value.includes(q));
+ if (filtered.length === 0) {
+ return `