feat: birthday tracking, dashboard KPIs, and app name customization (#88)
- Add Birthdays module: CRUD with calendar/reminder auto-sync, photo upload, age notes - Add DB migration 18 (birthdays table with calendar_event_id, trigger, indexes) - Add dashboard widgets: birthdays, family participants, budget overview - Add Settings > General: admins can set a custom app name (reflected in title/sidebar/login) - Improve service worker: network-first caching for mutable JS/CSS assets - Add translations for 16 locales (birthday keys) Fixes applied during integration: - innerHTML replaced with insertAdjacentHTML/replaceChildren throughout birthdays.js and dashboard.js - docker-compose.yml personal dev changes reverted Co-authored-by: Rafael Foster <rafaelgfoster@gmail.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
"shopping": "Покупки",
|
||||
"notes": "Заметки",
|
||||
"contacts": "Контакты",
|
||||
"birthdays": "Дни рождения",
|
||||
"budget": "Бюджет",
|
||||
"settings": "Настройки",
|
||||
"main": "Главная навигация",
|
||||
@@ -82,6 +83,19 @@
|
||||
"allDay": "Весь день",
|
||||
"shoppingMore": "+{{count}} ещё",
|
||||
"weather": "Погода",
|
||||
"familyMembers": "Члены семьи",
|
||||
"participantsAdded": "участников добавлено",
|
||||
"upcomingBirthdays": "Ближайшие дни рождения",
|
||||
"noBirthdays": "Дней рождения пока нет",
|
||||
"daysLeft": "{{count}} дн.",
|
||||
"budgetOverview": "Обзор бюджета",
|
||||
"monthlyIncome": "Доходы",
|
||||
"monthlyExpenses": "Расходы",
|
||||
"monthlyBalance": "Баланс",
|
||||
"savingsRate": "Норма сбережений",
|
||||
"topExpense": "Крупнейший расход",
|
||||
"budgetEntries": "Записи",
|
||||
"noBudgetData": "Нет данных бюджета за этот месяц.",
|
||||
"customize": "Настроить",
|
||||
"customizeTitle": "Настроить виджеты",
|
||||
"customizeReset": "Сбросить",
|
||||
@@ -537,6 +551,7 @@
|
||||
"tabAccount": "Аккаунт",
|
||||
"tabsAriaLabel": "Разделы настроек",
|
||||
"sectionDesign": "Внешний вид",
|
||||
"sectionAppName": "Название приложения",
|
||||
"sectionShopping": "Покупки",
|
||||
"shoppingCategoriesLabel": "Категории покупок",
|
||||
"shoppingCategoriesHint": "Добавляйте, переименовывайте, удаляйте или сортируйте категории.",
|
||||
@@ -554,6 +569,16 @@
|
||||
"sectionCalendarSync": "Синхронизация календаря",
|
||||
"sectionFamily": "Члены семьи",
|
||||
"cardAppearance": "Отображение",
|
||||
"appNameTitle": "Название приложения",
|
||||
"appNameLabel": "Название приложения",
|
||||
"appNameHint": "Это название отображается в боковом меню, заголовке браузера и на экране входа.",
|
||||
"appNamePlaceholder": "Oikos",
|
||||
"appNameSavedToast": "Название приложения сохранено.",
|
||||
"sectionDate": "Дата",
|
||||
"dateFormatTitle": "Формат даты",
|
||||
"dateFormatLabel": "Предпочитаемый формат даты",
|
||||
"dateFormatHint": "Выберите, как даты отображаются в приложении.",
|
||||
"dateFormatSavedToast": "Формат даты сохранён.",
|
||||
"themeSystem": "Система",
|
||||
"themeSysLabel": "Использовать системную настройку",
|
||||
"themeLight": "Светлая",
|
||||
@@ -760,6 +785,34 @@
|
||||
"placeholder": "Поиск…",
|
||||
"noResults": "Результаты не найдены."
|
||||
},
|
||||
"birthdays": {
|
||||
"title": "Дни рождения",
|
||||
"addButton": "Добавить день рождения",
|
||||
"searchPlaceholder": "Поиск дней рождения…",
|
||||
"upcomingTitle": "Ближайшие дни рождения",
|
||||
"upcomingHint": "Ближайшие праздники, уже синхронизированные с календарём.",
|
||||
"peopleTitle": "Люди",
|
||||
"peopleHint": "Ищите, просматривайте и редактируйте все сохранённые дни рождения.",
|
||||
"emptyTitle": "Дней рождения пока нет",
|
||||
"emptyDescription": "Добавьте день рождения, чтобы он отображался в календаре и напоминаниях.",
|
||||
"newTitle": "Новый день рождения",
|
||||
"editTitle": "Редактировать день рождения",
|
||||
"nameLabel": "Имя",
|
||||
"birthDateLabel": "Дата рождения",
|
||||
"photoLabel": "Фото профиля",
|
||||
"removePhoto": "Удалить фото",
|
||||
"notesLabel": "Заметки",
|
||||
"notesPlaceholder": "Идеи подарков, любимый торт, семейные заметки…",
|
||||
"calendarHint": "Каждый день рождения автоматически добавляется в календарь и систему напоминаний.",
|
||||
"requiredFields": "Имя и дата рождения обязательны.",
|
||||
"createdToast": "День рождения сохранён.",
|
||||
"updatedToast": "День рождения обновлён.",
|
||||
"deletedToast": "День рождения удалён.",
|
||||
"deleteConfirm": "Удалить день рождения \"{{name}}\"?",
|
||||
"ageNoteToday": "Исполняется {{age}} сегодня.",
|
||||
"ageNoteTomorrow": "Исполнится {{age}} завтра.",
|
||||
"ageNoteDays": "Исполнится {{age}} через {{days}} дн."
|
||||
},
|
||||
"reminders": {
|
||||
"sectionTitle": "Напоминание",
|
||||
"enableLabel": "Установить напоминание",
|
||||
|
||||
Reference in New Issue
Block a user