feat: add housekeeping module for household staff management
* Adding flexible reminder options to birthdays * Fix database migration merge conflict * Truncate calendar popup descriptions * Log app version on backend startup * Add host-mounted data and backup folders * feat: add housekeeping module * fix: align housekeeping UI and add task creation * refactor: rebuild housekeeping experience * feat: support multiple housekeeping staff * feat: integrate housekeeping visits with calendar * feat: refine housekeeping visits and payments * feat: add housekeeping staff visit logs * feat: add housekeeping receipts and document folders * feat: localize housekeeping folders and chores * feat: refine housekeeping tabs and document folders * fix: sync housekeeping tab active state * feat: use configured app name in onboarding and manifest
This commit is contained in:
+250
-7
@@ -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 -"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user