diff --git a/application/Espo/Core/Templates/i18n/pt_PT/Base.json b/application/Espo/Core/Templates/i18n/pt_PT/Base.json
new file mode 100644
index 0000000000..c7dcccd067
--- /dev/null
+++ b/application/Espo/Core/Templates/i18n/pt_PT/Base.json
@@ -0,0 +1,5 @@
+{
+ "labels": {
+ "Create {entityType}": "Criar {entityTypeTranslated}"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Core/Templates/i18n/pt_PT/BasePlus.json b/application/Espo/Core/Templates/i18n/pt_PT/BasePlus.json
new file mode 100644
index 0000000000..e06b36dae5
--- /dev/null
+++ b/application/Espo/Core/Templates/i18n/pt_PT/BasePlus.json
@@ -0,0 +1,10 @@
+{
+ "links": {
+ "meetings": "Reuniões",
+ "calls": "Chamadas",
+ "tasks": "Tarefas"
+ },
+ "labels": {
+ "Create {entityType}": "Criar {entityTypeTranslated}"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Core/Templates/i18n/pt_PT/Company.json b/application/Espo/Core/Templates/i18n/pt_PT/Company.json
new file mode 100644
index 0000000000..e73ace1879
--- /dev/null
+++ b/application/Espo/Core/Templates/i18n/pt_PT/Company.json
@@ -0,0 +1,14 @@
+{
+ "fields": {
+ "billingAddress": "Endereço de faturação",
+ "shippingAddress": "Endereço de envio"
+ },
+ "links": {
+ "meetings": "Reuniões",
+ "calls": "Chamadas",
+ "tasks": "Tarefas"
+ },
+ "labels": {
+ "Create {entityType}": "Criar {entityTypeTranslated}"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Core/Templates/i18n/pt_PT/Event.json b/application/Espo/Core/Templates/i18n/pt_PT/Event.json
new file mode 100644
index 0000000000..bdb533b347
--- /dev/null
+++ b/application/Espo/Core/Templates/i18n/pt_PT/Event.json
@@ -0,0 +1,39 @@
+{
+ "fields": {
+ "parent": "Relativo a",
+ "dateStart": "Data de início",
+ "dateEnd": "Data de fim",
+ "duration": "Duração",
+ "status": "Estado",
+ "reminders": "Lembretes",
+ "dateStartDate": "Data de início (todo o dia)",
+ "dateEndDate": "Data de fim (todo o dia)",
+ "isAllDay": "Todo o dia"
+ },
+ "links": {
+ "parent": "Relativo a"
+ },
+ "options": {
+ "status": {
+ "Planned": "Planeado",
+ "Held": "Manter",
+ "Not Held": "Não manter"
+ }
+ },
+ "labels": {
+ "Create {entityType}": "Criar {entityTypeTranslated}",
+ "Schedule {entityType}": "Planeamento {entityTypeTranslated}",
+ "Log {entityType}": "Registo {entityTypeTranslated}",
+ "Set Held": "Configurar manter",
+ "Set Not Held": "Configurar não manter"
+ },
+ "massActions": {
+ "setHeld": "Configurar manter",
+ "setNotHeld": "Configurar não manter"
+ },
+ "presetFilters": {
+ "planned": "Planeado",
+ "held": "Manter",
+ "todays": "Hoje"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Core/Templates/i18n/pt_PT/Person.json b/application/Espo/Core/Templates/i18n/pt_PT/Person.json
new file mode 100644
index 0000000000..afba4ed01a
--- /dev/null
+++ b/application/Espo/Core/Templates/i18n/pt_PT/Person.json
@@ -0,0 +1,13 @@
+{
+ "fields": {
+ "address": "Endereço"
+ },
+ "links": {
+ "meetings": "Reuniões",
+ "calls": "Chamadas",
+ "tasks": "Tarefas"
+ },
+ "labels": {
+ "Create {entityType}": "Criar {entityTypeTranslated}"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Account.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Account.json
new file mode 100644
index 0000000000..a4acb3a2f8
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Account.json
@@ -0,0 +1,103 @@
+{
+ "fields": {
+ "name": "Nome",
+ "phoneNumber": "Telemóvel",
+ "billingAddress": "Endereço de faturação",
+ "shippingAddress": "Endereço de envio",
+ "description": "Descrição",
+ "sicCode": "NIF",
+ "industry": "Indústria",
+ "type": "Tipo",
+ "contactRole": "Título",
+ "campaign": "Campanha",
+ "targetLists": "Públicos Alvo",
+ "targetList": "Público Alvo",
+ "originalLead": "Origem lead",
+ "contactIsInactive": "Inativo"
+ },
+ "links": {
+ "contacts": "Contactos",
+ "opportunities": "Oportunidades",
+ "cases": "Casos",
+ "documents": "Documentos",
+ "meetingsPrimary": "Reuniões (expandidas)",
+ "callsPrimary": "Chamdas (expandidas)",
+ "tasksPrimary": "Tarefas (expandidas)",
+ "emailsPrimary": "emails (expandidas)",
+ "targetLists": "Públicos Alvo",
+ "campaignLogRecords": "Registo de campanha",
+ "campaign": "Campanha",
+ "portalUsers": "Utilizadores do portal",
+ "originalLead": "Lead original",
+ "contactsPrimary": "Contactos (primário)"
+ },
+ "options": {
+ "type": {
+ "Customer": "Cliente",
+ "Investor": "Investidor",
+ "Partner": "Parceiro",
+ "Reseller": "Revendedor"
+ },
+ "industry": {
+ "Agriculture": "Agricultura",
+ "Advertising": "Publicidade",
+ "Apparel & Accessories": "Vestuário e Acessórios",
+ "Automotive": "Automóvel",
+ "Banking": "Bancário",
+ "Biotechnology": "Biotecnologia",
+ "Building Materials & Equipment": "Materiais de construção e equipamentos",
+ "Chemical": "Química",
+ "Computer": "Computador",
+ "Education": "Educação",
+ "Electronics": "Eletrônica",
+ "Energy": "Energia",
+ "Entertainment & Leisure": "Entretenimento e Lazer",
+ "Finance": "Finanças",
+ "Food & Beverage": "Comidas e bebidas",
+ "Grocery": "Mercearia",
+ "Healthcare": "Cuidados de saúde",
+ "Insurance": "Seguros",
+ "Legal": "Jurídico",
+ "Manufacturing": "Fabricação",
+ "Publishing": "Publicação",
+ "Real Estate": "Imobiliária",
+ "Service": "Serviços",
+ "Sports": "Desporto",
+ "Technology": "Tecnologia",
+ "Telecommunications": "Telecomunicações",
+ "Television": "Televisão",
+ "Transportation": "Transportes",
+ "Venture Capital": "Capital de risco",
+ "Aerospace": "Aeroespacial",
+ "Architecture": "Arquitetura",
+ "Construction": "Construção",
+ "Defense": "Defesa",
+ "Creative": "Criatividade",
+ "Culture": "Cultura",
+ "Consulting": "Consultoria",
+ "Electric Power": "Energia elétrica",
+ "Hospitality": "Hospitalidade",
+ "Mass Media": "Mídia de Massa",
+ "Mining": "Mineração",
+ "Music": "Música",
+ "Petroleum": "Petróleo",
+ "Retail": "Retalho",
+ "Shipping": "Envios",
+ "Support": "Apoio",
+ "Testing, Inspection & Certification": "Teste, Inspeção e Certificação",
+ "Wholesale": "Atacado",
+ "Water": "Água",
+ "Travel": "Viagens"
+ }
+ },
+ "labels": {
+ "Create Account": "Criar Conta",
+ "Copy Billing": "Copiar dados da faturação",
+ "Set Primary": "Definir como primária"
+ },
+ "presetFilters": {
+ "customers": "Clientes",
+ "partners": "Parceiros",
+ "recentlyCreated": "Criados recentemente"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Admin.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Admin.json
new file mode 100644
index 0000000000..24095db785
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Admin.json
@@ -0,0 +1,11 @@
+{
+ "layouts": {
+ "detailConvert": "Converter Lead",
+ "listForAccount": "Lista (para contas)",
+ "listForContact": "Lista (para contactos)"
+ },
+ "templates": {
+ "invitation": "Convites",
+ "reminder": "Lembrete"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Calendar.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Calendar.json
new file mode 100644
index 0000000000..b6261913ba
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Calendar.json
@@ -0,0 +1,22 @@
+{
+ "modes": {
+ "month": "Mês",
+ "week": "Semana",
+ "agendaWeek": "Semana",
+ "day": "Dia",
+ "agendaDay": "Dia",
+ "timeline": "Linha do tempo"
+ },
+ "labels": {
+ "Today": "Hoje",
+ "Create": "Criar",
+ "Shared": "Partilhado",
+ "Add User": "Adicionar utilizador",
+ "current": "corrente",
+ "time": "tempo",
+ "User List": "Lista de utilizador",
+ "Manage Users": "Gerir utilizadores",
+ "View Calendar": "Ver calendário",
+ "Create Shared View": "Criar vistas partilhadas"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Call.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Call.json
new file mode 100644
index 0000000000..d67c775721
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Call.json
@@ -0,0 +1,49 @@
+{
+ "fields": {
+ "name": "Nome",
+ "parent": "Relativo a",
+ "status": "Estado",
+ "dateStart": "Data de início",
+ "dateEnd": "Data de fim",
+ "direction": "Direção",
+ "duration": "Duração",
+ "description": "Descrição",
+ "users": "Utilizadores",
+ "contacts": "Contactos",
+ "reminders": "Lembretes",
+ "account": "Conta",
+ "acceptanceStatus": "Estado de aceitação"
+ },
+ "options": {
+ "status": {
+ "Planned": "Planeamento",
+ "Held": "Manter",
+ "Not Held": "Não manter"
+ },
+ "direction": {
+ "Outbound": "Saída",
+ "Inbound": "Entrada"
+ },
+ "acceptanceStatus": {
+ "None": "Nenhum",
+ "Accepted": "Aceite",
+ "Declined": "Recusado",
+ "Tentative": "Tentativa"
+ }
+ },
+ "massActions": {
+ "setHeld": "Configurar manter",
+ "setNotHeld": "Configurar não manter"
+ },
+ "labels": {
+ "Create Call": "Criar chamada",
+ "Set Held": "Configurar manter",
+ "Set Not Held": "Configurar não manter",
+ "Send Invitations": "Enviar convites"
+ },
+ "presetFilters": {
+ "planned": "Planeado",
+ "held": "Manter",
+ "todays": "Hoje"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Campaign.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Campaign.json
new file mode 100644
index 0000000000..7614f8ac58
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Campaign.json
@@ -0,0 +1,82 @@
+{
+ "fields": {
+ "name": "Nome",
+ "description": "Descrição",
+ "status": "Estado",
+ "type": "Tipo",
+ "startDate": "Data de Início",
+ "endDate": "Data de Fim",
+ "targetLists": "Públicos Alvo",
+ "excludingTargetLists": "Excluir dos Públicos Alvo",
+ "sentCount": "Enviado",
+ "openedCount": "Aberto",
+ "clickedCount": "Clicado",
+ "optedOutCount": "Opted-out",
+ "bouncedCount": "Devolvido",
+ "hardBouncedCount": "Hard bounced",
+ "softBouncedCount": "Soft bounced",
+ "leadCreatedCount": "Leads criadas",
+ "revenue": "Receita",
+ "revenueConverted": "Receita (convertido)",
+ "budget": "Orçamento",
+ "budgetConverted": "Orçamento (convertido)",
+ "contactsTemplate": "Modelo de contactos",
+ "leadsTemplate": "Modelo de leads",
+ "accountsTemplate": "Modelos de contas",
+ "usersTemplate": "Modelos de utilizadores",
+ "mailMergeOnlyWithAddress": "Ignorar registos sem endereço preenchido",
+ "optedInCount": "Opted-in",
+ "budgetCurrency": "Moeda do orçamento"
+ },
+ "links": {
+ "targetLists": "Públicos Alvo",
+ "excludingTargetLists": "Excluir dos Públicos Alvo",
+ "accounts": "Contas",
+ "contacts": "Contactos",
+ "opportunities": "Oportunidades",
+ "campaignLogRecords": "Registo",
+ "massEmails": "Emails em massa",
+ "trackingUrls": "Rasteamento de URLs",
+ "contactsTemplate": "Modelo de contactos",
+ "leadsTemplate": "Modelos de Leads ",
+ "accountsTemplate": "Modelos de contas",
+ "usersTemplate": "Modelos de utilizadores"
+ },
+ "options": {
+ "type": {
+ "Television": "Televisão",
+ "Radio": "Rádio"
+ },
+ "status": {
+ "Planning": "Plano",
+ "Active": "Ativo",
+ "Inactive": "Inativo",
+ "Complete": "Completo"
+ }
+ },
+ "labels": {
+ "Create Campaign": "Criar Campanha",
+ "Target Lists": "Públicos Alvo",
+ "Statistics": "Estatistica",
+ "hard": "Difícil",
+ "soft": "Fácil",
+ "Unsubscribe": "Cancelar subscrição",
+ "Mass Emails": "Emails em massa",
+ "Email Templates": "Modelo de email",
+ "Unsubscribe again": "Cancelar subscrição outra vez",
+ "Subscribe again": "Subcrever outra vez",
+ "Create Target List": "Criar Público Alvo",
+ "Generate Mail Merge PDF": "Gerar Mail Merge PDF"
+ },
+ "presetFilters": {
+ "active": "Ativo"
+ },
+ "messages": {
+ "unsubscribed": "Foi eliminado da nossa lista de distribuição.",
+ "subscribedAgain": "Está subscrito novamente"
+ },
+ "tooltips": {
+ "targetLists": "Alvos que devem receber mensagens.",
+ "excludingTargetLists": "Alvos que não devem receber mensagens."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/CampaignLogRecord.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/CampaignLogRecord.json
new file mode 100644
index 0000000000..f8c59458d2
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/CampaignLogRecord.json
@@ -0,0 +1,44 @@
+{
+ "fields": {
+ "action": "Ação",
+ "actionDate": "Data",
+ "data": "Dados",
+ "campaign": "Campanha",
+ "parent": "Alvo",
+ "object": "Objeto",
+ "application": "Aplicação",
+ "queueItem": "Item da fila",
+ "stringData": "Dados de string",
+ "stringAdditionalData": "Dados de string adicional",
+ "isTest": "Teste"
+ },
+ "links": {
+ "queueItem": "Item da fila",
+ "parent": "Relativo a",
+ "object": "Objeto",
+ "campaign": "Campanha"
+ },
+ "options": {
+ "action": {
+ "Sent": "Enviado",
+ "Opened": "Aberto",
+ "Opted Out": "Opted-out",
+ "Bounced": "Devolvido",
+ "Clicked": "Clicado",
+ "Lead Created": "Lead criada",
+ "Opted In": "Opted-in"
+ }
+ },
+ "labels": {
+ "All": "Todos"
+ },
+ "presetFilters": {
+ "sent": "Enviado",
+ "opened": "Aberto",
+ "optedOut": "Opted-out",
+ "bounced": "Devolvido",
+ "clicked": "Clicado",
+ "leadCreated": "Lead criada",
+ "optedIn": "Opted-in"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/CampaignTrackingUrl.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/CampaignTrackingUrl.json
new file mode 100644
index 0000000000..c892aac108
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/CampaignTrackingUrl.json
@@ -0,0 +1,24 @@
+{
+ "fields": {
+ "urlToUse": "Código para inserir em vez de URL",
+ "campaign": "Campanha",
+ "action": "Ação",
+ "message": "Mensagem"
+ },
+ "links": {
+ "campaign": "Campanha"
+ },
+ "labels": {
+ "Create CampaignTrackingUrl": "Criar URL de seguimento"
+ },
+ "options": {
+ "action": {
+ "Redirect": "Redirecionar",
+ "Show Message": "Mostrar mensagem"
+ }
+ },
+ "tooltips": {
+ "url": "O destinatário será redirecionado para este local depois de seguir o link.",
+ "message": "A mensagem será mostrada ao destinatário depois que ele seguir o link. Markdown é suportado."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Case.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Case.json
new file mode 100644
index 0000000000..b920caa659
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Case.json
@@ -0,0 +1,58 @@
+{
+ "fields": {
+ "name": "Nome",
+ "number": "Número",
+ "status": "Estado",
+ "account": "Conta",
+ "contact": "Contacto",
+ "contacts": "Contactos",
+ "priority": "Prioridade",
+ "type": "Tipo",
+ "description": "Descrição",
+ "attachments": "Anexos",
+ "inboundEmail": "Conta de email do grupo"
+ },
+ "links": {
+ "account": "Conta",
+ "contact": "Contato (Primário)",
+ "Contacts": "Contactos",
+ "meetings": "Reuniões",
+ "calls": "Chamadas",
+ "tasks": "Tarefas",
+ "emails": "emails",
+ "articles": "Artigos da Base de Conhecimento",
+ "attachments": "Anexos",
+ "inboundEmail": "Conta de email do grupo"
+ },
+ "options": {
+ "status": {
+ "New": "Novo",
+ "Assigned": "Atribuído",
+ "Pending": "Pendente",
+ "Closed": "Fechado",
+ "Rejected": "Rejeitado",
+ "Duplicate": "Duplicado"
+ },
+ "priority": {
+ "Low": "Baixo",
+ "High": "Alto",
+ "Urgent": "Urgente"
+ },
+ "type": {
+ "Question": "Questão",
+ "Incident": "Incidente",
+ "Problem": "Problema"
+ }
+ },
+ "labels": {
+ "Create Case": "Criar Caso",
+ "Close": "Fechar",
+ "Reject": "Rejeitar",
+ "Closed": "Fechado",
+ "Rejected": "Rejeitado"
+ },
+ "presetFilters": {
+ "open": "Abrir",
+ "closed": "Fechado"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Contact.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Contact.json
new file mode 100644
index 0000000000..54b1b8e3e9
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Contact.json
@@ -0,0 +1,55 @@
+{
+ "fields": {
+ "name": "Nome",
+ "accountRole": "Título",
+ "account": "Conta",
+ "accounts": "Contas",
+ "phoneNumber": "Telefone",
+ "accountType": "Tipo de conta",
+ "doNotCall": "Não contactar",
+ "address": "Endereço",
+ "opportunityRole": "Função da Oportunidade",
+ "description": "Descrição",
+ "campaign": "Campanha",
+ "targetLists": "Públicos Alvo",
+ "targetList": "Público Alvo",
+ "portalUser": "Utilizador do Portal",
+ "originalLead": "Origem Lead",
+ "acceptanceStatus": "Estado de aceitação",
+ "accountIsInactive": "Conta Inativa",
+ "acceptanceStatusMeetings": "Estado de Aceitação (reuniões)",
+ "acceptanceStatusCalls": "Estado de Aceitação (chamadas)",
+ "title": "Título da conta principal",
+ "hasPortalUser": "Utilizador do portal"
+ },
+ "links": {
+ "opportunities": "Oportunidades",
+ "cases": "Casos",
+ "targetLists": "Públicos Alvo",
+ "campaignLogRecords": "Registo de Campanha",
+ "campaign": "Campanha",
+ "account": "Conta (primária)",
+ "accounts": "Contas",
+ "casesPrimary": "Casos (primário)",
+ "portalUser": "Utilizador do Portal",
+ "originalLead": "Lead original",
+ "documents": "Documentos",
+ "tasksPrimary": "Tarefas (expandidas)",
+ "opportunitiesPrimary": "Oportunidades (primário)"
+ },
+ "labels": {
+ "Create Contact": "Criar contato"
+ },
+ "options": {
+ "opportunityRole": {
+ "Decision Maker": "Tomada de decisão",
+ "Evaluator": "Avaliador",
+ "Influencer": "Influenciador"
+ }
+ },
+ "presetFilters": {
+ "portalUsers": "Utilizadores do portal",
+ "notPortalUsers": "Não Utilizadores do Portal",
+ "accountActive": "Ativo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/DashletOptions.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/DashletOptions.json
new file mode 100644
index 0000000000..786fce62dd
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/DashletOptions.json
@@ -0,0 +1,7 @@
+{
+ "fields": {
+ "futureDays": "Próximos X dias",
+ "useLastStage": "Agrupar pelo último estado alcançado",
+ "team": "Equipa"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Document.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Document.json
new file mode 100644
index 0000000000..3f0edc6468
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Document.json
@@ -0,0 +1,40 @@
+{
+ "labels": {
+ "Create Document": "Criar documento",
+ "Details": "Detalhes"
+ },
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "file": "Ficheiro",
+ "type": "Tipo",
+ "publishDate": "Data de Publicação",
+ "expirationDate": "Data de validade",
+ "description": "Descrição",
+ "accounts": "Contas",
+ "folder": "Pasta"
+ },
+ "links": {
+ "accounts": "Contas",
+ "opportunities": "Oportunidades",
+ "folder": "Pasta",
+ "contacts": "Contactos"
+ },
+ "options": {
+ "status": {
+ "Active": "Ativo",
+ "Draft": "Rascunho",
+ "Expired": "Expirado",
+ "Canceled": "Cancelado"
+ },
+ "type": {
+ "": "Nenhum",
+ "Contract": "Contrato",
+ "License Agreement": "Contrato de licença"
+ }
+ },
+ "presetFilters": {
+ "active": "Ativo",
+ "draft": "Rascunho"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/DocumentFolder.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/DocumentFolder.json
new file mode 100644
index 0000000000..286e74e0c2
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/DocumentFolder.json
@@ -0,0 +1,10 @@
+{
+ "labels": {
+ "Create DocumentFolder": "Criar pasta de documentos",
+ "Manage Categories": "Gerir Pastas",
+ "Documents": "Documentos"
+ },
+ "links": {
+ "documents": "Documentos"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Email.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Email.json
new file mode 100644
index 0000000000..835c3c15dc
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Email.json
@@ -0,0 +1,13 @@
+{
+ "labels": {
+ "Create Lead": "Criar Lead",
+ "Create Contact": "Criar Contacto",
+ "Create Task": "Criar tarefa",
+ "Create Case": "Criar caso",
+ "Add to Contact": "Adicionar contacto",
+ "Add to Lead": "Adicionar à Lead"
+ },
+ "fields": {
+ "tasks": "Tarefas"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/EmailQueueItem.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/EmailQueueItem.json
new file mode 100644
index 0000000000..6b8db8f512
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/EmailQueueItem.json
@@ -0,0 +1,29 @@
+{
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "target": "Alvo",
+ "sentAt": "Data de envio",
+ "attemptCount": "Tentativas",
+ "emailAddress": "Endereço de email",
+ "massEmail": "Email em massa",
+ "isTest": "Teste"
+ },
+ "links": {
+ "target": "Alvo",
+ "massEmail": "Email em massa"
+ },
+ "options": {
+ "status": {
+ "Pending": "Pendente",
+ "Sent": "Enviado",
+ "Failed": "Falhado",
+ "Sending": "A enviar"
+ }
+ },
+ "presetFilters": {
+ "pending": "Pendente",
+ "sent": "Enviado",
+ "failed": "Falhado"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Global.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Global.json
new file mode 100644
index 0000000000..13766838cd
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Global.json
@@ -0,0 +1,114 @@
+{
+ "links": {
+ "parent": "Retalivo a",
+ "contacts": "Contactos",
+ "opportunities": "Oportunidades",
+ "meetings": "Reuniões",
+ "calls": "Chamadas",
+ "tasks": "Tarefas",
+ "accounts": "Contas",
+ "cases": "Casos",
+ "documents": "Documentos",
+ "account": "Conta",
+ "opportunity": "Oportunidade",
+ "contact": "Contacto"
+ },
+ "scopeNames": {
+ "Account": "Conta",
+ "Contact": "Contacto",
+ "Target": "Alvo",
+ "Opportunity": "Oportunidade",
+ "Meeting": "Reunião",
+ "Calendar": "Calendário",
+ "Call": "Chamada",
+ "Task": "Tarefa",
+ "Case": "Caso",
+ "Document": "Documento",
+ "DocumentFolder": "Pasta de documento",
+ "Campaign": "Campanha",
+ "TargetList": "Público Alvo",
+ "MassEmail": "Email em massa",
+ "EmailQueueItem": "Item de fila de email",
+ "CampaignTrackingUrl": "Seguimento URL",
+ "Activities": "Atividades",
+ "KnowledgeBaseArticle": "Artigo da base de conhecimento",
+ "KnowledgeBaseCategory": "Categoria da base de conhecimento",
+ "CampaignLogRecord": "Registo de log da campanha"
+ },
+ "scopeNamesPlural": {
+ "Account": "Contas",
+ "Contact": "Contactos",
+ "Target": "Alvos",
+ "Opportunity": "Oportunidades",
+ "Meeting": "Reuniões",
+ "Calendar": "Calendário",
+ "Call": "Chamadas",
+ "Task": "Tarefas",
+ "Case": "Casos",
+ "Document": "Documentos",
+ "DocumentFolder": "Pastas de documentos",
+ "Campaign": "Campanhas",
+ "TargetList": "Públicos Alvo",
+ "MassEmail": "emails em massa",
+ "EmailQueueItem": "Items de fila de email",
+ "CampaignTrackingUrl": "Seguimentos URLs",
+ "Activities": "Atividades",
+ "KnowledgeBaseArticle": "Base de Conhecimento",
+ "KnowledgeBaseCategory": "Categorias de Base de Conhecimento",
+ "CampaignLogRecord": "registos de Log da Campanha"
+ },
+ "dashlets": {
+ "Leads": "As minhas leads",
+ "Opportunities": "As minhas oportunidades",
+ "Tasks": "As minhas tarefas",
+ "Cases": "Os meus casos",
+ "Calendar": "Calendário",
+ "Calls": "As minhas chamadas",
+ "Meetings": "As minhas reuniões",
+ "OpportunitiesByStage": "Oportunidades por estado",
+ "OpportunitiesByLeadSource": "Oportunidades por origem de leads",
+ "SalesByMonth": "Vendas por mês",
+ "SalesPipeline": "Pipeline de vendas",
+ "Activities": "As minhas atividades"
+ },
+ "labels": {
+ "Create InboundEmail": "Criar email de entrada",
+ "Activities": "Atividades",
+ "History": "História",
+ "Attendees": "Participantes",
+ "Schedule Meeting": "Agendar de reuniões",
+ "Schedule Call": "Agendar de chamadas",
+ "Compose Email": "Escrever um email",
+ "Log Meeting": "Registar reunião",
+ "Log Call": "Registar chamada",
+ "Archive Email": "Arquivar email",
+ "Create Task": "Criar tarefa",
+ "Tasks": "Tarefas",
+ "Scheduler": "Agendador"
+ },
+ "fields": {
+ "billingAddressCity": "Cidade",
+ "addressCity": "Cidade",
+ "billingAddressCountry": "País",
+ "addressCountry": "País",
+ "billingAddressPostalCode": "Código-postal",
+ "addressPostalCode": "Código-postal",
+ "billingAddressState": "Distrito",
+ "addressState": "Distrito",
+ "billingAddressStreet": "Rua",
+ "addressStreet": "Rua",
+ "billingAddressMap": "Mapa",
+ "addressMap": "Mapa",
+ "shippingAddressCity": "Cidade (envio)",
+ "shippingAddressStreet": "Rua (envio)",
+ "shippingAddressCountry": "País (envio)",
+ "shippingAddressState": "Distrito (envio)",
+ "shippingAddressPostalCode": "Código-postal (envio)",
+ "shippingAddressMap": "Mapa (envio)"
+ },
+ "options": {
+ "reminderTypes": {
+ "Popup": "Pop-up"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/KnowledgeBaseArticle.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/KnowledgeBaseArticle.json
new file mode 100644
index 0000000000..64cb8140ed
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/KnowledgeBaseArticle.json
@@ -0,0 +1,47 @@
+{
+ "labels": {
+ "Create KnowledgeBaseArticle": "Criar artigo",
+ "Any": "Qualquer",
+ "Send in Email": "Enviar por email",
+ "Move Up": "Subir",
+ "Move Down": "Descer",
+ "Move to Top": "Mover para o início",
+ "Move to Bottom": "Mover para o fim"
+ },
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "type": "Tipo",
+ "attachments": "Anexos",
+ "publishDate": "Data de publicação",
+ "expirationDate": "Data de validade",
+ "description": "Descrição",
+ "body": "Corpo",
+ "categories": "Categorias",
+ "language": "Idioma",
+ "portals": "Portais"
+ },
+ "links": {
+ "cases": "Casos",
+ "opportunities": "Oportunidades",
+ "categories": "Casos",
+ "portals": "Portais"
+ },
+ "options": {
+ "status": {
+ "In Review": "Em revisão",
+ "Draft": "Rascunho",
+ "Archived": "Arquivado",
+ "Published": "Publicado"
+ },
+ "type": {
+ "Article": "Artigo"
+ }
+ },
+ "presetFilters": {
+ "published": "Publicado"
+ },
+ "tooltips": {
+ "portals": "O artigo estará disponível apenas em portais especificados."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/KnowledgeBaseCategory.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/KnowledgeBaseCategory.json
new file mode 100644
index 0000000000..af7e8c10e1
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/KnowledgeBaseCategory.json
@@ -0,0 +1,10 @@
+{
+ "labels": {
+ "Create KnowledgeBaseCategory": "Criar categoria",
+ "Manage Categories": "Gerir Categorias",
+ "Articles": "Artigos"
+ },
+ "links": {
+ "articles": "Artigos"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Lead.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Lead.json
new file mode 100644
index 0000000000..5c1035710f
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Lead.json
@@ -0,0 +1,67 @@
+{
+ "labels": {
+ "Converted To": "Converter em",
+ "Create Lead": "Criar Lead",
+ "Convert": "Converter",
+ "convert": "converter"
+ },
+ "fields": {
+ "name": "Nome",
+ "title": "Título",
+ "phoneNumber": "Telemóvel",
+ "accountName": "Nome de conta",
+ "doNotCall": "Não contactar",
+ "address": "Endereço",
+ "status": "Estado",
+ "source": "Origem",
+ "opportunityAmount": "Montante da oportunidade",
+ "opportunityAmountConverted": "Montante da oportunidade (convertido)",
+ "description": "Descrição",
+ "createdAccount": "Conta",
+ "createdContact": "Contacto",
+ "createdOpportunity": "Oportunidade",
+ "campaign": "Campanha",
+ "targetLists": "Públicos Alvo",
+ "targetList": "Público Alvo",
+ "industry": "Indústria",
+ "acceptanceStatus": "Estado de aceitação",
+ "opportunityAmountCurrency": "Moeda da quantidade de oportunidade",
+ "acceptanceStatusMeetings": "Estados de Aceitação (reuniões)",
+ "acceptanceStatusCalls": "Estado de Aceitação (chamadas)",
+ "convertedAt": "Convertido em"
+ },
+ "links": {
+ "targetLists": "Públicos Alvo",
+ "campaignLogRecords": "Registo de campanha",
+ "campaign": "Campanha",
+ "createdAccount": "Conta",
+ "createdContact": "Contacto",
+ "createdOpportunity": "Oportunidade",
+ "cases": "Casos",
+ "documents": "Documentos"
+ },
+ "options": {
+ "status": {
+ "New": "Novo",
+ "Assigned": "Atribuído",
+ "In Process": "Em progresso",
+ "Converted": "Convertido",
+ "Recycled": "Reciclado",
+ "Dead": "Morto"
+ },
+ "source": {
+ "Call": "Chamada",
+ "Existing Customer": "Cliente existente",
+ "Partner": "Parceiro",
+ "Public Relations": "Relações públicas",
+ "Web Site": "Website",
+ "Campaign": "Campanha",
+ "Other": "Outro"
+ }
+ },
+ "presetFilters": {
+ "active": "Ativo",
+ "actual": "Atual",
+ "converted": "Convertido"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/MassEmail.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/MassEmail.json
new file mode 100644
index 0000000000..a58aeda228
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/MassEmail.json
@@ -0,0 +1,58 @@
+{
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "storeSentEmails": "Armazenar emails enviados",
+ "startAt": "Data de início",
+ "fromAddress": "A partir do endereço",
+ "fromName": "A partir do nome",
+ "replyToAddress": "Responder para o endereço",
+ "replyToName": "Responder para o nome",
+ "campaign": "Campanha",
+ "emailTemplate": "Modelo de email",
+ "inboundEmail": "Conta de email",
+ "targetLists": "Públicos Alvo",
+ "excludingTargetLists": "Exluir dos Públicos Alvo",
+ "optOutEntirely": "Desativar totalmente",
+ "smtpAccount": "Conta SMTP"
+ },
+ "links": {
+ "targetLists": "Público Alvo",
+ "excludingTargetLists": "Exluir do Público Alvo",
+ "queueItems": "Items da fila",
+ "campaign": "Campanha",
+ "emailTemplate": "Modelo de email",
+ "inboundEmail": "Conta de email"
+ },
+ "options": {
+ "status": {
+ "Draft": "Rascunho",
+ "Pending": "Pendente",
+ "In Process": "Em progresso",
+ "Complete": "Completo",
+ "Canceled": "Cancelado",
+ "Failed": "Falhado"
+ }
+ },
+ "labels": {
+ "Create MassEmail": "Criar email em massa",
+ "Send Test": "Enviar teste",
+ "System SMTP": "Sistema SMTP",
+ "system": "sistema",
+ "group": "grupo"
+ },
+ "messages": {
+ "selectAtLeastOneTarget": "Selecione pelo menos um alvo.",
+ "testSent": "Email(s) de teste devem ser enviados"
+ },
+ "tooltips": {
+ "optOutEntirely": "Os endereços de email dos destinatários que não foram inscritos serão marcados como excluídos e não receberão mais nenhum email em massa.",
+ "targetLists": "Alvos que devem receber mensagens.",
+ "excludingTargetLists": "Alvos que não devem receber mensagens.",
+ "storeSentEmails": "Os emails serão armazenados no CRM."
+ },
+ "presetFilters": {
+ "actual": "Atual",
+ "complete": "Completo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Meeting.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Meeting.json
new file mode 100644
index 0000000000..fd90596c39
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Meeting.json
@@ -0,0 +1,57 @@
+{
+ "fields": {
+ "name": "Nome",
+ "parent": "Relativo a",
+ "status": "Estado",
+ "dateStart": "Data de início",
+ "dateEnd": "Data fim",
+ "duration": "Duração",
+ "description": "Descrição",
+ "users": "Utilizadores",
+ "contacts": "Contactos",
+ "reminders": "Lembretes",
+ "account": "Conta",
+ "acceptanceStatus": "Estado de aceitação",
+ "dateStartDate": "Data de início (todo o dia)",
+ "dateEndDate": "Data de fim (todo o dia)",
+ "isAllDay": "Todo o dia",
+ "Acceptance": "Aceitar",
+ "sourceEmail": "Email de origem"
+ },
+ "options": {
+ "status": {
+ "Planned": "Planeado",
+ "Held": "Manter",
+ "Not Held": "Não manter"
+ },
+ "acceptanceStatus": {
+ "None": "Nenhum",
+ "Accepted": "Aceite",
+ "Declined": "Recusado",
+ "Tentative": "Tentativa"
+ }
+ },
+ "massActions": {
+ "setHeld": "Configurar manter",
+ "setNotHeld": "Configurar não manter"
+ },
+ "labels": {
+ "Create Meeting": "Criar reunião",
+ "Set Held": "Configurar manter",
+ "Set Not Held": "Configurar não manter",
+ "Send Invitations": "Enviar convites",
+ "on time": "na hora",
+ "before": "antes",
+ "All-Day": "Todo o dia"
+ },
+ "presetFilters": {
+ "planned": "Planeado",
+ "held": "Manter",
+ "todays": "Hoje"
+ },
+ "messages": {
+ "nothingHasBeenSent": "Nada foi enviado",
+ "selectAcceptanceStatus": "Defina seu status de aceitação.",
+ "sendInvitationsConfirmation": "Enviar e-mails de convite para os participantes?"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Opportunity.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Opportunity.json
new file mode 100644
index 0000000000..ff6409e248
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Opportunity.json
@@ -0,0 +1,53 @@
+{
+ "fields": {
+ "name": "Nome",
+ "account": "Conta",
+ "stage": "Estado",
+ "amount": "Montante",
+ "probability": "Probabilidade, %",
+ "leadSource": "Origem Lead",
+ "doNotCall": "Não contactar",
+ "closeDate": "Data de fecho",
+ "contacts": "Contactos",
+ "description": "Descrição",
+ "amountConverted": "Montante (convertido)",
+ "amountWeightedConverted": "Quantia ponderada",
+ "campaign": "Campanha",
+ "originalLead": "Origem Lead",
+ "amountCurrency": "Valor em moeda",
+ "contactRole": "Função do contacto",
+ "lastStage": "Último estado",
+ "contact": "Contacto (primário)"
+ },
+ "links": {
+ "contacts": "Contactos",
+ "documents": "Documentos",
+ "campaign": "Campanha",
+ "originalLead": "Lead original",
+ "contact": "Contacto (primário)"
+ },
+ "options": {
+ "stage": {
+ "Prospecting": "Prospecção",
+ "Qualification": "Qualificação",
+ "Needs Analysis": "Precisa de análise",
+ "Value Proposition": "Proposta de valor",
+ "Id. Decision Makers": "Identidade. Tomadores de decisão",
+ "Perception Analysis": "Análise de percepção",
+ "Proposal/Price Quote": "Proposta/Cotação de preço",
+ "Negotiation/Review": "Negociação/Revisão",
+ "Closed Won": "Fechada como ganha",
+ "Closed Lost": "Fechada como perdida",
+ "Proposal": "Proposta",
+ "Negotiation": "Negociação"
+ }
+ },
+ "labels": {
+ "Create Opportunity": "Criar Oportunidade"
+ },
+ "presetFilters": {
+ "open": "Abrir",
+ "won": "Ganho",
+ "lost": "Perdido"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Portal.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Portal.json
new file mode 100644
index 0000000000..6395494d90
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Portal.json
@@ -0,0 +1,5 @@
+{
+ "links": {
+ "articles": "Artigos da base de conhecimento"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/ScheduledJob.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/ScheduledJob.json
new file mode 100644
index 0000000000..47de370522
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/ScheduledJob.json
@@ -0,0 +1,8 @@
+{
+ "options": {
+ "job": {
+ "ProcessMassEmail": "Enviar emails em massa",
+ "ControlKnowledgeBaseArticleStatus": "Controlo por estado do artigo da base de conhecimento"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/TargetList.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/TargetList.json
new file mode 100644
index 0000000000..96efafe812
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/TargetList.json
@@ -0,0 +1,37 @@
+{
+ "fields": {
+ "name": "Nome",
+ "description": "Descrição",
+ "entryCount": "Contagem de entradas",
+ "campaigns": "Campanhas",
+ "endDate": "Data fim",
+ "targetLists": "Públicos Alvo",
+ "includingActionList": "Incluindo",
+ "excludingActionList": "Excluindo",
+ "optedOutCount": "Contagem de saída (opt-out)",
+ "targetStatus": "Estado ",
+ "isOptedOut": "Opted-out"
+ },
+ "links": {
+ "accounts": "Contas",
+ "contacts": "Contactos",
+ "campaigns": "Campanhas",
+ "massEmails": "Emails em massa"
+ },
+ "options": {
+ "type": {
+ "Television": "Televisão",
+ "Radio": "Rádio"
+ },
+ "targetStatus": {
+ "Opted Out": "Opted-out",
+ "Listed": "Listado"
+ }
+ },
+ "labels": {
+ "Create TargetList": "Criar Público Alvo",
+ "Opted Out": "Opted-out",
+ "Cancel Opt-Out": "Cancelar opt-out",
+ "Opt-Out": "Opt-out"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Task.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Task.json
new file mode 100644
index 0000000000..b7ada4364a
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/Task.json
@@ -0,0 +1,53 @@
+{
+ "fields": {
+ "name": "Nome",
+ "parent": "Relativo a",
+ "status": "Estado",
+ "dateStart": "Data de início",
+ "dateEnd": "Data de vencimento",
+ "dateStartDate": "Data de início (todo o dia)",
+ "dateEndDate": "Data de fim (todo o dia)",
+ "priority": "Prioridade",
+ "description": "Descrição",
+ "isOverdue": "Atrasado",
+ "account": "Conta",
+ "dateCompleted": "Data de conclusão",
+ "attachments": "Anexos",
+ "reminders": "Lembretes",
+ "contact": "Contacto"
+ },
+ "links": {
+ "attachments": "Anexos",
+ "account": "Conta",
+ "contact": "Contacto"
+ },
+ "options": {
+ "status": {
+ "Not Started": "Não iniciado",
+ "Started": "Iniciado",
+ "Completed": "Completo",
+ "Canceled": "Cancelado",
+ "Deferred": "Diferido"
+ },
+ "priority": {
+ "Low": "Baixo",
+ "High": "Alto",
+ "Urgent": "Urgente"
+ }
+ },
+ "labels": {
+ "Create Task": "Criar tarefa",
+ "Complete": "Completo",
+ "overdue": "atrasado"
+ },
+ "presetFilters": {
+ "actual": "Atual",
+ "completed": "Completo",
+ "todays": "Hoje",
+ "overdue": "Atrasado",
+ "deferred": "Diferido"
+ },
+ "nameOptions": {
+ "replyToEmail": "Responder ao email"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Modules/Crm/Resources/i18n/pt_PT/User.json b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/User.json
new file mode 100644
index 0000000000..21f5ebfa00
--- /dev/null
+++ b/application/Espo/Modules/Crm/Resources/i18n/pt_PT/User.json
@@ -0,0 +1,10 @@
+{
+ "links": {
+ "targetLists": "Públicos Alvo"
+ },
+ "fields": {
+ "acceptanceStatus": "Estado de aceitação",
+ "acceptanceStatusMeetings": "Estado de Aceitação (Reuniões)",
+ "acceptanceStatusCalls": "Estado de Aceitação (Chamadas)"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_BR/EntityManager.json b/application/Espo/Resources/i18n/pt_BR/EntityManager.json
index 7e9cd16d79..0fb9b72ede 100644
--- a/application/Espo/Resources/i18n/pt_BR/EntityManager.json
+++ b/application/Espo/Resources/i18n/pt_BR/EntityManager.json
@@ -2,6 +2,7 @@
"labels": {
"Fields": "Campos",
"Relationships": "Relacionamentos",
+ "Schedule": "Agendamento",
"Formula": "Fórmula"
},
"fields": {
diff --git a/application/Espo/Resources/i18n/pt_BR/ImportError.json b/application/Espo/Resources/i18n/pt_BR/ImportError.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_BR/ImportError.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_BR/Preferences.json b/application/Espo/Resources/i18n/pt_BR/Preferences.json
index a8389b3688..8c3594b5b5 100644
--- a/application/Espo/Resources/i18n/pt_BR/Preferences.json
+++ b/application/Espo/Resources/i18n/pt_BR/Preferences.json
@@ -8,14 +8,6 @@
"defaultCurrency": "Moeda Padrão",
"currencyList": "Moedas Disponíveis",
"language": "Idioma",
- "smtpServer": "Servidor",
- "smtpPort": "Porta",
- "smtpAuth": "Autenticação",
- "smtpSecurity": "Segurança",
- "smtpUsername": "Usuário",
- "emailAddress": "E-mail",
- "smtpPassword": "Senha",
- "smtpEmailAddress": "Endereço de E-mail",
"exportDelimiter": "Delimitador de Exportação",
"signature": "Assinatura do E-mail",
"dashboardTabList": "Lista de Aba",
diff --git a/application/Espo/Resources/i18n/pt_BR/Settings.json b/application/Espo/Resources/i18n/pt_BR/Settings.json
index 8dbe01b7cf..536483e8e8 100644
--- a/application/Espo/Resources/i18n/pt_BR/Settings.json
+++ b/application/Espo/Resources/i18n/pt_BR/Settings.json
@@ -210,6 +210,7 @@
"Currency Settings": "Configurações de Moeda",
"Currency Rates": "Conversão de moedas",
"Mass Email": "E-mail em Massa",
+ "Test Connection": "Testar conexão",
"Connecting": "Conectando...",
"Activities": "Atividades",
"Admin Notifications": "Administrar Notificações",
diff --git a/application/Espo/Resources/i18n/pt_BR/User.json b/application/Espo/Resources/i18n/pt_BR/User.json
index 054d1ce83d..e6f33dd539 100644
--- a/application/Espo/Resources/i18n/pt_BR/User.json
+++ b/application/Espo/Resources/i18n/pt_BR/User.json
@@ -145,4 +145,4 @@
"ApiKey": "Chave de API"
}
}
-}
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_BR/WorkingTimeCalendar.json b/application/Espo/Resources/i18n/pt_BR/WorkingTimeCalendar.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_BR/WorkingTimeCalendar.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_BR/WorkingTimeRange.json b/application/Espo/Resources/i18n/pt_BR/WorkingTimeRange.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_BR/WorkingTimeRange.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/ActionHistoryRecord.json b/application/Espo/Resources/i18n/pt_PT/ActionHistoryRecord.json
new file mode 100644
index 0000000000..9c9094461a
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/ActionHistoryRecord.json
@@ -0,0 +1,30 @@
+{
+ "fields": {
+ "user": "Utilizador",
+ "action": "Ação",
+ "createdAt": "Data",
+ "target": "Alvo",
+ "targetType": "Tipo de alvo",
+ "authToken": "Token de autenticação",
+ "ipAddress": "Endereço IP",
+ "authLogRecord": "registo de autenticações",
+ "userType": "Tipo de utilizador"
+ },
+ "links": {
+ "authToken": "Token de autenticação",
+ "user": "Utilizador",
+ "target": "Alvo",
+ "authLogRecord": "registo de autenticações"
+ },
+ "presetFilters": {
+ "onlyMy": "Apenas eu"
+ },
+ "options": {
+ "action": {
+ "read": "Ler",
+ "update": "Atualizar",
+ "delete": "Eliminar",
+ "create": "Criar"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Admin.json b/application/Espo/Resources/i18n/pt_PT/Admin.json
new file mode 100644
index 0000000000..dcb2200cef
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Admin.json
@@ -0,0 +1,293 @@
+{
+ "labels": {
+ "Enabled": "Ativado",
+ "Disabled": "Desativado",
+ "System": "Sistema",
+ "Users": "Utilizadores",
+ "Email": "email",
+ "Data": "Dados",
+ "Customization": "Customização",
+ "Available Fields": "Campos Disponíveis",
+ "Entity Manager": "Gestão de entidades",
+ "Add Panel": "Adicionar painel",
+ "Add Field": "Adicionar campo",
+ "Settings": "Configurações",
+ "Scheduled Jobs": "Agendar tarefas",
+ "Clear Cache": "Limpar cache",
+ "Rebuild": "Reconstruir",
+ "Teams": "Equipas",
+ "Roles": "Perfis",
+ "Portals": "Portais",
+ "Portal Roles": "Perfis do portal",
+ "Outbound Emails": "Email de saída",
+ "Group Email Accounts": "Contas de email de grupo ",
+ "Personal Email Accounts": "Contas pessoais de email",
+ "Inbound Emails": "Email de entrada",
+ "Email Templates": "Template de emails",
+ "Import": "Importar",
+ "Layout Manager": "Gestão de layout",
+ "User Interface": "Interface do utilizador",
+ "Auth Tokens": "Token de autenticação",
+ "Authentication": "Autenticação",
+ "Currency": "Moeda",
+ "Integrations": "Integrações",
+ "Extensions": "Extensões",
+ "Upload": "Carregar",
+ "Installing...": "A Instalar...",
+ "Upgrading...": "A Atualizar...",
+ "Upgraded successfully": "Atualização com sucesso",
+ "Installed successfully": "Instalado com sucesso",
+ "Ready for upgrade": "Pronto para atualização",
+ "Run Upgrade": "Atualizar",
+ "Install": "Instalar",
+ "Ready for installation": "Pronto para instalar",
+ "Uninstalling...": "A desinstalar...",
+ "Uninstalled": "Desinstalado",
+ "Create Entity": "Criar entidade",
+ "Edit Entity": "Editar entidade",
+ "Create Link": "Criar link",
+ "Edit Link": "Editar link",
+ "Notifications": "Notificações",
+ "Jobs": "Tarefas",
+ "Reset to Default": "Repor definições",
+ "Email Filters": "Filtro de Email",
+ "Portal Users": "Utilizadores do portal",
+ "Action History": "Histórico de ações",
+ "Label Manager": "Gestor de etiquetas",
+ "Auth Log": "Registo de autenticação",
+ "Lead Capture": "Captura de lead",
+ "Attachments": "Anexos",
+ "API Users": "API utilizadores",
+ "Template Manager": "Gestor de templates",
+ "System Requirements": "Requisitos de sistema",
+ "PHP Settings": "Configurações PHP",
+ "Database Settings": "Configuração de base de dados",
+ "Permissions": "Permissões",
+ "Success": "Sucesso",
+ "Fail": "Falha",
+ "is recommended": "recomendado",
+ "extension is missing": "extensão em falta",
+ "PDF Templates": "Templates PDF",
+ "Dashboard Templates": "Template de dashboard",
+ "Email Addresses": "Endereço de email",
+ "Phone Numbers": "Número de telemóvel",
+ "Layout Sets": "Conjunto de formulários por equipas",
+ "Messaging": "Mensagens",
+ "Job Settings": "Definições da tarefa",
+ "Configuration Instructions": "Instruções de configuração",
+ "Working Time Calendars": "Working time calendars"
+ },
+ "layouts": {
+ "list": "Lista",
+ "detail": "Detalhes",
+ "listSmall": "Lista (pequena)",
+ "detailSmall": "Detalhe (pequeno)",
+ "filters": "Procura de filtros",
+ "massUpdate": "Atualização em massa",
+ "relationships": "Painel de relacionamentos",
+ "sidePanelsDetail": "Painéis laterais (detalhe)",
+ "sidePanelsEdit": "Painéis laterais (editar)",
+ "sidePanelsDetailSmall": "Painéis laterais (pequeno, detalhe)",
+ "sidePanelsEditSmall": "Painéis laterais (editar detalhe)",
+ "detailPortal": "Detalhe (portal)",
+ "detailSmallPortal": "Detalhe (pequeno, portal)",
+ "listSmallPortal": "Lista (pequeno, portal)",
+ "listPortal": "Lista (portal)",
+ "relationshipsPortal": "Painel de relacionamentos (portal)",
+ "defaultSidePanel": "Campos do painel lateral",
+ "bottomPanelsDetail": "Painéis inferiores",
+ "bottomPanelsEdit": "Painéis inferiores (editar)",
+ "bottomPanelsDetailSmall": "Painéis inferiores (detalhes, pequeno)",
+ "bottomPanelsEditSmall": "Painéis inferiores (editar pequeno)"
+ },
+ "fieldTypes": {
+ "address": "Endereço",
+ "foreign": "Forreign",
+ "password": "Senha",
+ "personName": "Person name",
+ "enumInt": "Enum integer",
+ "enumFloat": "Enum float",
+ "linkMultiple": "Link multiple",
+ "linkParent": "Link parent",
+ "attachmentMultiple": "Attachment multiple",
+ "rangeInt": "Range integer",
+ "rangeFloat": "Range float",
+ "rangeCurrency": "Range currency",
+ "currencyConverted": "Currency (converted)",
+ "number": "Nuber (auto-increment)",
+ "datetime": "Date-time",
+ "datetimeOptional": "Date/Date-time",
+ "linkOne": "Link one"
+ },
+ "fields": {
+ "type": "Tipo",
+ "name": "Nome",
+ "label": "Etiqueta",
+ "required": "Obrigatório",
+ "default": "Padrão",
+ "maxLength": "Comprimento máximo",
+ "options": "Opções",
+ "after": "Depois (campo)",
+ "before": "Antes (campo)",
+ "field": "Campo",
+ "translation": "Tradução",
+ "previewSize": "Tamanho de pré-visualização",
+ "defaultType": "Tipo padrão",
+ "seeMoreDisabled": "Desativar corte de texto",
+ "entityList": "Lista de entidades",
+ "isSorted": "Está ordenado (em ordem alfabética)",
+ "audited": "Auditado",
+ "trim": "Aparar",
+ "height": "Altura (px)",
+ "minHeight": "Altura mínima (px)",
+ "provider": "Fornecedor",
+ "typeList": "Lista de tipos",
+ "rows": "Número de linhas da área de texto",
+ "lengthOfCut": "Comprimento do corte",
+ "sourceList": "Lista de fontes",
+ "tooltipText": "Descrição do campo",
+ "prefix": "Prefixo",
+ "nextNumber": "Próximo número",
+ "padLength": "Tamanho",
+ "disableFormatting": "Desativar formatação ",
+ "dynamicLogicVisible": "Condições que tornam o campo vísivel",
+ "dynamicLogicReadOnly": "Condições que tornam o campo apenas leitura",
+ "dynamicLogicRequired": "Condições que tornam o campo obrigatório",
+ "dynamicLogicOptions": "Opções condicionais",
+ "readOnly": "Apenas leitura",
+ "noEmptyString": "Campo vazio não é permitido",
+ "maxFileSize": "Tamanho máximo do ficheiro (Mb)",
+ "isPersonalData": "Dados pessoais",
+ "useIframe": "Usar Iframe",
+ "useNumericFormat": "Usar formato numérico",
+ "strip": "Encurtar",
+ "cutHeight": "Altura de corte (px)",
+ "minuteStep": "Espaçamento de minutos",
+ "inlineEditDisabled": "Desabilitar edição inline",
+ "displayAsLabel": "Exibir como etiqueta",
+ "allowCustomOptions": "Permitir opções personalizadas",
+ "maxCount": "Contagem máxima de itens",
+ "displayRawText": "Exibir texto bruto (sem remarcação)",
+ "notActualOptions": "Not actual options",
+ "accept": "Aceitar",
+ "displayAsList": "Exibir como lista",
+ "viewMap": "Botão ver mapa",
+ "codeType": "Tipo de codificação",
+ "lastChar": "Ultimo caractere",
+ "listPreviewSize": "Tamanho de pré-visualização em vista de lista",
+ "onlyDefaultCurrency": "Apenas moeda padrão",
+ "dynamicLogicInvalid": "Condições que tornam o campo inválido",
+ "conversionDisabled": "Desabilitar conversão",
+ "decimalPlaces": "Lugares decimais",
+ "pattern": "Padrão",
+ "globalRestrictions": "Restrições globais"
+ },
+ "messages": {
+ "selectEntityType": "Selecione o tipo de entidade no menu à esquerda.",
+ "selectUpgradePackage": "Selecione o pacote de atualização",
+ "selectLayout": "Selecione o layout necessário no menu à esquerda e edite-o.",
+ "selectExtensionPackage": "Selecione o pacote da extensão",
+ "extensionInstalled": "Extensão {name} {version} instalada.",
+ "installExtension": "Extensão {name} {version} pronta para instalar.",
+ "upgradeBackup": "Recomendamos que se efetue uma cópia de segurança antes da atualização",
+ "thousandSeparatorEqualsDecimalMark": "O caractere separador do milhar não pode ser o mesmo que o caractere de ponto decimal.",
+ "userHasNoEmailAddress": "Utilizador sem endereço de email.",
+ "uninstallConfirmation": "Tem a certeza que deseja desinstalar a extensão?",
+ "cronIsNotConfigured": "Trabalhos agendados não estão em execução. Por isso, os emails, notificações e lembretes de entrada não estão a funcionar. Por favor, siga as instruções (https://www.espocrm.com/documentation/administration/server-configuration/#user-content-setup-a-crontab) para configurar o cron.",
+ "newExtensionVersionIsAvailable": "Nova versão {latestVersion} da {extensionName} está disponível.",
+ "upgradeVersion": "A Aplicação vai ser atualizada para a versão {version}. Por favor, aguarde.",
+ "upgradeDone": "A aplicação foi atualizada para a versão {version}.",
+ "downloadUpgradePackage": "Baixa o pacote de atualização [aqui]({url}).",
+ "upgradeInfo": "Verifique a [documentação]({url}) sobre como atualizar sua instância do EspoCRM.",
+ "upgradeRecommendation": "Esta forma de atualização não é recomendada. É melhor atualizar a partir da linha de comandos.",
+ "newVersionIsAvailable": "Nova versão da aplicação {latestVersion} disponível.",
+ "formulaFunctions": "Mais funções podem ser encontradas na [documentação]({documentationUrl})",
+ "rebuildRequired": "Precisa executar a reconstrução da linha de comandos."
+ },
+ "descriptions": {
+ "settings": "Configurações de sistema da aplicação.",
+ "scheduledJob": "Trabalhos que são executados pelo cron.",
+ "upgrade": "Atualizar aplicação",
+ "clearCache": "Limpar todo o cache de back-end.",
+ "rebuild": "Reconstrua o back-end e limpe o cache.",
+ "users": "Gestão de utilizadores.",
+ "teams": "Gestão de equipas",
+ "roles": "Gestão de funções",
+ "portals": "Gestão de portais",
+ "portalRoles": "Funções para o portal.",
+ "outboundEmails": "Configurações SMTP para emails de saída.",
+ "groupEmailAccounts": "Agrupar contas de email IMAP. Importação de email e Email-to-Case.",
+ "personalEmailAccounts": "Contas de email dos utilizadores.",
+ "emailTemplates": "Modelos para emails de saída.",
+ "import": "Importar dados do arquivo CSV.",
+ "layoutManager": "Personalize layouts (lista, detalhe, edição, pesquisa, atualização em massa).",
+ "userInterface": "Configurar UI",
+ "authTokens": "Sessões de autenticação ativas. Endereço IP e data do último acesso.",
+ "authentication": "Configurações de autenticação.",
+ "currency": "Configurações de moeda e taxas.",
+ "extensions": "Instalar ou desinstalar extensões.",
+ "integrations": "Integração com serviços de terceiros.",
+ "notifications": "Configurações de notificação no aplicativo e por email.",
+ "inboundEmails": "Configurações para emails recebidos.",
+ "portalUsers": "Utilizadores do portal.",
+ "entityManager": "Crie e edite entidades personalizadas. Gerenciar campos e relacionamentos.",
+ "emailFilters": "As mensagens de email que correspondem ao filtro especificado não serão importadas.",
+ "actionHistory": "Log de ações do utilizador.",
+ "labelManager": "Personalizar rótulos de aplicativos.",
+ "authLog": "Histórico de login.",
+ "leadCapture": "Pontos de entrada de API para Web-to-Lead.",
+ "attachments": "Todos os anexos de arquivos armazenados no sistema.",
+ "templateManager": "Personalizar modelos de mensagem.",
+ "systemRequirements": "Requisitos do sistema para EspoCRM",
+ "apiUsers": "Utilizadores separados para fins de integração.",
+ "jobs": "Tarefas executadas em segundo plano.",
+ "pdfTemplates": "Modelos para impressão em PDF.",
+ "webhooks": "Gerir webhooks.",
+ "dashboardTemplates": "Implantar paineis para utilizadores.",
+ "phoneNumbers": "Todos os números de telemóvel armazenados no sistema.",
+ "emailAddresses": "Todos os endereços de email armazenados no sistema.",
+ "layoutSets": "Coleção de layouts que podem ser atribuídos às equipas e portais.",
+ "jobsSettings": "Trabalho a processar configurações. Trabalho a executar tarefas em segundo-plano.",
+ "sms": "Configurações de SMS.",
+ "formulaSandbox": "Escreva e teste scripts de fórmulas.",
+ "workingTimeCalendars": "Cronograma de trabalho."
+ },
+ "options": {
+ "previewSize": {
+ "x-small": "Exta-Pequeno",
+ "small": "Pequeno",
+ "medium": "Médio",
+ "large": "Grande",
+ "": "Padrão"
+ }
+ },
+ "logicalOperators": {
+ "and": "E",
+ "or": "OU",
+ "not": "NÃO"
+ },
+ "systemRequirements": {
+ "requiredPhpVersion": "Versão PHP",
+ "requiredMysqlVersion": "Versãp MySQL",
+ "host": "Nome do host",
+ "dbname": "Nome da base de dados",
+ "user": "Nome do utilizador",
+ "readable": "Legível",
+ "requiredMariadbVersion": "Versão MariaDB"
+ },
+ "templates": {
+ "accessInfo": "Informação de acesso",
+ "accessInfoPortal": "Informação de acesso para portal",
+ "assignment": "Tarefa",
+ "mention": "Menção",
+ "notePost": "Nota sobre publicação",
+ "notePostNoParent": "Nota sobre publicação (no parent)",
+ "noteStatus": "Nota sobre a atualização do estado",
+ "passwordChangeLink": "Link de mudança de senha",
+ "noteEmailReceived": "Nota sobre email recebido",
+ "twoFactorCode": "Código 2FA"
+ },
+ "strings": {
+ "rebuildRequired": "Reconstrução necessária"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/ApiUser.json b/application/Espo/Resources/i18n/pt_PT/ApiUser.json
new file mode 100644
index 0000000000..1238d504af
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/ApiUser.json
@@ -0,0 +1,5 @@
+{
+ "labels": {
+ "Create ApiUser": "Criar utilizador API"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Attachment.json b/application/Espo/Resources/i18n/pt_PT/Attachment.json
new file mode 100644
index 0000000000..47b9641056
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Attachment.json
@@ -0,0 +1,25 @@
+{
+ "insertFromSourceLabels": {
+ "Document": "Inserir documento"
+ },
+ "fields": {
+ "role": "Função",
+ "related": "Relacionado",
+ "file": "Ficheiro",
+ "type": "Tipo",
+ "field": "Campo",
+ "sourceId": "ID Origem",
+ "storage": "Amazenamento",
+ "size": "Tamanho (bytes)",
+ "isBeingUploaded": "Está a ser carregado"
+ },
+ "options": {
+ "role": {
+ "Attachment": "Anexo",
+ "Inline Attachment": "Anexo inline",
+ "Import File": "Importar ficheiro",
+ "Export File": "Exportar ficheiro",
+ "Mass Pdf": "Mass PDF"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/AuthLogRecord.json b/application/Espo/Resources/i18n/pt_PT/AuthLogRecord.json
new file mode 100644
index 0000000000..d10bf3f50a
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/AuthLogRecord.json
@@ -0,0 +1,34 @@
+{
+ "fields": {
+ "username": "Utilizador",
+ "ipAddress": "Endereço IP",
+ "requestTime": "Tempo pedido",
+ "createdAt": "Pedido a",
+ "isDenied": "Negado",
+ "denialReason": "Razão da Negação",
+ "user": "Utilizador",
+ "authToken": "Token de autenticação criado",
+ "requestUrl": "Solicitar URL",
+ "requestMethod": "Método de soliticação",
+ "authTokenIsActive": "Token de autenticação está ativo",
+ "authenticationMethod": "Método de autenticação"
+ },
+ "links": {
+ "authToken": "Token de autenticação criado",
+ "user": "Utilizador",
+ "actionHistoryRecords": "Histórico de ações"
+ },
+ "presetFilters": {
+ "denied": "Recusado",
+ "accepted": "Aceitado"
+ },
+ "options": {
+ "denialReason": {
+ "CREDENTIALS": "Credenciais inválias",
+ "INACTIVE_USER": "Utilizador inativo",
+ "IS_PORTAL_USER": "Utilizador do portal",
+ "IS_NOT_PORTAL_USER": "Não é utilizador do portal",
+ "USER_IS_NOT_IN_PORTAL": "Utilizador não está relacionado com o portal"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/AuthToken.json b/application/Espo/Resources/i18n/pt_PT/AuthToken.json
new file mode 100644
index 0000000000..2cc697a927
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/AuthToken.json
@@ -0,0 +1,22 @@
+{
+ "fields": {
+ "user": "Utilizador",
+ "ipAddress": "Endereço IP",
+ "lastAccess": "Data do último acesso",
+ "createdAt": "Data de login",
+ "isActive": "Está ativo"
+ },
+ "links": {
+ "actionHistoryRecords": "Histórico de Ações"
+ },
+ "presetFilters": {
+ "active": "Ativo",
+ "inactive": "Inativo"
+ },
+ "labels": {
+ "Set Inactive": "Definir inativo"
+ },
+ "massActions": {
+ "setInactive": "Definir inativo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Currency.json b/application/Espo/Resources/i18n/pt_PT/Currency.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Currency.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/DashboardTemplate.json b/application/Espo/Resources/i18n/pt_PT/DashboardTemplate.json
new file mode 100644
index 0000000000..83a29bb526
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/DashboardTemplate.json
@@ -0,0 +1,10 @@
+{
+ "fields": {
+ "append": "Anexar (não remover as guias do utilizador)"
+ },
+ "labels": {
+ "Create DashboardTemplate": "Criar template",
+ "Deploy to Users": "Implantar para utilizadores",
+ "Deploy to Team": "Implantar para a equipa"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/DashletOptions.json b/application/Espo/Resources/i18n/pt_PT/DashletOptions.json
new file mode 100644
index 0000000000..b4eca262bc
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/DashletOptions.json
@@ -0,0 +1,36 @@
+{
+ "fields": {
+ "title": "Título",
+ "dateFrom": "Data de",
+ "dateTo": "Data até",
+ "autorefreshInterval": "Intervalo de atualização automática",
+ "displayRecords": "Exibir registos",
+ "isDoubleHeight": "Altura 2x",
+ "mode": "Modo",
+ "enabledScopeList": "O que exibir",
+ "users": "Utilizadores",
+ "entityType": "Tipo de entidade",
+ "primaryFilter": "Filtro primário",
+ "boolFilterList": "Filtros adicionais",
+ "sortBy": "Ordenação (campo)",
+ "sortDirection": "Ordenação (direção)",
+ "dateFilter": "Filtro data",
+ "skipOwn": "Não mostrar registos próprios"
+ },
+ "options": {
+ "mode": {
+ "agendaWeek": "Semana (agenda)",
+ "basicWeek": "Semana",
+ "month": "Mês",
+ "basicDay": "Dia",
+ "agendaDay": "Dia (agenda)",
+ "timeline": "Linha do tempo"
+ }
+ },
+ "messages": {
+ "selectEntityType": "Selecione tipo de entidade nas opções de dashlet."
+ },
+ "tooltips": {
+ "skipOwn": "Ações feitas pela sua conta de utilizador não serão exibidas"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/DynamicLogic.json b/application/Espo/Resources/i18n/pt_PT/DynamicLogic.json
new file mode 100644
index 0000000000..8b3ae3e48c
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/DynamicLogic.json
@@ -0,0 +1,30 @@
+{
+ "options": {
+ "operators": {
+ "equals": "Igual",
+ "notEquals": "Diferente",
+ "greaterThan": "Maior que",
+ "lessThan": "Menor que",
+ "greaterThanOrEquals": "Maior ou igual que",
+ "lessThanOrEquals": "Menor ou igual a",
+ "in": "Em",
+ "notIn": "Não em",
+ "inPast": "No passado",
+ "inFuture": "É Futuro",
+ "isToday": "É hoje",
+ "isTrue": "É verdade",
+ "isFalse": "É falso",
+ "isEmpty": "Sem informação",
+ "isNotEmpty": "Tem informação",
+ "contains": "Contém",
+ "has": "Contém",
+ "notContains": "Não contém",
+ "notHas": "Não contém",
+ "startsWith": "Começa com",
+ "endsWith": "Acaba com"
+ }
+ },
+ "labels": {
+ "Field": "Campo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Email.json b/application/Espo/Resources/i18n/pt_PT/Email.json
new file mode 100644
index 0000000000..ab736dd8e2
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Email.json
@@ -0,0 +1,138 @@
+{
+ "fields": {
+ "parent": "Relativo a",
+ "status": "Estado",
+ "dateSent": "Data de envio",
+ "from": "De",
+ "to": "Para",
+ "replyTo": "Responder para",
+ "replyToString": "Responder para (String)",
+ "isHtml": "É Html",
+ "subject": "Assunto",
+ "attachments": "Anexos",
+ "selectTemplate": "Selecionar modelo",
+ "fromAddress": "A partir do endereço",
+ "emailAddress": "Endereço de email",
+ "deliveryDate": "Data de entrega",
+ "account": "Conta",
+ "users": "Utilizador",
+ "replied": "Respondido",
+ "replies": "Respostas",
+ "isRead": "Lido",
+ "isNotRead": "Não lido",
+ "isImportant": "Importante",
+ "isUsers": "É o utilizador",
+ "inTrash": "No lixo",
+ "name": "Nome (assunto)",
+ "isReplied": "Respondido",
+ "isNotReplied": "Não respondido",
+ "folder": "Pasta",
+ "inboundEmails": "Grupo de contas",
+ "emailAccounts": "Contas pessoais",
+ "hasAttachment": "Tem anexo",
+ "sentBy": "Enviado por",
+ "assignedUsers": "Utilizadores atribuídos",
+ "bodyPlain": "Body (simples)",
+ "ccEmailAddresses": "CC Endereços de email",
+ "messageId": "Mensagem Id",
+ "messageIdInternal": "Mensagem Id (interno)",
+ "folderId": "Pasta ID",
+ "fromName": "A partir do nome",
+ "fromString": "Do string",
+ "isSystem": "No sistema",
+ "toEmailAddresses": "Para endereço email",
+ "bccEmailAddresses": "BCC Endereços de email",
+ "replyToEmailAddresses": "Responder para Endereços de email",
+ "personStringData": "Dados pessoais",
+ "fromEmailAddress": "Endereço de",
+ "replyToName": "Responder ao nome",
+ "replyToAddress": "Responder ao endereço",
+ "createdEvent": "Created event"
+ },
+ "links": {
+ "replied": "Respondido",
+ "replies": "Respostas",
+ "inboundEmails": "Grupo de contas",
+ "emailAccounts": "Contas pessoais",
+ "assignedUsers": "Utilizadores atribuídos",
+ "sentBy": "Enviado de",
+ "attachments": "Anexos",
+ "fromEmailAddress": "A partir do endereço",
+ "toEmailAddresses": "Para endereços de email",
+ "ccEmailAddresses": "CC Para endereços de email",
+ "bccEmailAddresses": "BCC Para endereços de email",
+ "replyToEmailAddresses": "Responder a endereços de email"
+ },
+ "options": {
+ "status": {
+ "Draft": "Rascunho",
+ "Sending": "A enviar",
+ "Sent": "Enviado",
+ "Archived": "Arquivado",
+ "Received": "Recebido",
+ "Failed": "Falhado"
+ }
+ },
+ "labels": {
+ "Create Email": "Arquivo de email",
+ "Archive Email": "Arquivo de email",
+ "Compose": "Composto",
+ "Reply": "Responder",
+ "Reply to All": "Responder a todos",
+ "Forward": "Encaminhar",
+ "Original message": "Mensagem original",
+ "Forwarded message": "Mensagem encaminhada",
+ "Email Accounts": "Contas de email pessoal",
+ "Inbound Emails": "Contas de email do grupo",
+ "Email Templates": "Modelos de email",
+ "Send Test Email": "Enviar email teste",
+ "Send": "Enviar",
+ "Email Address": "Endereço de email",
+ "Mark Read": "Marcar como lido",
+ "Sending...": "A enviar...",
+ "Save Draft": "Salvo como rascunho",
+ "Mark all as read": "Marcar todos como lido",
+ "Show Plain Text": "Mostrar texto simples",
+ "Mark as Important": "Marcar como importante",
+ "Unmark Importance": "Desmarcar importância",
+ "Move to Trash": "Mover para o lixo",
+ "Retrieve from Trash": "Recuperar do lixo",
+ "Move to Folder": "Mover para pasta",
+ "Filters": "Filtros",
+ "Folders": "Pastas",
+ "View Users": "Ver utilizadores",
+ "No Subject": "Sem assunto",
+ "Insert Field": "Inserir campo",
+ "Event": "Evento"
+ },
+ "messages": {
+ "testEmailSent": "O email de teste foi enviado",
+ "emailSent": "O email foi enviado",
+ "savedAsDraft": "Guardado como rascunho",
+ "confirmInsertTemplate": "O corpo do email será perdido. Tem certeza de que deseja inserir o modelo?",
+ "noSmtpSetup": "Nenhuma configuração de SMTP. {link}.",
+ "sendConfirm": "Enviar email?",
+ "removeSelectedRecordsConfirmation": "Tem a certeza que quer remover os emails selecionados?\n\nEles também serão removidos para outros utilizadores.",
+ "removeRecordConfirmation": "Tem a certeza que quer remover o email?\n\nEle será removido para os outros utilizadores."
+ },
+ "presetFilters": {
+ "sent": "Enviado",
+ "archived": "Arquivado",
+ "inbox": "Caixa de Entrada",
+ "drafts": "Rascunhos",
+ "trash": "Lixeira",
+ "important": "Importante"
+ },
+ "massActions": {
+ "markAsRead": "Marcar como lido",
+ "markAsNotRead": "Marcar como não lido",
+ "markAsImportant": "Marcar como importante",
+ "markAsNotImportant": "Desmarcar como importante",
+ "moveToTrash": "Mover para lixo",
+ "moveToFolder": "Mover para pasta",
+ "retrieveFromTrash": "Recuperar do lixo"
+ },
+ "strings": {
+ "sendingFailed": "Envio de email falhou"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EmailAccount.json b/application/Espo/Resources/i18n/pt_PT/EmailAccount.json
new file mode 100644
index 0000000000..ec383867aa
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EmailAccount.json
@@ -0,0 +1,44 @@
+{
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "username": "Utilizador",
+ "password": "Senha",
+ "port": "Porta",
+ "monitoredFolders": "Pastas monitorizadas",
+ "fetchSince": "Buscar desde",
+ "emailAddress": "Endereço de email",
+ "sentFolder": "Enviar viste",
+ "storeSentEmails": "Armazenar emails enviados",
+ "keepFetchedEmailsUnread": "Manter emails buscados não lidos",
+ "emailFolder": "Colocar em pasta",
+ "useSmtp": "Usar SMTP",
+ "useImap": "Buscar emails",
+ "security": "Segurança"
+ },
+ "links": {
+ "filters": "Filtros"
+ },
+ "options": {
+ "status": {
+ "Active": "Ativo",
+ "Inactive": "Inativo"
+ }
+ },
+ "labels": {
+ "Create EmailAccount": "Criar conta de email",
+ "Main": "Principal",
+ "Test Connection": "Teste de conexão",
+ "Send Test Email": "Enviar email de teste"
+ },
+ "messages": {
+ "couldNotConnectToImap": "Não foi possível conectar-se ao servidor IMAP",
+ "connectionIsOk": "Conexão está ok"
+ },
+ "tooltips": {
+ "monitoredFolders": "Várias pastas devem ser separadas por vírgula.\n\nPode adicionar uma pasta 'Enviada' para sincronizar emails enviados de um cliente de email externo.",
+ "storeSentEmails": "Os emails enviados serão armazenados no servidor IMAP. O campo \"endereço de email\" deve corresponder ao endereço do qual os emails serão enviados.",
+ "useSmtp": "Abilidade de enviar emails.",
+ "emailAddress": "O utilizador registado (utilizador atribuído) deverá ter o mesmo endereço de email para ser capaz de usar esta conta de email para enviar."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EmailAddress.json b/application/Espo/Resources/i18n/pt_PT/EmailAddress.json
new file mode 100644
index 0000000000..dbe2c8c762
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EmailAddress.json
@@ -0,0 +1,11 @@
+{
+ "labels": {
+ "Primary": "Primário",
+ "Opted Out": "Opted out",
+ "Invalid": "Inválido"
+ },
+ "fields": {
+ "optOut": "Opted out",
+ "invalid": "Inválido"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EmailFilter.json b/application/Espo/Resources/i18n/pt_PT/EmailFilter.json
new file mode 100644
index 0000000000..7142788441
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EmailFilter.json
@@ -0,0 +1,28 @@
+{
+ "fields": {
+ "from": "De",
+ "to": "Para",
+ "subject": "Assunto",
+ "bodyContains": "O corpo contém",
+ "action": "Ação",
+ "isGlobal": "Global",
+ "emailFolder": "Pasta"
+ },
+ "labels": {
+ "Create EmailFilter": "Criar filtro de email"
+ },
+ "tooltips": {
+ "from": "A enviar emails a partir do endereços especificados. Deixe vazio se não for necessário. Você pode usar wildcard *.",
+ "to": "A enviar emails para o endereço especificado. Deixe vazio se não for necessário. Você pode usar wildcard.",
+ "name": "Dê ao filtro um nome descritivo.",
+ "bodyContains": "O corpo do email contém qualquer uma das palavras ou frases especificadas.",
+ "isGlobal": "Aplica esse filtro a todos os emails recebidos no sistema.",
+ "subject": "Utilize wildcard *:\n\ntext* - começa com o texto,\n*text* - contém o texto. \n *termina com o texto"
+ },
+ "options": {
+ "action": {
+ "Skip": "Ignorar",
+ "Move to Folder": "Coloque na pasta"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EmailFolder.json b/application/Espo/Resources/i18n/pt_PT/EmailFolder.json
new file mode 100644
index 0000000000..e904b5246d
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EmailFolder.json
@@ -0,0 +1,10 @@
+{
+ "fields": {
+ "skipNotifications": "Dispensar notificações"
+ },
+ "labels": {
+ "Create EmailFolder": "Criar pasta",
+ "Manage Folders": "Gerir pastas",
+ "Emails": "emails"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EmailTemplate.json b/application/Espo/Resources/i18n/pt_PT/EmailTemplate.json
new file mode 100644
index 0000000000..05a8da7095
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EmailTemplate.json
@@ -0,0 +1,34 @@
+{
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "isHtml": "É Html",
+ "body": "Corpo",
+ "subject": "Assunto",
+ "attachments": "Anexos",
+ "oneOff": "Único",
+ "category": "Categoria",
+ "insertField": "Inserir campo"
+ },
+ "labels": {
+ "Create EmailTemplate": "Criar template de email",
+ "Info": "Informação",
+ "Available placeholders": "Espaços reservados disponíveis"
+ },
+ "tooltips": {
+ "oneOff": "Verifique se vai usar este modelo apenas uma vez. Por exemplo: para email em massa."
+ },
+ "presetFilters": {
+ "actual": "Atual"
+ },
+ "placeholderTexts": {
+ "optOutLink": "um link de cancelamento de inscrição.",
+ "today": "Hoje",
+ "now": "Data & Hora corrente",
+ "currentYear": "Ano atual",
+ "optOutUrl": "URL para um link de cancelamento de inscrição"
+ },
+ "messages": {
+ "infoText": "Espaços reservados disponíveis:\n\n{optOutUrl} –URL para um link de cancelamento de inscrição;\n\n{optOutLink} – um link de cancelamento de inscrição."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EmailTemplateCategory.json b/application/Espo/Resources/i18n/pt_PT/EmailTemplateCategory.json
new file mode 100644
index 0000000000..656b189c09
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EmailTemplateCategory.json
@@ -0,0 +1,14 @@
+{
+ "labels": {
+ "Create EmailTemplateCategory": "Criar categoria",
+ "Manage Categories": "Gerir categorias",
+ "EmailTemplates": "Template de email"
+ },
+ "fields": {
+ "order": "Ordem",
+ "childList": "Lista pequena"
+ },
+ "links": {
+ "emailTemplates": "Template email"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/EntityManager.json b/application/Espo/Resources/i18n/pt_PT/EntityManager.json
new file mode 100644
index 0000000000..2822969a9f
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/EntityManager.json
@@ -0,0 +1,81 @@
+{
+ "labels": {
+ "Fields": "Campos",
+ "Relationships": "Relações",
+ "Schedule": "Agendamento",
+ "Formula": "Fórmula"
+ },
+ "fields": {
+ "name": "Nome",
+ "type": "Tipo",
+ "labelSingular": "Singular",
+ "labelPlural": "Plural",
+ "stream": "Fluxo",
+ "label": "Etiqueta",
+ "linkType": "Tipo de link",
+ "entityForeign": "Entidade estrangeira",
+ "linkForeign": "Link estrangeiro",
+ "labelForeign": "Label estrangeira",
+ "sortBy": "Ordenação por defeito (campo)",
+ "sortDirection": "Ordenação por defeito (orientação)",
+ "relationName": "Nome da tabela intermédia",
+ "linkMultipleField": "Link múltiplo campo",
+ "linkMultipleFieldForeign": "Link estrangeiro multiplo campo",
+ "disabled": "Desativado",
+ "textFilterFields": "Filtro de texto - campos ",
+ "audited": "Auditado",
+ "auditedForeign": "Estrangeiro auditado",
+ "statusField": "Estado do campo",
+ "beforeSaveCustomScript": "Depois de salvar - script customizado",
+ "color": "Cor",
+ "kanbanViewMode": "Vista kanban",
+ "kanbanStatusIgnoreList": "Ignorar grupos na vista kanban",
+ "fullTextSearch": "Pesquisa de texto completo",
+ "countDisabled": "Desativar contagem de registos",
+ "parentEntityTypeList": "Tipo de Entity Parents",
+ "foreignLinkEntityTypeList": "Links estrangeiros",
+ "entity": "Entidade",
+ "optimisticConcurrencyControl": "Controle de simultaneidade otimista"
+ },
+ "options": {
+ "type": {
+ "": "Nenhum",
+ "Person": "Pessoa",
+ "CategoryTree": "Árvore de categorias",
+ "Event": "Evento",
+ "BasePlus": "Base plus",
+ "Company": "Empresa"
+ },
+ "linkType": {
+ "manyToMany": "Many-to-many",
+ "oneToMany": "One-to-many",
+ "manyToOne": "Many-to-one",
+ "parentToChildren": "Parent-to-children",
+ "childrenToParent": "Children-to-parent",
+ "oneToOneRight": "One-to-one right",
+ "oneToOneLeft": "One-to-one left"
+ },
+ "sortDirection": {
+ "asc": "Crescente",
+ "desc": "Descendente"
+ }
+ },
+ "messages": {
+ "entityCreated": "A entidade foi criada.",
+ "linkAlreadyExists": "Conflito de nome de link.",
+ "linkConflict": "Conflito de nome: link ou campo com o mesmo nome já existe.",
+ "confirmRemove": "Tem a certeza que quer remover o tipo de entidade do sistema?"
+ },
+ "tooltips": {
+ "statusField": "Atualizações desse campo são registradas no fluxo.",
+ "textFilterFields": "Campos usados pela pesquisa de texto.",
+ "stream": "Se a entidade tem um fluxo.",
+ "disabled": "Verifique se não precisa dessa entidade no sistema.",
+ "linkAudited": "A criação de registos e links relacionados com registos existentes será registrada no fluxo.",
+ "linkMultipleField": "Link Multiple field fornece uma maneira prática de editar relações. Não use se tem um grande número de registos relacionados.",
+ "entityType": "Base Plus - possui painéis Atividades, Histórico e Tarefas.\n\nEvento - disponível no painel Calendário e Atividades.",
+ "fullTextSearch": "A reconstrução em execução é necessária.",
+ "countDisabled": "O nome total não será mostrado na vista de lista. Pode diminuir o tempo de carregamento quando a tabela da base de dados é grande.",
+ "optimisticConcurrencyControl": "Previne conflitos de escrita."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Export.json b/application/Espo/Resources/i18n/pt_PT/Export.json
new file mode 100644
index 0000000000..2c544c6a2e
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Export.json
@@ -0,0 +1,23 @@
+{
+ "fields": {
+ "fieldList": "Lista de campos",
+ "exportAllFields": "Exportar todos os campos",
+ "format": "Formatação",
+ "status": "Estado"
+ },
+ "options": {
+ "format": {
+ "xlsx": "XLSX (excel)"
+ },
+ "status": {
+ "Pending": "Pendente",
+ "Running": "Correndo",
+ "Success": "Sucesso",
+ "Failed": "Falhou"
+ }
+ },
+ "messages": {
+ "exportProcessed": "A exportação foi processada. Baixe o [ficheiro]({url})",
+ "infoText": "A exportação está a ser processada. Pode demorar a terminar. Fechar esta caixa de diálogo não vai afetar o processo."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Extension.json b/application/Espo/Resources/i18n/pt_PT/Extension.json
new file mode 100644
index 0000000000..5bf6a112e5
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Extension.json
@@ -0,0 +1,16 @@
+{
+ "fields": {
+ "name": "Nome",
+ "version": "Versão",
+ "description": "Descrição",
+ "isInstalled": "Instalado",
+ "checkVersionUrl": "URL para verificar novas versões"
+ },
+ "labels": {
+ "Uninstall": "Desinstalar",
+ "Install": "Instalar"
+ },
+ "messages": {
+ "uninstalled": "A extensão {name} foi desinstalada"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/ExternalAccount.json b/application/Espo/Resources/i18n/pt_PT/ExternalAccount.json
new file mode 100644
index 0000000000..5c8865749e
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/ExternalAccount.json
@@ -0,0 +1,8 @@
+{
+ "labels": {
+ "Connect": "Conectar",
+ "Connected": "Conectado",
+ "Disconnect": "Desconectar",
+ "Disconnected": "Desconectado"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/FieldManager.json b/application/Espo/Resources/i18n/pt_PT/FieldManager.json
new file mode 100644
index 0000000000..ea5fad9ba2
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/FieldManager.json
@@ -0,0 +1,148 @@
+{
+ "labels": {
+ "Dynamic Logic": "Lógica Dinâmica",
+ "Name": "Nome",
+ "Label": "Etiqueta",
+ "Type": "Tipo"
+ },
+ "options": {
+ "dateTimeDefault": {
+ "": "Nenhum",
+ "javascript: return this.dateTime.getNow(1);": "Agora",
+ "javascript: return this.dateTime.getNow(5);": "Agora (5m)",
+ "javascript: return this.dateTime.getNow(15);": "Agora (15m)",
+ "javascript: return this.dateTime.getNow(30);": "Agora (30m)",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(1, 'hours', 15);": "+1 hora",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(2, 'hours', 15);": "+2 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(3, 'hours', 15);": "+3 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(4, 'hours', 15);": "+4 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(5, 'hours', 15);": "+5 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(6, 'hours', 15);": "+6 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(7, 'hours', 15);": "+7 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(8, 'hours', 15);": "+8 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(9, 'hours', 15);": "+9 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(10, 'hours', 15);": "+10 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(11, 'hours', 15);": "+11 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(12, 'hours', 15);": "+12 horas",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(1, 'days', 15);": "+1 dia",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(2, 'days', 15);": "+2 dias",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(3, 'days', 15);": "+3 dias",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(4, 'days', 15);": "+4 dias",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(5, 'days', 15);": "+5 dias",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(6, 'days', 15);": "+6 dias",
+ "javascript: return this.dateTime.getDateTimeShiftedFromNow(1, 'week', 15);": "+1 semana"
+ },
+ "dateDefault": {
+ "": "Nenhum",
+ "javascript: return this.dateTime.getToday();": "Hoje",
+ "javascript: return this.dateTime.getDateShiftedFromToday(1, 'days');": "+1 dia",
+ "javascript: return this.dateTime.getDateShiftedFromToday(2, 'days');": "+2 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(3, 'days');": "+3 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(4, 'days');": "+4 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(5, 'days');": "+5 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(6, 'days');": "+6 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(7, 'days');": "+7 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(8, 'days');": "+8 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(9, 'days');": "+9 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(10, 'days');": "+10 dias",
+ "javascript: return this.dateTime.getDateShiftedFromToday(1, 'weeks');": "+1 semana",
+ "javascript: return this.dateTime.getDateShiftedFromToday(2, 'weeks');": "+2 semanas",
+ "javascript: return this.dateTime.getDateShiftedFromToday(3, 'weeks');": "+3 semanas",
+ "javascript: return this.dateTime.getDateShiftedFromToday(1, 'months');": "+1 mês",
+ "javascript: return this.dateTime.getDateShiftedFromToday(2, 'months');": "+2 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(3, 'months');": "+3 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(4, 'months');": "+4 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(5, 'months');": "+5 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(6, 'months');": "+6 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(7, 'months');": "+7 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(8, 'months');": "+8 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(9, 'months');": "+9 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(10, 'months');": "+1 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(11, 'months');": "+11 meses",
+ "javascript: return this.dateTime.getDateShiftedFromToday(1, 'year');": "+1 ano"
+ },
+ "globalRestrictions": {
+ "forbidden": "Proíbido",
+ "internal": "Interno",
+ "onlyAdmin": "Restrito ao admin",
+ "readOnly": "Apenas leitura",
+ "nonAdminReadOnly": "Apenas leitura para não administrador"
+ }
+ },
+ "tooltips": {
+ "audited": "Atualizações serão registradas no fluxo.",
+ "required": "Campo será obrigatório. Não pode ser deixado vazio.",
+ "default": "O valor será definido por padrão ao criar.",
+ "min": "Valor mínimo aceitável.",
+ "max": "Valor máximo aceitável.",
+ "seeMoreDisabled": "Se não estiver marcada, os textos longos serão reduzidos.",
+ "lengthOfCut": "Quão longo o texto pode ser antes de ser cortado.",
+ "maxLength": "Comprimento máximo aceitável do texto.",
+ "before": "O valor de data deve ser anterior ao valor de data do campo especificado.",
+ "after": "O valor de data deve ser posterior ao valor de data do campo especificado.",
+ "readOnly": "O valor do campo não pode ser especificado pelo utilizador. Mas pode ser calculado por fórmula.",
+ "maxFileSize": "Se vazio ou 0, então não tem limite.",
+ "fileAccept": "Quais tipos de ficheiros podem ser aceitados. É possível adicionar itens personalizados.",
+ "barcodeLastChar": "Para o tipo EAN-13.",
+ "conversionDisabled": "A conversão de moeda não será aplicada neste campo.",
+ "cutHeight": "Texto maior que o valor especificado será cortado com um botão \"ver mais\".",
+ "pattern": "Uma expressão regular para verificar um valor de campo. Defina uma expressão ou selecione uma predefinida.",
+ "options": "Uma lista de valores possíveis e as suas etiquetas.",
+ "optionsArray": "Uma lista de valores possíveis e as suas etiquetas. Se vazio, o campo irá permitir a entrada de valores personalizados.",
+ "maxCount": "Número máximo de itens a ser selecionado. ",
+ "displayAsList": "Cada item numa nova linha.",
+ "optionsVarchar": "Uma lista de valores de preenchimento automático."
+ },
+ "fieldParts": {
+ "address": {
+ "street": "Rua",
+ "city": "Cidade",
+ "state": "Distrito",
+ "country": "País",
+ "postalCode": "Código postal",
+ "map": "Mapa"
+ },
+ "personName": {
+ "salutation": "Saudação",
+ "first": "Primeiro",
+ "last": "Último",
+ "middle": "Meio"
+ },
+ "currency": {
+ "converted": "(Convertido)",
+ "currency": "(Moeda)"
+ },
+ "datetimeOptional": {
+ "date": "Data"
+ }
+ },
+ "fieldInfo": {
+ "varchar": "Um texto de uma linha.",
+ "enum": "Caixa de seleção, apenas um valor pode ser selecionado.",
+ "text": "Um texto de múltiplas linhas, com suporte markdown.",
+ "date": "Data sem hora",
+ "datetime": "Data e hora",
+ "currency": "O valor da moeda. Um valor variável com o código de moeda.",
+ "int": "Um número inteiro.",
+ "float": "Um número com casas decimais.",
+ "bool": "Uma caixa de seleção. Dois valores possíves: verdadeiro e falso.",
+ "multiEnum": "Uma lista de valores, múltiplos valores podem ser selecionados. A lisa é ordenada.",
+ "checklist": "Uma lista de caixas de seleção.",
+ "array": "Uma lista de valores, similar a um campo Multi-Enum. ",
+ "address": "Uma morada com rua, cidade, distrito, código postal e país.",
+ "url": "Para armazenamento de links.",
+ "wysiwyg": "Um texto com suporte HTML.",
+ "file": "Para o carregamento de ficheiros.",
+ "image": "Para o carregamento de imagens.",
+ "attachmentMultiple": "Permite o carregamento de múltiplos ficheiros.",
+ "number": "Um número de incremento automático do tipo de string com um possível prefixo e comprimento específico.",
+ "autoincrement": "Um número inteiro, apenas de leitura e com incremento automático, gerado.",
+ "barcode": "Um código de barras. Pode ser impresso para PDF.",
+ "email": "Um conjunto de endereços de email, com o paramêtros: opted-out, inválio, primário.",
+ "phone": "Um conjunto de números de telemóvel, com o paramêtros: opted-out, inválio, primário.",
+ "foreign": "Um campo de um registo relacionado. Apenas de leitura.",
+ "link": "Um reegisto relacionado com uma relação Belongs-To (many-to-one or one-to-one)",
+ "linkParent": "Um registo relacionado com uma relação Belongs-To-Parent. Pode ter diferentes tipos de entidades.",
+ "linkMultiple": "Um registo relacionado com uma relção Has-Many (many-to-many or one-to-many). Nem todas as relações têm campos com links múltiplos. Apenas esses têm, onde o paramêtro está ativo."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Formula.json b/application/Espo/Resources/i18n/pt_PT/Formula.json
new file mode 100644
index 0000000000..c650eaf7ab
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Formula.json
@@ -0,0 +1,20 @@
+{
+ "labels": {
+ "Check Syntax": "Verificar sintaxe."
+ },
+ "fields": {
+ "target": "Alvo",
+ "targetType": "Tipo do Alvo",
+ "error": "Erro"
+ },
+ "messages": {
+ "runSuccess": "Executado com sucesso.",
+ "runError": "Erro.",
+ "checkSyntaxSuccess": "Sintaxe está correta.",
+ "checkSyntaxError": "Erro de sintaxe.",
+ "emptyScript": "O script está vazio."
+ },
+ "tooltips": {
+ "output": "Os valores de impressão com a função `output\\printLine`. "
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Global.json b/application/Espo/Resources/i18n/pt_PT/Global.json
new file mode 100644
index 0000000000..e6e700c4db
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Global.json
@@ -0,0 +1,751 @@
+{
+ "scopeNames": {
+ "Email": "email",
+ "User": "Utilizador",
+ "Team": "Equipa",
+ "Role": "Perfil",
+ "EmailTemplate": "Template de email",
+ "EmailAccount": "Conta de email pessoal",
+ "EmailAccountScope": "Conta de email pessoal",
+ "OutboundEmail": "Saída de email",
+ "ScheduledJob": "Agendamento de tarefa",
+ "ExternalAccount": "Conta externa",
+ "Extension": "Extensão",
+ "InboundEmail": "Grupo de contas de email",
+ "Stream": "Fluxo",
+ "Import": "Importar",
+ "Job": "Trabalho",
+ "EmailFilter": "Filtro de email",
+ "PortalRole": "Regra para portal",
+ "Attachment": "Anexo",
+ "EmailFolder": "Pasta de email",
+ "PortalUser": "Portal de utilizador",
+ "ScheduledJobLogRecord": "Registo de trabalho agendado",
+ "PasswordChangeRequest": "Pedido de alteração de senha",
+ "ActionHistoryRecord": "Registo de ações",
+ "AuthToken": "Token de autenticação",
+ "UniqueId": "ID único",
+ "LastViewed": "Últimos visualizados",
+ "Settings": "Configurações",
+ "FieldManager": "Gestor de campos",
+ "Integration": "Integração",
+ "LayoutManager": "Gestor de Layouts",
+ "EntityManager": "Gestor de Entidades",
+ "Export": "Exportar",
+ "DynamicLogic": "Lógica dinâmica",
+ "DashletOptions": "Opções de painel",
+ "Admin": "Administrador",
+ "Global": "Geral",
+ "Preferences": "Preferências",
+ "EmailAddress": "Endereço de email",
+ "PhoneNumber": "Telemóvel",
+ "AuthLogRecord": "Registo de autenticação",
+ "AuthFailLogRecord": "Registo de falha de autenticação",
+ "EmailTemplateCategory": "Categoria de template de email",
+ "LeadCapture": "Ponto de entrada de captura de leads",
+ "LeadCaptureLogRecord": "Registo de captura de leads",
+ "ArrayValue": "Valor do array",
+ "ApiUser": "Utilizador API",
+ "DashboardTemplate": "Template do painel",
+ "Currency": "Moeda",
+ "LayoutSet": "Conjunto de layout",
+ "Mass Action": "Ação em massa",
+ "Note": "Nota",
+ "ImportError": "Erro de importação",
+ "WorkingTimeCalendar": "Calendário de tempo de trabalho",
+ "WorkingTimeRange": "Faixa de tempo de trabalho"
+ },
+ "scopeNamesPlural": {
+ "Email": "emails",
+ "User": "Utilizadores",
+ "Team": "Equipas",
+ "Role": "Perfis",
+ "EmailTemplate": "Templates de email",
+ "EmailAccount": "Contas de email pessoais",
+ "EmailAccountScope": "Contas de email pessoais",
+ "OutboundEmail": "Saída de emails",
+ "ScheduledJob": "Agendamento de tarefas",
+ "ExternalAccount": "Contas externas",
+ "Extension": "Extensões",
+ "Dashboard": "Painel",
+ "InboundEmail": "Contas de email de grupo",
+ "Stream": "Fluxo",
+ "Job": "Tarefas",
+ "EmailFilter": "Filtro de emails",
+ "Portal": "Portais",
+ "PortalRole": "Regras de portal",
+ "Attachment": "Anexos",
+ "EmailFolder": "Pastas de email",
+ "PortalUser": "Utilizadores do portal",
+ "ScheduledJobLogRecord": "Registo de tarefas agendadas",
+ "PasswordChangeRequest": "Pedidos de alteração de senha",
+ "ActionHistoryRecord": "Histórico de ações",
+ "AuthToken": "Tokens de autenticação",
+ "UniqueId": "ID únicos",
+ "LastViewed": "Últimos vizualizados",
+ "AuthLogRecord": "Registo de autenticação",
+ "AuthFailLogRecord": "Registo de autenticações falhadas",
+ "EmailTemplateCategory": "Categorias de template de emails",
+ "Import": "Importar",
+ "LeadCapture": "Captura de leads",
+ "LeadCaptureLogRecord": "Registo de captura de leads",
+ "ArrayValue": "Valores do array",
+ "ApiUser": "Utilizadores API",
+ "DashboardTemplate": "Templates do painel",
+ "EmailAddress": "Endereço de email",
+ "PhoneNumber": "Telemóvel",
+ "Currency": "Moeda",
+ "LayoutSet": "Conjuntos de layout",
+ "Note": "Notas",
+ "ImportError": "Erro de importação",
+ "WorkingTimeCalendar": "Calendários de tempo de trabalho",
+ "WorkingTimeRange": "Faixas de tempo de trabalho"
+ },
+ "labels": {
+ "Merge": "Unificar",
+ "None": "Vazio",
+ "by": "por",
+ "Saved": "Salvo",
+ "Error": "Erro",
+ "Select": "Selecionar",
+ "Not valid": "Não é válido",
+ "Please wait...": "Por favor, espere...",
+ "Please wait": "Por favor, espere",
+ "Loading...": "A Carregar...",
+ "Uploading...": "A Carregar...",
+ "Sending...": "A Enviar...",
+ "Merging...": "A Unificar...",
+ "Merged": "Unificado",
+ "Removed": "Removido",
+ "Posted": "Publicado",
+ "Linked": "Ligado",
+ "Unlinked": "Removida a ligação",
+ "Done": "Feito",
+ "Access denied": "Acesso negado",
+ "Not found": "Não encontrado",
+ "Access": "Acesso",
+ "Are you sure?": "Tem a certeza?",
+ "Record has been removed": "O registo foi eliminado",
+ "Wrong username/password": "utilizador/senha errados",
+ "Post cannot be empty": "A publicação não deve ser vazia",
+ "Removing...": "A remover...",
+ "Unlinking...": "A desconectar...",
+ "Posting...": "A publicar...",
+ "Username can not be empty!": "O nome de utilizador não deve ser vazio!",
+ "Cache is not enabled": "Cache não está ativa. ",
+ "Cache has been cleared": "Cache limpa",
+ "Rebuild has been done": "Reconstrução foi realizada.",
+ "Saving...": "A Salvar...",
+ "Modified": "Modificado",
+ "Created": "Criado",
+ "Create": "Criar",
+ "create": "criado",
+ "Overview": "Vista Geral",
+ "Details": "Detalhes",
+ "Add Field": "Adicionar Campo",
+ "Add Dashlet": "Adicionar painel",
+ "Filter": "Filtro",
+ "Edit Dashboard": "Editar painel",
+ "Add": "Adicionar",
+ "Add Item": "Adicionar Item",
+ "More": "Mais",
+ "Search": "Procura",
+ "Only My": "Apenas eu",
+ "Open": "Aberto",
+ "About": "Sobre",
+ "Refresh": "Atualizar",
+ "Remove": "Remover",
+ "Options": "Opções",
+ "Username": "Utilizador",
+ "Password": "Senha",
+ "Log Out": "Sair",
+ "Preferences": "Preferências",
+ "State": "Distrito",
+ "Street": "Rua",
+ "Country": "País",
+ "City": "Cidade",
+ "PostalCode": "Código postal",
+ "Followed": "Seguido",
+ "Follow": "Seguir",
+ "Followers": "Seguidores",
+ "Clear Local Cache": "Limpar cache local",
+ "Actions": "Ações",
+ "Delete": "Apagar",
+ "Update": "Atualizar",
+ "Save": "Guardar",
+ "Edit": "Editar",
+ "View": "Ver",
+ "Cancel": "Cancelar",
+ "Apply": "Aplicar",
+ "Unlink": "Remover ligação",
+ "Mass Update": "Atualização em massa",
+ "Export": "Exportar",
+ "No Data": "Sem dados",
+ "No Access": "Sem acesso",
+ "All": "Todos",
+ "Active": "Ativo",
+ "Inactive": "Inativo",
+ "Write your comment here": "Escreva o seu comentário aqui",
+ "Post": "Publicar",
+ "Stream": "Fluxo",
+ "Show more": "Ver mais",
+ "Dashlet Options": "Opções do painel",
+ "Full Form": "Formulário completo",
+ "Insert": "Inserir",
+ "Person": "Pessoa",
+ "First Name": "Primeiro nome",
+ "Last Name": "Último nome",
+ "You": "Tu",
+ "you": "tu",
+ "change": "alterar",
+ "Change": "Alterar",
+ "Primary": "Primário",
+ "Save Filter": "Salvar Filtro",
+ "Administration": "Administração",
+ "Run Import": "Importação",
+ "Duplicate": "Duplicado",
+ "Notifications": "Notificações",
+ "Mark all read": "Marcar todos como lido.",
+ "See more": "Ver mais",
+ "Today": "Hoje",
+ "Tomorrow": "Amanhã",
+ "Yesterday": "Ontem",
+ "Submit": "Submeter",
+ "Close": "Fechar",
+ "Yes": "Sim",
+ "No": "Não",
+ "Value": "Valor",
+ "Current version": "Seleção atual",
+ "List View": "Vista em Lista",
+ "Tree View": "Vista em Árvore",
+ "Unlink All": "Desconectar todos",
+ "Print to PDF": "Imprimir para PDF",
+ "Default": "Por Defeito",
+ "Number": "Número",
+ "From": "De",
+ "To": "Para",
+ "Create Post": "Criar publicação",
+ "Previous Entry": "Registo anterior",
+ "Next Entry": "Próximo registo",
+ "View List": "Vista em lista",
+ "Attach File": "Anexar ficheiro",
+ "Skip": "Saltar",
+ "Attribute": "Atributo",
+ "Function": "Função",
+ "Self-Assign": "Atribuir a mim mesmo",
+ "Self-Assigned": "Atribuir a mim mesmo",
+ "Return to Application": "Voltar para a aplicação",
+ "Select All Results": "Selecionar todos os resultados",
+ "Expand": "Expandir",
+ "Collapse": "Compactar",
+ "New notifications": "Novas notificações",
+ "Manage Categories": "Gerir categorias",
+ "Manage Folders": "Gerir pastas",
+ "Convert to": "Converter em",
+ "View Personal Data": "Vista pessoal",
+ "Personal Data": "Dados pessoais",
+ "Erase": "Apagar",
+ "Move Over": "Mover",
+ "Restore": "Restaurar",
+ "View Followers": "Ver seguidores",
+ "Convert Currency": "Converter moeda",
+ "Middle Name": "Nome do meio",
+ "View on Map": "Ver no mapa",
+ "Proceed": "Continuar",
+ "Attached": "Anexado",
+ "Preview": "Pré-visualizar",
+ "Save & Continue Editing": "Salvar e continuar a editar",
+ "Save & New": "Salvar e abrir novo",
+ "Field": "Campo",
+ "Resolution": "Resolução",
+ "Resolve Conflict": "Resolver conflito",
+ "Download": "Baixar",
+ "Sort": "Ordenar",
+ "Global Search": "Busca global"
+ },
+ "messages": {
+ "pleaseWait": "Por favor, aguarde...",
+ "posting": "A publicar...",
+ "confirmLeaveOutMessage": "Tem a certeza que deseja sair do formulário?",
+ "notModified": "Não efetuou alterações no registo",
+ "fieldIsRequired": "{field} é obrigatório",
+ "fieldShouldAfter": "{field} deve estar depois de {otherField}",
+ "fieldShouldBefore": "{field} deve estar antes {otherField}",
+ "fieldShouldBeBetween": "{field} deve estar entre {min} e {max}",
+ "fieldBadPasswordConfirm": "{field} não foi confirmado corretamente",
+ "resetPreferencesDone": "Todas as preferencias foram repostas",
+ "confirmation": "Tem a certeza?",
+ "unlinkAllConfirmation": "Tem a certeza que pretende desconectar todos os registos relacionados?",
+ "resetPreferencesConfirmation": "Tem a certeza que deseja repor todas as preferências?",
+ "removeRecordConfirmation": "Tem a certeza que pretende remover o registo?",
+ "unlinkRecordConfirmation": "Tem certeza de que deseja desconectar o registo relacionado?",
+ "removeSelectedRecordsConfirmation": "Tem certeza de que deseja remover os registos selecionados?",
+ "massUpdateResult": "{count} registos foram atualizados",
+ "massUpdateResultSingle": "{count} registo foi atualizado",
+ "noRecordsUpdated": "Sem registos atualizados",
+ "massRemoveResult": "{count} registos foram removidos",
+ "massRemoveResultSingle": "{count} registo foi removido",
+ "noRecordsRemoved": "Não foram removidos registos",
+ "clickToRefresh": "Clicar para atualizar",
+ "writeYourCommentHere": "Escreva o seu comentário aqui",
+ "writeMessageToUser": "Escreve a sua mensagem para {user}",
+ "typeAndPressEnter": "Digite e pressione enter",
+ "checkForNewNotifications": "Verifique novas notificações",
+ "duplicate": "O registo que está a tentar criar, possivelmente já existe",
+ "dropToAttach": "Solte para anexar",
+ "writeMessageToSelf": "Escreva a sua mensagem no fluxo",
+ "checkForNewNotes": "Verifique atualizações no Fluxo",
+ "internalPost": "Publicação apenas será vizualizada por utilizadores internos",
+ "done": "Feito",
+ "confirmMassFollow": "Tem a certeza que deseja seguir os registos selecionados?",
+ "confirmMassUnfollow": "Tem a certeza que deseja deixar de seguir os registos selecionados?",
+ "massFollowResult": "{count} registos são agora seguidos",
+ "massUnfollowResult": "{count} registos deixaram de ser seguidos",
+ "massFollowResultSingle": "{count} registo agora é seguido",
+ "massUnfollowResultSingle": "{count} registo deixou de ser seguido",
+ "massFollowZeroResult": "Nada foi seguido",
+ "massUnfollowZeroResult": "Não existe nada a ser seguido",
+ "fieldShouldBeEmail": "{field} deve ser um email válido",
+ "fieldShouldBeFloat": "{field} deve ser um décimal válido",
+ "fieldShouldBeInt": "{field} deve ser um inteiro válido",
+ "fieldShouldBeDate": "{field} deve ser uma data válida",
+ "fieldShouldBeDatetime": "{field} deve ser respeitar o formato data/hora",
+ "internalPostTitle": "Publicação é vista apenas por utilizadores internos",
+ "loading": "A carregar...",
+ "saving": "A salvar...",
+ "fieldMaxFileSizeError": "O ficheiro não deve exceder {max} Mb",
+ "fieldShouldBeLess": "{field} não deve ser maior que {value}",
+ "fieldShouldBeGreater": "{field} não deve ser menor que {value}",
+ "fieldIsUploading": "Carregamento em curso",
+ "erasePersonalDataConfirmation": "Os campos marcados serão apagados permanentemente. Tem certeza?",
+ "massPrintPdfMaxCountError": "Impossível imprimir mais que {maxCount} registos.",
+ "fieldValueDuplicate": "Valor duplicado",
+ "unlinkSelectedRecordsConfirmation": "Tem certeza de que deseja retirar as relações dos registos selecionados",
+ "recalculateFormulaConfirmation": "Tem certeza de que deseja recalcular a fórmula dos registos selecionados?",
+ "fieldExceedsMaxCount": "Contagem excede o máximo permitido {maxCount}",
+ "notUpdated": "Não atualizado",
+ "maintenanceMode": "A aplicação está atualmente no modo de manutenção. Apenas administradores têm acesso. \n\\ O modo de manutenção pode ser desativado em Administração → Defenições. ",
+ "fieldInvalid": "{field} é inválido",
+ "resolveSaveConflict": "O registo foi modificado. Deve resolver o conflito antes de salvar o registo.",
+ "massActionProcessed": "Ação em massa foi processada.",
+ "fieldUrlExceedsMaxLength": "O URL codificado excede a largura máxima de {maxLength} ",
+ "fieldNotMatchingPattern": "{field} não corresponde ao padrão `{pattern}`",
+ "fieldNotMatchingPattern$noBadCharacters": "{field} contem caracteres não permitidos",
+ "fieldNotMatchingPattern$noAsciiSpecialCharacters": "{field} não deve conter caracteres especiais ASCII",
+ "fieldNotMatchingPattern$latinLetters": "{field} só pode conter letras latinas",
+ "fieldNotMatchingPattern$latinLettersDigits": "{field} apenas pode conter letras e dígitos latinos",
+ "fieldNotMatchingPattern$latinLettersDigitsWhitespace": "{field} apenas pode conter letras e dígitos latinos e espaços",
+ "fieldNotMatchingPattern$latinLettersWhitespace": "{field} apenas pode conter letras latinas e espaços",
+ "fieldNotMatchingPattern$digits": "{field} apenas pode conter dígitos",
+ "fieldPhoneInvalidCharacters": "Apenas dígitos, letras latinas e caracteres `-+_@:#().` são permitidos.",
+ "arrayItemMaxLength": "O item não deve ser maior do que {max} caracteres.",
+ "validationFailure": "Falha na validação de back-end. \n\nField: `{field}`\nValidation: `{type}`",
+ "confirmAppRefresh": "A apçicação foi atualizada. É recomendado que atrualize a pagina para assegurar o bom funcionamento.",
+ "error404": "O url que solicitou não pode ser tratado.",
+ "error403": "Não tem acesso a esta área."
+ },
+ "boolFilters": {
+ "onlyMy": "Apenas eu",
+ "followed": "Seguido",
+ "onlyMyTeam": "A minha equipa"
+ },
+ "presetFilters": {
+ "followed": "Seguido",
+ "all": "Todos"
+ },
+ "massActions": {
+ "remove": "Remover",
+ "merge": "Unificar",
+ "massUpdate": "Atualização em massa",
+ "export": "Exportar",
+ "follow": "Seguir",
+ "unfollow": "Não seguir",
+ "convertCurrency": "Converter moeda",
+ "printPdf": "Imprimir para PDF",
+ "unlink": "Remover ligação",
+ "recalculateFormula": "Recalcular Formula",
+ "update": "Atualizar"
+ },
+ "fields": {
+ "name": "Nome",
+ "firstName": "Primeiro Nome",
+ "lastName": "Último Nome",
+ "salutationName": "Saudação",
+ "assignedUser": "Utilizador atribuído",
+ "assignedUsers": "Utilizadores atribuídos",
+ "emailAddress": "email",
+ "assignedUserName": "Atribuido ao utilizador",
+ "teams": "Equipas",
+ "createdAt": "Criado em",
+ "modifiedAt": "Modificado em",
+ "createdBy": "Criado por",
+ "modifiedBy": "Modificado por",
+ "description": "Descrição",
+ "address": "Endereço",
+ "phoneNumber": "Telefone",
+ "phoneNumberMobile": "Telemóvel",
+ "phoneNumberHome": "Telefone (casa)",
+ "phoneNumberFax": "Telefone (fax)",
+ "phoneNumberOffice": "Telefone (escritório)",
+ "phoneNumberOther": "Telefone (outro)",
+ "order": "Ordenar",
+ "parent": "Relativo a",
+ "children": "Filho",
+ "emailAddressData": "Dados de endereço de email",
+ "phoneNumberData": "Dados número de telemóvel",
+ "names": "Nomes",
+ "emailAddressIsOptedOut": "Endereços de email está opted-out",
+ "targetListIsOptedOut": "Opted Out (lista de alvos)",
+ "type": "Tipo",
+ "phoneNumberIsOptedOut": "Número de telemóvel está opted-out",
+ "types": "Tipos",
+ "middleName": "Nome do meio"
+ },
+ "links": {
+ "assignedUser": "Utilizador atribuído",
+ "createdBy": "Criado por",
+ "modifiedBy": "Modificado por",
+ "team": "Equipa",
+ "roles": "Perfis",
+ "teams": "Equipas",
+ "users": "Regras",
+ "parent": "Retalivo a",
+ "children": "Filho"
+ },
+ "dashlets": {
+ "Stream": "Fluxo",
+ "Emails": "Caixa de entrada",
+ "Records": "Lista de registos"
+ },
+ "notificationMessages": {
+ "assign": "{entityType} {entity} foi-lhe atribuída",
+ "emailReceived": "Email recebido de {from}",
+ "entityRemoved": "{user} removeu {entityType} {entity}"
+ },
+ "streamMessages": {
+ "post": "{user} publicou em {entityType} {entity}",
+ "attach": "{user} anexou em {entityType} {entity}",
+ "status": "{user} atualizou o {field} da {entityType} {entity}",
+ "update": "{user} atualizou {entityType} {entity}",
+ "postTargetTeam": "{user} publicou para a equipa {target}",
+ "postTargetTeams": "{user} publicou para as equipas {target}",
+ "postTargetPortal": "{user} publicou no portal {target}",
+ "postTargetPortals": "{user} publicou no portal {target}",
+ "postTarget": "{user} publicou em {target}",
+ "postTargetYou": "{user} publicou para ti",
+ "postTargetYouAndOthers": "{user} publicou {target} e a ti",
+ "postTargetAll": "{user} publicou para todos",
+ "mentionInPost": "{user} mencionou {mentioned} na {entityType} {entity}",
+ "mentionYouInPost": "{user} mencionou-te na {entityType} {entity}",
+ "mentionInPostTarget": "{user} mencionou {mentioned} na publicações",
+ "mentionYouInPostTarget": "{user} mencionou-te na publicação para {target}",
+ "mentionYouInPostTargetAll": "{user} mencionou-te na publicação para todos",
+ "mentionYouInPostTargetNoTarget": "{user} mencionou-te na publicação",
+ "create": "{user} criou {entityType} {entity}",
+ "createThis": "{user} criou a {entityType}",
+ "createAssignedThis": "{user} criou {entityType} e atribuiu a {assignee}",
+ "createAssigned": "{user} criou {entityType} {entity} e atribuiu a {assignee}",
+ "assign": "{user} atribuiu {entityType} {entity} a {assignee}",
+ "assignThis": "{user} atribuiu esta {entityType} ao {assignee}",
+ "postThis": "{user} publicou",
+ "attachThis": "{user} anexou",
+ "statusThis": "{user} atualizou {field}",
+ "updateThis": "{user} atualizou esta {entityType}",
+ "createRelatedThis": "{user} criou {relatedEntityType} {relatedEntity} relacionado com esta {entityType}",
+ "createRelated": "{user} criou {relatedEntityType} {relatedEntity} relacionada com {entityType} {entity}",
+ "relate": "{user} relacionado {relatedEntityType} {relatedEntity} com {entityType} {entity}",
+ "relateThis": "{user} relacionado {relatedEntityType} {relatedEntity} com esta {entityType}",
+ "emailReceivedFromThis": "email recebido de {from}",
+ "emailReceivedInitialFromThis": "email recebido de {from}, desta {entityType} criada",
+ "emailReceivedThis": "Email recebido",
+ "emailReceivedInitialThis": "Email recebido, esta {entityType} criada",
+ "emailReceivedFrom": "Email recebido de {from}, relacionado com {entityType} {entity}",
+ "emailReceivedFromInitial": "Email recevido de {from}, {entityType} {entity} criada",
+ "emailReceivedInitialFrom": "Email recevido de {from}, {entityType} {entity} criada",
+ "emailReceived": "Email recebido relacionado com {entityType} {entity}",
+ "emailReceivedInitial": "Email recebido: {entityType} {entity} criado",
+ "emailSent": "{by} enviado email relacionado com {entityType} {entity}",
+ "emailSentThis": "{by} enviado email",
+ "postTargetSelf": "{user} publicou para si mesmo",
+ "postTargetSelfAndOthers": "{user} publicou para {target} e ele mesmo",
+ "createAssignedYou": "{user} criou {entityType} {entity} e atribuiu-te a mesma",
+ "createAssignedThisSelf": "{user} criou {entityType} e atribuiu a ele mesmo",
+ "createAssignedSelf": "{user} criou {entityType} {entity} e atribuiu a ele mesmo",
+ "assignYou": "{user} atribuiu-te {entityType} {entity}",
+ "assignThisVoid": "{user} retirou a atribuição desta {entityType}",
+ "assignVoid": "{user} retirou a atribuição da {entityType} {entity}",
+ "assignThisSelf": "{user} auto-atribuiu esta {entityType}",
+ "assignSelf": "{user} auto-atribuiu {entityType} {entity}"
+ },
+ "lists": {
+ "monthNames": [
+ "janeiro",
+ "fevereiro",
+ "março",
+ "abril",
+ "maio",
+ "junho",
+ "julho",
+ "agosto",
+ "setembro",
+ "outubro",
+ "novembro",
+ "dezembro"
+ ],
+ "monthNamesShort": [
+ "jan",
+ "fev",
+ "mar",
+ "abr",
+ "mai",
+ "jun",
+ "jul",
+ "ago",
+ "set",
+ "out",
+ "nov",
+ "dez"
+ ],
+ "dayNames": [
+ "domingo",
+ "segunda-feira",
+ "terça-feira",
+ "quarta-feira",
+ "quinta-feira",
+ "sexta-feira",
+ "sábado"
+ ],
+ "dayNamesShort": [
+ "dom",
+ "seg",
+ "ter",
+ "qua",
+ "qui",
+ "sex",
+ "sab"
+ ],
+ "dayNamesMin": [
+ "do",
+ "se",
+ "te",
+ "qa",
+ "qi",
+ "sx",
+ "sb"
+ ]
+ },
+ "options": {
+ "salutationName": {
+ "Mr.": "Sr.",
+ "Mrs.": "Sra.",
+ "Ms.": "Menina"
+ },
+ "dateSearchRanges": {
+ "on": "Em",
+ "notOn": "Não em",
+ "after": "Depois",
+ "before": "Antes",
+ "between": "Entre",
+ "today": "Hoje",
+ "past": "Passado",
+ "future": "Futuro",
+ "currentMonth": "Currente mês",
+ "lastMonth": "Último mês",
+ "currentQuarter": "Currente trimestre",
+ "lastQuarter": "Último trimestre",
+ "currentYear": "Ano corrente",
+ "lastYear": "Último ano",
+ "lastSevenDays": "Últimos 7 dias",
+ "lastXDays": "Últimos X dias",
+ "nextXDays": "Próximos X dias",
+ "ever": "Sempre",
+ "isEmpty": "É vazio",
+ "olderThanXDays": "Mais antigo que X dias",
+ "afterXDays": "Depois de X dias",
+ "nextMonth": "Próximo mês",
+ "currentFiscalYear": "Ano fiscal corrente",
+ "lastFiscalYear": "Último ano fiscal",
+ "currentFiscalQuarter": "Trimestre fiscal corrente",
+ "lastFiscalQuarter": "Último trimestre fiscal"
+ },
+ "searchRanges": {
+ "is": "É",
+ "isEmpty": "É vazio",
+ "isNotEmpty": "Não é vazio",
+ "isFromTeams": "É da equipa",
+ "isOneOf": "Qualquer um",
+ "anyOf": "Qualquer um",
+ "isNot": "Não é",
+ "isNotOneOf": "Nenhum",
+ "noneOf": "Nenhum",
+ "allOf": "Todos",
+ "any": "Qualquer"
+ },
+ "varcharSearchRanges": {
+ "equals": "Igual",
+ "like": "É como (%)",
+ "startsWith": "Começa em",
+ "endsWith": "Termina em",
+ "contains": "Contém",
+ "isEmpty": "É vazio",
+ "isNotEmpty": "Não é vazio",
+ "notLike": "Não é como (%)",
+ "notContains": "Não Contém",
+ "notEquals": "Não é igual"
+ },
+ "intSearchRanges": {
+ "equals": "Igual",
+ "notEquals": "Não é igual",
+ "greaterThan": "Maior que",
+ "lessThan": "Menor que",
+ "greaterThanOrEquals": "Maior ou igual que",
+ "lessThanOrEquals": "Menor ou igual a",
+ "between": "Entre",
+ "isEmpty": "É vazio",
+ "isNotEmpty": "Não é vazio"
+ },
+ "autorefreshInterval": {
+ "0": "Nenhum",
+ "1": "1 minuto",
+ "2": "2 minuto",
+ "5": "5 minuto",
+ "10": "10 minutos",
+ "0.5": "30 segundos"
+ },
+ "phoneNumber": {
+ "Mobile": "Telemóvel",
+ "Office": "Escritório",
+ "Home": "Casa",
+ "Other": "Outro"
+ },
+ "saveConflictResolution": {
+ "current": "Corrente",
+ "actual": "Atual"
+ }
+ },
+ "sets": {
+ "summernote": {
+ "NOTICE": "Pode encontrar a tradução aqui: https://github.com/HackerWins/summernote/tree/master/lang",
+ "font": {
+ "bold": "Negrito",
+ "italic": "Itálico",
+ "underline": "Sublinhado",
+ "clear": "Remover tipo de fonte",
+ "height": "Altura da linha",
+ "name": "Tipo de letra",
+ "size": "Tamanho de letra"
+ },
+ "image": {
+ "image": "Imagem",
+ "insert": "Inserir imagem",
+ "resizeFull": "Redimensionar completamente",
+ "resizeHalf": "Redimensionar metade",
+ "resizeQuarter": "Redimensionar um quarto",
+ "floatLeft": "Alinhar à esquerda",
+ "floatRight": "Alinhar à direita",
+ "floatNone": "Sem alinhamento",
+ "dragImageHere": "Arraste uma imagem para aqui",
+ "selectFromFiles": "Selecione os arquivos desde o computador",
+ "url": "URL da imagem",
+ "remove": "Remover imagem"
+ },
+ "link": {
+ "link": "Ligação",
+ "insert": "Inserir ligação",
+ "unlink": "Remover ligação",
+ "edit": "Editar",
+ "textToDisplay": "Texta a exibir",
+ "url": "Para qual URL esta ligação deve ir?",
+ "openInNewWindow": "Abrir em nova janela"
+ },
+ "video": {
+ "video": "Vídeo",
+ "videoLink": "Ligação para Vídeo",
+ "insert": "Inserir Vídeo",
+ "url": "URL do Vídeo?",
+ "providers": "(Youtube, Vimeo, Vine, Instagram ou DailyMotion)"
+ },
+ "table": {
+ "table": "Tabela"
+ },
+ "hr": {
+ "insert": "Inserir regra horizontal"
+ },
+ "style": {
+ "style": "Estilo",
+ "blockquote": "Proposta",
+ "pre": "Código",
+ "h1": "Cabeçalho 1",
+ "h2": "Cabeçalho 2",
+ "h3": "Cabeçalho 3",
+ "h4": "Cabeçalho 4",
+ "h5": "Cabeçalho 5",
+ "h6": "Cabeçalho 6"
+ },
+ "lists": {
+ "unordered": "Lista não ordenada",
+ "ordered": "Lista ordenada"
+ },
+ "options": {
+ "help": "Ajuda",
+ "fullscreen": "Ecrã inteiro",
+ "codeview": "Vista de Código"
+ },
+ "paragraph": {
+ "paragraph": "Parágrafo",
+ "left": "Alinhar à esquerda",
+ "center": "Alinhar ao centro",
+ "right": "Alinhar à direita",
+ "justify": "Totalmente justificado"
+ },
+ "color": {
+ "recent": "Cor recente",
+ "more": "Mais cores",
+ "background": "Cor de fundo",
+ "foreground": "Cor de letra",
+ "transparent": "Transparente",
+ "setTransparent": "Definir transparência",
+ "reset": "Redefinir",
+ "resetToDefault": "Restauro Padrão"
+ },
+ "shortcut": {
+ "shortcuts": "Atalhos",
+ "close": "Fechar",
+ "textFormatting": "Formatação de texto",
+ "action": "Ação",
+ "paragraphFormatting": "Formatação de Parágrafo",
+ "documentStyle": "Estilo do documento"
+ },
+ "history": {
+ "undo": "Desfazer",
+ "redo": "Refazer"
+ }
+ }
+ },
+ "streamMessagesMale": {
+ "postTargetSelfAndOthers": "{user} publicou para {target} e ele mesmo"
+ },
+ "streamMessagesFemale": {
+ "postTargetSelfAndOthers": "{user} publicou para {target} e ela mesmo"
+ },
+ "listViewModes": {
+ "list": "Lista"
+ },
+ "themeNavbars": {
+ "side": "Barra de navegação lateral",
+ "top": "Barra de navegação superior"
+ },
+ "fieldValidations": {
+ "required": "Necessário",
+ "maxCount": "Contagem máxima",
+ "maxLength": "Comprimento máximo",
+ "pattern": "Correspondência de padrões",
+ "emailAddress": "Endereço de email válido",
+ "phoneNumber": "Número de telemóvel válido",
+ "arrayOfString": "Array de Strings",
+ "valid": "Válido",
+ "noEmptyString": "Array não vazio",
+ "max": "Valor máximo",
+ "min": "Valor mínimo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Import.json b/application/Espo/Resources/i18n/pt_PT/Import.json
new file mode 100644
index 0000000000..a2864b8f39
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Import.json
@@ -0,0 +1,104 @@
+{
+ "labels": {
+ "Revert Import": "Reverter Importação",
+ "Return to Import": "Voltar à importação",
+ "Run Import": "Iniciar Importação",
+ "Back": "Voltar",
+ "Field Mapping": "Mapeamento de campos",
+ "Default Values": "Valores padrão",
+ "Add Field": "Adicionar campo",
+ "Created": "Criado",
+ "Updated": "Atualizado",
+ "Result": "Resultado",
+ "Show records": "Mostrar registos",
+ "Remove Duplicates": "Remover duplicados",
+ "importedCount": "Importado (contagem)",
+ "duplicateCount": "Duplciados (Contagem)",
+ "updatedCount": "Atualizado (Contagem)",
+ "Create Only": "Apenas criar",
+ "Create and Update": "Criar e atualizar",
+ "Update Only": "Apenas atualizar",
+ "Update by": "Atualizar por",
+ "Set as Not Duplicate": "Marcar como não duplicado",
+ "File (CSV)": "Ficheiro (CSV)",
+ "First Row Value": "Valor da primeira linha",
+ "Skip": "Ignorar",
+ "Header Row Value": "Valor do cabeçalho",
+ "Field": "Campo",
+ "What to Import?": "Importar o quê?",
+ "Entity Type": "Tipo de entidade",
+ "What to do?": "Fazer o quê?",
+ "Properties": "Propriedades",
+ "Header Row": "Linha de cabeçalho",
+ "Person Name Format": "Formato do nome da pessoa",
+ "Field Delimiter": "Delimitador",
+ "Date Format": "Formato de data",
+ "Decimal Mark": "Marca decimal",
+ "Text Qualifier": "Qualificador de texto",
+ "Time Format": "Formato de hora",
+ "Currency": "Moeda",
+ "Preview": "Pré-visualizar",
+ "Next": "Seguinte",
+ "Step 1": "Passo 1",
+ "Step 2": "Passo 2",
+ "Double Quote": "Citação dupla",
+ "Single Quote": "Citação única",
+ "Imported": "Importado",
+ "Duplicates": "Duplicados",
+ "Skip searching for duplicates": "Ignorar pesquisa por duplicatas",
+ "Timezone": "Fuso horário",
+ "Remove Import Log": "Remover log de importação",
+ "New Import": "Nova importação",
+ "Import Results": "Importar Resultados",
+ "Silent Mode": "Modo silencioso",
+ "New import with same params": "Novo import com os mesmos parametros",
+ "Run Manually": "Correr de forma manual",
+ "Export": "Exportar"
+ },
+ "messages": {
+ "utf8": "Deve ser codificado em UTF-8",
+ "duplicatesRemoved": "Duplicados removidos",
+ "inIdle": "Executar em modo inativo (para grande volume de dados; via cron)",
+ "revert": "A ação removerá todos os registos importados permanentemente.",
+ "removeDuplicates": "A ação removerá permanentemente todos os registos importados que foram reconhecidos como duplicados.",
+ "confirmRevert": "A ação removerá todos os registos importados permanentemente. Tem a certeza?",
+ "confirmRemoveDuplicates": "A ação removerá permanentemente todos os registos importados que foram reconhecidos como duplicados. Tem a certeza?",
+ "removeImportLog": "A ação removerá o log de importação. Todos os registos importados serão mantidos. Use-o se tiver certeza de que a importação está correta.",
+ "confirmRemoveImportLog": "A ação removerá o log de importação. Todos os registos importados serão mantidos. Não poderá reverter os resultados da importação. Tem a certeza?",
+ "noErrors": "Sem erros."
+ },
+ "fields": {
+ "file": "Ficheiro",
+ "entityType": "Tipo de entidade",
+ "imported": "Registos importados",
+ "duplicates": "Registos duplicados",
+ "updated": "Registos atualizados",
+ "status": "Estado"
+ },
+ "options": {
+ "status": {
+ "Failed": "Falhado",
+ "In Process": "Em progresso",
+ "Complete": "Completo",
+ "Pending": "Pendente"
+ },
+ "personNameFormat": {
+ "f l": "Primeiro Último",
+ "l f": "Último Primeiro",
+ "f m l": "Primeio Meio Último",
+ "l f m": "Úlitmo Primeiro Meio",
+ "l, f": "Último, Primeiro"
+ }
+ },
+ "strings": {
+ "commandToRun": "Comando para executar (da linha de comandos)",
+ "saveAsDefault": "Salvar como padrão"
+ },
+ "tooltips": {
+ "manualMode": "Se marcado, terá de executar a importação manualmente desde a linha de comandos. O comando será mostrado após configurar a importação. ",
+ "silentMode": "A maioria dos scripts será ignorada após a execução. As notas de transmissão não serão criadas. A importação será executada mais rapidamente"
+ },
+ "links": {
+ "errors": "Erros"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/ImportError.json b/application/Espo/Resources/i18n/pt_PT/ImportError.json
new file mode 100644
index 0000000000..8e65fbcbba
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/ImportError.json
@@ -0,0 +1,23 @@
+{
+ "fields": {
+ "type": "Tipo",
+ "validationFailures": "Erros de validação",
+ "import": "Importar",
+ "rowIndex": "Índice de linha",
+ "exportRowIndex": "Exportar índice de linha",
+ "lineNumber": "Número de linha",
+ "exportLineNumber": "Exportar número de linha",
+ "row": "Linha"
+ },
+ "options": {
+ "type": {
+ "Validation": "Validação",
+ "Access": "Acesso",
+ "Not-Found": "Não encontrado"
+ }
+ },
+ "tooltips": {
+ "lineNumber": "Um número de linha no CSV original.",
+ "exportLineNumber": "Um número de linha no CSV exportado."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/InboundEmail.json b/application/Espo/Resources/i18n/pt_PT/InboundEmail.json
new file mode 100644
index 0000000000..f13216d63f
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/InboundEmail.json
@@ -0,0 +1,74 @@
+{
+ "fields": {
+ "name": "Nome",
+ "emailAddress": "Endereço de email",
+ "status": "Estado",
+ "assignToUser": "Atribuído ao utilizador",
+ "username": "Utilizador",
+ "password": "Senha",
+ "port": "Porta",
+ "monitoredFolders": "Pastas monotorizadas",
+ "trashFolder": "Lixo",
+ "createCase": "Criar Caso",
+ "reply": "Auto resposta",
+ "caseDistribution": "Distribuição de casos",
+ "replyEmailTemplate": "Modelo de email de resposta",
+ "replyFromAddress": "Responder do endereço",
+ "replyToAddress": "Responder para endereço",
+ "replyFromName": "Responder do nome",
+ "targetUserPosition": "Posição do utilizador alvo",
+ "fetchSince": "Procurar desde",
+ "addAllTeamUsers": "Para todos os utilizadores",
+ "team": "Equipa alvo",
+ "teams": "Equipas",
+ "sentFolder": "Enviados",
+ "storeSentEmails": "Armazenar emails enviados",
+ "useSmtp": "Usar SMTP",
+ "smtpPort": "SMTP Post",
+ "fromName": "Do Nome",
+ "smtpIsShared": "SMTP is shared",
+ "smtpIsForMassEmail": "SMTP Is for Mass Email ",
+ "useImap": "Procurar emails",
+ "keepFetchedEmailsUnread": "Mantenha os emails encontrados como não lidos",
+ "security": "Segurança"
+ },
+ "tooltips": {
+ "reply": "Notifique os remetentes de email que seus emails foram recebidos.\n\nSomente um email será enviado para um determinado destinatário durante algum período de tempo para evitar o loop.",
+ "createCase": "Criar casos automaticamente a partir de emails recebidos.",
+ "replyToAddress": "Especifique o endereço de email da caixa de correio para que as respostas cheguem até aqui.",
+ "caseDistribution": "Como os casos serão atribuídos. Atribuído diretamente ao utilizador ou a alguém da equipa.",
+ "assignToUser": "Casos de utilizadores serão atribuídos a.",
+ "team": "Casos de equipa serão atribuídos a.",
+ "teams": "Os emails das equipas serão atribuídos a.",
+ "addAllTeamUsers": "Os emails serão exibidos na Caixa de entrada de todos os utilizadores da equipa especificada.",
+ "targetUserPosition": "Utilizadores com posição especificada serão distribuídos com casos.",
+ "monitoredFolders": "Várias pastas devem ser separadas por vírgula.",
+ "smtpIsShared": "Se marcado, os utilizadores poderão enviar emails usando o seu serviço SMTP. A disponibilidade é controlada por funções através da permissão de conta de email do grupo.",
+ "smtpIsForMassEmail": "Se marcado, o SMTP estará disponível para email em massa.",
+ "storeSentEmails": "Os emails enviados serão armazenados no servidor IMAP.",
+ "useSmtp": "Possiblidade de enviar emails."
+ },
+ "links": {
+ "filters": "Filtros",
+ "assignToUser": "Atribuído ao utilizador"
+ },
+ "options": {
+ "status": {
+ "Active": "Ativo",
+ "Inactive": "Inativo"
+ },
+ "caseDistribution": {
+ "": "Nenhum",
+ "Direct-Assignment": "Atribuição direta",
+ "Least-Busy": "Menos ocupado"
+ }
+ },
+ "labels": {
+ "Create InboundEmail": "Crie uma conta de email",
+ "Actions": "Ações",
+ "Main": "Principal"
+ },
+ "messages": {
+ "couldNotConnectToImap": "Não foi possível conectar-se ao servidor IMAP"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Integration.json b/application/Espo/Resources/i18n/pt_PT/Integration.json
new file mode 100644
index 0000000000..d7ad000ed2
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Integration.json
@@ -0,0 +1,15 @@
+{
+ "fields": {
+ "enabled": "Ativo",
+ "clientId": "ID do client",
+ "redirectUri": "Redirecione URI"
+ },
+ "messages": {
+ "selectIntegration": "Selecione uma integração desde o menu.",
+ "noIntegrations": "Nenhuma integração está disponível."
+ },
+ "help": {
+ "Google": "Obtenha as credenciais do OAuth 2.0 no Google Developers Console.**\n\nVisite o [Google Developers Console](https://console.developers.google.com/project) para obter as credenciais do OAuth 2.0, como Client ID e Client Segredo que é conhecido pelo aplicativo do Google e do EspoCRM.",
+ "GoogleMaps": "Obtenha API key [aqui](https://developers.google.com/maps/documentation/javascript/get-api-key)."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Job.json b/application/Espo/Resources/i18n/pt_PT/Job.json
new file mode 100644
index 0000000000..29a7c7c922
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Job.json
@@ -0,0 +1,32 @@
+{
+ "fields": {
+ "status": "Estado",
+ "executeTime": "Executar em",
+ "attempts": "Tentativas em falta",
+ "failedAttempts": "Tentativas falhadas",
+ "serviceName": "Serviço",
+ "methodName": "Método",
+ "scheduledJob": "Trabalho agendado",
+ "data": "Dados",
+ "method": "Método (descontinuado)",
+ "scheduledJobJob": "Nome do trabalho agendado",
+ "executedAt": "Executado em",
+ "startedAt": "Começou às",
+ "targetType": "Tipo de Alvo",
+ "targetId": "Alvo ID",
+ "number": "Número",
+ "queue": "Fila",
+ "job": "Trabalho",
+ "group": "Grupo",
+ "className": "Nome da classe",
+ "targetGroup": "Grupo alvo"
+ },
+ "options": {
+ "status": {
+ "Pending": "Pendente",
+ "Success": "Sucesso",
+ "Running": "A executar",
+ "Failed": "Falhado"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/LayoutManager.json b/application/Espo/Resources/i18n/pt_PT/LayoutManager.json
new file mode 100644
index 0000000000..e94165e618
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/LayoutManager.json
@@ -0,0 +1,53 @@
+{
+ "fields": {
+ "width": "Comprimento (%) ",
+ "link": "Ligação",
+ "notSortable": "Não ordenável",
+ "align": "Alinhar",
+ "panelName": "Nome do painel",
+ "style": "Estilo",
+ "sticked": "Colado",
+ "isLarge": "Tamanho de fonte grande",
+ "dynamicLogicVisible": "Condições que tornam o painel visível",
+ "hidden": "Escondido",
+ "dynamicLogicStyled": "Condiçõees que aplicam o estilo",
+ "widthPx": "Largura (px)",
+ "noLabel": "Sem etiqueta",
+ "tabLabel": "Etiqueta de aba",
+ "tabBreak": "Quebra de tabulação"
+ },
+ "options": {
+ "align": {
+ "left": "Esquerda",
+ "right": "Direita"
+ },
+ "style": {
+ "default": "Padrão",
+ "success": "Sucesso",
+ "danger": "Perigo",
+ "info": "Informação",
+ "warning": "Aviso",
+ "primary": "Primário"
+ }
+ },
+ "labels": {
+ "New panel": "Novo Painel"
+ },
+ "tooltips": {
+ "link": "Se marcado, um valor de campo será exibido como um link apontando para a visualização de detalhes do registo. Geralmente é usado para campos *Nome*.",
+ "hiddenPanel": "Precisa de clicar \"ver mais\" para ver o painel.",
+ "sticked": "O painel será colado ao painel superior. Sem espaço entre os painéis.",
+ "panelStyle": "Cor do painel.",
+ "dynamicLogicVisible": "Se definido, o painel estará escondido, até que a condição seja atendida.",
+ "dynamicLogicStyled": "A cor será aplicada se determinada condição for atendida. A cor é definida pelo parâmetro *Estilo*.",
+ "tabBreak": "Uma aba separada para o painel e para todos os paineis seguintes, até à próxima quebra.",
+ "noLabel": "Não exiba um rótulo de coluna no cabeçalho.",
+ "notSortable": "Desativa a capacidade de classificar por coluna.",
+ "width": "Largura da coluna em percentagem. É recommendado que haja uma coluna com a largura não definida, geralmente é o campo *Nome*.",
+ "widthPx": "Largura da coluna em pixels. Tem efeito apenas quando o valor em percetagem não está definido. Torna a largura fixa."
+ },
+ "messages": {
+ "cantBeEmpty": "O layout não pode estar vazio.",
+ "fieldsIncompatible": "Campos que não podem estar juntos no layout: {fields}."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/LayoutSet.json b/application/Espo/Resources/i18n/pt_PT/LayoutSet.json
new file mode 100644
index 0000000000..c8a7a03962
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/LayoutSet.json
@@ -0,0 +1,6 @@
+{
+ "labels": {
+ "Create LayoutSet": "Criar conjunto de layouts",
+ "Edit Layouts": "Editar layouts"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/LeadCapture.json b/application/Espo/Resources/i18n/pt_PT/LeadCapture.json
new file mode 100644
index 0000000000..c296f43574
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/LeadCapture.json
@@ -0,0 +1,46 @@
+{
+ "fields": {
+ "name": "Nome",
+ "campaign": "Campanha",
+ "isActive": "Ativo",
+ "subscribeToTargetList": "Inscrever-se na lista de alvos",
+ "subscribeContactToTargetList": "Inscrever contato se existir",
+ "targetList": "Público alvo",
+ "optInConfirmation": "Duplo Opt-In",
+ "optInConfirmationEmailTemplate": "Modelo de email de confirmação de opt-in",
+ "optInConfirmationLifetime": "Vida útil da confirmação de opt-in (horas)",
+ "optInConfirmationSuccessMessage": "Texto a ser exibido após a confirmação de aceitação",
+ "leadSource": "Origem da Lead",
+ "apiKey": "API key",
+ "targetTeam": "Equipa alvo",
+ "exampleRequestMethod": "Método",
+ "createLeadBeforeOptInConfirmation": "Criar lead antes de confirmar",
+ "duplicateCheck": "Duplicate check ",
+ "skipOptInConfirmationIfSubscribed": "Pular confirmação se a lead já estiver na lista de alvos.",
+ "smtpAccount": "AMTP Account",
+ "inboundEmail": "Conta de email de grupo",
+ "exampleRequestHeaders": "Cabeçalhos"
+ },
+ "links": {
+ "targetList": "Público alvo",
+ "campaign": "Campanha",
+ "optInConfirmationEmailTemplate": "Modelo de email de confirmação de opt-in",
+ "targetTeam": "Equipa alvo",
+ "logRecords": "Registo",
+ "inboundEmail": "Conta de email de grupo"
+ },
+ "labels": {
+ "Create LeadCapture": "Criar ponto de entrada",
+ "Generate New API Key": "Gerar nova chave API",
+ "Request": "Pedido",
+ "Confirm Opt-In": "Confirme Opt-In"
+ },
+ "messages": {
+ "generateApiKey": "Criar nova chave API",
+ "optInConfirmationExpired": "O link de confirmação de ativação expirou.",
+ "optInIsConfirmed": "O opt-in confirmado."
+ },
+ "tooltips": {
+ "optInConfirmationSuccessMessage": "Markdown é suportado"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/LeadCaptureLogRecord.json b/application/Espo/Resources/i18n/pt_PT/LeadCaptureLogRecord.json
new file mode 100644
index 0000000000..5ddaebfb88
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/LeadCaptureLogRecord.json
@@ -0,0 +1,14 @@
+{
+ "fields": {
+ "number": "Número",
+ "data": "Dados",
+ "target": "Alvo",
+ "leadCapture": "Captura de Lead",
+ "createdAt": "Entrado em",
+ "isCreated": "Lead Criada"
+ },
+ "links": {
+ "leadCapture": "Captura de Lead",
+ "target": "Alvo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/MassAction.json b/application/Espo/Resources/i18n/pt_PT/MassAction.json
new file mode 100644
index 0000000000..d0dff5b6f3
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/MassAction.json
@@ -0,0 +1,17 @@
+{
+ "fields": {
+ "status": "Estado",
+ "processedCount": "Contagem processada"
+ },
+ "options": {
+ "status": {
+ "Pending": "Pendente",
+ "Running": "Executando",
+ "Success": "Sucesso",
+ "Failed": "Falhado"
+ }
+ },
+ "messages": {
+ "infoText": "A ação em massa está a ser processada em modo inativo pelo cron. Pode levar algum tempo para terminar. Fechar esta caixa de diálogo não afetará o processo de execução."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Note.json b/application/Espo/Resources/i18n/pt_PT/Note.json
new file mode 100644
index 0000000000..7843cc7183
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Note.json
@@ -0,0 +1,41 @@
+{
+ "fields": {
+ "post": "Publicar",
+ "attachments": "Anexos",
+ "targetType": "Alvo",
+ "teams": "Equipas",
+ "users": "Utilizadores",
+ "portals": "Portais",
+ "type": "Tipo",
+ "isGlobal": "Global",
+ "isInternal": "Interno (para utilizadores internos)",
+ "related": "Relacionado",
+ "createdByGender": "Criado por género",
+ "data": "Dados",
+ "number": "Número"
+ },
+ "filters": {
+ "all": "Todos",
+ "posts": "Publicações",
+ "updates": "Atualizações"
+ },
+ "messages": {
+ "writeMessage": "Escreve a sua mensagem aqui"
+ },
+ "options": {
+ "targetType": {
+ "self": "para mim mesmo",
+ "users": "para utilizador(s) em particular",
+ "teams": "para equipa(s) em particular",
+ "all": "para utilizadores internos",
+ "portals": "para utilizadores do portal"
+ },
+ "type": {
+ "Post": "Publicar"
+ }
+ },
+ "links": {
+ "superParent": "Super parent",
+ "related": "Relacionado"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/PhoneNumber.json b/application/Espo/Resources/i18n/pt_PT/PhoneNumber.json
new file mode 100644
index 0000000000..9109240492
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/PhoneNumber.json
@@ -0,0 +1,7 @@
+{
+ "fields": {
+ "type": "Tipo",
+ "optOut": "Opted-out",
+ "invalid": "Inválido"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Portal.json b/application/Espo/Resources/i18n/pt_PT/Portal.json
new file mode 100644
index 0000000000..cf1da2f00b
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Portal.json
@@ -0,0 +1,37 @@
+{
+ "fields": {
+ "name": "Nome",
+ "portalRoles": "Perfis",
+ "isActive": "Ativo",
+ "isDefault": "Por defeito",
+ "tabList": "Lista de abas",
+ "quickCreateList": "Lista de criação rápida",
+ "theme": "Tema",
+ "language": "Idioma",
+ "dashboardLayout": "Layout do painel",
+ "dateFormat": "Formato de data",
+ "timeFormat": "Formato de hora",
+ "timeZone": "Fuso horário",
+ "weekStart": "Primeiro dia da semana",
+ "defaultCurrency": "Moeda padrão",
+ "customUrl": "URL personalizado",
+ "customId": "ID personalizado",
+ "layoutSet": "Conjunto de layouts"
+ },
+ "links": {
+ "users": "Utilizadores",
+ "portalRoles": "Perfis",
+ "notes": "Notas",
+ "layoutSet": "Conjutnto de layouts"
+ },
+ "tooltips": {
+ "portalRoles": "As funções de portal especificadas serão aplicadas a todos os utilizadores deste portal.",
+ "layoutSet": "Fornece a capacidade de ter layouts diferentes dos padrões."
+ },
+ "labels": {
+ "Create Portal": "Criar portal",
+ "User Interface": "Interface de utilizador",
+ "General": "Geral",
+ "Settings": "Configurações"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/PortalRole.json b/application/Espo/Resources/i18n/pt_PT/PortalRole.json
new file mode 100644
index 0000000000..b12bcb64af
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/PortalRole.json
@@ -0,0 +1,19 @@
+{
+ "links": {
+ "users": "Utilizadores"
+ },
+ "labels": {
+ "Access": "Acesso",
+ "Create PortalRole": "Crie uma função de portal",
+ "Scope Level": "Nível de âmbito",
+ "Field Level": "Nível de campo"
+ },
+ "fields": {
+ "exportPermission": "Exportar permissões",
+ "massUpdatePermission": "Permissão de atualização em massa"
+ },
+ "tooltips": {
+ "exportPermission": "Define se os utilizadores do portal têm a capacidade de exportar registos.",
+ "massUpdatePermission": "Define se os utilizadores do portal têm a capacidade de fazer atualizações em massa de registos."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/PortalUser.json b/application/Espo/Resources/i18n/pt_PT/PortalUser.json
new file mode 100644
index 0000000000..f629e29b67
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/PortalUser.json
@@ -0,0 +1,5 @@
+{
+ "labels": {
+ "Create PortalUser": "Criar utilizador do portal"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Preferences.json b/application/Espo/Resources/i18n/pt_PT/Preferences.json
new file mode 100644
index 0000000000..bdb18d7468
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Preferences.json
@@ -0,0 +1,54 @@
+{
+ "fields": {
+ "dateFormat": "Formato de data",
+ "timeFormat": "Formato de hora",
+ "timeZone": "Fuso horário",
+ "weekStart": "Primeiro dia da semana",
+ "thousandSeparator": "Separador dos milhares",
+ "decimalMark": "Marca decimal",
+ "defaultCurrency": "Moeda padrão",
+ "currencyList": "Lista de moedas",
+ "language": "Idioma",
+ "exportDelimiter": "Delimitador de exportação",
+ "signature": "Assinatura de email",
+ "dashboardTabList": "Lista de abas",
+ "tabList": "Lista de abas",
+ "defaultReminders": "Lembretes padrão",
+ "theme": "Tema",
+ "useCustomTabList": "Lista de abas personalizadas",
+ "receiveAssignmentEmailNotifications": "Notificações por email após a atribuição",
+ "receiveMentionEmailNotifications": "Notificações por email sobre menções em publicações",
+ "receiveStreamEmailNotifications": "Notificações por email sobre publicações e atualizações de estados",
+ "dashboardLayout": "Layout do Painel",
+ "emailReplyForceHtml": "Responder a email em HTML",
+ "autoFollowEntityTypeList": "Auto acompanhamento global",
+ "emailReplyToAllByDefault": "Email Responder a todos por padrão",
+ "doNotFillAssignedUserIfNotRequired": "Não preencha previamente o utilizador atribuído na criação do registo",
+ "followEntityOnStreamPost": "Seguir automaticamente o registo após publicar no Fluxo",
+ "followCreatedEntities": "Siga automaticamente os registos criados",
+ "followCreatedEntityTypeList": "Siga automaticamente os registos criados de tipos de entidade específicos",
+ "emailUseExternalClient": "Use um cliente de email externo",
+ "scopeColorsDisabled": "Desativar cores do âmbito",
+ "tabColorsDisabled": "Desativar cores das guias",
+ "assignmentNotificationsIgnoreEntityTypeList": "Notificações de atribuição no aplicativo",
+ "assignmentEmailNotificationsIgnoreEntityTypeList": "Notificaões de atribuição via email"
+ },
+ "options": {
+ "weekStart": {
+ "0": "domingo",
+ "1": "segunda"
+ }
+ },
+ "labels": {
+ "Notifications": "Notificações",
+ "User Interface": "Interface de utilizador",
+ "Locale": "Localidade",
+ "Reset Dashboard to Default": "Redefinir o painel para o padrão"
+ },
+ "tooltips": {
+ "autoFollowEntityTypeList": "Seguir automaticamente TODOS os novos registos (criados por qualquer utilizador) dos tipos de entidade selecionados. Para poder ver informações no fluxo e receber notificações sobre todos os registos no sistema.",
+ "doNotFillAssignedUserIfNotRequired": "Quando criar um registo, o utilizador atribuído não será preenchido com o próprio utilizador, a menos que o campo seja obrigatório.",
+ "followCreatedEntities": "Quando criar novos registos, eles serão automaticamente seguidos, mesmo se atribuídos a outro utilizador.",
+ "followCreatedEntityTypeList": "Quando criar novos registos de tipos de entidade selecionados, eles serão seguidos automaticamente, mesmo se atribuídos a outro utilizador."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Role.json b/application/Espo/Resources/i18n/pt_PT/Role.json
new file mode 100644
index 0000000000..7ef1f945f5
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Role.json
@@ -0,0 +1,61 @@
+{
+ "fields": {
+ "name": "Nome",
+ "roles": "Perfis",
+ "assignmentPermission": "Permissão de atribuíção",
+ "userPermission": "Permissão de utilizador",
+ "portalPermission": "Permissões de Portal",
+ "groupEmailAccountPermission": "Permissão de conta de email em grupo",
+ "exportPermission": "Permissão de Exportação",
+ "dataPrivacyPermission": "Permissão de privacidade de dados",
+ "massUpdatePermission": "Permissão de atualização em massa",
+ "followerManagementPermission": "Permissões de gerenciador de seguidores"
+ },
+ "links": {
+ "users": "Utilizadores",
+ "teams": "Equipas"
+ },
+ "tooltips": {
+ "assignmentPermission": "Permite restringir a capacidade de atribuir registos e publicar mensagens a outros utilizadores.\n\ntodos - nenhuma restrição\n\nequipa - pode atribuir e publicar apenas a membros de equipa\n\nno - pode atribuir e publicar apenas para si mesmo",
+ "userPermission": "Permite restringir a capacidade dos utilizadores visualizarem atividades, calendário e fluxo de outros utilizadores.\n\nTodos - pode visualizar todos os grupos\n\nequipa - só pode ver atividades dos membros de equipa\n\nno - não é possível ver",
+ "portalPermission": "Define o acesso às informações do portal, capacidade de publicar mensagens para utilizadores do portal.",
+ "groupEmailAccountPermission": "Define o acesso a contas de email de grupo, uma capacidade de enviar emails do grupo SMTP.",
+ "dataPrivacyPermission": "Permite visualizar e apagar dados pessoais.",
+ "exportPermission": "Define se os utilizadores têm a capacidade de exportar registos.",
+ "massUpdatePermission": "Define se os utilizadores têm a capacidade de fazer atualizações em massa de registos.",
+ "followerManagementPermission": "Permite gerenciar seguidores de registos específicos"
+ },
+ "labels": {
+ "Access": "Acesso",
+ "Create Role": "Criar função",
+ "Scope Level": "Nível de alcance",
+ "Field Level": "Nível de campo"
+ },
+ "options": {
+ "accessList": {
+ "not-set": "não definido",
+ "enabled": "ativo",
+ "disabled": "desativado"
+ },
+ "levelList": {
+ "all": "todos",
+ "team": "equipa",
+ "account": "conta",
+ "contact": "contacto",
+ "own": "próprio",
+ "no": "não",
+ "yes": "sim",
+ "not-set": "não definido"
+ }
+ },
+ "actions": {
+ "read": "Ler",
+ "edit": "Editar",
+ "delete": "Apagar",
+ "stream": "Fluxo",
+ "create": "Criar"
+ },
+ "messages": {
+ "changesAfterClearCache": "Todas as alterações de um controlo de acesso serão aplicadas após o cache ser limpo."
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/ScheduledJob.json b/application/Espo/Resources/i18n/pt_PT/ScheduledJob.json
new file mode 100644
index 0000000000..edb60bb28e
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/ScheduledJob.json
@@ -0,0 +1,40 @@
+{
+ "fields": {
+ "name": "Nome",
+ "status": "Estado",
+ "job": "Trabalho",
+ "scheduling": "Agendando"
+ },
+ "links": {
+ "log": "Registo"
+ },
+ "labels": {
+ "Create ScheduledJob": "Criar trabalho agendado",
+ "As often as possible": "O mais frequente possível"
+ },
+ "options": {
+ "job": {
+ "Cleanup": "Limpar",
+ "CheckInboundEmails": "Verificar contas de email do grupo",
+ "CheckEmailAccounts": "Verificar contas de email pessoais",
+ "SendEmailReminders": "Enviar lembretes por email",
+ "AuthTokenControl": "Controle de token de autenticação",
+ "SendEmailNotifications": "Enviar notificações por email",
+ "CheckNewVersion": "Verificar se há nova versão",
+ "ProcessWebhookQueue": "Processar fila de webhook"
+ },
+ "cronSetup": {
+ "linux": "Nota: Adicione esta linha ao arquivo crontab para executar o Espo Scheduled Jobs:",
+ "mac": "Nota: Adicione esta linha ao arquivo crontab para executar o Espo Scheduled Jobs:",
+ "windows": "Nota: Crie um arquivo em lote com os seguintes comandos para executar o Espo Scheduled Jobs usando as Tarefas Agendadas do Windows:",
+ "default": "Nota: Adicione este comando ao Cron Job (tarefa programada):"
+ },
+ "status": {
+ "Active": "Ativo",
+ "Inactive": "Inativo"
+ }
+ },
+ "tooltips": {
+ "scheduling": "Notação Crontab. Define a frequência de execuções de trabalho.\n\n*/5 * * * * - todos os 5 minutos\n\n`0 */2 * * * - todas as 2 horas\n\n`30 1 * * * - uma vez por dia às 01:30\n\n0 0 1 * * - no primeiro dia do mês"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/ScheduledJobLogRecord.json b/application/Espo/Resources/i18n/pt_PT/ScheduledJobLogRecord.json
new file mode 100644
index 0000000000..2285f36daa
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/ScheduledJobLogRecord.json
@@ -0,0 +1,7 @@
+{
+ "fields": {
+ "status": "Estado",
+ "executionTime": "Tempo de execução",
+ "target": "Alvo"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Settings.json b/application/Espo/Resources/i18n/pt_PT/Settings.json
new file mode 100644
index 0000000000..4bbf2d79f2
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Settings.json
@@ -0,0 +1,257 @@
+{
+ "fields": {
+ "useCache": "Usar cache",
+ "dateFormat": "Formato de data",
+ "timeFormat": "Formato de hora",
+ "timeZone": "Fuso horário",
+ "weekStart": "Primero dia da semana",
+ "thousandSeparator": "Separador dos milhares",
+ "decimalMark": "Separador decimal",
+ "defaultCurrency": "Moeda padrão",
+ "baseCurrency": "Moeda Base",
+ "currencyRates": "Valores da taxa",
+ "currencyList": "Lista de moedas",
+ "language": "Idioma",
+ "companyLogo": "Logo da Empresa",
+ "smtpServer": "Servidor",
+ "smtpPort": "Porta",
+ "ldapPort": "Porta",
+ "smtpAuth": "Autenticação",
+ "ldapAuth": "Autenticação",
+ "smtpSecurity": "Segurança",
+ "ldapSecurity": "Segurança",
+ "smtpUsername": "Utilizador",
+ "smtpPassword": "Senha",
+ "ldapPassword": "Senha",
+ "outboundEmailFromName": "Do nome",
+ "outboundEmailFromAddress": "Do endereço",
+ "outboundEmailIsShared": "Partilhado",
+ "recordsPerPage": "Registos por página",
+ "recordsPerPageSmall": "Registos por página (pequeno)",
+ "tabList": "Lista de abas",
+ "quickCreateList": "Lista de criação rápida",
+ "exportDelimiter": "Delimitador de Exportação",
+ "globalSearchEntityList": "Lista de entidades de pesquisa global",
+ "authenticationMethod": "Método de autenticação",
+ "ldapAccountDomainName": "Nome de domínio da conta",
+ "ldapTryUsernameSplit": "Experimente a divisão do nome de utilizador",
+ "ldapCreateEspoUser": "Criar utilizador em EspoCRM",
+ "ldapUserLoginFilter": "Usar filtro de login",
+ "ldapAccountDomainNameShort": "Nome de domínio da conta curto",
+ "exportDisabled": "Desativar Exportar (apenas admin é permitido)",
+ "b2cMode": "Modo B2C",
+ "avatarsDisabled": "Desativar Avatars",
+ "displayListViewRecordCount": "Exibir contagem total (na exibição de lista)",
+ "theme": "Tema",
+ "userThemesDisabled": "Desativar temas de utilizador",
+ "emailMessageMaxSize": "Tamanho máximo do email (Mb)",
+ "personalEmailMaxPortionSize": "Tamanho máximo da parcela de email para obtenção de contas pessoais",
+ "inboundEmailMaxPortionSize": "Tamanho máximo da parcela de email para obtenção da conta do grupo",
+ "authTokenLifetime": "Vida útil do token de autenticação (horas)",
+ "authTokenMaxIdleTime": "Tempo máximo parado do token de autenticação (horas)",
+ "dashboardLayout": "Layout do painel (padrão)",
+ "siteUrl": "URL do site",
+ "addressPreview": "Pré-visualização de endereço",
+ "addressFormat": "Formato do endereço",
+ "notificationSoundsDisabled": "Desativar som das notificações",
+ "applicationName": "Nome da aplicação",
+ "ldapUserNameAttribute": "Atributos do Username",
+ "ldapUserTitleAttribute": "Atributo do título do utilizador",
+ "ldapUserFirstNameAttribute": "Atributo do primeiro nome do utilizador",
+ "ldapUserLastNameAttribute": "Atributo do último nome do utilizador",
+ "ldapUserEmailAddressAttribute": "Atribuito do enderesso de email do utilizador",
+ "ldapUserTeams": "Equipas do utilizador",
+ "ldapUserDefaultTeam": "Equipa padrão do utilizador",
+ "ldapUserPhoneNumberAttribute": "Atribuito do número de telemóvel do utilizador",
+ "assignmentNotificationsEntityList": "Entidades para notificar sobre a atribuição",
+ "assignmentEmailNotifications": "Notificações após atribuição",
+ "assignmentEmailNotificationsEntityList": "Alcance de notificações por email de atribuição",
+ "streamEmailNotifications": "Notificações sobre atualizações no Stream para utilizadores internos",
+ "portalStreamEmailNotifications": "Notificações sobre atualizações no Stream para utilizadores do portal",
+ "streamEmailNotificationsEntityList": "Transmitir âmbito de notificações por email",
+ "calendarEntityList": "Lista de entidades do calendário",
+ "mentionEmailNotifications": "Enviar notificações por email sobre menções em publicações",
+ "massEmailDisableMandatoryOptOutLink": "Desativar o link de opt-out obrigatório",
+ "activitiesEntityList": "Lista de entidades de atividades",
+ "historyEntityList": "Lista de entidades do histórico",
+ "currencyFormat": "Formato de moeda",
+ "currencyDecimalPlaces": "Casas decimais da moeda",
+ "followCreatedEntities": "Seguir registos criados",
+ "aclAllowDeleteCreated": "Permitir remover registos criados",
+ "adminNotifications": "Notificações do sistema no painel de administração",
+ "adminNotificationsNewVersion": "Mostrar notificação quando a nova versão do EspoCRM estiver disponível",
+ "massEmailMaxPerHourCount": "Número máximo de emails enviados por hora",
+ "maxEmailAccountCount": "Número máximo de contas de email pessoais por utilizador",
+ "streamEmailNotificationsTypeList": "O que notificar sobre",
+ "authTokenPreventConcurrent": "Apenas um token de autenticação por utilizador",
+ "scopeColorsDisabled": "Desativar scope colors",
+ "tabColorsDisabled": "Desativar cores nas abas",
+ "tabIconsDisabled": "Desativar icones nas abas",
+ "textFilterUseContainsForVarchar": "Use o operador 'contains' ao filtrar campos texto",
+ "emailAddressIsOptedOutByDefault": "Marcar novos endereços de email como opted-out",
+ "outboundEmailBccAddress": "Endereço BCC para clientes externos",
+ "adminNotificationsNewExtensionVersion": "Mostrar notificação quando novas versões de extensões estiverem disponíveis",
+ "cleanupDeletedRecords": "Limpar os registos apagados",
+ "ldapPortalUserLdapAuth": "Use LDAP Autehntication for Portal User",
+ "ldapPortalUserPortals": "Portais padrão para um utilizador do portal",
+ "ldapPortalUserRoles": "Funções padrão para um utilizador do portal",
+ "addressCountryList": "Lista de preenchimento automático do país",
+ "fiscalYearShift": "Início do ano fiscal",
+ "jobRunInParallel": "Trabalhos executados em paralelo",
+ "jobMaxPortion": "Parcela Max de trabalhos",
+ "jobPoolConcurrencyNumber": "Número de simultaneidade do pool de trabalhos",
+ "addressCityList": "Lista de cidades",
+ "addressStateList": "Lista de Estados",
+ "cronDisabled": "Desativar o Cron",
+ "maintenanceMode": "Modo de manutenção",
+ "useWebSocket": "Usar WebSocket",
+ "emailNotificationsDelay": "Atraso de notificações por email (em segundos)",
+ "massEmailOpenTracking": "Rastreamento de abertura de email",
+ "passwordRecoveryDisabled": "Desativar recuperação de senha",
+ "passwordRecoveryForAdminDisabled": "Desativar recuperação de senha para utilizadores admin",
+ "passwordGenerateLength": "Comprimento de senhas geradas",
+ "passwordStrengthLength": "Comprimento mínimo da senha",
+ "passwordStrengthLetterCount": "Número de letras necessárias na senha",
+ "passwordStrengthNumberCount": "Número de dígitos necessários na senha",
+ "passwordStrengthBothCases": "A senha deve conter letras maiúsculas e mínusculas",
+ "auth2FA": "Ativar autenticação de dois fatores",
+ "auth2FAMethodList": "Métodos de autenticação de dois fatores disponíveis",
+ "personNameFormat": "Fromato do nome da pessoa",
+ "newNotificationCountInTitle": "Mostrar número de novas notificações no título da página",
+ "massEmailVerp": "Usar VERP",
+ "emailAddressLookupEntityTypeList": "Alcance de pesquisa de endereço de email",
+ "busyRangesEntityList": "Lista de entidades livres/ocupadas",
+ "passwordRecoveryForInternalUsersDisabled": "Desativar recuperação de senha para utilizadores internos",
+ "passwordRecoveryNoExposure": "Prevenir exposição do endereço de email no formulário de recuperação de senha",
+ "auth2FAForced": "Forçar utilizadores regulares a configurar autenticação de dois fatores",
+ "smsProvider": "Provedor de SMS",
+ "outboundSmsFromNumber": "SMS a partir de número",
+ "recordsPerPageSelect": "Registos por página (selecione)",
+ "attachmentUploadMaxSize": "Tamanho máximo de carregamento (Mb)",
+ "attachmentUploadChunkSize": "Tamanho do bloco de carregamento (Mb)",
+ "workingTimeCalendar": "Calendário de horário de trabalho",
+ "oidcClientId": "ID de clientes OIDC",
+ "oidcClientSecret": "Clente secreto OIDC"
+ },
+ "tooltips": {
+ "recordsPerPage": "Número de registos inicialmente exibidos em exibições de lista.",
+ "recordsPerPageSmall": "Número de registos inicialmente exibidos nos painéis de relacionamento.",
+ "followCreatedEntities": "Os utilizadores seguirão automaticamente os registos criados por eles.",
+ "emailMessageMaxSize": "Todos os emails de entrada que excedam um tamanho especificado serão obtidos sem o corpo e os anexos.",
+ "authTokenLifetime": "Define quanto tempo os tokens podem existir.\n0 - significa que não há expiração.",
+ "authTokenMaxIdleTime": "Define por quanto tempo os últimos tokens de acesso podem existir.\n0 - significa que não há expiração.",
+ "userThemesDisabled": "Se marcado, os utilizadores não poderão selecionar outro tema.",
+ "ldapUsername": "O DN completo do utilizador do sistema, que permite pesquisar outros utilizadores. Por exemplo. \"CN = Utilizador do sistema LDAP, OU = utilizador, OU = espocrm, DC = teste, DC = lan \".",
+ "ldapPassword": "A senha para aceder o servidor LDAP.",
+ "ldapAuth": "Credenciais de acesso para o servidor LDAP.",
+ "ldapUserNameAttribute": "O atributo para identificar o utilizador. \nE.g. \"userPrincipalName\" ou \"sAMAccountName\" para o Active Directory, \"uid\" para OpenLDAP.",
+ "ldapUserObjectClass": "Atributo ObjectClass para pesquisar utilizadores. Por exemplo. \"person\" para o AD, \"inetOrgPerson\" para o OpenLDAP.",
+ "ldapBindRequiresDn": "Opção para formatar o nome de utilizador no formulário DN.",
+ "ldapBaseDn": "DN base padrão usado para pesquisar utilizadores. Por exemplo. \"OU=utilizadores,OU=espocrm,DC=teste,DC=lan\".",
+ "ldapTryUsernameSplit": "A opção de dividir um nome de utilizador com o domínio.",
+ "ldapOptReferrals": "se as referências devem ser seguidas para o cliente LDAP.",
+ "ldapCreateEspoUser": "Esta opção permite que o EspoCRM crie um utilizador a partir do LDAP.",
+ "ldapUserFirstNameAttribute": "Atributo LDAP usado para determinar o nome do utilizador. Por exemplo. \"givenname\".",
+ "ldapUserLastNameAttribute": "Atributo LDAP usado para determinar o sobrenome do utilizador. Por exemplo. \"sn\".",
+ "ldapUserTitleAttribute": "Atributo LDAP usado para determinar o título do utilizador. Por exemplo. \"title\".",
+ "ldapUserEmailAddressAttribute": "Atributo LDAP usado para determinar o endereço de email do utilizador. Por exemplo. \"mail\".",
+ "ldapUserPhoneNumberAttribute": "Atributo LDAP usado para determinar o número de telefone do utilizador. Por exemplo. \"telephoneNumber\".",
+ "ldapUserLoginFilter": "O filtro que permite restringir utilizadores que podem usar o EspoCRM. Por exemplo. \"memberOf=CN=espoGroup, OU=groups,OU=espocrm, DC=test,DC=lan\".",
+ "ldapAccountDomainName": "O domínio que é usado para autorização para o servidor LDAP.",
+ "ldapAccountDomainNameShort": "O domínio curto que é usado para autorização para o servidor LDAP.",
+ "ldapUserTeams": "Equipas para utilizador criado. Para mais, veja o perfil do utilizador.",
+ "ldapUserDefaultTeam": "Equipa padrão para o utilizador criado. Para mais, veja o perfil do utilizador.",
+ "b2cMode": "Por padrão, o EspoCRM é adaptado para B2B. Pode mudar para B2C.",
+ "currencyDecimalPlaces": "Número de casas decimais. Se vazio, todas as casas decimais não-espaçosas serão exibidas.",
+ "aclStrictMode": "Habilitado: o acesso a scopes será proibido se não estiver especificado nas funções.\n\nDesabilitado: o acesso a scopes será permitido se não estiver especificado nas funções.",
+ "outboundEmailIsShared": "Permitir que os utilizadores enviem emails desse endereço.",
+ "aclAllowDeleteCreated": "Os utilizadores poderão remover registos criados mesmo que não tenham acesso para exclusão.",
+ "textFilterUseContainsForVarchar": "Se não estiver marcado, o operador 'começa com' é usado. Pode usar o wildcard '%'.",
+ "streamEmailNotificationsEntityList": "Notificações por email sobre atualizações de fluxo de registos seguidos. Os utilizadores receberão notificações por email apenas para tipos de entidade especificados.",
+ "authTokenPreventConcurrent": "Os utilizadores não poderão fazer login em vários dispositivos simultaneamente.",
+ "emailAddressIsOptedOutByDefault": "Ao criar um novo endereço de email de registo, ele será marcado como opted-out.",
+ "cleanupDeletedRecords": "Os registos removidos serão excluídos da base de dados depois de um tempo.",
+ "ldapPortalUserLdapAuth": "Permitir que os utilizadores do portal usem a autenticação LDAP em vez da autenticação Espo.",
+ "ldapPortalUserPortals": "Portais padrão para o utilizador do portal criado",
+ "ldapPortalUserRoles": "Funções padrão para o utilizador do portal criado",
+ "jobRunInParallel": "Os trabalhos serão executados em processos paralelos.",
+ "jobPoolConcurrencyNumber": "Número máximo de processos executados simultaneamente.",
+ "jobMaxPortion": "Número máximo de trabalhos processados por uma execução.",
+ "daemonInterval": "Intervalo entre o cron do processo é executado em segundos.",
+ "daemonMaxProcessNumber": "Número máximo de processos cron executados simultaneamente.",
+ "daemonProcessTimeout": "Tempo máximo de execução (em segundos) alocado para um único processo cron.",
+ "cronDisabled": "Cron não será executado.",
+ "maintenanceMode": "Apenas administradores têm acesso ao sistema",
+ "ldapAccountCanonicalForm": "O tipo da conta, na sua forma canônica. Há 4 opções:\n\n- 'Dn' - a forma no formato 'CN=tester,OU=espocrm,DC=test, DC=lan'.\n\n- 'Username' - a forma 'tester'.\n\n- 'Backslash' - a forma 'COMPANY\\tester'.\n\n- 'Principal' - a forma 'tester@company.com'.",
+ "massEmailVerp": "Caminho de retorno de envelope variável. Para melhor manuseio de mensagens devolvidas. Certifique-se de que seu provedor SMTP o suporta.",
+ "displayListViewRecordCount": "Um número total de registos que será mostrado na exibição de lista.",
+ "currencyList": "Quais moedas estarão disponíveis no sistema.",
+ "activitiesEntityList": "Que registos estão disponíveis no painel Atividades",
+ "historyEntityList": "Que registos estarão disponíveis no painel Histórico.",
+ "calendarEntityList": "Que registos estarão disponíveis no Calendário.",
+ "addressStateList": "Sugestões de estado para campos de endereço.",
+ "addressCityList": "Sugestões de cidades para campos de endereço.",
+ "addressCountryList": "Sugestões de países para campos de endereço.",
+ "exportDisabled": "Utilizadores não poderão exportar registos. Apenas o admin será permitido.",
+ "globalSearchEntityList": "Quais registos podem ser partilhados com a Pesquisa Global.",
+ "siteUrl": "Um URL desta intência do EspoCRM. Irá precisar de alterá-lo se mudar para outro domínio.",
+ "useCache": "Não é recomendado desativar, a menos que seja para fins de desenvolvimento.",
+ "useWebSocket": "WebSocket permite comunicação interativa bidirecional entre um servidor e um navegador. Requer a configuração do daemon WebSocket em seu servidor. Verifique a documentação para mais informações.",
+ "passwordRecoveryForInternalUsersDisabled": "Apenas utilizadores do portal serão capazes de recuperar a senha.",
+ "passwordRecoveryNoExposure": "Não será possível determinar se um endereço de email específico está registado no sistema.",
+ "emailAddressLookupEntityTypeList": "Para preenchimento automático de endereço de email.",
+ "emailNotificationsDelay": "Uma mensagem pode ser editada dentro de um intervalo de tempo específico, antes que a notificação seja enviada.",
+ "outboundEmailFromAddress": "O endereço de email do sistema.",
+ "smtpServer": "Se vazio, então a conta de email do grupo com o endereço de email correspondente será usada.",
+ "busyRangesEntityList": "O que será levado em consideração ao mostrar intervalos de tempo ocupado no agendador e linha do tempo.",
+ "recordsPerPageSelect": "Número de registos inicialmente apresentados ao selecionar registos.",
+ "workingTimeCalendar": "Um calendário de horário de trabalho padrão que será aplicado a todos os utilizadores.",
+ "oidcGroupClaim": "Uma declaração ao utilizador para mapeamento da equipa.",
+ "oidcFallback": "Permitir login por utilizador/senha",
+ "oidcCreateUser": "Criar um novo utilizador no Espo quando não é encontrado um utilizador correspondente.",
+ "oidcSync": "Sincronizar dados do utilizador (em cada login).",
+ "oidcSyncTeams": "Sincronizar dados da equipa (em cada login).",
+ "oidcUsernameClaim": "Uma declaração a ser usada para um nome de utilizador (para correspondência e criação de utilizadores).",
+ "oidcTeams": "Equipas do Espo mapeadas em relação a grupos/equipes/funções do provedor de identidade. Equipas com um valor de mapeamento vazio serão sempre atribuídas a um utilizador (ao criar ou sincronizar).",
+ "oidcLogoutUrl": "Um URL para o qual o navegador redirecionará após sair do Espo. Destinado a limpar as informações da sessão no navegador e fazer o logout no lado do provedor. Normalmente, o URL contém um parâmetro de URL de redirecionamento, para retornar ao Espo.\\ n\nEspaços reservados disponíveis:\n* `{siteUrl}`\n* `{clientId}`"
+ },
+ "labels": {
+ "System": "Sistema",
+ "Configuration": "Configuração",
+ "In-app Notifications": "Notificações no aplicativo",
+ "Email Notifications": "Notificações email",
+ "Currency Settings": "Configurações da moeda",
+ "Currency Rates": "Taxas de câmbio",
+ "Mass Email": "Email em massa",
+ "Test Connection": "Testar conexão",
+ "Connecting": "A conectar...",
+ "Activities": "Atividades",
+ "Admin Notifications": "Notificações de administrador",
+ "Search": "Pesquisa",
+ "2-Factor Authentication": "Autenticação de 2 fatores",
+ "Group Tab": "Aba de grupo",
+ "Attachments": "Anexos",
+ "IdP Group": "Grupo IdP"
+ },
+ "messages": {
+ "ldapTestConnection": "Conexão estabelecida com sucesso."
+ },
+ "options": {
+ "currencyFormat": {
+ "1": "10 EUR",
+ "2": "€10",
+ "3": "10€"
+ },
+ "streamEmailNotificationsTypeList": {
+ "Post": "Publicações",
+ "Status": "Atualizações dos estados",
+ "EmailReceived": "Emails recebidos"
+ },
+ "personNameFormat": {
+ "firstLast": "Primeiro Último",
+ "lastFirst": "Úlitmo Primeiro",
+ "firstMiddleLast": "Primeiro Meio Último",
+ "lastFirstMiddle": "Último Primeiro Meio"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Stream.json b/application/Espo/Resources/i18n/pt_PT/Stream.json
new file mode 100644
index 0000000000..d55e289d10
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Stream.json
@@ -0,0 +1,14 @@
+{
+ "messages": {
+ "infoMention": "Escrva **@username** para mencionar um utilizador no post.",
+ "infoSyntax": "Sintaxe markdown disponível.",
+ "couldNotAddFollowerUserHasNoAccessToStream": "Não foi possível adicionar o utilizador '{userName}' aos seguidores. O utilizador não tem acesso ao 'Fluxo' do registro."
+ },
+ "syntaxItems": {
+ "code": "código",
+ "multilineCode": "código multilinha",
+ "strongText": "texto forte",
+ "emphasizedText": "texto enfatizado",
+ "deletedText": "texto apagado"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Team.json b/application/Espo/Resources/i18n/pt_PT/Team.json
new file mode 100644
index 0000000000..c62bdec23e
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Team.json
@@ -0,0 +1,26 @@
+{
+ "fields": {
+ "name": "Nome",
+ "roles": "Cargos",
+ "positionList": "Lista de posições",
+ "layoutSet": "Conjunto de layouts",
+ "workingTimeCalendar": "Calendário de horário de trabalho"
+ },
+ "links": {
+ "users": "Utilizadores",
+ "notes": "Notas",
+ "roles": "Cargos",
+ "inboundEmails": "Contas de email do grupo",
+ "layoutSet": "Conjunto de layouts",
+ "workingTimeCalendar": "Calendário de horário de trabalho"
+ },
+ "tooltips": {
+ "roles": "Funções de acesso. Os utilizadores dessa equipe obtêm o nível de controlo de acesso das funções selecionadas.",
+ "positionList": "Posições disponíveis nesta equipa. Por exemplo. Vendedor, Gerente",
+ "layoutSet": "Oferece a possiblidade de ter layouts que diferem dos lauouts padrões. Um conjunto de layouts será aplicado para utilizadores que têm esta equipa como equipa padrão.",
+ "workingTimeCalendar": "Um calendário será aplicado aos utilizadores que têm esta equipa como equipa padrão."
+ },
+ "labels": {
+ "Create Team": "Criar equipa"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Template.json b/application/Espo/Resources/i18n/pt_PT/Template.json
new file mode 100644
index 0000000000..1e4d77ae42
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Template.json
@@ -0,0 +1,45 @@
+{
+ "fields": {
+ "name": "Nome",
+ "body": "Corpo",
+ "entityType": "Tipo de Entidade",
+ "header": "Cabeçalho",
+ "footer": "Rodapé",
+ "leftMargin": "Margem esquerda",
+ "topMargin": "Margem superior",
+ "rightMargin": "Margem direita",
+ "bottomMargin": "Margem inferior",
+ "printFooter": "Imprimir rodapé",
+ "footerPosition": "Posição do Rodapé",
+ "variables": "Espaços reservados disponíveis",
+ "pageOrientation": "Orientação da página",
+ "pageFormat": "Formato folha",
+ "fontFace": "Tipo de letra",
+ "pageWidth": "Largura da página (mm)",
+ "pageHeight": "Altura da página (mm)",
+ "headerPosition": "Posição do cabeçalho",
+ "printHeader": "Imprimir cabeçalho",
+ "title": "Título"
+ },
+ "labels": {
+ "Create Template": "Criar template"
+ },
+ "tooltips": {
+ "footer": "Use {pageNumber} para imprimir o número da página",
+ "variables": "Copie e cole o placeholder necessário para Cabeçalho, Corpo ou Rodapé."
+ },
+ "options": {
+ "pageOrientation": {
+ "Portrait": "Vertital",
+ "Landscape": "Horizontal"
+ },
+ "placeholders": {
+ "today": "Hoje (data)",
+ "now": "Agora (data-hora)",
+ "pagebreak": "Quebra de página"
+ },
+ "pageFormat": {
+ "Custom": "Customizado"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/User.json b/application/Espo/Resources/i18n/pt_PT/User.json
new file mode 100644
index 0000000000..4780f52366
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/User.json
@@ -0,0 +1,147 @@
+{
+ "fields": {
+ "name": "Nome",
+ "userName": "Utilizador",
+ "title": "Título",
+ "isAdmin": "Admin",
+ "defaultTeam": "Equipa padrão",
+ "phoneNumber": "Telefone",
+ "roles": "Cargo",
+ "portals": "Portais",
+ "portalRoles": "Funções do portal",
+ "teamRole": "Posição",
+ "password": "Senha",
+ "currentPassword": "Senha atual",
+ "passwordConfirm": "Confirme senha",
+ "newPassword": "Nova senha",
+ "newPasswordConfirm": "Confirme nova senha",
+ "avatar": "Foto",
+ "isActive": "Ativo",
+ "isPortalUser": "Utilizador de portal",
+ "contact": "Contacto",
+ "accounts": "Contas",
+ "account": "Conta (primária)",
+ "sendAccessInfo": "Enviar email com informações de acesso ao utilizador",
+ "gender": "Género",
+ "position": "Posição na equipa",
+ "ipAddress": "Endereço IP",
+ "passwordPreview": "Ver senha",
+ "isSuperAdmin": "Super Admin",
+ "lastAccess": "Último acesso",
+ "type": "Tipo",
+ "apiKey": "Chave API",
+ "secretKey": "Chave secreta",
+ "authMethod": "Método de autenticação",
+ "yourPassword": "A sua senha atual",
+ "dashboardTemplate": "Template do dashboard",
+ "auth2FAEnable": "Ativar autenticação de 2 fatores",
+ "auth2FAMethod": "Método 2FA",
+ "workingTimeCalendar": "Calendário de horário de trabalho"
+ },
+ "links": {
+ "teams": "Equipas",
+ "roles": "Cargos",
+ "notes": "Notas",
+ "portals": "Portais",
+ "portalRoles": "Cargos do Portal",
+ "contact": "Contacto",
+ "accounts": "Contas",
+ "account": "Conta (primária)",
+ "tasks": "Tarefas",
+ "defaultTeam": "Equipa padrão",
+ "dashboardTemplate": "Template do dashboard",
+ "userData": "Dados do utilizador",
+ "workingTimeCalendar": "Calendário do horário de trabakho",
+ "workingTimeRanges": "Intervalos de tempo de trabalho"
+ },
+ "labels": {
+ "Create User": "Criar utilizador",
+ "Generate": "Gerar",
+ "Access": "Acesso",
+ "Preferences": "Preferências",
+ "Change Password": "Mudar senha",
+ "Teams and Access Control": "Equipas e Controlp de Acesso",
+ "Forgot Password?": "Esqueceu a senha?",
+ "Password Change Request": "Pedido de mudança de senha",
+ "Email Address": "Endereço de email",
+ "External Accounts": "Conta externa",
+ "Email Accounts": "Contas de email",
+ "Create Portal User": "Criar utilizador do portal",
+ "Proceed w/o Contact": "Continuar sem contato",
+ "Generate New API Key": "Gerar nova chave de API",
+ "Generate New Password": "Gerar nova senha",
+ "Code": "Código",
+ "Back to login form": "Voltar ao formulário de login",
+ "Requirements": "Requerimentos",
+ "Security": "Segurança",
+ "Reset 2FA": "Repor 2FA",
+ "Secret": "Segredo",
+ "Send Password Change Link": "Enviar link para mudança de senha",
+ "Send Code": "Enviar código",
+ "Login Link": "Link de login"
+ },
+ "tooltips": {
+ "defaultTeam": "Todos os registos criados por esse utilizador serão relacionados a esta equipa por padrão.",
+ "userName": "Letras a-z, números 0-9, pontos, hifens, @ -sinais e sublinhados são permitidos.",
+ "isAdmin": "O administrador pode aceder tudo.",
+ "isActive": "Se desativado, o utilizador não poderá efetuar login.",
+ "teams": "Equipas às quais este utilizador pertence. O nível de controlo de acesso é herdado das funções da equipa.",
+ "roles": "Funções de acesso adicionais. Utilize se o utilizador não pertencer a nenhuma equipa ou se precisar de estender o nível de controlo de acesso exclusivamente para esse utilizador.",
+ "portalRoles": "Funções adicionais do portal. Utilize para estender o nível de controlo de acesso exclusivamente para esse utilizador.",
+ "portals": "Portais aos quais o utilizador tem acesso."
+ },
+ "messages": {
+ "passwordWillBeSent": "A senha será enviada para o endereço de email do utilizador.",
+ "passwordChanged": "A senha foi alterada",
+ "userCantBeEmpty": "O nome de utilizador não pode estar vazio",
+ "wrongUsernamePassword": "utilizador/senha errados.",
+ "emailAddressCantBeEmpty": "Endereço de email não pode estar vazio",
+ "userNameEmailAddressNotFound": "utilizador/email não encontrados",
+ "forbidden": "Proibido, por favor tente mais tarde",
+ "uniqueLinkHasBeenSent": "O URL exclusivo foi enviado para o endereço de email especificado.",
+ "passwordChangedByRequest": "A senha foi alterada.",
+ "userNameExists": "O nome de utilizador já existe.",
+ "setupSmtpBefore": "Precisa de configurar [as configurações de SMTP]({url}) para que o sistema possa enviar a senha por email.",
+ "passwordStrengthLength": "Deve ter, pelo menos, {length} caracteres.",
+ "passwordStrengthLetterCount": "Deve conter, pelo menos, {count} letras.",
+ "passwordStrengthNumberCount": "Deve contar, pelo menos, {count} digits.",
+ "passwordStrengthBothCases": "Deve contar letras maiúsculas e minúsculas.",
+ "wrongCode": "Código errado.",
+ "codeIsRequired": "O código é obrigatório.",
+ "enterTotpCode": "Insira o código da sua app de autenticação.",
+ "verifyTotpCode": "Digitalize o código QR com seu aplicativo autenticador móvel. Se você tiver problemas com a digitalização, poderá inserir o secret manualmente. Depois disso, você verá um código de 6 dígitos em seu aplicativo. Digite este código no campo abaixo.",
+ "generateAndSendNewPassword": "Uma nova senha será gerada e enviada para o endereço de email do utilizador.",
+ "security2FaResetConfirmation": "Tem a certeza que quer repor as configurações corrents da autenticação de 2 fatores?",
+ "ldapUserInEspoNotFound": "Utilizador não encontrado no EspoCRM. Contacte o seu administradot para criar o utilizador.",
+ "passwordRecoverySentIfMatched": "Supondo que os dados inseridos correspondam a qualquer conta de utilizador.",
+ "auth2FARequiredHeader": "Autenticação de 2 fatores obrigatória.",
+ "auth2FARequired": "Precisa de configurar a autenticação de 2 fatores. Use uma applicação de autenticação no seu telemóvel (ex. Google Authenticator).",
+ "sendPasswordChangeLinkConfirmation": "Um e-mail com um link exclusivo será enviado ao utilizador permitindo que ele altere sua senha. O link expirará após um determinado período de tempo.",
+ "yourAuthenticationCode": "O seu código de autenticação: {code}",
+ "choose2FaSmsPhoneNumber": "Selecione um número de telemóvel que será usado para a 2FA (autenticação de 2 fatores)",
+ "choose2FaEmailAddress": "Selecione um endereço de email que será usado para a 2FA (autenticação de 2 fatores). É extremamente recomendado que não use um endereço de email primário.",
+ "enterCodeSentInEmail": "Insira o código que foi enviado para o seu endereço de email.",
+ "enterCodeSentBySms": "Insira o código que foi enviado por SMS para o seu número de telemóvel.",
+ "passwordChangeRequestNotFound": "O pedido de mudança de senha não foi encontrado. Talvez tenha expirado. Tente iniciar um novo pedido desde a [página de log in]({url}).",
+ "loginAs": "Abra o link de login em uma janela anônima para preservar sua sessão atual. Use suas credenciais de administrador para fazer login.",
+ "failedToLogIn": "Falha ao fazer log in."
+ },
+ "boolFilters": {
+ "onlyMyTeam": "Apenas a minha equipa"
+ },
+ "presetFilters": {
+ "active": "Ativo",
+ "activePortal": "Portal Ativo"
+ },
+ "options": {
+ "gender": {
+ "": "Não configurado",
+ "Male": "Masculino",
+ "Female": "Feminino",
+ "Neutral": "Neutro"
+ },
+ "type": {
+ "system": "Sistema"
+ }
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/Webhook.json b/application/Espo/Resources/i18n/pt_PT/Webhook.json
new file mode 100644
index 0000000000..81ef7ad80b
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/Webhook.json
@@ -0,0 +1,16 @@
+{
+ "labels": {
+ "Create Webhook": "Criar Webhook"
+ },
+ "fields": {
+ "event": "Evento",
+ "isActive": "Está ativo",
+ "user": "Utilizador API",
+ "entityType": "Tipo de entidade",
+ "field": "Campo",
+ "secretKey": "Chave secreta"
+ },
+ "links": {
+ "user": "Utilizador"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/WorkingTimeCalendar.json b/application/Espo/Resources/i18n/pt_PT/WorkingTimeCalendar.json
new file mode 100644
index 0000000000..6118737049
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/WorkingTimeCalendar.json
@@ -0,0 +1,23 @@
+{
+ "labels": {
+ "Create WorkingTimeCalendar": "Criar calendário"
+ },
+ "fields": {
+ "timeZone": "Fuso horário",
+ "timeRanges": "Agenda do dia de trablho",
+ "weekday0": "Dom",
+ "weekday1": "Seg",
+ "weekday2": "Ter",
+ "weekday3": "Qua",
+ "weekday4": "Qui",
+ "weekday5": "Sex",
+ "weekday6": "Sab",
+ "weekday0TimeRanges": "Agenda Dom",
+ "weekday1TimeRanges": "Agenda Seg",
+ "weekday2TimeRanges": "Agenda Ter",
+ "weekday3TimeRanges": "Agenda Qua",
+ "weekday4TimeRanges": "Agenda Qui",
+ "weekday5TimeRanges": "Agenda Sex",
+ "weekday6TimeRanges": "Agenda Sab"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/i18n/pt_PT/WorkingTimeRange.json b/application/Espo/Resources/i18n/pt_PT/WorkingTimeRange.json
new file mode 100644
index 0000000000..a4014daafc
--- /dev/null
+++ b/application/Espo/Resources/i18n/pt_PT/WorkingTimeRange.json
@@ -0,0 +1,27 @@
+{
+ "labels": {
+ "Create WorkingTimeRange": "Create range",
+ "Calendars": "Calendários"
+ },
+ "fields": {
+ "timeRanges": "Agenda",
+ "dateStart": "Data de início",
+ "dateEnd": "Data de fim",
+ "type": "Tipo",
+ "calendars": "Calendário",
+ "users": "Utilizador"
+ },
+ "links": {
+ "calendars": "Calendário",
+ "users": "Utilizadores"
+ },
+ "options": {
+ "type": {
+ "Non-working": "Não está a trabalhar",
+ "Working": "Está a trabalhar"
+ }
+ },
+ "presetFilters": {
+ "actual": "Atual"
+ }
+}
\ No newline at end of file
diff --git a/application/Espo/Resources/metadata/app/language.json b/application/Espo/Resources/metadata/app/language.json
index 6eb436854e..d321e6b71f 100644
--- a/application/Espo/Resources/metadata/app/language.json
+++ b/application/Espo/Resources/metadata/app/language.json
@@ -29,6 +29,7 @@
"ru_RU",
"pl_PL",
"pt_BR",
+ "pt_PT",
"uk_UA",
"vi_VN",
"zh_CN",
diff --git a/install/core/i18n/pt_PT/install.json b/install/core/i18n/pt_PT/install.json
new file mode 100644
index 0000000000..8719ad28b5
--- /dev/null
+++ b/install/core/i18n/pt_PT/install.json
@@ -0,0 +1,138 @@
+{
+ "labels": {
+ "Main page title": "Bem Vindo ao EspoCRM",
+ "Start page title": "Contrato de licença",
+ "Step1 page title": "Contrato de licença",
+ "License Agreement": "Contrato de licença",
+ "I accept the agreement": "Eu aceito o acordo",
+ "Step2 page title": "Configuração da base de dados",
+ "Step3 page title": "Configuração do Administrador",
+ "Step4 page title": "Configuração de sistema",
+ "Step5 page title": "Configurações SMTP para emails enviados",
+ "Errors page title": "Erros",
+ "Finish page title": "Instalação completa",
+ "Congratulation! Welcome to EspoCRM": "Parabéns! EspoCRM configurado corretamente",
+ "More Information": "Para mais informações, visite o nosso {BLOG}, siga-nos no {TWITTER}.
Se tiver alguma sugestão ou dúvida, por favor, pergunte no {FORUM}.",
+ "share": "Se gosta de EspoCRM, partilhe-a com os seus amigos. Deixe-os saber sobre este produto.",
+ "Installation Guide": "Guia de Instalação",
+ "Locale": "Localidade",
+ "Outbound Email Configuration": "Configuração de email de saída",
+ "Start": "Começar",
+ "Back": "Anterior",
+ "Next": "Seguinte",
+ "Go to EspoCRM": "Ir para EspoCRM",
+ "Re-check": "Verificar",
+ "Version": "Versão",
+ "Test settings": "Testar conexão",
+ "Database Settings Description": "Digite suas informações de conexão da base de dados MySQL (nome do host, nome de utilizador e senha). Pode especificar a porta do servidor para o nome do host como localhost: 3306.",
+ "Install": "Instalar",
+ "Configuration Instructions": "Instruções de configuração",
+ "phpVersion": "Versão PHP",
+ "requiredMysqlVersion": "Versão mySql",
+ "dbHostName": "Nome do Host",
+ "dbName": "Nome de base de dados",
+ "dbUserName": "Utilizador de base de dados",
+ "OK": "Ok",
+ "SetupConfirmation page title": "Requisitos de Sistema",
+ "PHP Configuration": "Configurações PHP",
+ "MySQL Configuration": "Configurações base de dados",
+ "Permission Requirements": "Permissões",
+ "Success": "Sucesso",
+ "Fail": "Falha",
+ "is recommended": "recomendado",
+ "extension is missing": "Extensão em falta",
+ "headerTitle": "Instalação do EspoCRM",
+ "Crontab setup instructions": "Sem executar e-mails de entrada de trabalhos agendados, notificações e lembretes não funcionarão. Aqui você pode ler {SETUP_INSTRUCTIONS}",
+ "Setup instructions": "Intrições de configuração"
+ },
+ "fields": {
+ "Choose your language": "Escolha o idioma",
+ "Database Name": "Nome da base de dados",
+ "Host Name": "Nome do host",
+ "Port": "Porta",
+ "smtpPort": "Porta",
+ "Database User Name": "Utilizador de base de dados",
+ "Database User Password": "Senha de utilizador da base de dados",
+ "Database driver": "Driver da base de dados",
+ "User Name": "Utilizador",
+ "Password": "Senha",
+ "smtpPassword": "Senha",
+ "Confirm Password": "Confirme a sua senha",
+ "From Address": "A partir do endereço",
+ "From Name": "A partir do nome",
+ "Is Shared": "Partilhado",
+ "Date Format": "Formato de data",
+ "Time Format": "Formato de hora",
+ "Time Zone": "Fuso horário",
+ "First Day of Week": "Primeiro dia da semana",
+ "Thousand Separator": "Separador dos milhares",
+ "Decimal Mark": "Marca decimal",
+ "Default Currency": "Moeda padrão",
+ "Currency List": "Lista de moedas",
+ "Language": "Idioma",
+ "smtpServer": "Servidor",
+ "smtpAuth": "Autenticação",
+ "smtpSecurity": "Segurança",
+ "smtpUsername": "Utilizador"
+ },
+ "messages": {
+ "1045": "Acesso negado ao utilizador",
+ "1049": "Base de dados desconhecida",
+ "2005": "Host do servidor MySQL desconhecido",
+ "Some errors occurred!": "Ocorreram alguns erros!",
+ "phpVersion": "A sua versão de PHP não é suportada pelo EspoCRM, por favor atualize para PHP {minVersion} at least",
+ "requiredMysqlVersion": "A sua versão de MySQL não é suportada pelo EspoCRM, por favor atualize para MySQL {minVersion} at least",
+ "The PHP extension was not found...": "Erro PHP: Extensão {exName} não encontrada.",
+ "All Settings correct": "Todas as configurações estão corretas",
+ "Failed to connect to database": "Falha a conectar à base de dados",
+ "PHP version": "Versão PHP",
+ "You must agree to the license agreement": "Deve concordar com o contrato de licença",
+ "Passwords do not match": "As senhas não coincidem",
+ "Enable mod_rewrite in Apache server": "Habilite mod_rewrite no servidor Apache",
+ "checkWritable error": "Erro checkWritable",
+ "applySett error": "Erro applySett",
+ "buildDatabase error": "Erro buildDatabase",
+ "createUser error": "Erro createUser",
+ "checkAjaxPermission error": "Erro checkAjaxPermission",
+ "Cannot create user": "Não foi possível criar utilizador",
+ "Permission denied": "Permissão recusada",
+ "Permission denied to": "Permissão recusada",
+ "Can not save settings": "Não é possível salvar configurações",
+ "Cannot save preferences": "Naõ é possívl salvas as preferências",
+ "Thousand Separator and Decimal Mark equal": "Separados dos mulheres e a marca das casas decimais não pode ser igual",
+ "extension": "A extensão {0} está em falta",
+ "option": "O valor recomendado é {0}",
+ "mysqlSettingError": "EspoCRM precisa que o valor MySQL \"{NAME}\" esteja configurado para {VALUE}",
+ "requiredMariadbVersion": "A sua versão MariaBD não é suportada pelo EspoCRM, por favor atualize para MariaDB {minVersion} at least",
+ "Ajax failed": "Um erro inesperado aconteceu",
+ "Bad init Permission": "Permissão negada para o diretório \"{*}\". Por favor, defina 775 para \"{*}\" ou apenas execute este comando no terminal
{C} Operação não permitida? Experimente este: {CSU}",
+ "permissionInstruction": "\"{C}\"",
+ "operationNotPermitted": "Operação não permitida? Tente esta: {APACHE1}{APACHE2_PATH1} ou {APACHE2_PATH2} (ou {APACHE2_PATH3}):{APACHE2}\n Depois execute este comando em um terminal:{APACHE3}{API_PATH}.htaccess e substitua a seguinte linha:{APACHE4}To{APACHE5}< hr>Para obter mais informações, visite a diretriz Configuração do servidor Apache para EspoCRM.{WINDOWS_APACHE1} (remova o sinal de libra '#' de frente da linha).ClearModuleList não está comentada e certifique-se de que a linha AddModule mod_rewrite.c não está comentado.\n"
+ },
+ "nginx": {
+ "linux": "{NGINX_PATH} dentro da seção \"server\":{NGINX}