Merge branch 'main' of github.com:rafaelfoster/oikos

This commit is contained in:
Rafael Foster
2026-04-29 08:13:48 -03:00
19 changed files with 548 additions and 386 deletions
+11
View File
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.32.2] - 2026-04-29
### Changed
- Bottom navigation restructured: Dashboard, Tasks, Calendar as first three primary slots; Search promoted to a dedicated fourth bottom-nav button (no longer buried in the More sheet)
- Sidebar tooltips added for the collapsed mode (10241439 px) — hovering an icon now shows a label tooltip so module names remain discoverable without expanding the sidebar
## [0.32.1] - 2026-04-29
### Fixed
- i18n: complete documents and tasks translations for all 15 locales — gridView, listView, viewToggle, file labels, action labels, toast messages, status labels, and the five new tasks keys (statusArchived, archiveButton, archivedToast, kanbanArchived, reminderNeedsDueDate) were untranslated in all non-English locales (#103)
## [0.32.0] - 2026-04-29 ## [0.32.0] - 2026-04-29
### Added ### Added
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "oikos", "name": "oikos",
"version": "0.32.0", "version": "0.32.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "oikos", "name": "oikos",
"version": "0.32.0", "version": "0.32.2",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"bcrypt": "^6.0.0", "bcrypt": "^6.0.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "oikos", "name": "oikos",
"version": "0.32.0", "version": "0.32.2",
"description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.",
"main": "server/index.js", "main": "server/index.js",
"type": "module", "type": "module",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "الأولوية", "filterGroupPriority": "الأولوية",
"filterGroupStatus": "الحالة", "filterGroupStatus": "الحالة",
"swipedDoneToast": "تم وضع علامة مكتمل.", "swipedDoneToast": "تم وضع علامة مكتمل.",
"swipedOpenToast": "تم وضع علامة مفتوح." "swipedOpenToast": "تم وضع علامة مفتوح.",
"statusArchived": "مؤرشف",
"archiveButton": "أرشفة المهمة",
"archivedToast": "تم أرشفة المهمة.",
"kanbanArchived": "مؤرشف",
"reminderNeedsDueDate": "حدّد تاريخ استحقاق لتفعيل تذكيرات المهمة."
}, },
"shopping": { "shopping": {
"title": "التسوق", "title": "التسوق",
@@ -903,38 +908,38 @@
"title": "المستندات", "title": "المستندات",
"addButton": "إضافة مستند", "addButton": "إضافة مستند",
"searchPlaceholder": "البحث في المستندات...", "searchPlaceholder": "البحث في المستندات...",
"gridView": "Grid view", "gridView": "عرض شبكي",
"listView": "List view", "listView": "عرض قائمة",
"viewToggle": "Document view", "viewToggle": "عرض المستندات",
"allCategories": "كل الفئات", "allCategories": "كل الفئات",
"emptyTitle": "لا توجد مستندات بعد", "emptyTitle": "لا توجد مستندات بعد",
"emptyDescription": "ارفع مستندات العائلة وتحكم في من يمكنه رؤية كل ملف.", "emptyDescription": "ارفع مستندات العائلة وتحكم في من يمكنه رؤية كل ملف.",
"newTitle": "مستند جديد", "newTitle": "مستند جديد",
"editTitle": "إعدادات المستند", "editTitle": "إعدادات المستند",
"nameLabel": "Name", "nameLabel": "الاسم",
"descriptionLabel": "Description", "descriptionLabel": "الوصف",
"categoryLabel": "Category", "categoryLabel": "الفئة",
"fileLabel": "File", "fileLabel": "الملف",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "ملفات PDF والصور والنصوص وملفات Office حتى 5 ميغابايت.",
"visibilityLabel": "Visibility", "visibilityLabel": "مستوى الرؤية",
"statusLabel": "Status", "statusLabel": "الحالة",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "الأعضاء المسموح لهم",
"uploadAction": "Upload", "uploadAction": "رفع",
"downloadAction": "Download", "downloadAction": "تحميل",
"editAction": "Settings", "editAction": "إعدادات",
"archiveAction": "Archive", "archiveAction": "أرشفة",
"restoreAction": "Restore", "restoreAction": "استعادة",
"savedToast": "Document saved.", "savedToast": "تم حفظ المستند.",
"uploadedToast": "Document uploaded.", "uploadedToast": "تم رفع المستند.",
"archivedToast": "Document archived.", "archivedToast": "تم أرشفة المستند.",
"restoredToast": "Document restored.", "restoredToast": "تم استعادة المستند.",
"deletedToast": "Document deleted.", "deletedToast": "تم حذف المستند.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "حذف المستند \"{{name}}\"؟",
"fileRequired": "Select a file to upload.", "fileRequired": "يرجى اختيار ملف للرفع.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "يجب ألا يتجاوز حجم الملف 5 ميغابايت.",
"fileReadError": "File could not be read.", "fileReadError": "تعذّر قراءة الملف.",
"statusActive": "Active", "statusActive": "نشط",
"statusArchived": "Archived", "statusArchived": "مؤرشف",
"visibility": { "visibility": {
"family": "كل العائلة", "family": "كل العائلة",
"restricted": "أعضاء محددون", "restricted": "أعضاء محددون",
+31 -26
View File
@@ -187,7 +187,12 @@
"filterGroupPriority": "Priorität", "filterGroupPriority": "Priorität",
"filterGroupPerson": "Person", "filterGroupPerson": "Person",
"filterClearAll": "Alle Filter zurücksetzen", "filterClearAll": "Alle Filter zurücksetzen",
"navLabelOverdue": "Aufgaben, {{count}} überfällig" "navLabelOverdue": "Aufgaben, {{count}} überfällig",
"statusArchived": "Archiviert",
"archiveButton": "Aufgabe archivieren",
"archivedToast": "Aufgabe archiviert.",
"kanbanArchived": "Archiviert",
"reminderNeedsDueDate": "Lege ein Fälligkeitsdatum fest, um Aufgabenerinnerungen zu aktivieren."
}, },
"shopping": { "shopping": {
"title": "Einkauf", "title": "Einkauf",
@@ -941,38 +946,38 @@
"title": "Dokumente", "title": "Dokumente",
"addButton": "Dokument hinzufügen", "addButton": "Dokument hinzufügen",
"searchPlaceholder": "Dokumente suchen...", "searchPlaceholder": "Dokumente suchen...",
"gridView": "Grid view", "gridView": "Rasteransicht",
"listView": "List view", "listView": "Listenansicht",
"viewToggle": "Document view", "viewToggle": "Dokumentansicht",
"allCategories": "Alle Kategorien", "allCategories": "Alle Kategorien",
"emptyTitle": "Noch keine Dokumente", "emptyTitle": "Noch keine Dokumente",
"emptyDescription": "Lade Familiendokumente hoch und steuere, wer jede Datei sehen darf.", "emptyDescription": "Lade Familiendokumente hoch und steuere, wer jede Datei sehen darf.",
"newTitle": "Neues Dokument", "newTitle": "Neues Dokument",
"editTitle": "Dokumenteinstellungen", "editTitle": "Dokumenteinstellungen",
"nameLabel": "Name", "nameLabel": "Name",
"descriptionLabel": "Description", "descriptionLabel": "Beschreibung",
"categoryLabel": "Category", "categoryLabel": "Kategorie",
"fileLabel": "File", "fileLabel": "Datei",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, Bilder, Text und Office-Dateien bis zu 5 MB.",
"visibilityLabel": "Visibility", "visibilityLabel": "Sichtbarkeit",
"statusLabel": "Status", "statusLabel": "Status",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Erlaubte Mitglieder",
"uploadAction": "Upload", "uploadAction": "Hochladen",
"downloadAction": "Download", "downloadAction": "Herunterladen",
"editAction": "Settings", "editAction": "Einstellungen",
"archiveAction": "Archive", "archiveAction": "Archivieren",
"restoreAction": "Restore", "restoreAction": "Wiederherstellen",
"savedToast": "Document saved.", "savedToast": "Dokument gespeichert.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Dokument hochgeladen.",
"archivedToast": "Document archived.", "archivedToast": "Dokument archiviert.",
"restoredToast": "Document restored.", "restoredToast": "Dokument wiederhergestellt.",
"deletedToast": "Document deleted.", "deletedToast": "Dokument gelöscht.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Dokument \"{{name}}\" löschen?",
"fileRequired": "Select a file to upload.", "fileRequired": "Bitte wähle eine Datei aus.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Die Datei darf höchstens 5 MB groß sein.",
"fileReadError": "File could not be read.", "fileReadError": "Die Datei konnte nicht gelesen werden.",
"statusActive": "Active", "statusActive": "Aktiv",
"statusArchived": "Archived", "statusArchived": "Archiviert",
"visibility": { "visibility": {
"family": "Ganze Familie", "family": "Ganze Familie",
"restricted": "Ausgewählte Mitglieder", "restricted": "Ausgewählte Mitglieder",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Προτεραιότητα", "filterGroupPriority": "Προτεραιότητα",
"filterGroupStatus": "Κατάσταση", "filterGroupStatus": "Κατάσταση",
"swipedDoneToast": "Επισημάνθηκε ως ολοκληρωμένο.", "swipedDoneToast": "Επισημάνθηκε ως ολοκληρωμένο.",
"swipedOpenToast": "Επισημάνθηκε ως ανοιχτό." "swipedOpenToast": "Επισημάνθηκε ως ανοιχτό.",
"statusArchived": "Αρχειοθετημένο",
"archiveButton": "Αρχειοθέτηση εργασίας",
"archivedToast": "Η εργασία αρχειοθετήθηκε.",
"kanbanArchived": "Αρχειοθετημένο",
"reminderNeedsDueDate": "Ορίστε ημερομηνία λήξης για να ενεργοποιήσετε τις υπενθυμίσεις."
}, },
"shopping": { "shopping": {
"title": "Αγορές", "title": "Αγορές",
@@ -903,38 +908,38 @@
"title": "Έγγραφα", "title": "Έγγραφα",
"addButton": "Προσθήκη εγγράφου", "addButton": "Προσθήκη εγγράφου",
"searchPlaceholder": "Αναζήτηση εγγράφων...", "searchPlaceholder": "Αναζήτηση εγγράφων...",
"gridView": "Grid view", "gridView": "Προβολή πλέγματος",
"listView": "List view", "listView": "Προβολή λίστας",
"viewToggle": "Document view", "viewToggle": "Προβολή εγγράφων",
"allCategories": "Όλες οι κατηγορίες", "allCategories": "Όλες οι κατηγορίες",
"emptyTitle": "Δεν υπάρχουν έγγραφα ακόμα", "emptyTitle": "Δεν υπάρχουν έγγραφα ακόμα",
"emptyDescription": "Ανεβάστε οικογενειακά έγγραφα και ελέγξτε ποιος μπορεί να βλέπει κάθε αρχείο.", "emptyDescription": "Ανεβάστε οικογενειακά έγγραφα και ελέγξτε ποιος μπορεί να βλέπει κάθε αρχείο.",
"newTitle": "Νέο έγγραφο", "newTitle": "Νέο έγγραφο",
"editTitle": "Ρυθμίσεις εγγράφου", "editTitle": "Ρυθμίσεις εγγράφου",
"nameLabel": "Name", "nameLabel": "Όνομα",
"descriptionLabel": "Description", "descriptionLabel": "Περιγραφή",
"categoryLabel": "Category", "categoryLabel": "Κατηγορία",
"fileLabel": "File", "fileLabel": "Αρχείο",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, εικόνες, κείμενο και αρχεία Office έως 5 MB.",
"visibilityLabel": "Visibility", "visibilityLabel": "Ορατότητα",
"statusLabel": "Status", "statusLabel": "Κατάσταση",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Επιτρεπόμενα μέλη",
"uploadAction": "Upload", "uploadAction": "Μεταφόρτωση",
"downloadAction": "Download", "downloadAction": "Λήψη",
"editAction": "Settings", "editAction": "Ρυθμίσεις",
"archiveAction": "Archive", "archiveAction": "Αρχειοθέτηση",
"restoreAction": "Restore", "restoreAction": "Επαναφορά",
"savedToast": "Document saved.", "savedToast": "Το έγγραφο αποθηκεύτηκε.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Το έγγραφο ανέβηκε.",
"archivedToast": "Document archived.", "archivedToast": "Το έγγραφο αρχειοθετήθηκε.",
"restoredToast": "Document restored.", "restoredToast": "Το έγγραφο επαναφέρθηκε.",
"deletedToast": "Document deleted.", "deletedToast": "Το έγγραφο διαγράφηκε.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Διαγραφή εγγράφου \"{{name}}\";",
"fileRequired": "Select a file to upload.", "fileRequired": "Επιλέξτε ένα αρχείο για μεταφόρτωση.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Το αρχείο μπορεί να είναι έως 5 MB.",
"fileReadError": "File could not be read.", "fileReadError": "Δεν ήταν δυνατή η ανάγνωση του αρχείου.",
"statusActive": "Active", "statusActive": "Ενεργό",
"statusArchived": "Archived", "statusArchived": "Αρχειοθετημένο",
"visibility": { "visibility": {
"family": "Όλη η οικογένεια", "family": "Όλη η οικογένεια",
"restricted": "Επιλεγμένα μέλη", "restricted": "Επιλεγμένα μέλη",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Prioridad", "filterGroupPriority": "Prioridad",
"filterGroupStatus": "Estado", "filterGroupStatus": "Estado",
"swipedDoneToast": "Marcado como hecho.", "swipedDoneToast": "Marcado como hecho.",
"swipedOpenToast": "Marcado como abierto." "swipedOpenToast": "Marcado como abierto.",
"statusArchived": "Archivado",
"archiveButton": "Archivar tarea",
"archivedToast": "Tarea archivada.",
"kanbanArchived": "Archivado",
"reminderNeedsDueDate": "Establece una fecha de vencimiento para activar los recordatorios de tareas."
}, },
"shopping": { "shopping": {
"title": "Compras", "title": "Compras",
@@ -903,38 +908,38 @@
"title": "Documentos", "title": "Documentos",
"addButton": "Agregar documento", "addButton": "Agregar documento",
"searchPlaceholder": "Buscar documentos...", "searchPlaceholder": "Buscar documentos...",
"gridView": "Grid view", "gridView": "Vista de cuadrícula",
"listView": "List view", "listView": "Vista de lista",
"viewToggle": "Document view", "viewToggle": "Vista de documentos",
"allCategories": "Todas las categorías", "allCategories": "Todas las categorías",
"emptyTitle": "Aún no hay documentos", "emptyTitle": "Aún no hay documentos",
"emptyDescription": "Sube documentos familiares y controla quién puede ver cada archivo.", "emptyDescription": "Sube documentos familiares y controla quién puede ver cada archivo.",
"newTitle": "Nuevo documento", "newTitle": "Nuevo documento",
"editTitle": "Configuración del documento", "editTitle": "Configuración del documento",
"nameLabel": "Name", "nameLabel": "Nombre",
"descriptionLabel": "Description", "descriptionLabel": "Descripción",
"categoryLabel": "Category", "categoryLabel": "Categoría",
"fileLabel": "File", "fileLabel": "Archivo",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, imágenes, texto y archivos Office de hasta 5 MB.",
"visibilityLabel": "Visibility", "visibilityLabel": "Visibilidad",
"statusLabel": "Status", "statusLabel": "Estado",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Miembros permitidos",
"uploadAction": "Upload", "uploadAction": "Subir",
"downloadAction": "Download", "downloadAction": "Descargar",
"editAction": "Settings", "editAction": "Configuración",
"archiveAction": "Archive", "archiveAction": "Archivar",
"restoreAction": "Restore", "restoreAction": "Restaurar",
"savedToast": "Document saved.", "savedToast": "Documento guardado.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Documento subido.",
"archivedToast": "Document archived.", "archivedToast": "Documento archivado.",
"restoredToast": "Document restored.", "restoredToast": "Documento restaurado.",
"deletedToast": "Document deleted.", "deletedToast": "Documento eliminado.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "¿Eliminar documento \"{{name}}\"?",
"fileRequired": "Select a file to upload.", "fileRequired": "Selecciona un archivo para subir.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "El archivo puede tener como máximo 5 MB.",
"fileReadError": "File could not be read.", "fileReadError": "No se pudo leer el archivo.",
"statusActive": "Active", "statusActive": "Activo",
"statusArchived": "Archived", "statusArchived": "Archivado",
"visibility": { "visibility": {
"family": "Toda la familia", "family": "Toda la familia",
"restricted": "Miembros seleccionados", "restricted": "Miembros seleccionados",
+32 -27
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Priorité", "filterGroupPriority": "Priorité",
"filterGroupStatus": "Statut", "filterGroupStatus": "Statut",
"swipedDoneToast": "Marqué comme terminé.", "swipedDoneToast": "Marqué comme terminé.",
"swipedOpenToast": "Marqué comme ouvert." "swipedOpenToast": "Marqué comme ouvert.",
"statusArchived": "Archivé",
"archiveButton": "Archiver la tâche",
"archivedToast": "Tâche archivée.",
"kanbanArchived": "Archivé",
"reminderNeedsDueDate": "Définissez une date d'échéance pour activer les rappels de tâche."
}, },
"shopping": { "shopping": {
"title": "Courses", "title": "Courses",
@@ -903,38 +908,38 @@
"title": "Documents", "title": "Documents",
"addButton": "Ajouter un document", "addButton": "Ajouter un document",
"searchPlaceholder": "Rechercher des documents...", "searchPlaceholder": "Rechercher des documents...",
"gridView": "Grid view", "gridView": "Vue en grille",
"listView": "List view", "listView": "Vue en liste",
"viewToggle": "Document view", "viewToggle": "Vue des documents",
"allCategories": "Toutes les catégories", "allCategories": "Toutes les catégories",
"emptyTitle": "Aucun document pour le moment", "emptyTitle": "Aucun document pour le moment",
"emptyDescription": "Ajoutez des documents familiaux et contrôlez qui peut voir chaque fichier.", "emptyDescription": "Ajoutez des documents familiaux et contrôlez qui peut voir chaque fichier.",
"newTitle": "Nouveau document", "newTitle": "Nouveau document",
"editTitle": "Paramètres du document", "editTitle": "Paramètres du document",
"nameLabel": "Name", "nameLabel": "Nom",
"descriptionLabel": "Description", "descriptionLabel": "Description",
"categoryLabel": "Category", "categoryLabel": "Catégorie",
"fileLabel": "File", "fileLabel": "Fichier",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, images, texte et fichiers Office jusqu'à 5 Mo.",
"visibilityLabel": "Visibility", "visibilityLabel": "Visibilité",
"statusLabel": "Status", "statusLabel": "Statut",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Membres autorisés",
"uploadAction": "Upload", "uploadAction": "Téléverser",
"downloadAction": "Download", "downloadAction": "Télécharger",
"editAction": "Settings", "editAction": "Paramètres",
"archiveAction": "Archive", "archiveAction": "Archiver",
"restoreAction": "Restore", "restoreAction": "Restaurer",
"savedToast": "Document saved.", "savedToast": "Document enregistré.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Document téléversé.",
"archivedToast": "Document archived.", "archivedToast": "Document archivé.",
"restoredToast": "Document restored.", "restoredToast": "Document restauré.",
"deletedToast": "Document deleted.", "deletedToast": "Document supprimé.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Supprimer le document \"{{name}}\" ?",
"fileRequired": "Select a file to upload.", "fileRequired": "Sélectionnez un fichier à téléverser.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Le fichier ne peut pas dépasser 5 Mo.",
"fileReadError": "File could not be read.", "fileReadError": "Impossible de lire le fichier.",
"statusActive": "Active", "statusActive": "Actif",
"statusArchived": "Archived", "statusArchived": "Archivé",
"visibility": { "visibility": {
"family": "Toute la famille", "family": "Toute la famille",
"restricted": "Membres sélectionnés", "restricted": "Membres sélectionnés",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "प्राथमिकता", "filterGroupPriority": "प्राथमिकता",
"filterGroupStatus": "स्थिति", "filterGroupStatus": "स्थिति",
"swipedDoneToast": "पूर्ण के रूप में चिह्नित।", "swipedDoneToast": "पूर्ण के रूप में चिह्नित।",
"swipedOpenToast": "खुले के रूप में चिह्नित।" "swipedOpenToast": "खुले के रूप में चिह्नित।",
"statusArchived": "संग्रहित",
"archiveButton": "कार्य संग्रहित करें",
"archivedToast": "कार्य संग्रहित किया गया।",
"kanbanArchived": "संग्रहित",
"reminderNeedsDueDate": "कार्य अनुस्मारक सक्षम करने के लिए एक नियत तारीख निर्धारित करें।"
}, },
"shopping": { "shopping": {
"title": "खरीदारी", "title": "खरीदारी",
@@ -903,38 +908,38 @@
"title": "दस्तावेज़", "title": "दस्तावेज़",
"addButton": "दस्तावेज़ जोड़ें", "addButton": "दस्तावेज़ जोड़ें",
"searchPlaceholder": "दस्तावेज़ खोजें...", "searchPlaceholder": "दस्तावेज़ खोजें...",
"gridView": "Grid view", "gridView": "ग्रिड व्यू",
"listView": "List view", "listView": "सूची व्यू",
"viewToggle": "Document view", "viewToggle": "दस्तावेज़ व्यू",
"allCategories": "सभी श्रेणियाँ", "allCategories": "सभी श्रेणियाँ",
"emptyTitle": "अभी कोई दस्तावेज़ नहीं", "emptyTitle": "अभी कोई दस्तावेज़ नहीं",
"emptyDescription": "परिवार के दस्तावेज़ अपलोड करें और तय करें कि हर फ़ाइल कौन देख सकता है।", "emptyDescription": "परिवार के दस्तावेज़ अपलोड करें और तय करें कि हर फ़ाइल कौन देख सकता है।",
"newTitle": "नया दस्तावेज़", "newTitle": "नया दस्तावेज़",
"editTitle": "दस्तावेज़ सेटिंग्स", "editTitle": "दस्तावेज़ सेटिंग्स",
"nameLabel": "Name", "nameLabel": "नाम",
"descriptionLabel": "Description", "descriptionLabel": "विवरण",
"categoryLabel": "Category", "categoryLabel": "श्रेणी",
"fileLabel": "File", "fileLabel": "फ़ाइल",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, चित्र, टेक्स्ट और Office फ़ाइलें 5 MB तक।",
"visibilityLabel": "Visibility", "visibilityLabel": "दृश्यता",
"statusLabel": "Status", "statusLabel": "स्थिति",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "अनुमत सदस्य",
"uploadAction": "Upload", "uploadAction": "अपलोड करें",
"downloadAction": "Download", "downloadAction": "डाउनलोड करें",
"editAction": "Settings", "editAction": "सेटिंग्स",
"archiveAction": "Archive", "archiveAction": "संग्रहित करें",
"restoreAction": "Restore", "restoreAction": "पुनर्स्थापित करें",
"savedToast": "Document saved.", "savedToast": "दस्तावेज़ सहेजा गया।",
"uploadedToast": "Document uploaded.", "uploadedToast": "दस्तावेज़ अपलोड किया गया।",
"archivedToast": "Document archived.", "archivedToast": "दस्तावेज़ संग्रहित किया गया।",
"restoredToast": "Document restored.", "restoredToast": "दस्तावेज़ पुनर्स्थापित किया गया।",
"deletedToast": "Document deleted.", "deletedToast": "दस्तावेज़ हटाया गया।",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "दस्तावेज़ \"{{name}}\" हटाएं?",
"fileRequired": "Select a file to upload.", "fileRequired": "अपलोड करने के लिए एक फ़ाइल चुनें।",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "फ़ाइल अधिकतम 5 MB हो सकती है।",
"fileReadError": "File could not be read.", "fileReadError": "फ़ाइल पढ़ी नहीं जा सकी।",
"statusActive": "Active", "statusActive": "सक्रिय",
"statusArchived": "Archived", "statusArchived": "संग्रहित",
"visibility": { "visibility": {
"family": "पूरा परिवार", "family": "पूरा परिवार",
"restricted": "चुने हुए सदस्य", "restricted": "चुने हुए सदस्य",
+32 -27
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Priorità", "filterGroupPriority": "Priorità",
"filterGroupStatus": "Stato", "filterGroupStatus": "Stato",
"swipedDoneToast": "Contrassegnato come fatto.", "swipedDoneToast": "Contrassegnato come fatto.",
"swipedOpenToast": "Contrassegnato come aperto." "swipedOpenToast": "Contrassegnato come aperto.",
"statusArchived": "Archiviato",
"archiveButton": "Archivia attività",
"archivedToast": "Attività archiviata.",
"kanbanArchived": "Archiviato",
"reminderNeedsDueDate": "Imposta una data di scadenza per abilitare i promemoria delle attività."
}, },
"shopping": { "shopping": {
"title": "Spesa", "title": "Spesa",
@@ -903,38 +908,38 @@
"title": "Documenti", "title": "Documenti",
"addButton": "Aggiungi documento", "addButton": "Aggiungi documento",
"searchPlaceholder": "Cerca documenti...", "searchPlaceholder": "Cerca documenti...",
"gridView": "Grid view", "gridView": "Vista griglia",
"listView": "List view", "listView": "Vista elenco",
"viewToggle": "Document view", "viewToggle": "Vista documenti",
"allCategories": "Tutte le categorie", "allCategories": "Tutte le categorie",
"emptyTitle": "Nessun documento", "emptyTitle": "Nessun documento",
"emptyDescription": "Carica documenti di famiglia e controlla chi può vedere ogni file.", "emptyDescription": "Carica documenti di famiglia e controlla chi può vedere ogni file.",
"newTitle": "Nuovo documento", "newTitle": "Nuovo documento",
"editTitle": "Impostazioni documento", "editTitle": "Impostazioni documento",
"nameLabel": "Name", "nameLabel": "Nome",
"descriptionLabel": "Description", "descriptionLabel": "Descrizione",
"categoryLabel": "Category", "categoryLabel": "Categoria",
"fileLabel": "File", "fileLabel": "File",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, immagini, testo e file Office fino a 5 MB.",
"visibilityLabel": "Visibility", "visibilityLabel": "Visibilità",
"statusLabel": "Status", "statusLabel": "Stato",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Membri autorizzati",
"uploadAction": "Upload", "uploadAction": "Carica",
"downloadAction": "Download", "downloadAction": "Scarica",
"editAction": "Settings", "editAction": "Impostazioni",
"archiveAction": "Archive", "archiveAction": "Archivia",
"restoreAction": "Restore", "restoreAction": "Ripristina",
"savedToast": "Document saved.", "savedToast": "Documento salvato.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Documento caricato.",
"archivedToast": "Document archived.", "archivedToast": "Documento archiviato.",
"restoredToast": "Document restored.", "restoredToast": "Documento ripristinato.",
"deletedToast": "Document deleted.", "deletedToast": "Documento eliminato.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Eliminare il documento \"{{name}}\"?",
"fileRequired": "Select a file to upload.", "fileRequired": "Seleziona un file da caricare.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Il file può essere al massimo 5 MB.",
"fileReadError": "File could not be read.", "fileReadError": "Impossibile leggere il file.",
"statusActive": "Active", "statusActive": "Attivo",
"statusArchived": "Archived", "statusArchived": "Archiviato",
"visibility": { "visibility": {
"family": "Tutta la famiglia", "family": "Tutta la famiglia",
"restricted": "Membri selezionati", "restricted": "Membri selezionati",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "優先度", "filterGroupPriority": "優先度",
"filterGroupStatus": "ステータス", "filterGroupStatus": "ステータス",
"swipedDoneToast": "完了としてマーク。", "swipedDoneToast": "完了としてマーク。",
"swipedOpenToast": "未完了としてマーク。" "swipedOpenToast": "未完了としてマーク。",
"statusArchived": "アーカイブ済み",
"archiveButton": "タスクをアーカイブ",
"archivedToast": "タスクをアーカイブしました。",
"kanbanArchived": "アーカイブ済み",
"reminderNeedsDueDate": "タスクのリマインダーを有効にするには期日を設定してください。"
}, },
"shopping": { "shopping": {
"title": "買い物", "title": "買い物",
@@ -903,38 +908,38 @@
"title": "書類", "title": "書類",
"addButton": "書類を追加", "addButton": "書類を追加",
"searchPlaceholder": "書類を検索...", "searchPlaceholder": "書類を検索...",
"gridView": "Grid view", "gridView": "グリッド表示",
"listView": "List view", "listView": "リスト表示",
"viewToggle": "Document view", "viewToggle": "ドキュメント表示",
"allCategories": "すべてのカテゴリ", "allCategories": "すべてのカテゴリ",
"emptyTitle": "書類はまだありません", "emptyTitle": "書類はまだありません",
"emptyDescription": "家族の書類をアップロードし、各ファイルを見られるメンバーを管理できます。", "emptyDescription": "家族の書類をアップロードし、各ファイルを見られるメンバーを管理できます。",
"newTitle": "新しい書類", "newTitle": "新しい書類",
"editTitle": "書類設定", "editTitle": "書類設定",
"nameLabel": "Name", "nameLabel": "名前",
"descriptionLabel": "Description", "descriptionLabel": "説明",
"categoryLabel": "Category", "categoryLabel": "カテゴリ",
"fileLabel": "File", "fileLabel": "ファイル",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF、画像、テキスト、Officeファイル(5MBまで)。",
"visibilityLabel": "Visibility", "visibilityLabel": "公開範囲",
"statusLabel": "Status", "statusLabel": "ステータス",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "許可メンバー",
"uploadAction": "Upload", "uploadAction": "アップロード",
"downloadAction": "Download", "downloadAction": "ダウンロード",
"editAction": "Settings", "editAction": "設定",
"archiveAction": "Archive", "archiveAction": "アーカイブ",
"restoreAction": "Restore", "restoreAction": "復元",
"savedToast": "Document saved.", "savedToast": "ドキュメントを保存しました。",
"uploadedToast": "Document uploaded.", "uploadedToast": "ドキュメントをアップロードしました。",
"archivedToast": "Document archived.", "archivedToast": "ドキュメントをアーカイブしました。",
"restoredToast": "Document restored.", "restoredToast": "ドキュメントを復元しました。",
"deletedToast": "Document deleted.", "deletedToast": "ドキュメントを削除しました。",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "ドキュメント「{{name}}」を削除しますか?",
"fileRequired": "Select a file to upload.", "fileRequired": "アップロードするファイルを選択してください。",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "ファイルは5MB以下である必要があります。",
"fileReadError": "File could not be read.", "fileReadError": "ファイルを読み込めませんでした。",
"statusActive": "Active", "statusActive": "有効",
"statusArchived": "Archived", "statusArchived": "アーカイブ済み",
"visibility": { "visibility": {
"family": "家族全員", "family": "家族全員",
"restricted": "選択したメンバー", "restricted": "選択したメンバー",
+1 -1
View File
@@ -923,7 +923,7 @@
"fileLabel": "Arquivo", "fileLabel": "Arquivo",
"fileHint": "PDF, imagens, texto e arquivos Office ate 5 MB.", "fileHint": "PDF, imagens, texto e arquivos Office ate 5 MB.",
"visibilityLabel": "Visibilidade", "visibilityLabel": "Visibilidade",
"statusLabel": "Status", "statusLabel": "Estado",
"allowedMembersLabel": "Membros permitidos", "allowedMembersLabel": "Membros permitidos",
"uploadAction": "Enviar", "uploadAction": "Enviar",
"downloadAction": "Baixar", "downloadAction": "Baixar",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Приоритет", "filterGroupPriority": "Приоритет",
"filterGroupStatus": "Статус", "filterGroupStatus": "Статус",
"swipedDoneToast": "Отмечено как выполненное.", "swipedDoneToast": "Отмечено как выполненное.",
"swipedOpenToast": "Отмечено как открытое." "swipedOpenToast": "Отмечено как открытое.",
"statusArchived": "Архивирована",
"archiveButton": "Архивировать задачу",
"archivedToast": "Задача архивирована.",
"kanbanArchived": "Архивировано",
"reminderNeedsDueDate": "Установите срок выполнения, чтобы включить напоминания о задаче."
}, },
"shopping": { "shopping": {
"title": "Покупки", "title": "Покупки",
@@ -903,38 +908,38 @@
"title": "Документы", "title": "Документы",
"addButton": "Добавить документ", "addButton": "Добавить документ",
"searchPlaceholder": "Поиск документов...", "searchPlaceholder": "Поиск документов...",
"gridView": "Grid view", "gridView": "Сетка",
"listView": "List view", "listView": "Список",
"viewToggle": "Document view", "viewToggle": "Вид документов",
"allCategories": "Все категории", "allCategories": "Все категории",
"emptyTitle": "Документов пока нет", "emptyTitle": "Документов пока нет",
"emptyDescription": "Загружайте семейные документы и управляйте доступом к каждому файлу.", "emptyDescription": "Загружайте семейные документы и управляйте доступом к каждому файлу.",
"newTitle": "Новый документ", "newTitle": "Новый документ",
"editTitle": "Настройки документа", "editTitle": "Настройки документа",
"nameLabel": "Name", "nameLabel": "Название",
"descriptionLabel": "Description", "descriptionLabel": "Описание",
"categoryLabel": "Category", "categoryLabel": "Категория",
"fileLabel": "File", "fileLabel": "Файл",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, изображения, текст и файлы Office до 5 МБ.",
"visibilityLabel": "Visibility", "visibilityLabel": "Видимость",
"statusLabel": "Status", "statusLabel": "Статус",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Разрешённые участники",
"uploadAction": "Upload", "uploadAction": "Загрузить",
"downloadAction": "Download", "downloadAction": "Скачать",
"editAction": "Settings", "editAction": "Настройки",
"archiveAction": "Archive", "archiveAction": "Архивировать",
"restoreAction": "Restore", "restoreAction": "Восстановить",
"savedToast": "Document saved.", "savedToast": "Документ сохранён.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Документ загружен.",
"archivedToast": "Document archived.", "archivedToast": "Документ архивирован.",
"restoredToast": "Document restored.", "restoredToast": "Документ восстановлен.",
"deletedToast": "Document deleted.", "deletedToast": "Документ удалён.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Удалить документ «{{name}}»?",
"fileRequired": "Select a file to upload.", "fileRequired": "Выберите файл для загрузки.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Файл может быть не более 5 МБ.",
"fileReadError": "File could not be read.", "fileReadError": "Не удалось прочитать файл.",
"statusActive": "Active", "statusActive": "Активный",
"statusArchived": "Archived", "statusArchived": "Архивированный",
"visibility": { "visibility": {
"family": "Вся семья", "family": "Вся семья",
"restricted": "Выбранные участники", "restricted": "Выбранные участники",
+32 -27
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Prioritet", "filterGroupPriority": "Prioritet",
"filterGroupStatus": "Status", "filterGroupStatus": "Status",
"swipedDoneToast": "Markerad som klar.", "swipedDoneToast": "Markerad som klar.",
"swipedOpenToast": "Markerad som öppen." "swipedOpenToast": "Markerad som öppen.",
"statusArchived": "Arkiverad",
"archiveButton": "Arkivera uppgift",
"archivedToast": "Uppgiften arkiverades.",
"kanbanArchived": "Arkiverad",
"reminderNeedsDueDate": "Ange ett förfallodatum för att aktivera påminnelser för uppgiften."
}, },
"shopping": { "shopping": {
"title": "Shopping", "title": "Shopping",
@@ -903,38 +908,38 @@
"title": "Dokument", "title": "Dokument",
"addButton": "Lägg till dokument", "addButton": "Lägg till dokument",
"searchPlaceholder": "Sök dokument...", "searchPlaceholder": "Sök dokument...",
"gridView": "Grid view", "gridView": "Rutnätsvy",
"listView": "List view", "listView": "Listvy",
"viewToggle": "Document view", "viewToggle": "Dokumentvy",
"allCategories": "Alla kategorier", "allCategories": "Alla kategorier",
"emptyTitle": "Inga dokument ännu", "emptyTitle": "Inga dokument ännu",
"emptyDescription": "Ladda upp familjedokument och styr vem som kan se varje fil.", "emptyDescription": "Ladda upp familjedokument och styr vem som kan se varje fil.",
"newTitle": "Nytt dokument", "newTitle": "Nytt dokument",
"editTitle": "Dokumentinställningar", "editTitle": "Dokumentinställningar",
"nameLabel": "Name", "nameLabel": "Namn",
"descriptionLabel": "Description", "descriptionLabel": "Beskrivning",
"categoryLabel": "Category", "categoryLabel": "Kategori",
"fileLabel": "File", "fileLabel": "Fil",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, bilder, text och Office-filer upp till 5 MB.",
"visibilityLabel": "Visibility", "visibilityLabel": "Synlighet",
"statusLabel": "Status", "statusLabel": "Status",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Tillåtna medlemmar",
"uploadAction": "Upload", "uploadAction": "Ladda upp",
"downloadAction": "Download", "downloadAction": "Ladda ner",
"editAction": "Settings", "editAction": "Inställningar",
"archiveAction": "Archive", "archiveAction": "Arkivera",
"restoreAction": "Restore", "restoreAction": "Återställ",
"savedToast": "Document saved.", "savedToast": "Dokumentet sparades.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Dokumentet laddades upp.",
"archivedToast": "Document archived.", "archivedToast": "Dokumentet arkiverades.",
"restoredToast": "Document restored.", "restoredToast": "Dokumentet återställdes.",
"deletedToast": "Document deleted.", "deletedToast": "Dokumentet raderades.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Ta bort dokument \"{{name}}\"?",
"fileRequired": "Select a file to upload.", "fileRequired": "Välj en fil att ladda upp.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Filen får vara högst 5 MB.",
"fileReadError": "File could not be read.", "fileReadError": "Filen kunde inte läsas.",
"statusActive": "Active", "statusActive": "Aktiv",
"statusArchived": "Archived", "statusArchived": "Arkiverad",
"visibility": { "visibility": {
"family": "Hela familjen", "family": "Hela familjen",
"restricted": "Valda medlemmar", "restricted": "Valda medlemmar",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Öncelik", "filterGroupPriority": "Öncelik",
"filterGroupStatus": "Durum", "filterGroupStatus": "Durum",
"swipedDoneToast": "Tamamlandı olarak işaretlendi.", "swipedDoneToast": "Tamamlandı olarak işaretlendi.",
"swipedOpenToast": "Açık olarak işaretlendi." "swipedOpenToast": "Açık olarak işaretlendi.",
"statusArchived": "Arşivlenmiş",
"archiveButton": "Görevi arşivle",
"archivedToast": "Görev arşivlendi.",
"kanbanArchived": "Arşivlenmiş",
"reminderNeedsDueDate": "Görev hatırlatıcılarını etkinleştirmek için bir son tarih belirleyin."
}, },
"shopping": { "shopping": {
"title": "Alışveriş", "title": "Alışveriş",
@@ -903,38 +908,38 @@
"title": "Belgeler", "title": "Belgeler",
"addButton": "Belge ekle", "addButton": "Belge ekle",
"searchPlaceholder": "Belgelerde ara...", "searchPlaceholder": "Belgelerde ara...",
"gridView": "Grid view", "gridView": "Izgara görünümü",
"listView": "List view", "listView": "Liste görünümü",
"viewToggle": "Document view", "viewToggle": "Belge görünümü",
"allCategories": "Tüm kategoriler", "allCategories": "Tüm kategoriler",
"emptyTitle": "Henüz belge yok", "emptyTitle": "Henüz belge yok",
"emptyDescription": "Aile belgelerini yükleyin ve her dosyayı kimlerin görebileceğini yönetin.", "emptyDescription": "Aile belgelerini yükleyin ve her dosyayı kimlerin görebileceğini yönetin.",
"newTitle": "Yeni belge", "newTitle": "Yeni belge",
"editTitle": "Belge ayarları", "editTitle": "Belge ayarları",
"nameLabel": "Name", "nameLabel": "Ad",
"descriptionLabel": "Description", "descriptionLabel": "Açıklama",
"categoryLabel": "Category", "categoryLabel": "Kategori",
"fileLabel": "File", "fileLabel": "Dosya",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, resimler, metin ve Office dosyaları en fazla 5 MB.",
"visibilityLabel": "Visibility", "visibilityLabel": "Görünürlük",
"statusLabel": "Status", "statusLabel": "Durum",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "İzin verilen üyeler",
"uploadAction": "Upload", "uploadAction": "Yükle",
"downloadAction": "Download", "downloadAction": "İndir",
"editAction": "Settings", "editAction": "Ayarlar",
"archiveAction": "Archive", "archiveAction": "Arşivle",
"restoreAction": "Restore", "restoreAction": "Geri yükle",
"savedToast": "Document saved.", "savedToast": "Belge kaydedildi.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Belge yüklendi.",
"archivedToast": "Document archived.", "archivedToast": "Belge arşivlendi.",
"restoredToast": "Document restored.", "restoredToast": "Belge geri yüklendi.",
"deletedToast": "Document deleted.", "deletedToast": "Belge silindi.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "\"{{name}}\" belgesini sil?",
"fileRequired": "Select a file to upload.", "fileRequired": "Yüklemek için bir dosya seçin.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Dosya en fazla 5 MB olabilir.",
"fileReadError": "File could not be read.", "fileReadError": "Dosya okunamadı.",
"statusActive": "Active", "statusActive": "Aktif",
"statusArchived": "Archived", "statusArchived": "Arşivlenmiş",
"visibility": { "visibility": {
"family": "Tüm aile", "family": "Tüm aile",
"restricted": "Seçili üyeler", "restricted": "Seçili üyeler",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "Пріоритет", "filterGroupPriority": "Пріоритет",
"filterGroupStatus": "Статус", "filterGroupStatus": "Статус",
"swipedDoneToast": "Позначено як виконане.", "swipedDoneToast": "Позначено як виконане.",
"swipedOpenToast": "Позначено як відкрите." "swipedOpenToast": "Позначено як відкрите.",
"statusArchived": "Архівована",
"archiveButton": "Архівувати завдання",
"archivedToast": "Завдання архівовано.",
"kanbanArchived": "Архівовано",
"reminderNeedsDueDate": "Встановіть дату виконання, щоб увімкнути нагадування про завдання."
}, },
"shopping": { "shopping": {
"title": "Покупки", "title": "Покупки",
@@ -911,38 +916,38 @@
"title": "Документи", "title": "Документи",
"addButton": "Додати документ", "addButton": "Додати документ",
"searchPlaceholder": "Пошук документів...", "searchPlaceholder": "Пошук документів...",
"gridView": "Grid view", "gridView": "Сітка",
"listView": "List view", "listView": "Список",
"viewToggle": "Document view", "viewToggle": "Вигляд документів",
"allCategories": "Усі категорії", "allCategories": "Усі категорії",
"emptyTitle": "Документів ще немає", "emptyTitle": "Документів ще немає",
"emptyDescription": "Завантажуйте сімейні документи та керуйте доступом до кожного файлу.", "emptyDescription": "Завантажуйте сімейні документи та керуйте доступом до кожного файлу.",
"newTitle": "Новий документ", "newTitle": "Новий документ",
"editTitle": "Налаштування документа", "editTitle": "Налаштування документа",
"nameLabel": "Name", "nameLabel": "Назва",
"descriptionLabel": "Description", "descriptionLabel": "Опис",
"categoryLabel": "Category", "categoryLabel": "Категорія",
"fileLabel": "File", "fileLabel": "Файл",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF, зображення, текст та файли Office до 5 МБ.",
"visibilityLabel": "Visibility", "visibilityLabel": "Видимість",
"statusLabel": "Status", "statusLabel": "Статус",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "Дозволені учасники",
"uploadAction": "Upload", "uploadAction": "Завантажити",
"downloadAction": "Download", "downloadAction": "Завантажити",
"editAction": "Settings", "editAction": "Налаштування",
"archiveAction": "Archive", "archiveAction": "Архівувати",
"restoreAction": "Restore", "restoreAction": "Відновити",
"savedToast": "Document saved.", "savedToast": "Документ збережено.",
"uploadedToast": "Document uploaded.", "uploadedToast": "Документ завантажено.",
"archivedToast": "Document archived.", "archivedToast": "Документ архівовано.",
"restoredToast": "Document restored.", "restoredToast": "Документ відновлено.",
"deletedToast": "Document deleted.", "deletedToast": "Документ видалено.",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "Видалити документ «{{name}}»?",
"fileRequired": "Select a file to upload.", "fileRequired": "Виберіть файл для завантаження.",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "Файл може бути не більше 5 МБ.",
"fileReadError": "File could not be read.", "fileReadError": "Не вдалося прочитати файл.",
"statusActive": "Active", "statusActive": "Активний",
"statusArchived": "Archived", "statusArchived": "Архівований",
"visibility": { "visibility": {
"family": "Уся сім’я", "family": "Уся сім’я",
"restricted": "Вибрані учасники", "restricted": "Вибрані учасники",
+33 -28
View File
@@ -180,7 +180,12 @@
"filterGroupPriority": "优先级", "filterGroupPriority": "优先级",
"filterGroupStatus": "状态", "filterGroupStatus": "状态",
"swipedDoneToast": "已标记为完成。", "swipedDoneToast": "已标记为完成。",
"swipedOpenToast": "已标记为未完成。" "swipedOpenToast": "已标记为未完成。",
"statusArchived": "已归档",
"archiveButton": "归档任务",
"archivedToast": "任务已归档。",
"kanbanArchived": "已归档",
"reminderNeedsDueDate": "设置截止日期以启用任务提醒。"
}, },
"shopping": { "shopping": {
"title": "购物", "title": "购物",
@@ -903,38 +908,38 @@
"title": "文档", "title": "文档",
"addButton": "添加文档", "addButton": "添加文档",
"searchPlaceholder": "搜索文档...", "searchPlaceholder": "搜索文档...",
"gridView": "Grid view", "gridView": "网格视图",
"listView": "List view", "listView": "列表视图",
"viewToggle": "Document view", "viewToggle": "文档视图",
"allCategories": "所有类别", "allCategories": "所有类别",
"emptyTitle": "还没有文档", "emptyTitle": "还没有文档",
"emptyDescription": "上传家庭文档并控制每个文件的可见成员。", "emptyDescription": "上传家庭文档并控制每个文件的可见成员。",
"newTitle": "新文档", "newTitle": "新文档",
"editTitle": "文档设置", "editTitle": "文档设置",
"nameLabel": "Name", "nameLabel": "名称",
"descriptionLabel": "Description", "descriptionLabel": "描述",
"categoryLabel": "Category", "categoryLabel": "类别",
"fileLabel": "File", "fileLabel": "文件",
"fileHint": "PDF, images, text and Office files up to 5 MB.", "fileHint": "PDF、图片、文本和Office文件,最大5 MB",
"visibilityLabel": "Visibility", "visibilityLabel": "可见性",
"statusLabel": "Status", "statusLabel": "状态",
"allowedMembersLabel": "Allowed members", "allowedMembersLabel": "允许的成员",
"uploadAction": "Upload", "uploadAction": "上传",
"downloadAction": "Download", "downloadAction": "下载",
"editAction": "Settings", "editAction": "设置",
"archiveAction": "Archive", "archiveAction": "归档",
"restoreAction": "Restore", "restoreAction": "恢复",
"savedToast": "Document saved.", "savedToast": "文档已保存。",
"uploadedToast": "Document uploaded.", "uploadedToast": "文档已上传。",
"archivedToast": "Document archived.", "archivedToast": "文档已归档。",
"restoredToast": "Document restored.", "restoredToast": "文档已恢复。",
"deletedToast": "Document deleted.", "deletedToast": "文档已删除。",
"deleteConfirm": "Delete document \"{{name}}\"?", "deleteConfirm": "删除文档\"{{name}}\"",
"fileRequired": "Select a file to upload.", "fileRequired": "请选择要上传的文件。",
"fileTooLarge": "File may be at most 5 MB.", "fileTooLarge": "文件最大为5 MB",
"fileReadError": "File could not be read.", "fileReadError": "无法读取文件。",
"statusActive": "Active", "statusActive": "活跃",
"statusArchived": "Archived", "statusArchived": "已归档",
"visibility": { "visibility": {
"family": "整个家庭", "family": "整个家庭",
"restricted": "选定成员", "restricted": "选定成员",
+51 -22
View File
@@ -131,7 +131,7 @@ let _pendingLoginRedirect = false;
const ROUTE_ORDER = ['/', '/tasks', '/calendar', '/birthdays', '/meals', '/recipes', '/shopping', const ROUTE_ORDER = ['/', '/tasks', '/calendar', '/birthdays', '/meals', '/recipes', '/shopping',
'/notes', '/contacts', '/budget', '/documents', '/settings']; '/notes', '/contacts', '/budget', '/documents', '/settings'];
const PRIMARY_NAV = 4; const PRIMARY_NAV = 3;
const DEFAULT_APP_NAME = 'Oikos'; const DEFAULT_APP_NAME = 'Oikos';
const APP_NAME_STORAGE_KEY = 'oikos-app-name'; const APP_NAME_STORAGE_KEY = 'oikos-app-name';
@@ -350,20 +350,12 @@ async function renderPage(route, previousPath = null) {
// Richtung bestimmen (previousPath ist der alte Pfad vor der Navigation) // Richtung bestimmen (previousPath ist der alte Pfad vor der Navigation)
const direction = getDirection(previousPath, route.path); const direction = getDirection(previousPath, route.path);
const outClass = direction === 'right' ? 'page-transition--out-left' : 'page-transition--out-right';
const inClass = direction === 'right' ? 'page-transition--in-right' : 'page-transition--in-left'; const inClass = direction === 'right' ? 'page-transition--in-right' : 'page-transition--in-left';
// Performance: backdrop-filter während Übergang deaktivieren (Android-Optimierung). // Performance: backdrop-filter während Übergang deaktivieren (Android-Optimierung).
// glass.css setzt alle backdrop-filter im app-content auf none solange diese Klasse aktiv ist. // glass.css setzt alle backdrop-filter im app-content auf none solange diese Klasse aktiv ist.
document.documentElement.classList.add('navigating'); document.documentElement.classList.add('navigating');
// Alte Seite kurz ausfaden, falls vorhanden
const oldPage = content.querySelector('.page-transition');
if (oldPage) {
oldPage.classList.add(outClass);
await new Promise(r => setTimeout(r, 120));
}
// Alter Inhalt ist jetzt weg - altes Stylesheet kann entfernt werden // Alter Inhalt ist jetzt weg - altes Stylesheet kann entfernt werden
const pageWrapper = document.createElement('div'); const pageWrapper = document.createElement('div');
pageWrapper.className = 'page-transition'; pageWrapper.className = 'page-transition';
@@ -486,6 +478,20 @@ function renderAppShell(container) {
const bottomItems = document.createElement('div'); const bottomItems = document.createElement('div');
bottomItems.className = 'nav-bottom__items'; bottomItems.className = 'nav-bottom__items';
navItems().slice(0, PRIMARY_NAV).forEach((item) => bottomItems.appendChild(navItemEl(item))); navItems().slice(0, PRIMARY_NAV).forEach((item) => bottomItems.appendChild(navItemEl(item)));
const searchNavBtn = document.createElement('button');
searchNavBtn.className = 'nav-item nav-item--search';
searchNavBtn.id = 'search-nav-btn';
searchNavBtn.setAttribute('aria-label', t('search.title'));
const searchNavIcon = document.createElement('i');
searchNavIcon.dataset.lucide = 'search';
searchNavIcon.className = 'nav-item__icon';
searchNavIcon.setAttribute('aria-hidden', 'true');
const searchNavLabel = document.createElement('span');
searchNavLabel.className = 'nav-item__label';
searchNavLabel.textContent = t('search.title');
searchNavBtn.appendChild(searchNavIcon);
searchNavBtn.appendChild(searchNavLabel);
bottomItems.appendChild(searchNavBtn);
const moreBtn = document.createElement('button'); const moreBtn = document.createElement('button');
moreBtn.className = 'nav-item nav-item--more'; moreBtn.className = 'nav-item nav-item--more';
moreBtn.id = 'more-btn'; moreBtn.id = 'more-btn';
@@ -758,6 +764,7 @@ function initMoreSheet(container) {
*/ */
function initSearch(container) { function initSearch(container) {
const searchBtn = container.querySelector('#search-btn'); const searchBtn = container.querySelector('#search-btn');
const searchNavBtn = container.querySelector('#search-nav-btn');
const searchClose = container.querySelector('#search-close'); const searchClose = container.querySelector('#search-close');
const overlay = container.querySelector('#search-overlay'); const overlay = container.querySelector('#search-overlay');
const input = container.querySelector('#search-input'); const input = container.querySelector('#search-input');
@@ -770,6 +777,7 @@ function initSearch(container) {
let _searchTrapHandler = null; let _searchTrapHandler = null;
function openSearch() { function openSearch() {
window._openSearch = openSearch;
if (window._closeMoreSheet) window._closeMoreSheet(); if (window._closeMoreSheet) window._closeMoreSheet();
overlay.setAttribute('aria-hidden', 'false'); overlay.setAttribute('aria-hidden', 'false');
overlay.classList.add('search-overlay--visible'); overlay.classList.add('search-overlay--visible');
@@ -804,6 +812,7 @@ function initSearch(container) {
} }
searchBtn.addEventListener('click', openSearch); searchBtn.addEventListener('click', openSearch);
if (searchNavBtn) searchNavBtn.addEventListener('click', openSearch);
searchClose.addEventListener('click', closeSearch); searchClose.addEventListener('click', closeSearch);
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
@@ -878,18 +887,18 @@ function renderSearchResults(container, data, onClose) {
function navItems() { function navItems() {
return [ return [
{ path: '/', label: t('nav.dashboard'), icon: 'layout-dashboard' }, { path: '/', label: t('nav.dashboard'), icon: 'layout-dashboard' },
{ path: '/tasks', label: t('nav.tasks'), icon: 'check-square' }, { path: '/tasks', label: t('nav.tasks'), icon: 'check-square' },
{ path: '/birthdays', label: t('nav.birthdays'), icon: 'cake' }, { path: '/calendar', label: t('nav.calendar'), icon: 'calendar' },
{ path: '/calendar', label: t('nav.calendar'), icon: 'calendar' }, { path: '/shopping', label: t('nav.shopping'), icon: 'shopping-cart' },
{ path: '/meals', label: t('nav.meals'), icon: 'utensils' }, { path: '/meals', label: t('nav.meals'), icon: 'utensils' },
{ path: '/recipes', label: t('nav.recipes'), icon: 'book-text' }, { path: '/recipes', label: t('nav.recipes'), icon: 'book-text' },
{ path: '/shopping', label: t('nav.shopping'), icon: 'shopping-cart' }, { path: '/birthdays', label: t('nav.birthdays'), icon: 'cake' },
{ path: '/notes', label: t('nav.notes'), icon: 'sticky-note' }, { path: '/notes', label: t('nav.notes'), icon: 'sticky-note' },
{ path: '/contacts', label: t('nav.contacts'), icon: 'book-user' }, { path: '/contacts', label: t('nav.contacts'), icon: 'book-user' },
{ path: '/budget', label: t('nav.budget'), icon: 'wallet' }, { path: '/budget', label: t('nav.budget'), icon: 'wallet' },
{ path: '/documents', label: t('nav.documents'), icon: 'folder-lock' }, { path: '/documents', label: t('nav.documents'), icon: 'folder-lock' },
{ path: '/settings', label: t('nav.settings'), icon: 'settings' }, { path: '/settings', label: t('nav.settings'), icon: 'settings' },
]; ];
} }
@@ -1128,7 +1137,27 @@ window.addEventListener('locale-changed', () => {
if (bottomItems) { if (bottomItems) {
const moreBtn = bottomItems.querySelector('#more-btn'); const moreBtn = bottomItems.querySelector('#more-btn');
const newItems = navItems().slice(0, PRIMARY_NAV).map(navItemEl); const newItems = navItems().slice(0, PRIMARY_NAV).map(navItemEl);
bottomItems.replaceChildren(...newItems, moreBtn); // Such-Button neu erstellen (wird durch replaceChildren entfernt)
const newSearchBtn = document.createElement('button');
newSearchBtn.className = 'nav-item nav-item--search';
newSearchBtn.id = 'search-nav-btn';
newSearchBtn.setAttribute('aria-label', t('search.title'));
const newSearchIcon = document.createElement('i');
newSearchIcon.dataset.lucide = 'search';
newSearchIcon.className = 'nav-item__icon';
newSearchIcon.setAttribute('aria-hidden', 'true');
const newSearchLbl = document.createElement('span');
newSearchLbl.className = 'nav-item__label';
newSearchLbl.textContent = t('search.title');
newSearchBtn.appendChild(newSearchIcon);
newSearchBtn.appendChild(newSearchLbl);
bottomItems.replaceChildren(...newItems, newSearchBtn, moreBtn);
// Event-Listener auf neuen Such-Button
if (newSearchBtn) {
newSearchBtn.addEventListener('click', () => {
if (window._openSearch) window._openSearch();
});
}
} }
if (moreSheet) { if (moreSheet) {
const searchBtn = moreSheet.querySelector('#search-btn'); const searchBtn = moreSheet.querySelector('#search-btn');
+58 -1
View File
@@ -80,6 +80,11 @@
to { opacity: 0; transform: translateX(20px); } to { opacity: 0; transform: translateX(20px); }
} }
@keyframes page-crossfade-in {
from { opacity: 0; }
to { opacity: 1; }
}
.page-transition--in-right { .page-transition--in-right {
animation: page-slide-in-right 0.2s var(--ease-out); animation: page-slide-in-right 0.2s var(--ease-out);
} }
@@ -95,6 +100,11 @@
pointer-events: none; pointer-events: none;
} }
.page-transition--crossfade {
animation: page-crossfade-in 0.18s var(--ease-out);
opacity: 1;
}
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
.page-transition--in-right, .page-transition--in-right,
.page-transition--in-left { .page-transition--in-left {
@@ -105,6 +115,10 @@
.page-transition--out-right { .page-transition--out-right {
animation: none; animation: none;
} }
.page-transition--crossfade {
animation: none;
opacity: 1;
}
} }
/* -------------------------------------------------------- /* --------------------------------------------------------
@@ -144,6 +158,11 @@
z-index: var(--z-nav); z-index: var(--z-nav);
backdrop-filter: var(--blur-md) saturate(180%); backdrop-filter: var(--blur-md) saturate(180%);
-webkit-backdrop-filter: var(--blur-md) saturate(180%); -webkit-backdrop-filter: var(--blur-md) saturate(180%);
transition: transform 0.2s var(--ease-out);
}
.nav-bottom--hidden {
transform: translateY(100%);
} }
/* ── Items-Reihe ── */ /* ── Items-Reihe ── */
@@ -197,7 +216,7 @@
padding: var(--space-4) var(--space-4) calc(var(--space-4) + var(--safe-area-inset-bottom)); padding: var(--space-4) var(--space-4) calc(var(--space-4) + var(--safe-area-inset-bottom));
z-index: calc(var(--z-nav) + 2); z-index: calc(var(--z-nav) + 2);
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(3, 1fr);
gap: var(--space-3); gap: var(--space-3);
transform: translateY(100%); transform: translateY(100%);
transition: transform 0.25s var(--ease-out); transition: transform 0.25s var(--ease-out);
@@ -644,6 +663,38 @@
} }
} }
/* Tooltip für collapsed Sidebar (nur Icons sichtbar bei 10241439px) */
@media (min-width: 1024px) and (max-width: 1439px) {
.nav-sidebar .nav-item {
overflow: visible;
}
.nav-sidebar .nav-item::after {
content: attr(title);
position: absolute;
left: calc(var(--sidebar-width) + var(--space-2));
top: 50%;
transform: translateY(-50%);
background: var(--color-surface);
color: var(--color-text-primary);
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-sm);
box-shadow: var(--shadow-md);
border: 1px solid var(--color-border-subtle);
white-space: nowrap;
font-size: var(--text-sm);
font-weight: var(--font-weight-medium);
pointer-events: none;
opacity: 0;
transition: opacity 0.15s ease;
z-index: calc(var(--z-nav) + 10);
}
.nav-sidebar .nav-item:hover::after {
opacity: 1;
}
}
/* ================================================================ /* ================================================================
* Sidebar Expanded (≥ 1280px) - Labels sichtbar * Sidebar Expanded (≥ 1280px) - Labels sichtbar
* ================================================================ */ * ================================================================ */
@@ -1590,6 +1641,12 @@
width: min(calc(100% - var(--space-8)), 380px); width: min(calc(100% - var(--space-8)), 380px);
} }
@media (min-width: 768px) and (max-width: 1023px) {
.toast-container {
bottom: var(--space-8);
}
}
@media (min-width: 1024px) { @media (min-width: 1024px) {
.toast-container { .toast-container {
bottom: var(--space-6); bottom: var(--space-6);