diff --git a/client/src/locales/index.js b/client/src/locales/index.js
index d0d2bad9..49ae52a8 100644
--- a/client/src/locales/index.js
+++ b/client/src/locales/index.js
@@ -24,6 +24,7 @@ import koKR from './ko-KR';
import nlNL from './nl-NL';
import plPL from './pl-PL';
import ptBR from './pt-BR';
+import ptPT from './pt-PT';
import roRO from './ro-RO';
import ruRU from './ru-RU';
import skSK from './sk-SK';
@@ -58,6 +59,7 @@ const locales = [
nlNL,
plPL,
ptBR,
+ ptPT,
roRO,
ruRU,
skSK,
diff --git a/client/src/locales/pt-PT/core.js b/client/src/locales/pt-PT/core.js
new file mode 100644
index 00000000..02986f15
--- /dev/null
+++ b/client/src/locales/pt-PT/core.js
@@ -0,0 +1,234 @@
+import dateFns from 'date-fns/locale/pt';
+import timeAgo from 'javascript-time-ago/locale/pt';
+
+import markdownEditor from './markdown-editor.json';
+
+export default {
+ dateFns,
+ timeAgo,
+ markdownEditor,
+
+ format: {
+ date: 'dd/MM/yyyy',
+ time: 'p',
+ dateTime: '$t(format:date) $t(format:time)',
+ longDate: 'd MMM',
+ longDateTime: "d 'de' MMMM 'às' p",
+ fullDate: 'd MMM, y',
+ fullDateTime: "d 'de' MMMM, y 'às' p",
+ },
+
+ translation: {
+ common: {
+ aboutPlanka: 'Sobre o PLANKA',
+ account: 'Conta',
+ actions: 'Ações',
+ addAttachment_title: 'Anexar Ficheiro',
+ addManager_title: 'Adicionar Gestor',
+ addMember_title: 'Adicionar Membro',
+ addUser_title: 'Adicionar Utilizador',
+ all: 'Todos',
+ allChangesWillBeAutomaticallySavedAfterConnectionRestored:
+ 'Todas as alterações serão automaticamente guardadas
após a ligação ser restabelecida.',
+ areYouSureYouWantToDeleteThisAttachment: 'Tem a certeza de que pretende eliminar este anexo?',
+ areYouSureYouWantToDeleteThisBoard: 'Tem a certeza de que pretende eliminar este quadro?',
+ areYouSureYouWantToDeleteThisCard: 'Tem a certeza de que pretende eliminar este cartão?',
+ areYouSureYouWantToDeleteThisComment:
+ 'Tem a certeza de que pretende eliminar este comentário?',
+ areYouSureYouWantToDeleteThisLabel: 'Tem a certeza de que pretende eliminar esta etiqueta?',
+ areYouSureYouWantToDeleteThisList: 'Tem a certeza de que pretende eliminar esta lista?',
+ areYouSureYouWantToDeleteThisProject: 'Tem a certeza de que pretende eliminar este projeto?',
+ areYouSureYouWantToDeleteThisTask: 'Tem a certeza de que pretende eliminar esta tarefa?',
+ areYouSureYouWantToDeleteThisUser: 'Tem a certeza de que pretende eliminar este utilizador?',
+ areYouSureYouWantToLeaveBoard: 'Tem a certeza de que pretende sair do quadro?',
+ areYouSureYouWantToLeaveProject: 'Tem a certeza de que pretende sair do projeto?',
+ areYouSureYouWantToRemoveThisManagerFromProject:
+ 'Tem a certeza de que pretende remover este gestor do projeto?',
+ areYouSureYouWantToRemoveThisMemberFromBoard:
+ 'Tem a certeza de que pretende remover este membro do quadro?',
+ attachment: 'Anexo',
+ attachments: 'Anexos',
+ authentication: 'Autenticação',
+ background: 'Fundo',
+ board: 'Quadro',
+ boardNotFound_title: 'Quadro não encontrado',
+ canComment: 'Pode comentar',
+ canOnlyViewBoard: 'Só pode visualizar o quadro.',
+ cardActions_title: 'Ações do Cartão',
+ cardNotFound_title: 'Cartão não encontrado',
+ color: 'Cor',
+ createBoard_title: 'Criar Quadro',
+ createLabel_title: 'Criar Etiqueta',
+ createNewOneOrSelectExistingOne: 'Crie um novo ou selecione
um existente.',
+ createProject_title: 'Criar Projeto',
+ createTextFile_title: 'Criar Ficheiro de Texto',
+ currentPassword: 'Palavra-passe atual',
+ dangerZone_title: 'Zona Perigosa',
+ date: 'Data',
+ deleteAttachment_title: 'Eliminar Anexo',
+ deleteBoard_title: 'Eliminar Quadro',
+ deleteCard_title: 'Eliminar Cartão',
+ deleteComment_title: 'Eliminar Comentário',
+ deleteLabel_title: 'Eliminar Etiqueta',
+ deleteList_title: 'Eliminar Lista',
+ deleteProject_title: 'Eliminar Projeto',
+ deleteTask_title: 'Eliminar Tarefa',
+ deleteUser_title: 'Eliminar Utilizador',
+ description: 'Descrição',
+ detectAutomatically: 'Detetar automaticamente',
+ dropFileToUpload: 'Largue o ficheiro para carregar',
+ dueDate_title: 'Data de Vencimento',
+ editAttachment_title: 'Editar Anexo',
+ editAvatar_title: 'Editar Avatar',
+ editDueDate_title: 'Editar Data de Vencimento',
+ editEmail_title: 'Editar E-mail',
+ editInformation_title: 'Editar Informações',
+ editLabel_title: 'Editar Etiqueta',
+ editPassword_title: 'Editar Palavra-passe',
+ editPermissions_title: 'Editar Permissões',
+ editStopwatch_title: 'Editar Cronómetro',
+ editUsername_title: 'Editar Nome de Utilizador',
+ editor: 'Editor',
+ email: 'E-mail',
+ enterCardTitle: 'Introduza o título do cartão...',
+ enterDescription: 'Introduza a descrição...',
+ enterFilename: 'Introduza o nome do ficheiro',
+ enterListTitle: 'Introduza o título da lista...',
+ enterTaskDescription: 'Introduza a descrição da tarefa...',
+ filterByLabels_title: 'Filtrar por Etiquetas',
+ filterByMembers_title: 'Filtrar por Membros',
+ fromComputer_title: 'Do Computador',
+ fromTrello: 'Do Trello',
+ general: 'Geral',
+ hours: 'Horas',
+ importBoard_title: 'Importar Quadro',
+ invalidCurrentPassword: 'Palavra-passe atual inválida',
+ labels: 'Etiquetas',
+ language: 'Idioma',
+ leaveBoard_title: 'Sair do Quadro',
+ leaveProject_title: 'Sair do Projeto',
+ list: 'Lista',
+ listActions_title: 'Ações da Lista',
+ managers: 'Gestores',
+ members: 'Membros',
+ minutes: 'Minutos',
+ moveCard_title: 'Mover Cartão',
+ name: 'Nome',
+ newEmail: 'Novo e-mail',
+ newPassword: 'Nova palavra-passe',
+ newUsername: 'Novo nome de utilizador',
+ noBoards: 'Sem quadros',
+ noConnectionToServer: 'Sem ligação ao servidor',
+ noLists: 'Sem listas',
+ noProjects: 'Sem projetos',
+ noUnreadNotifications: 'Nenhuma notificação por ler.',
+ notifications: 'Notificações',
+ openBoard_title: 'Abrir Quadro',
+ optional_inline: 'opcional',
+ organization: 'Organização',
+ phone: 'Telefone',
+ preferences: 'Preferências',
+ pressPasteShortcutToAddAttachmentFromClipboard:
+ 'Dica: prima Ctrl-V (Cmd-V no Mac) para adicionar um anexo da área de transferência.',
+ project: 'Projeto',
+ projectNotFound_title: 'Projeto não encontrado',
+ removeManager_title: 'Remover Gestor',
+ removeMember_title: 'Remover Membro',
+ searchLabels: 'Pesquisar etiquetas...',
+ searchMembers: 'Pesquisar membros...',
+ searchUsers: 'Pesquisar utilizadores...',
+ seconds: 'Segundos',
+ selectBoard: 'Selecionar quadro',
+ selectList: 'Selecionar lista',
+ selectPermissions_title: 'Selecionar Permissões',
+ selectProject: 'Selecionar projeto',
+ settings: 'Configurações',
+ stopwatch: 'Cronómetro',
+ subscribeToMyOwnCardsByDefault: 'Subscrever automaticamente os meus cartões',
+ taskActions_title: 'Ações da Tarefa',
+ thereIsNoPreviewAvailableForThisAttachment:
+ 'Não há pré-visualização disponível para este anexo.',
+ time: 'Tempo',
+ title: 'Título',
+ userActions_title: 'Ações do Utilizador',
+ userAddedThisCardToList: '<0>{{user}}0> adicionou este cartão à {{list}}',
+ userLeftNewCommentToCard:
+ '<0>{{user}}0> deixou um novo comentário «{{comment}}» em <2>{{card}}2>',
+ userMovedCardFromListToList:
+ '<0>{{user}}0> moveu <2>{{card}}2> de {{fromList}} para {{toList}}',
+ userMovedThisCardFromListToList:
+ '<0>{{user}}0> moveu este cartão de {{fromList}} para {{toList}}',
+ username: 'Nome de utilizador',
+ users: 'Utilizadores',
+ viewer: 'Visualizador',
+ writeComment: 'Escreva um comentário...',
+ },
+
+ action: {
+ addAnotherCard: 'Adicionar outro cartão',
+ addAnotherList: 'Adicionar outra lista',
+ addAnotherTask: 'Adicionar outra tarefa',
+ addCard: 'Adicionar cartão',
+ addCard_title: 'Adicionar Cartão',
+ addComment: 'Adicionar comentário',
+ addList: 'Adicionar lista',
+ addMember: 'Adicionar membro',
+ addMoreDetailedDescription: 'Adicionar descrição mais detalhada',
+ addTask: 'Adicionar tarefa',
+ addToCard: 'Adicionar ao cartão',
+ addUser: 'Adicionar utilizador',
+ createBoard: 'Criar quadro',
+ createFile: 'Criar ficheiro',
+ createLabel: 'Criar etiqueta',
+ createNewLabel: 'Criar nova etiqueta',
+ createProject: 'Criar projeto',
+ delete: 'Eliminar',
+ deleteAttachment: 'Eliminar anexo',
+ deleteAvatar: 'Eliminar avatar',
+ deleteBoard: 'Eliminar quadro',
+ deleteCard: 'Eliminar cartão',
+ deleteCard_title: 'Eliminar Cartão',
+ deleteComment: 'Eliminar comentário',
+ deleteLabel: 'Eliminar etiqueta',
+ deleteList: 'Eliminar lista',
+ deleteList_title: 'Eliminar Lista',
+ deleteProject: 'Eliminar projeto',
+ deleteProject_title: 'Eliminar Projeto',
+ deleteTask: 'Eliminar tarefa',
+ deleteTask_title: 'Eliminar Tarefa',
+ deleteUser: 'Eliminar utilizador',
+ edit: 'Editar',
+ editDescription_title: 'Editar Descrição',
+ editDueDate_title: 'Editar Data de Vencimento',
+ editEmail_title: 'Editar E-mail',
+ editInformation_title: 'Editar Informações',
+ editPassword_title: 'Editar Palavra-passe',
+ editPermissions: 'Editar permissões',
+ editStopwatch_title: 'Editar Cronómetro',
+ editTitle_title: 'Editar Título',
+ editUsername_title: 'Editar Nome de Utilizador',
+ import: 'Importar',
+ leaveBoard: 'Sair do quadro',
+ leaveProject: 'Sair do projeto',
+ logOut_title: 'Terminar Sessão',
+ makeCover_title: 'Definir como Capa',
+ move: 'Mover',
+ moveCard_title: 'Mover Cartão',
+ remove: 'Remover',
+ removeCover_title: 'Remover Capa',
+ removeFromBoard: 'Remover do quadro',
+ removeFromProject: 'Remover do projeto',
+ removeManager: 'Remover gestor',
+ removeMember: 'Remover membro',
+ save: 'Guardar',
+ showAllAttachments: 'Mostrar todos os anexos ({{hidden}} ocultos)',
+ showFewerAttachments: 'Mostrar menos anexos',
+ start: 'Iniciar',
+ stop: 'Parar',
+ subscribe: 'Subscrever',
+ unsubscribe: 'Cancelar subscrição',
+ uploadNewAvatar: 'Carregar novo avatar',
+ uploadNewImage: 'Carregar nova imagem',
+ },
+ },
+};
diff --git a/client/src/locales/pt-PT/index.js b/client/src/locales/pt-PT/index.js
new file mode 100644
index 00000000..f6a9a36a
--- /dev/null
+++ b/client/src/locales/pt-PT/index.js
@@ -0,0 +1,8 @@
+import login from './login';
+
+export default {
+ language: 'pt-PT',
+ country: 'pt',
+ name: 'Português',
+ embeddedLocale: login,
+};
diff --git a/client/src/locales/pt-PT/login.js b/client/src/locales/pt-PT/login.js
new file mode 100644
index 00000000..ec6e39a9
--- /dev/null
+++ b/client/src/locales/pt-PT/login.js
@@ -0,0 +1,22 @@
+export default {
+ translation: {
+ common: {
+ emailAlreadyInUse: 'E-mail já está em uso',
+ emailOrUsername: 'E-mail ou nome de utilizador',
+ invalidEmailOrUsername: 'E-mail ou nome de utilizador inválido',
+ invalidPassword: 'Palavra-passe inválida',
+ noInternetConnection: 'Sem ligação à internet',
+ pageNotFound_title: 'Página não encontrada',
+ password: 'Palavra-passe',
+ serverConnectionFailed: 'Falha na ligação ao servidor',
+ unknownError: 'Erro desconhecido, tente novamente mais tarde',
+ useSingleSignOn: 'Utilizar início de sessão único',
+ usernameAlreadyInUse: 'Nome de utilizador já está em uso',
+ },
+
+ action: {
+ logIn: 'Iniciar sessão',
+ logInWithSso: 'Iniciar sessão com SSO',
+ },
+ },
+};
diff --git a/client/src/locales/pt-PT/markdown-editor.json b/client/src/locales/pt-PT/markdown-editor.json
new file mode 100644
index 00000000..b6f8589d
--- /dev/null
+++ b/client/src/locales/pt-PT/markdown-editor.json
@@ -0,0 +1,165 @@
+{
+ "action-previews": {
+ "text": "Este é um texto sem título.\nTanto o título como o texto\npodem ser destacados a negrito, itálico, cor,\nriscado e sublinhado.",
+ "text-with-head": "Este é um texto com título.\nTanto o título como o texto\npodem ser destacados a negrito, itálico, cor,\nriscado e sublinhado.",
+ "heading": "Título"
+ },
+ "bundle": {
+ "error-title": "Erro no editor markdown",
+ "settings_wysiwyg": "Editor visual (wysiwyg)",
+ "settings_markup": "Marcação Markdown",
+ "markup_placeholder": "Introduza a marcação markdown..."
+ },
+ "codeblock": {
+ "remove": "Remover",
+ "empty_option": "Nenhuma correspondência encontrada"
+ },
+ "common": {
+ "delete": "Eliminar",
+ "edit": "Editar",
+ "toolbar_action_disabled": "Elemento de marcação incompatível"
+ },
+ "forms": {
+ "common_action_cancel": "Cancelar",
+ "common_action_submit": "Submeter",
+ "common_action_upload": "Selecionar",
+ "common_tab_attach": "Adicionar do dispositivo",
+ "common_tab_link": "Adicionar por link",
+ "common_link": "Ligação",
+ "common_sizes": "Tamanho, px",
+ "image_name": "Título",
+ "image_link_href": "Link da imagem",
+ "image_link_href_help": "Endereço para onde a ligação da imagem direciona.",
+ "image_alt": "Texto alternativo",
+ "image_alt_help": "O texto alternativo é apresentado se a imagem não puder ser carregada.",
+ "image_upload_help": "Imagem JPEG, GIF ou PNG até 1 MB.",
+ "image_upload_failed": "Falha ao adicionar imagem",
+ "image_size_width": "Largura",
+ "image_size_height": "Altura",
+ "link_url_help": "Endereço para onde a ligação direciona.",
+ "link_text": "Texto da ligação",
+ "link_text_help": "Texto apresentado como ligação.",
+ "link_open_help": "Abrir ligação numa nova aba"
+ },
+ "md-hints": {
+ "header_title": "Cabeçalho",
+ "header_hint": "# O seu texto",
+ "italic_title": "Itálico",
+ "italic_hint": "_O seu texto_",
+ "bold_title": "Negrito",
+ "bold_hint": "**O seu texto**",
+ "strikethrough_title": "Riscado",
+ "strikethrough_hint": "~~O seu texto~~",
+ "blockquote_title": "Citação",
+ "blockquote_hint": "> O seu texto",
+ "code_title": "Código",
+ "code_hint": "``````",
+ "link_title": "Ligação",
+ "link_hint": "[O seu texto](url)",
+ "image_title": "Imagem",
+ "image_hint": "",
+ "list_title": "Item da lista",
+ "list_hint": "- O seu texto",
+ "numbered-list_title": "Lista numerada",
+ "numbered-list_hint": "1. O seu texto",
+ "documentation": "Documentação",
+ "documentation_link": "https://diplodoc.com/docs/pt/syntax/"
+ },
+ "menubar": {
+ "bold": "Negrito",
+ "code": "Código",
+ "code_inline": "Código em linha",
+ "codeblock": "Bloco de código",
+ "colorify": "Cor do texto",
+ "colorify__color_blue": "Azul",
+ "colorify__color_default": "Padrão",
+ "colorify__color_gray": "Cinzento",
+ "colorify__color_green": "Verde",
+ "colorify__color_orange": "Laranja",
+ "colorify__color_red": "Vermelho",
+ "colorify__color_violet": "Violeta",
+ "colorify__color_yellow": "Amarelo",
+ "colorify__group_text": "Texto",
+ "cut": "Cortar",
+ "emoji": "Emoji",
+ "emoji__hint": "Pode adicionar emojis no WYSIWYG ou manualmente com marcação",
+ "heading": "Cabeçalho",
+ "heading1": "Cabeçalho 1",
+ "heading2": "Cabeçalho 2",
+ "heading3": "Cabeçalho 3",
+ "heading4": "Cabeçalho 4",
+ "heading5": "Cabeçalho 5",
+ "heading6": "Cabeçalho 6",
+ "hrule": "Separador",
+ "image": "Imagem",
+ "italic": "Itálico",
+ "link": "Ligação",
+ "list": "Lista",
+ "list__action_lift": "Subir item",
+ "list__action_sink": "Descer item",
+ "list_action_disabled": "Contradiz a lógica da lista",
+ "mark": "Marcado",
+ "mono": "Monoespaçado",
+ "more_action": "Mais ações",
+ "note": "Nota",
+ "olist": "Lista ordenada",
+ "quote": "Citação",
+ "redo": "Refazer",
+ "strike": "Riscado",
+ "table": "Tabela",
+ "text": "Texto",
+ "ulist": "Lista com marcadores",
+ "underline": "Sublinhado",
+ "undo": "Desfazer"
+ },
+ "placeholder": {
+ "doc_empty": "Digite / para ver comandos...",
+ "checkbox": "Introduza a descrição da tarefa...",
+ "deflist_term": "Termo",
+ "deflist_desc": "Descrição da definição",
+ "heading": "Cabeçalho",
+ "cut_title": "Título",
+ "cut_content": "Conteúdo apresentado ao clicar",
+ "note_title": "Título",
+ "note_content": "Conteúdo da nota",
+ "table_cell": "Conteúdo da célula",
+ "select_filter": "Procurar idiomas..."
+ },
+ "search": {
+ "label_case-sensitive": "Diferenciar maiúsculas e minúsculas",
+ "label_whole-word": "Palavra inteira",
+ "title": "Procurar no código"
+ },
+ "suggest": {
+ "empty-msg": "Não encontrado"
+ },
+ "widgets": {
+ "image": "Adicionar imagem",
+ "link": "Adicionar ligação"
+ },
+ "yfm-note": {
+ "info": "Nota",
+ "tip": "Dica",
+ "warning": "Aviso",
+ "alert": "Alerta",
+ "remove": "Remover"
+ },
+ "yfm-table": {
+ "column.add.before": "Adicionar coluna antes",
+ "column.add.after": "Adicionar coluna depois",
+ "column.remove": "Remover coluna",
+ "row.add.before": "Adicionar linha antes",
+ "row.add.after": "Adicionar linha depois",
+ "row.remove": "Remover linha",
+ "table.remove": "Remover tabela",
+ "table.menu.cell.align.left": "Alinhar o conteúdo da célula à esquerda",
+ "table.menu.cell.align.right": "Alinhar o conteúdo da célula à direita",
+ "table.menu.cell.align.center": "Centrar o conteúdo da célula",
+ "table.menu.row.add": "Adicionar linha depois",
+ "table.menu.row.remove": "Remover linha",
+ "table.menu.column.add": "Adicionar coluna depois",
+ "table.menu.column.remove": "Remover coluna",
+ "table.menu.convert.yfm": "Converter para tabela YFM",
+ "table.menu.table.remove": "Remover tabela"
+ }
+}
diff --git a/server/api/models/User.js b/server/api/models/User.js
index f1089a77..20873167 100755
--- a/server/api/models/User.js
+++ b/server/api/models/User.js
@@ -55,6 +55,7 @@ const LANGUAGES = [
'nl-NL',
'pl-PL',
'pt-BR',
+ 'pt-PT',
'ro-RO',
'ru-RU',
'sk-SK',