From 2e3c84db56ac50489ea155bac6e62ffc1736d8d4 Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 12:24:34 +0200 Subject: [PATCH 1/7] fix(i18n): complete tasks and documents translations for all 15 locales Add missing tasks.statusArchived, archiveButton, archivedToast, kanbanArchived, reminderNeedsDueDate and translate the documents section from English placeholders into all supported languages. Co-Authored-By: Claude Sonnet 4.6 --- public/locales/ar.json | 61 +++++++++++++++++++++++------------------- public/locales/de.json | 57 +++++++++++++++++++++------------------ public/locales/el.json | 61 +++++++++++++++++++++++------------------- public/locales/es.json | 61 +++++++++++++++++++++++------------------- public/locales/fr.json | 59 +++++++++++++++++++++------------------- public/locales/hi.json | 61 +++++++++++++++++++++++------------------- public/locales/it.json | 59 +++++++++++++++++++++------------------- public/locales/ja.json | 61 +++++++++++++++++++++++------------------- public/locales/pt.json | 2 +- public/locales/ru.json | 61 +++++++++++++++++++++++------------------- public/locales/sv.json | 59 +++++++++++++++++++++------------------- public/locales/tr.json | 61 +++++++++++++++++++++++------------------- public/locales/uk.json | 61 +++++++++++++++++++++++------------------- public/locales/zh.json | 61 +++++++++++++++++++++++------------------- 14 files changed, 425 insertions(+), 360 deletions(-) diff --git a/public/locales/ar.json b/public/locales/ar.json index 30cbf0c..5cfc2bb 100644 --- a/public/locales/ar.json +++ b/public/locales/ar.json @@ -180,7 +180,12 @@ "filterGroupPriority": "الأولوية", "filterGroupStatus": "الحالة", "swipedDoneToast": "تم وضع علامة مكتمل.", - "swipedOpenToast": "تم وضع علامة مفتوح." + "swipedOpenToast": "تم وضع علامة مفتوح.", + "statusArchived": "مؤرشف", + "archiveButton": "أرشفة المهمة", + "archivedToast": "تم أرشفة المهمة.", + "kanbanArchived": "مؤرشف", + "reminderNeedsDueDate": "حدّد تاريخ استحقاق لتفعيل تذكيرات المهمة." }, "shopping": { "title": "التسوق", @@ -903,38 +908,38 @@ "title": "المستندات", "addButton": "إضافة مستند", "searchPlaceholder": "البحث في المستندات...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "عرض شبكي", + "listView": "عرض قائمة", + "viewToggle": "عرض المستندات", "allCategories": "كل الفئات", "emptyTitle": "لا توجد مستندات بعد", "emptyDescription": "ارفع مستندات العائلة وتحكم في من يمكنه رؤية كل ملف.", "newTitle": "مستند جديد", "editTitle": "إعدادات المستند", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "الاسم", + "descriptionLabel": "الوصف", + "categoryLabel": "الفئة", + "fileLabel": "الملف", + "fileHint": "ملفات PDF والصور والنصوص وملفات Office حتى 5 ميغابايت.", + "visibilityLabel": "مستوى الرؤية", + "statusLabel": "الحالة", + "allowedMembersLabel": "الأعضاء المسموح لهم", + "uploadAction": "رفع", + "downloadAction": "تحميل", + "editAction": "إعدادات", + "archiveAction": "أرشفة", + "restoreAction": "استعادة", + "savedToast": "تم حفظ المستند.", + "uploadedToast": "تم رفع المستند.", + "archivedToast": "تم أرشفة المستند.", + "restoredToast": "تم استعادة المستند.", + "deletedToast": "تم حذف المستند.", + "deleteConfirm": "حذف المستند \"{{name}}\"؟", + "fileRequired": "يرجى اختيار ملف للرفع.", + "fileTooLarge": "يجب ألا يتجاوز حجم الملف 5 ميغابايت.", + "fileReadError": "تعذّر قراءة الملف.", + "statusActive": "نشط", + "statusArchived": "مؤرشف", "visibility": { "family": "كل العائلة", "restricted": "أعضاء محددون", diff --git a/public/locales/de.json b/public/locales/de.json index b60674f..748623b 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -187,7 +187,12 @@ "filterGroupPriority": "Priorität", "filterGroupPerson": "Person", "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": { "title": "Einkauf", @@ -941,38 +946,38 @@ "title": "Dokumente", "addButton": "Dokument hinzufügen", "searchPlaceholder": "Dokumente suchen...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Rasteransicht", + "listView": "Listenansicht", + "viewToggle": "Dokumentansicht", "allCategories": "Alle Kategorien", "emptyTitle": "Noch keine Dokumente", "emptyDescription": "Lade Familiendokumente hoch und steuere, wer jede Datei sehen darf.", "newTitle": "Neues Dokument", "editTitle": "Dokumenteinstellungen", "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", + "descriptionLabel": "Beschreibung", + "categoryLabel": "Kategorie", + "fileLabel": "Datei", + "fileHint": "PDF, Bilder, Text und Office-Dateien bis zu 5 MB.", + "visibilityLabel": "Sichtbarkeit", "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "allowedMembersLabel": "Erlaubte Mitglieder", + "uploadAction": "Hochladen", + "downloadAction": "Herunterladen", + "editAction": "Einstellungen", + "archiveAction": "Archivieren", + "restoreAction": "Wiederherstellen", + "savedToast": "Dokument gespeichert.", + "uploadedToast": "Dokument hochgeladen.", + "archivedToast": "Dokument archiviert.", + "restoredToast": "Dokument wiederhergestellt.", + "deletedToast": "Dokument gelöscht.", + "deleteConfirm": "Dokument \"{{name}}\" löschen?", + "fileRequired": "Bitte wähle eine Datei aus.", + "fileTooLarge": "Die Datei darf höchstens 5 MB groß sein.", + "fileReadError": "Die Datei konnte nicht gelesen werden.", + "statusActive": "Aktiv", + "statusArchived": "Archiviert", "visibility": { "family": "Ganze Familie", "restricted": "Ausgewählte Mitglieder", diff --git a/public/locales/el.json b/public/locales/el.json index 27e250f..c26e383 100644 --- a/public/locales/el.json +++ b/public/locales/el.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Προτεραιότητα", "filterGroupStatus": "Κατάσταση", "swipedDoneToast": "Επισημάνθηκε ως ολοκληρωμένο.", - "swipedOpenToast": "Επισημάνθηκε ως ανοιχτό." + "swipedOpenToast": "Επισημάνθηκε ως ανοιχτό.", + "statusArchived": "Αρχειοθετημένο", + "archiveButton": "Αρχειοθέτηση εργασίας", + "archivedToast": "Η εργασία αρχειοθετήθηκε.", + "kanbanArchived": "Αρχειοθετημένο", + "reminderNeedsDueDate": "Ορίστε ημερομηνία λήξης για να ενεργοποιήσετε τις υπενθυμίσεις." }, "shopping": { "title": "Αγορές", @@ -903,38 +908,38 @@ "title": "Έγγραφα", "addButton": "Προσθήκη εγγράφου", "searchPlaceholder": "Αναζήτηση εγγράφων...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Προβολή πλέγματος", + "listView": "Προβολή λίστας", + "viewToggle": "Προβολή εγγράφων", "allCategories": "Όλες οι κατηγορίες", "emptyTitle": "Δεν υπάρχουν έγγραφα ακόμα", "emptyDescription": "Ανεβάστε οικογενειακά έγγραφα και ελέγξτε ποιος μπορεί να βλέπει κάθε αρχείο.", "newTitle": "Νέο έγγραφο", "editTitle": "Ρυθμίσεις εγγράφου", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "Όνομα", + "descriptionLabel": "Περιγραφή", + "categoryLabel": "Κατηγορία", + "fileLabel": "Αρχείο", + "fileHint": "PDF, εικόνες, κείμενο και αρχεία Office έως 5 MB.", + "visibilityLabel": "Ορατότητα", + "statusLabel": "Κατάσταση", + "allowedMembersLabel": "Επιτρεπόμενα μέλη", + "uploadAction": "Μεταφόρτωση", + "downloadAction": "Λήψη", + "editAction": "Ρυθμίσεις", + "archiveAction": "Αρχειοθέτηση", + "restoreAction": "Επαναφορά", + "savedToast": "Το έγγραφο αποθηκεύτηκε.", + "uploadedToast": "Το έγγραφο ανέβηκε.", + "archivedToast": "Το έγγραφο αρχειοθετήθηκε.", + "restoredToast": "Το έγγραφο επαναφέρθηκε.", + "deletedToast": "Το έγγραφο διαγράφηκε.", + "deleteConfirm": "Διαγραφή εγγράφου \"{{name}}\";", + "fileRequired": "Επιλέξτε ένα αρχείο για μεταφόρτωση.", + "fileTooLarge": "Το αρχείο μπορεί να είναι έως 5 MB.", + "fileReadError": "Δεν ήταν δυνατή η ανάγνωση του αρχείου.", + "statusActive": "Ενεργό", + "statusArchived": "Αρχειοθετημένο", "visibility": { "family": "Όλη η οικογένεια", "restricted": "Επιλεγμένα μέλη", diff --git a/public/locales/es.json b/public/locales/es.json index 63f2403..7ecee87 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Prioridad", "filterGroupStatus": "Estado", "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": { "title": "Compras", @@ -903,38 +908,38 @@ "title": "Documentos", "addButton": "Agregar documento", "searchPlaceholder": "Buscar documentos...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Vista de cuadrícula", + "listView": "Vista de lista", + "viewToggle": "Vista de documentos", "allCategories": "Todas las categorías", "emptyTitle": "Aún no hay documentos", "emptyDescription": "Sube documentos familiares y controla quién puede ver cada archivo.", "newTitle": "Nuevo documento", "editTitle": "Configuración del documento", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "Nombre", + "descriptionLabel": "Descripción", + "categoryLabel": "Categoría", + "fileLabel": "Archivo", + "fileHint": "PDF, imágenes, texto y archivos Office de hasta 5 MB.", + "visibilityLabel": "Visibilidad", + "statusLabel": "Estado", + "allowedMembersLabel": "Miembros permitidos", + "uploadAction": "Subir", + "downloadAction": "Descargar", + "editAction": "Configuración", + "archiveAction": "Archivar", + "restoreAction": "Restaurar", + "savedToast": "Documento guardado.", + "uploadedToast": "Documento subido.", + "archivedToast": "Documento archivado.", + "restoredToast": "Documento restaurado.", + "deletedToast": "Documento eliminado.", + "deleteConfirm": "¿Eliminar documento \"{{name}}\"?", + "fileRequired": "Selecciona un archivo para subir.", + "fileTooLarge": "El archivo puede tener como máximo 5 MB.", + "fileReadError": "No se pudo leer el archivo.", + "statusActive": "Activo", + "statusArchived": "Archivado", "visibility": { "family": "Toda la familia", "restricted": "Miembros seleccionados", diff --git a/public/locales/fr.json b/public/locales/fr.json index 5f2d9bc..12feca1 100644 --- a/public/locales/fr.json +++ b/public/locales/fr.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Priorité", "filterGroupStatus": "Statut", "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": { "title": "Courses", @@ -903,38 +908,38 @@ "title": "Documents", "addButton": "Ajouter un document", "searchPlaceholder": "Rechercher des documents...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Vue en grille", + "listView": "Vue en liste", + "viewToggle": "Vue des documents", "allCategories": "Toutes les catégories", "emptyTitle": "Aucun document pour le moment", "emptyDescription": "Ajoutez des documents familiaux et contrôlez qui peut voir chaque fichier.", "newTitle": "Nouveau document", "editTitle": "Paramètres du document", - "nameLabel": "Name", + "nameLabel": "Nom", "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "categoryLabel": "Catégorie", + "fileLabel": "Fichier", + "fileHint": "PDF, images, texte et fichiers Office jusqu'à 5 Mo.", + "visibilityLabel": "Visibilité", + "statusLabel": "Statut", + "allowedMembersLabel": "Membres autorisés", + "uploadAction": "Téléverser", + "downloadAction": "Télécharger", + "editAction": "Paramètres", + "archiveAction": "Archiver", + "restoreAction": "Restaurer", + "savedToast": "Document enregistré.", + "uploadedToast": "Document téléversé.", + "archivedToast": "Document archivé.", + "restoredToast": "Document restauré.", + "deletedToast": "Document supprimé.", + "deleteConfirm": "Supprimer le document \"{{name}}\" ?", + "fileRequired": "Sélectionnez un fichier à téléverser.", + "fileTooLarge": "Le fichier ne peut pas dépasser 5 Mo.", + "fileReadError": "Impossible de lire le fichier.", + "statusActive": "Actif", + "statusArchived": "Archivé", "visibility": { "family": "Toute la famille", "restricted": "Membres sélectionnés", diff --git a/public/locales/hi.json b/public/locales/hi.json index 0140a78..30069a2 100644 --- a/public/locales/hi.json +++ b/public/locales/hi.json @@ -180,7 +180,12 @@ "filterGroupPriority": "प्राथमिकता", "filterGroupStatus": "स्थिति", "swipedDoneToast": "पूर्ण के रूप में चिह्नित।", - "swipedOpenToast": "खुले के रूप में चिह्नित।" + "swipedOpenToast": "खुले के रूप में चिह्नित।", + "statusArchived": "संग्रहित", + "archiveButton": "कार्य संग्रहित करें", + "archivedToast": "कार्य संग्रहित किया गया।", + "kanbanArchived": "संग्रहित", + "reminderNeedsDueDate": "कार्य अनुस्मारक सक्षम करने के लिए एक नियत तारीख निर्धारित करें।" }, "shopping": { "title": "खरीदारी", @@ -903,38 +908,38 @@ "title": "दस्तावेज़", "addButton": "दस्तावेज़ जोड़ें", "searchPlaceholder": "दस्तावेज़ खोजें...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "ग्रिड व्यू", + "listView": "सूची व्यू", + "viewToggle": "दस्तावेज़ व्यू", "allCategories": "सभी श्रेणियाँ", "emptyTitle": "अभी कोई दस्तावेज़ नहीं", "emptyDescription": "परिवार के दस्तावेज़ अपलोड करें और तय करें कि हर फ़ाइल कौन देख सकता है।", "newTitle": "नया दस्तावेज़", "editTitle": "दस्तावेज़ सेटिंग्स", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "नाम", + "descriptionLabel": "विवरण", + "categoryLabel": "श्रेणी", + "fileLabel": "फ़ाइल", + "fileHint": "PDF, चित्र, टेक्स्ट और Office फ़ाइलें 5 MB तक।", + "visibilityLabel": "दृश्यता", + "statusLabel": "स्थिति", + "allowedMembersLabel": "अनुमत सदस्य", + "uploadAction": "अपलोड करें", + "downloadAction": "डाउनलोड करें", + "editAction": "सेटिंग्स", + "archiveAction": "संग्रहित करें", + "restoreAction": "पुनर्स्थापित करें", + "savedToast": "दस्तावेज़ सहेजा गया।", + "uploadedToast": "दस्तावेज़ अपलोड किया गया।", + "archivedToast": "दस्तावेज़ संग्रहित किया गया।", + "restoredToast": "दस्तावेज़ पुनर्स्थापित किया गया।", + "deletedToast": "दस्तावेज़ हटाया गया।", + "deleteConfirm": "दस्तावेज़ \"{{name}}\" हटाएं?", + "fileRequired": "अपलोड करने के लिए एक फ़ाइल चुनें।", + "fileTooLarge": "फ़ाइल अधिकतम 5 MB हो सकती है।", + "fileReadError": "फ़ाइल पढ़ी नहीं जा सकी।", + "statusActive": "सक्रिय", + "statusArchived": "संग्रहित", "visibility": { "family": "पूरा परिवार", "restricted": "चुने हुए सदस्य", diff --git a/public/locales/it.json b/public/locales/it.json index a186987..c5df136 100644 --- a/public/locales/it.json +++ b/public/locales/it.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Priorità", "filterGroupStatus": "Stato", "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": { "title": "Spesa", @@ -903,38 +908,38 @@ "title": "Documenti", "addButton": "Aggiungi documento", "searchPlaceholder": "Cerca documenti...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Vista griglia", + "listView": "Vista elenco", + "viewToggle": "Vista documenti", "allCategories": "Tutte le categorie", "emptyTitle": "Nessun documento", "emptyDescription": "Carica documenti di famiglia e controlla chi può vedere ogni file.", "newTitle": "Nuovo documento", "editTitle": "Impostazioni documento", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", + "nameLabel": "Nome", + "descriptionLabel": "Descrizione", + "categoryLabel": "Categoria", "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "fileHint": "PDF, immagini, testo e file Office fino a 5 MB.", + "visibilityLabel": "Visibilità", + "statusLabel": "Stato", + "allowedMembersLabel": "Membri autorizzati", + "uploadAction": "Carica", + "downloadAction": "Scarica", + "editAction": "Impostazioni", + "archiveAction": "Archivia", + "restoreAction": "Ripristina", + "savedToast": "Documento salvato.", + "uploadedToast": "Documento caricato.", + "archivedToast": "Documento archiviato.", + "restoredToast": "Documento ripristinato.", + "deletedToast": "Documento eliminato.", + "deleteConfirm": "Eliminare il documento \"{{name}}\"?", + "fileRequired": "Seleziona un file da caricare.", + "fileTooLarge": "Il file può essere al massimo 5 MB.", + "fileReadError": "Impossibile leggere il file.", + "statusActive": "Attivo", + "statusArchived": "Archiviato", "visibility": { "family": "Tutta la famiglia", "restricted": "Membri selezionati", diff --git a/public/locales/ja.json b/public/locales/ja.json index af14261..74b90e4 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -180,7 +180,12 @@ "filterGroupPriority": "優先度", "filterGroupStatus": "ステータス", "swipedDoneToast": "完了としてマーク。", - "swipedOpenToast": "未完了としてマーク。" + "swipedOpenToast": "未完了としてマーク。", + "statusArchived": "アーカイブ済み", + "archiveButton": "タスクをアーカイブ", + "archivedToast": "タスクをアーカイブしました。", + "kanbanArchived": "アーカイブ済み", + "reminderNeedsDueDate": "タスクのリマインダーを有効にするには期日を設定してください。" }, "shopping": { "title": "買い物", @@ -903,38 +908,38 @@ "title": "書類", "addButton": "書類を追加", "searchPlaceholder": "書類を検索...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "グリッド表示", + "listView": "リスト表示", + "viewToggle": "ドキュメント表示", "allCategories": "すべてのカテゴリ", "emptyTitle": "書類はまだありません", "emptyDescription": "家族の書類をアップロードし、各ファイルを見られるメンバーを管理できます。", "newTitle": "新しい書類", "editTitle": "書類設定", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "名前", + "descriptionLabel": "説明", + "categoryLabel": "カテゴリ", + "fileLabel": "ファイル", + "fileHint": "PDF、画像、テキスト、Officeファイル(5MBまで)。", + "visibilityLabel": "公開範囲", + "statusLabel": "ステータス", + "allowedMembersLabel": "許可メンバー", + "uploadAction": "アップロード", + "downloadAction": "ダウンロード", + "editAction": "設定", + "archiveAction": "アーカイブ", + "restoreAction": "復元", + "savedToast": "ドキュメントを保存しました。", + "uploadedToast": "ドキュメントをアップロードしました。", + "archivedToast": "ドキュメントをアーカイブしました。", + "restoredToast": "ドキュメントを復元しました。", + "deletedToast": "ドキュメントを削除しました。", + "deleteConfirm": "ドキュメント「{{name}}」を削除しますか?", + "fileRequired": "アップロードするファイルを選択してください。", + "fileTooLarge": "ファイルは5MB以下である必要があります。", + "fileReadError": "ファイルを読み込めませんでした。", + "statusActive": "有効", + "statusArchived": "アーカイブ済み", "visibility": { "family": "家族全員", "restricted": "選択したメンバー", diff --git a/public/locales/pt.json b/public/locales/pt.json index cc192bc..4c6de1f 100644 --- a/public/locales/pt.json +++ b/public/locales/pt.json @@ -923,7 +923,7 @@ "fileLabel": "Arquivo", "fileHint": "PDF, imagens, texto e arquivos Office ate 5 MB.", "visibilityLabel": "Visibilidade", - "statusLabel": "Status", + "statusLabel": "Estado", "allowedMembersLabel": "Membros permitidos", "uploadAction": "Enviar", "downloadAction": "Baixar", diff --git a/public/locales/ru.json b/public/locales/ru.json index cbde67e..6d7b270 100644 --- a/public/locales/ru.json +++ b/public/locales/ru.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Приоритет", "filterGroupStatus": "Статус", "swipedDoneToast": "Отмечено как выполненное.", - "swipedOpenToast": "Отмечено как открытое." + "swipedOpenToast": "Отмечено как открытое.", + "statusArchived": "Архивирована", + "archiveButton": "Архивировать задачу", + "archivedToast": "Задача архивирована.", + "kanbanArchived": "Архивировано", + "reminderNeedsDueDate": "Установите срок выполнения, чтобы включить напоминания о задаче." }, "shopping": { "title": "Покупки", @@ -903,38 +908,38 @@ "title": "Документы", "addButton": "Добавить документ", "searchPlaceholder": "Поиск документов...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Сетка", + "listView": "Список", + "viewToggle": "Вид документов", "allCategories": "Все категории", "emptyTitle": "Документов пока нет", "emptyDescription": "Загружайте семейные документы и управляйте доступом к каждому файлу.", "newTitle": "Новый документ", "editTitle": "Настройки документа", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "Название", + "descriptionLabel": "Описание", + "categoryLabel": "Категория", + "fileLabel": "Файл", + "fileHint": "PDF, изображения, текст и файлы Office до 5 МБ.", + "visibilityLabel": "Видимость", + "statusLabel": "Статус", + "allowedMembersLabel": "Разрешённые участники", + "uploadAction": "Загрузить", + "downloadAction": "Скачать", + "editAction": "Настройки", + "archiveAction": "Архивировать", + "restoreAction": "Восстановить", + "savedToast": "Документ сохранён.", + "uploadedToast": "Документ загружен.", + "archivedToast": "Документ архивирован.", + "restoredToast": "Документ восстановлен.", + "deletedToast": "Документ удалён.", + "deleteConfirm": "Удалить документ «{{name}}»?", + "fileRequired": "Выберите файл для загрузки.", + "fileTooLarge": "Файл может быть не более 5 МБ.", + "fileReadError": "Не удалось прочитать файл.", + "statusActive": "Активный", + "statusArchived": "Архивированный", "visibility": { "family": "Вся семья", "restricted": "Выбранные участники", diff --git a/public/locales/sv.json b/public/locales/sv.json index 22ccc90..5cd0ec7 100644 --- a/public/locales/sv.json +++ b/public/locales/sv.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Prioritet", "filterGroupStatus": "Status", "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": { "title": "Shopping", @@ -903,38 +908,38 @@ "title": "Dokument", "addButton": "Lägg till dokument", "searchPlaceholder": "Sök dokument...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Rutnätsvy", + "listView": "Listvy", + "viewToggle": "Dokumentvy", "allCategories": "Alla kategorier", "emptyTitle": "Inga dokument ännu", "emptyDescription": "Ladda upp familjedokument och styr vem som kan se varje fil.", "newTitle": "Nytt dokument", "editTitle": "Dokumentinställningar", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", + "nameLabel": "Namn", + "descriptionLabel": "Beskrivning", + "categoryLabel": "Kategori", + "fileLabel": "Fil", + "fileHint": "PDF, bilder, text och Office-filer upp till 5 MB.", + "visibilityLabel": "Synlighet", "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "allowedMembersLabel": "Tillåtna medlemmar", + "uploadAction": "Ladda upp", + "downloadAction": "Ladda ner", + "editAction": "Inställningar", + "archiveAction": "Arkivera", + "restoreAction": "Återställ", + "savedToast": "Dokumentet sparades.", + "uploadedToast": "Dokumentet laddades upp.", + "archivedToast": "Dokumentet arkiverades.", + "restoredToast": "Dokumentet återställdes.", + "deletedToast": "Dokumentet raderades.", + "deleteConfirm": "Ta bort dokument \"{{name}}\"?", + "fileRequired": "Välj en fil att ladda upp.", + "fileTooLarge": "Filen får vara högst 5 MB.", + "fileReadError": "Filen kunde inte läsas.", + "statusActive": "Aktiv", + "statusArchived": "Arkiverad", "visibility": { "family": "Hela familjen", "restricted": "Valda medlemmar", diff --git a/public/locales/tr.json b/public/locales/tr.json index 9129103..ceb5e0a 100644 --- a/public/locales/tr.json +++ b/public/locales/tr.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Öncelik", "filterGroupStatus": "Durum", "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": { "title": "Alışveriş", @@ -903,38 +908,38 @@ "title": "Belgeler", "addButton": "Belge ekle", "searchPlaceholder": "Belgelerde ara...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Izgara görünümü", + "listView": "Liste görünümü", + "viewToggle": "Belge görünümü", "allCategories": "Tüm kategoriler", "emptyTitle": "Henüz belge yok", "emptyDescription": "Aile belgelerini yükleyin ve her dosyayı kimlerin görebileceğini yönetin.", "newTitle": "Yeni belge", "editTitle": "Belge ayarları", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "Ad", + "descriptionLabel": "Açıklama", + "categoryLabel": "Kategori", + "fileLabel": "Dosya", + "fileHint": "PDF, resimler, metin ve Office dosyaları en fazla 5 MB.", + "visibilityLabel": "Görünürlük", + "statusLabel": "Durum", + "allowedMembersLabel": "İzin verilen üyeler", + "uploadAction": "Yükle", + "downloadAction": "İndir", + "editAction": "Ayarlar", + "archiveAction": "Arşivle", + "restoreAction": "Geri yükle", + "savedToast": "Belge kaydedildi.", + "uploadedToast": "Belge yüklendi.", + "archivedToast": "Belge arşivlendi.", + "restoredToast": "Belge geri yüklendi.", + "deletedToast": "Belge silindi.", + "deleteConfirm": "\"{{name}}\" belgesini sil?", + "fileRequired": "Yüklemek için bir dosya seçin.", + "fileTooLarge": "Dosya en fazla 5 MB olabilir.", + "fileReadError": "Dosya okunamadı.", + "statusActive": "Aktif", + "statusArchived": "Arşivlenmiş", "visibility": { "family": "Tüm aile", "restricted": "Seçili üyeler", diff --git a/public/locales/uk.json b/public/locales/uk.json index e0c66de..ded1608 100644 --- a/public/locales/uk.json +++ b/public/locales/uk.json @@ -180,7 +180,12 @@ "filterGroupPriority": "Пріоритет", "filterGroupStatus": "Статус", "swipedDoneToast": "Позначено як виконане.", - "swipedOpenToast": "Позначено як відкрите." + "swipedOpenToast": "Позначено як відкрите.", + "statusArchived": "Архівована", + "archiveButton": "Архівувати завдання", + "archivedToast": "Завдання архівовано.", + "kanbanArchived": "Архівовано", + "reminderNeedsDueDate": "Встановіть дату виконання, щоб увімкнути нагадування про завдання." }, "shopping": { "title": "Покупки", @@ -911,38 +916,38 @@ "title": "Документи", "addButton": "Додати документ", "searchPlaceholder": "Пошук документів...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "Сітка", + "listView": "Список", + "viewToggle": "Вигляд документів", "allCategories": "Усі категорії", "emptyTitle": "Документів ще немає", "emptyDescription": "Завантажуйте сімейні документи та керуйте доступом до кожного файлу.", "newTitle": "Новий документ", "editTitle": "Налаштування документа", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "Назва", + "descriptionLabel": "Опис", + "categoryLabel": "Категорія", + "fileLabel": "Файл", + "fileHint": "PDF, зображення, текст та файли Office до 5 МБ.", + "visibilityLabel": "Видимість", + "statusLabel": "Статус", + "allowedMembersLabel": "Дозволені учасники", + "uploadAction": "Завантажити", + "downloadAction": "Завантажити", + "editAction": "Налаштування", + "archiveAction": "Архівувати", + "restoreAction": "Відновити", + "savedToast": "Документ збережено.", + "uploadedToast": "Документ завантажено.", + "archivedToast": "Документ архівовано.", + "restoredToast": "Документ відновлено.", + "deletedToast": "Документ видалено.", + "deleteConfirm": "Видалити документ «{{name}}»?", + "fileRequired": "Виберіть файл для завантаження.", + "fileTooLarge": "Файл може бути не більше 5 МБ.", + "fileReadError": "Не вдалося прочитати файл.", + "statusActive": "Активний", + "statusArchived": "Архівований", "visibility": { "family": "Уся сім’я", "restricted": "Вибрані учасники", diff --git a/public/locales/zh.json b/public/locales/zh.json index 730b037..9567d54 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -180,7 +180,12 @@ "filterGroupPriority": "优先级", "filterGroupStatus": "状态", "swipedDoneToast": "已标记为完成。", - "swipedOpenToast": "已标记为未完成。" + "swipedOpenToast": "已标记为未完成。", + "statusArchived": "已归档", + "archiveButton": "归档任务", + "archivedToast": "任务已归档。", + "kanbanArchived": "已归档", + "reminderNeedsDueDate": "设置截止日期以启用任务提醒。" }, "shopping": { "title": "购物", @@ -903,38 +908,38 @@ "title": "文档", "addButton": "添加文档", "searchPlaceholder": "搜索文档...", - "gridView": "Grid view", - "listView": "List view", - "viewToggle": "Document view", + "gridView": "网格视图", + "listView": "列表视图", + "viewToggle": "文档视图", "allCategories": "所有类别", "emptyTitle": "还没有文档", "emptyDescription": "上传家庭文档并控制每个文件的可见成员。", "newTitle": "新文档", "editTitle": "文档设置", - "nameLabel": "Name", - "descriptionLabel": "Description", - "categoryLabel": "Category", - "fileLabel": "File", - "fileHint": "PDF, images, text and Office files up to 5 MB.", - "visibilityLabel": "Visibility", - "statusLabel": "Status", - "allowedMembersLabel": "Allowed members", - "uploadAction": "Upload", - "downloadAction": "Download", - "editAction": "Settings", - "archiveAction": "Archive", - "restoreAction": "Restore", - "savedToast": "Document saved.", - "uploadedToast": "Document uploaded.", - "archivedToast": "Document archived.", - "restoredToast": "Document restored.", - "deletedToast": "Document deleted.", - "deleteConfirm": "Delete document \"{{name}}\"?", - "fileRequired": "Select a file to upload.", - "fileTooLarge": "File may be at most 5 MB.", - "fileReadError": "File could not be read.", - "statusActive": "Active", - "statusArchived": "Archived", + "nameLabel": "名称", + "descriptionLabel": "描述", + "categoryLabel": "类别", + "fileLabel": "文件", + "fileHint": "PDF、图片、文本和Office文件,最大5 MB。", + "visibilityLabel": "可见性", + "statusLabel": "状态", + "allowedMembersLabel": "允许的成员", + "uploadAction": "上传", + "downloadAction": "下载", + "editAction": "设置", + "archiveAction": "归档", + "restoreAction": "恢复", + "savedToast": "文档已保存。", + "uploadedToast": "文档已上传。", + "archivedToast": "文档已归档。", + "restoredToast": "文档已恢复。", + "deletedToast": "文档已删除。", + "deleteConfirm": "删除文档\"{{name}}\"?", + "fileRequired": "请选择要上传的文件。", + "fileTooLarge": "文件最大为5 MB。", + "fileReadError": "无法读取文件。", + "statusActive": "活跃", + "statusArchived": "已归档", "visibility": { "family": "整个家庭", "restricted": "选定成员", From 8ea0c870a7bd1c96805fa0a522591155788a4e3b Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 12:25:02 +0200 Subject: [PATCH 2/7] chore: release v0.32.1 Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 5 +++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1fada0..36bd6a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [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 ### Added diff --git a/package-lock.json b/package-lock.json index 19915d0..e7b4c4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "oikos", - "version": "0.32.0", + "version": "0.32.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oikos", - "version": "0.32.0", + "version": "0.32.1", "license": "MIT", "dependencies": { "bcrypt": "^6.0.0", diff --git a/package.json b/package.json index 02a201c..76ad466 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.32.0", + "version": "0.32.1", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", From 6852d9fbf87489423dbfe0bcb0f283dd10460822 Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 13:06:39 +0200 Subject: [PATCH 3/7] fix: bottom-nav hide-on-scroll CSS, mehr-sheet 3-col, tablet toast position --- public/styles/layout.css | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/public/styles/layout.css b/public/styles/layout.css index 8b75702..f1fcaa8 100755 --- a/public/styles/layout.css +++ b/public/styles/layout.css @@ -144,6 +144,11 @@ z-index: var(--z-nav); 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 ── */ @@ -197,7 +202,7 @@ padding: var(--space-4) var(--space-4) calc(var(--space-4) + var(--safe-area-inset-bottom)); z-index: calc(var(--z-nav) + 2); display: grid; - grid-template-columns: repeat(4, 1fr); + grid-template-columns: repeat(3, 1fr); gap: var(--space-3); transform: translateY(100%); transition: transform 0.25s var(--ease-out); @@ -1590,6 +1595,14 @@ width: min(calc(100% - var(--space-8)), 380px); } +@media (min-width: 768px) and (max-width: 1023px) { + .toast-container { + bottom: var(--space-8); + left: 50%; + transform: translateX(-50%); + } +} + @media (min-width: 1024px) { .toast-container { bottom: var(--space-6); From ca26befecd12329efb9ca45750676e99edb5d4cd Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 13:07:59 +0200 Subject: [PATCH 4/7] fix: remove redundant toast-container properties in tablet media query --- public/styles/layout.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/styles/layout.css b/public/styles/layout.css index f1fcaa8..ea58c11 100755 --- a/public/styles/layout.css +++ b/public/styles/layout.css @@ -1598,8 +1598,6 @@ @media (min-width: 768px) and (max-width: 1023px) { .toast-container { bottom: var(--space-8); - left: 50%; - transform: translateX(-50%); } } From 9b7909f690f0861f614b7dfb74a2495c48509956 Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 13:09:21 +0200 Subject: [PATCH 5/7] fix: page transition crossfade eliminates dark-mode flash on navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the sequential fade-out → wait → fade-in pattern that causes a visible black flash in dark mode between page transitions. Replaces with immediate crossfade (new page fades in over old content, no wait). Changes: - layout.css: Add page-crossfade-in keyframe (0.18s) + prefers-reduced-motion override - router.js: Remove outClass/inClass direction logic and oldPage fadeout wait The new approach: 1. Old page remains visible until new page renders 2. New page fades in (0.18s) with full opacity, overlaying old content 3. No 120ms delay = no visible flash in dark mode Co-Authored-By: Claude Sonnet 4.6 --- public/router.js | 8 -------- public/styles/layout.css | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/public/router.js b/public/router.js index 7a769c0..3907518 100644 --- a/public/router.js +++ b/public/router.js @@ -350,20 +350,12 @@ async function renderPage(route, previousPath = null) { // Richtung bestimmen (previousPath ist der alte Pfad vor der Navigation) 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'; // 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. 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 const pageWrapper = document.createElement('div'); pageWrapper.className = 'page-transition'; diff --git a/public/styles/layout.css b/public/styles/layout.css index ea58c11..d9ce003 100755 --- a/public/styles/layout.css +++ b/public/styles/layout.css @@ -80,6 +80,11 @@ to { opacity: 0; transform: translateX(20px); } } +@keyframes page-crossfade-in { + from { opacity: 0; } + to { opacity: 1; } +} + .page-transition--in-right { animation: page-slide-in-right 0.2s var(--ease-out); } @@ -95,6 +100,11 @@ pointer-events: none; } +.page-transition--crossfade { + animation: page-crossfade-in 0.18s var(--ease-out); + opacity: 1; +} + @media (prefers-reduced-motion: reduce) { .page-transition--in-right, .page-transition--in-left { @@ -105,6 +115,10 @@ .page-transition--out-right { animation: none; } + .page-transition--crossfade { + animation: none; + opacity: 1; + } } /* -------------------------------------------------------- From 50b224eaeffab3032cbe4565450cc709d9eb317c Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 13:12:56 +0200 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20restructure=20bottom-nav=20?= =?UTF-8?q?=E2=80=94=20search=20as=20primary=20slot,=20sidebar=20tooltips?= =?UTF-8?q?=20for=20collapsed=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/router.js | 65 +++++++++++++++++++++++++++++++--------- public/styles/layout.css | 32 ++++++++++++++++++++ 2 files changed, 83 insertions(+), 14 deletions(-) diff --git a/public/router.js b/public/router.js index 3907518..2e2b9a9 100644 --- a/public/router.js +++ b/public/router.js @@ -131,7 +131,7 @@ let _pendingLoginRedirect = false; const ROUTE_ORDER = ['/', '/tasks', '/calendar', '/birthdays', '/meals', '/recipes', '/shopping', '/notes', '/contacts', '/budget', '/documents', '/settings']; -const PRIMARY_NAV = 4; +const PRIMARY_NAV = 3; const DEFAULT_APP_NAME = 'Oikos'; const APP_NAME_STORAGE_KEY = 'oikos-app-name'; @@ -478,6 +478,20 @@ function renderAppShell(container) { const bottomItems = document.createElement('div'); bottomItems.className = 'nav-bottom__items'; 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'); moreBtn.className = 'nav-item nav-item--more'; moreBtn.id = 'more-btn'; @@ -750,6 +764,7 @@ function initMoreSheet(container) { */ function initSearch(container) { const searchBtn = container.querySelector('#search-btn'); + const searchNavBtn = container.querySelector('#search-nav-btn'); const searchClose = container.querySelector('#search-close'); const overlay = container.querySelector('#search-overlay'); const input = container.querySelector('#search-input'); @@ -762,6 +777,7 @@ function initSearch(container) { let _searchTrapHandler = null; function openSearch() { + window._openSearch = openSearch; if (window._closeMoreSheet) window._closeMoreSheet(); overlay.setAttribute('aria-hidden', 'false'); overlay.classList.add('search-overlay--visible'); @@ -796,6 +812,7 @@ function initSearch(container) { } searchBtn.addEventListener('click', openSearch); + if (searchNavBtn) searchNavBtn.addEventListener('click', openSearch); searchClose.addEventListener('click', closeSearch); document.addEventListener('keydown', (e) => { @@ -870,18 +887,18 @@ function renderSearchResults(container, data, onClose) { function navItems() { return [ - { path: '/', label: t('nav.dashboard'), icon: 'layout-dashboard' }, - { 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: '/meals', label: t('nav.meals'), icon: 'utensils' }, - { path: '/recipes', label: t('nav.recipes'), icon: 'book-text' }, - { path: '/shopping', label: t('nav.shopping'), icon: 'shopping-cart' }, - { path: '/notes', label: t('nav.notes'), icon: 'sticky-note' }, - { path: '/contacts', label: t('nav.contacts'), icon: 'book-user' }, - { path: '/budget', label: t('nav.budget'), icon: 'wallet' }, - { path: '/documents', label: t('nav.documents'), icon: 'folder-lock' }, - { path: '/settings', label: t('nav.settings'), icon: 'settings' }, + { path: '/', label: t('nav.dashboard'), icon: 'layout-dashboard' }, + { path: '/tasks', label: t('nav.tasks'), icon: 'check-square' }, + { 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: '/recipes', label: t('nav.recipes'), icon: 'book-text' }, + { path: '/birthdays', label: t('nav.birthdays'), icon: 'cake' }, + { path: '/notes', label: t('nav.notes'), icon: 'sticky-note' }, + { path: '/contacts', label: t('nav.contacts'), icon: 'book-user' }, + { path: '/budget', label: t('nav.budget'), icon: 'wallet' }, + { path: '/documents', label: t('nav.documents'), icon: 'folder-lock' }, + { path: '/settings', label: t('nav.settings'), icon: 'settings' }, ]; } @@ -1120,7 +1137,27 @@ window.addEventListener('locale-changed', () => { if (bottomItems) { const moreBtn = bottomItems.querySelector('#more-btn'); 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) { const searchBtn = moreSheet.querySelector('#search-btn'); diff --git a/public/styles/layout.css b/public/styles/layout.css index d9ce003..243c0fb 100755 --- a/public/styles/layout.css +++ b/public/styles/layout.css @@ -663,6 +663,38 @@ } } +/* Tooltip für collapsed Sidebar (nur Icons sichtbar bei 1024–1439px) */ +@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 * ================================================================ */ From 6c069fc99c587ba270dfc59d41c0907b31cf8bb5 Mon Sep 17 00:00:00 2001 From: Ulas Kalayci Date: Wed, 29 Apr 2026 13:13:19 +0200 Subject: [PATCH 7/7] chore: release v0.32.2 --- CHANGELOG.md | 6 ++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36bd6a2..8801e02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [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 (1024–1439 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 diff --git a/package-lock.json b/package-lock.json index e7b4c4c..a29070d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "oikos", - "version": "0.32.1", + "version": "0.32.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oikos", - "version": "0.32.1", + "version": "0.32.2", "license": "MIT", "dependencies": { "bcrypt": "^6.0.0", diff --git a/package.json b/package.json index 76ad466..704b705 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.32.1", + "version": "0.32.2", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module",