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": "Compras",
|
||||
"notes": "Notas",
|
||||
"contacts": "Contatos",
|
||||
"birthdays": "Aniversários",
|
||||
"budget": "Orçamento",
|
||||
"settings": "Configurações",
|
||||
"main": "Navegação principal",
|
||||
@@ -82,6 +83,19 @@
|
||||
"allDay": "Dia inteiro",
|
||||
"shoppingMore": "+{{count}} mais",
|
||||
"weather": "Clima",
|
||||
"familyMembers": "Membros da família",
|
||||
"participantsAdded": "participantes adicionados",
|
||||
"upcomingBirthdays": "Próximos aniversários",
|
||||
"noBirthdays": "Nenhum aniversário ainda",
|
||||
"daysLeft": "{{count}} dias",
|
||||
"budgetOverview": "Visão do orçamento",
|
||||
"monthlyIncome": "Receitas",
|
||||
"monthlyExpenses": "Despesas",
|
||||
"monthlyBalance": "Saldo",
|
||||
"savingsRate": "Taxa de poupança",
|
||||
"topExpense": "Maior despesa",
|
||||
"budgetEntries": "Lançamentos",
|
||||
"noBudgetData": "Sem dados de orçamento neste mês.",
|
||||
"customize": "Personalizar",
|
||||
"customizeTitle": "Personalizar widgets",
|
||||
"customizeReset": "Padrão",
|
||||
@@ -537,6 +551,7 @@
|
||||
"tabAccount": "Conta",
|
||||
"tabsAriaLabel": "Seções de configurações",
|
||||
"sectionDesign": "Design",
|
||||
"sectionAppName": "Nome da aplicação",
|
||||
"sectionShopping": "Compras",
|
||||
"shoppingCategoriesLabel": "Categorias de compras",
|
||||
"shoppingCategoriesHint": "Adicione, renomeie, exclua ou ordene categorias.",
|
||||
@@ -554,6 +569,16 @@
|
||||
"sectionCalendarSync": "Sincronização de calendário",
|
||||
"sectionFamily": "Membros da família",
|
||||
"cardAppearance": "Aparência",
|
||||
"appNameTitle": "Nome do app",
|
||||
"appNameLabel": "Nome da aplicação",
|
||||
"appNameHint": "Este nome aparece na barra lateral, no título do navegador e no ecrã de login.",
|
||||
"appNamePlaceholder": "Oikos",
|
||||
"appNameSavedToast": "Nome da aplicação guardado.",
|
||||
"sectionDate": "Data",
|
||||
"dateFormatTitle": "Formato da data",
|
||||
"dateFormatLabel": "Formato preferido da data",
|
||||
"dateFormatHint": "Escolha como as datas aparecem em toda a aplicação.",
|
||||
"dateFormatSavedToast": "Formato da data salvo.",
|
||||
"themeSystem": "Sistema",
|
||||
"themeSysLabel": "Usar configuração do sistema",
|
||||
"themeLight": "Claro",
|
||||
@@ -760,6 +785,35 @@
|
||||
"placeholder": "Pesquisar…",
|
||||
"noResults": "Nenhum resultado encontrado."
|
||||
},
|
||||
"birthdays": {
|
||||
"title": "Aniversários",
|
||||
"addButton": "Adicionar aniversário",
|
||||
"searchPlaceholder": "Buscar aniversários…",
|
||||
"upcomingTitle": "Próximos aniversários",
|
||||
"upcomingHint": "As próximas comemorações, já sincronizadas com o calendário.",
|
||||
"peopleTitle": "Pessoas",
|
||||
"peopleHint": "Pesquise, revise e edite todos os aniversários salvos.",
|
||||
"emptyTitle": "Nenhum aniversário ainda",
|
||||
"emptyDescription": "Adicione um aniversário para mantê-lo visível no calendário e nos lembretes.",
|
||||
"newTitle": "Novo aniversário",
|
||||
"editTitle": "Editar aniversário",
|
||||
"nameLabel": "Nome",
|
||||
"birthDateLabel": "Data de nascimento",
|
||||
"photoLabel": "Foto de perfil",
|
||||
"photoOptional": "Opcional: você também pode salvar sem foto de perfil.",
|
||||
"removePhoto": "Remover foto",
|
||||
"notesLabel": "Notas",
|
||||
"notesPlaceholder": "Ideias de presente, bolo favorito, notas da família…",
|
||||
"calendarHint": "Cada aniversário é adicionado automaticamente ao calendário e ao sistema de lembretes.",
|
||||
"requiredFields": "Nome e data de nascimento são obrigatórios.",
|
||||
"createdToast": "Aniversário salvo.",
|
||||
"updatedToast": "Aniversário atualizado.",
|
||||
"deletedToast": "Aniversário excluído.",
|
||||
"deleteConfirm": "Excluir o aniversário de \"{{name}}\"?",
|
||||
"ageNoteToday": "Completa {{age}} anos hoje.",
|
||||
"ageNoteTomorrow": "Completa {{age}} anos amanhã.",
|
||||
"ageNoteDays": "Completa {{age}} anos em {{days}} dias."
|
||||
},
|
||||
"reminders": {
|
||||
"sectionTitle": "Lembrete",
|
||||
"enableLabel": "Definir lembrete",
|
||||
|
||||
Reference in New Issue
Block a user