i18n: backend-localized lookups, suggestions, and static data (10 languages)
- suggestion_service: fix scorer (stringList unmarshal accepts scalar|array; anchor scoring on base universal score so bool matches no longer tie); add localizeReasons for human-readable, Accept-Language-localized match reasons - lookup_i18n: localize lookup display names, home-profile options, document types/categories via internal/i18n - static_data_handler: per-locale seeded-data response (display_name, home profile options, document types/categories) with per-locale cache + ETag - settings_handler: invalidate per-locale seeded-data cache on lookup change instead of pre-warming a single non-localized blob - cache_service: per-locale seeded-data keys + ETag - DTOs: add DisplayName fields (task/residence/contractor) - translations: add suggestion.reason.* and lookup.* keys across all 10 langs - cmd/api: extract startup helpers + tests Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -25,7 +25,6 @@
|
||||
"error.google_signin_not_configured": "O login com Google nao esta configurado",
|
||||
"error.google_signin_failed": "Falha no login com Google",
|
||||
"error.invalid_google_token": "Token de identidade Google invalido",
|
||||
|
||||
"error.invalid_task_id": "ID da tarefa invalido",
|
||||
"error.invalid_residence_id": "ID da propriedade invalido",
|
||||
"error.invalid_contractor_id": "ID do prestador invalido",
|
||||
@@ -34,7 +33,6 @@
|
||||
"error.invalid_user_id": "ID do usuario invalido",
|
||||
"error.invalid_notification_id": "ID da notificacao invalido",
|
||||
"error.invalid_device_id": "ID do dispositivo invalido",
|
||||
|
||||
"error.task_not_found": "Tarefa nao encontrada",
|
||||
"error.residence_not_found": "Propriedade nao encontrada",
|
||||
"error.contractor_not_found": "Prestador nao encontrado",
|
||||
@@ -43,7 +41,6 @@
|
||||
"error.user_not_found": "Usuario nao encontrado",
|
||||
"error.share_code_invalid": "Codigo de compartilhamento invalido",
|
||||
"error.share_code_expired": "O codigo de compartilhamento expirou",
|
||||
|
||||
"error.task_access_denied": "Voce nao tem acesso a esta tarefa",
|
||||
"error.residence_access_denied": "Voce nao tem acesso a esta propriedade",
|
||||
"error.contractor_access_denied": "Voce nao tem acesso a este prestador",
|
||||
@@ -52,10 +49,8 @@
|
||||
"error.cannot_remove_owner": "Nao e possivel remover o proprietario",
|
||||
"error.user_already_member": "O usuario ja e membro desta propriedade",
|
||||
"error.properties_limit_reached": "Voce atingiu o numero maximo de propriedades para sua assinatura",
|
||||
|
||||
"error.task_already_cancelled": "A tarefa ja esta cancelada",
|
||||
"error.task_already_archived": "A tarefa ja esta arquivada",
|
||||
|
||||
"error.failed_to_parse_form": "Falha ao analisar o formulario",
|
||||
"error.task_id_required": "task_id e obrigatorio",
|
||||
"error.invalid_task_id_value": "task_id invalido",
|
||||
@@ -64,14 +59,12 @@
|
||||
"error.invalid_residence_id_value": "residence_id invalido",
|
||||
"error.title_required": "Titulo e obrigatorio",
|
||||
"error.failed_to_upload_file": "Falha ao enviar arquivo",
|
||||
|
||||
"message.logged_out": "Logout realizado com sucesso",
|
||||
"message.email_verified": "Email verificado com sucesso",
|
||||
"message.verification_email_sent": "Email de verificacao enviado",
|
||||
"message.password_reset_email_sent": "Se existir uma conta com este email, um codigo de redefinicao foi enviado.",
|
||||
"message.reset_code_verified": "Codigo verificado com sucesso",
|
||||
"message.password_reset_success": "Senha redefinida com sucesso. Por favor, faca login com sua nova senha.",
|
||||
|
||||
"message.task_deleted": "Tarefa excluida com sucesso",
|
||||
"message.task_in_progress": "Tarefa marcada como em andamento",
|
||||
"message.task_cancelled": "Tarefa cancelada",
|
||||
@@ -79,46 +72,35 @@
|
||||
"message.task_archived": "Tarefa arquivada",
|
||||
"message.task_unarchived": "Tarefa desarquivada",
|
||||
"message.completion_deleted": "Conclusao excluida com sucesso",
|
||||
|
||||
"message.residence_deleted": "Propriedade excluida com sucesso",
|
||||
"message.user_removed": "Usuario removido da propriedade",
|
||||
"message.tasks_report_generated": "Relatorio de tarefas gerado com sucesso",
|
||||
"message.tasks_report_sent": "Relatorio de tarefas gerado e enviado para {{.Email}}",
|
||||
"message.tasks_report_email_failed": "Relatorio de tarefas gerado mas o email nao pode ser enviado",
|
||||
|
||||
"message.contractor_deleted": "Prestador excluido com sucesso",
|
||||
|
||||
"message.document_deleted": "Documento excluido com sucesso",
|
||||
"message.document_activated": "Documento ativado",
|
||||
"message.document_deactivated": "Documento desativado",
|
||||
|
||||
"message.notification_marked_read": "Notificação marcada como lida",
|
||||
"message.all_notifications_marked_read": "Todas as notificações marcadas como lidas",
|
||||
"message.device_removed": "Dispositivo removido",
|
||||
|
||||
"message.subscription_upgraded": "Assinatura atualizada com sucesso",
|
||||
"message.subscription_cancelled": "Assinatura cancelada. Você manterá os benefícios Pro até o final do seu período de faturamento.",
|
||||
"message.subscription_restored": "Assinatura restaurada com sucesso",
|
||||
|
||||
"message.file_deleted": "Arquivo excluído com sucesso",
|
||||
"message.static_data_refreshed": "Dados estáticos atualizados",
|
||||
|
||||
"error.notification_not_found": "Notificação não encontrada",
|
||||
"error.invalid_platform": "Plataforma inválida",
|
||||
|
||||
"error.upgrade_trigger_not_found": "Gatilho de atualização não encontrado",
|
||||
"error.receipt_data_required": "receipt_data é obrigatório para iOS",
|
||||
"error.purchase_token_required": "purchase_token é obrigatório para Android",
|
||||
|
||||
"error.no_file_provided": "Nenhum arquivo fornecido",
|
||||
|
||||
"error.failed_to_fetch_residence_types": "Falha ao buscar tipos de propriedade",
|
||||
"error.failed_to_fetch_task_categories": "Falha ao buscar categorias de tarefas",
|
||||
"error.failed_to_fetch_task_priorities": "Falha ao buscar prioridades de tarefas",
|
||||
"error.failed_to_fetch_task_frequencies": "Falha ao buscar frequências de tarefas",
|
||||
"error.failed_to_fetch_task_statuses": "Falha ao buscar status de tarefas",
|
||||
"error.failed_to_fetch_contractor_specialties": "Falha ao buscar especialidades de prestadores",
|
||||
|
||||
"push.task_due_soon.title": "Tarefa Proxima do Vencimento",
|
||||
"push.task_due_soon.body": "{{.TaskTitle}} vence em {{.DueDate}}",
|
||||
"push.task_overdue.title": "Tarefa Atrasada",
|
||||
@@ -129,63 +111,137 @@
|
||||
"push.task_assigned.body": "{{.TaskTitle}} foi atribuida a voce",
|
||||
"push.residence_shared.title": "Propriedade Compartilhada",
|
||||
"push.residence_shared.body": "{{.UserName}} compartilhou {{.ResidenceName}} com voce",
|
||||
|
||||
"email.welcome.subject": "Bem-vindo ao honeyDue!",
|
||||
"email.verification.subject": "Verifique Seu Email",
|
||||
"email.password_reset.subject": "Codigo de Redefinicao de Senha",
|
||||
"email.tasks_report.subject": "Relatorio de Tarefas para {{.ResidenceName}}",
|
||||
|
||||
"lookup.residence_type.house": "Casa",
|
||||
"lookup.residence_type.apartment": "Apartamento",
|
||||
"lookup.residence_type.condo": "Condominio",
|
||||
"lookup.residence_type.condo": "Condomínio",
|
||||
"lookup.residence_type.townhouse": "Sobrado",
|
||||
"lookup.residence_type.mobile_home": "Casa Movel",
|
||||
"lookup.residence_type.mobile_home": "Casa móvel",
|
||||
"lookup.residence_type.other": "Outro",
|
||||
|
||||
"lookup.task_category.plumbing": "Encanamento",
|
||||
"lookup.task_category.electrical": "Eletrica",
|
||||
"lookup.task_category.hvac": "Climatizacao",
|
||||
"lookup.task_category.appliances": "Eletrodomesticos",
|
||||
"lookup.task_category.electrical": "Elétrica",
|
||||
"lookup.task_category.hvac": "AVAC",
|
||||
"lookup.task_category.appliances": "Eletrodomésticos",
|
||||
"lookup.task_category.exterior": "Exterior",
|
||||
"lookup.task_category.interior": "Interior",
|
||||
"lookup.task_category.landscaping": "Paisagismo",
|
||||
"lookup.task_category.safety": "Seguranca",
|
||||
"lookup.task_category.safety": "Segurança",
|
||||
"lookup.task_category.cleaning": "Limpeza",
|
||||
"lookup.task_category.pest_control": "Controle de Pragas",
|
||||
"lookup.task_category.pest_control": "Controle de pragas",
|
||||
"lookup.task_category.seasonal": "Sazonal",
|
||||
"lookup.task_category.other": "Outro",
|
||||
|
||||
"lookup.task_priority.low": "Baixa",
|
||||
"lookup.task_priority.medium": "Media",
|
||||
"lookup.task_priority.medium": "Média",
|
||||
"lookup.task_priority.high": "Alta",
|
||||
"lookup.task_priority.urgent": "Urgente",
|
||||
|
||||
"lookup.task_status.pending": "Pendente",
|
||||
"lookup.task_status.in_progress": "Em Andamento",
|
||||
"lookup.task_status.completed": "Concluida",
|
||||
"lookup.task_status.cancelled": "Cancelada",
|
||||
"lookup.task_status.archived": "Arquivada",
|
||||
|
||||
"lookup.task_frequency.once": "Uma Vez",
|
||||
"lookup.task_frequency.daily": "Diario",
|
||||
"lookup.task_frequency.once": "Uma vez",
|
||||
"lookup.task_frequency.daily": "Diário",
|
||||
"lookup.task_frequency.weekly": "Semanal",
|
||||
"lookup.task_frequency.biweekly": "Quinzenal",
|
||||
"lookup.task_frequency.monthly": "Mensal",
|
||||
"lookup.task_frequency.quarterly": "Trimestral",
|
||||
"lookup.task_frequency.semiannually": "Semestral",
|
||||
"lookup.task_frequency.annually": "Anual",
|
||||
|
||||
"lookup.contractor_specialty.plumber": "Encanador",
|
||||
"lookup.contractor_specialty.electrician": "Eletricista",
|
||||
"lookup.contractor_specialty.hvac_technician": "Tecnico de Climatizacao",
|
||||
"lookup.contractor_specialty.hvac_technician": "Técnico de AVAC",
|
||||
"lookup.contractor_specialty.handyman": "Faz-tudo",
|
||||
"lookup.contractor_specialty.landscaper": "Paisagista",
|
||||
"lookup.contractor_specialty.landscaper": "Jardineiro",
|
||||
"lookup.contractor_specialty.roofer": "Telhadista",
|
||||
"lookup.contractor_specialty.painter": "Pintor",
|
||||
"lookup.contractor_specialty.carpenter": "Carpinteiro",
|
||||
"lookup.contractor_specialty.pest_control": "Controle de Pragas",
|
||||
"lookup.contractor_specialty.pest_control": "Controle de pragas",
|
||||
"lookup.contractor_specialty.cleaning": "Limpeza",
|
||||
"lookup.contractor_specialty.pool_service": "Servico de Piscina",
|
||||
"lookup.contractor_specialty.general_contractor": "Empreiteiro Geral",
|
||||
"lookup.contractor_specialty.other": "Outro"
|
||||
"lookup.contractor_specialty.pool_service": "Serviço de piscina",
|
||||
"lookup.contractor_specialty.general_contractor": "Empreiteiro geral",
|
||||
"lookup.contractor_specialty.other": "Outro",
|
||||
"suggestion.reason.has_pool": "Sua casa tem piscina",
|
||||
"suggestion.reason.has_sprinkler_system": "Sua casa tem sistema de irrigação",
|
||||
"suggestion.reason.has_septic": "Sua casa tem fossa séptica",
|
||||
"suggestion.reason.has_fireplace": "Sua casa tem lareira",
|
||||
"suggestion.reason.has_garage": "Sua casa tem garagem",
|
||||
"suggestion.reason.has_basement": "Sua casa tem porão",
|
||||
"suggestion.reason.has_attic": "Sua casa tem sótão",
|
||||
"suggestion.reason.heating_type": "Combina com seu sistema de aquecimento",
|
||||
"suggestion.reason.cooling_type": "Combina com seu sistema de refrigeração",
|
||||
"suggestion.reason.water_heater_type": "Combina com seu aquecedor de água",
|
||||
"suggestion.reason.roof_type": "Combina com seu telhado",
|
||||
"suggestion.reason.exterior_type": "Combina com seu exterior",
|
||||
"suggestion.reason.flooring_primary": "Combina com seu piso",
|
||||
"suggestion.reason.landscaping_type": "Combina com seu paisagismo",
|
||||
"suggestion.reason.property_type": "Recomendado para seu tipo de imóvel",
|
||||
"suggestion.reason.climate_region": "Recomendado para seu clima",
|
||||
"lookup.residence_type.duplex": "Duplex",
|
||||
"lookup.residence_type.vacation_home": "Casa de férias",
|
||||
"lookup.task_category.general": "Geral",
|
||||
"lookup.task_frequency.bi_weekly": "Quinzenal",
|
||||
"lookup.task_frequency.semi_annually": "Semestral",
|
||||
"lookup.task_frequency.custom": "Personalizado",
|
||||
"lookup.contractor_specialty.appliance_repair": "Reparo de eletrodomésticos",
|
||||
"lookup.contractor_specialty.cleaner": "Faxineiro",
|
||||
"lookup.contractor_specialty.locksmith": "Chaveiro",
|
||||
"lookup.home_profile.gas_furnace": "Aquecedor a gás",
|
||||
"lookup.home_profile.electric_furnace": "Aquecedor elétrico",
|
||||
"lookup.home_profile.heat_pump": "Bomba de calor",
|
||||
"lookup.home_profile.boiler": "Caldeira",
|
||||
"lookup.home_profile.radiant": "Radiante",
|
||||
"lookup.home_profile.other": "Outro",
|
||||
"lookup.home_profile.central_ac": "AC central",
|
||||
"lookup.home_profile.window_ac": "AC de janela",
|
||||
"lookup.home_profile.evaporative": "Evaporativo",
|
||||
"lookup.home_profile.none": "Nenhum",
|
||||
"lookup.home_profile.tank_gas": "Tanque (gás)",
|
||||
"lookup.home_profile.tank_electric": "Tanque (elétrico)",
|
||||
"lookup.home_profile.tankless_gas": "Sem tanque (gás)",
|
||||
"lookup.home_profile.tankless_electric": "Sem tanque (elétrico)",
|
||||
"lookup.home_profile.solar": "Solar",
|
||||
"lookup.home_profile.asphalt_shingle": "Telha asfáltica",
|
||||
"lookup.home_profile.metal": "Metal",
|
||||
"lookup.home_profile.tile": "Telha",
|
||||
"lookup.home_profile.slate": "Ardósia",
|
||||
"lookup.home_profile.wood_shake": "Telha de madeira",
|
||||
"lookup.home_profile.flat": "Plano",
|
||||
"lookup.home_profile.brick": "Tijolo",
|
||||
"lookup.home_profile.vinyl_siding": "Revestimento de vinil",
|
||||
"lookup.home_profile.wood_siding": "Revestimento de madeira",
|
||||
"lookup.home_profile.stucco": "Estuque",
|
||||
"lookup.home_profile.stone": "Pedra",
|
||||
"lookup.home_profile.fiber_cement": "Cimento reforçado",
|
||||
"lookup.home_profile.hardwood": "Madeira de lei",
|
||||
"lookup.home_profile.laminate": "Laminado",
|
||||
"lookup.home_profile.carpet": "Carpete",
|
||||
"lookup.home_profile.vinyl": "Vinil",
|
||||
"lookup.home_profile.concrete": "Concreto",
|
||||
"lookup.home_profile.lawn": "Gramado",
|
||||
"lookup.home_profile.desert": "Deserto",
|
||||
"lookup.home_profile.xeriscape": "Xeropaisagismo",
|
||||
"lookup.home_profile.garden": "Jardim",
|
||||
"lookup.home_profile.mixed": "Misto",
|
||||
"lookup.document_type.warranty": "Garantia",
|
||||
"lookup.document_type.manual": "Manual do usuário",
|
||||
"lookup.document_type.receipt": "Recibo/Fatura",
|
||||
"lookup.document_type.inspection": "Relatório de inspeção",
|
||||
"lookup.document_type.permit": "Licença",
|
||||
"lookup.document_type.deed": "Escritura/Título",
|
||||
"lookup.document_type.insurance": "Seguro",
|
||||
"lookup.document_type.contract": "Contrato",
|
||||
"lookup.document_type.photo": "Foto",
|
||||
"lookup.document_type.other": "Outro",
|
||||
"lookup.document_category.appliance": "Eletrodoméstico",
|
||||
"lookup.document_category.hvac": "AVAC",
|
||||
"lookup.document_category.plumbing": "Encanamento",
|
||||
"lookup.document_category.electrical": "Elétrica",
|
||||
"lookup.document_category.roofing": "Telhado",
|
||||
"lookup.document_category.structural": "Estrutural",
|
||||
"lookup.document_category.landscaping": "Paisagismo",
|
||||
"lookup.document_category.general": "Geral",
|
||||
"lookup.document_category.other": "Outro"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user