diff --git a/backend/i18n/frontend_pt.json b/backend/i18n/frontend_pt.json new file mode 100644 index 000000000..93256083b --- /dev/null +++ b/backend/i18n/frontend_pt.json @@ -0,0 +1,1111 @@ +{ + "api.contentApi": "API de conteúdo", + "api.generalApi": "API Geral", + "api.graphql": "GraphQL", + "api.graphqlPageTitle": "GraphQL", + "api.pageTitle": "API", + "api.title": "API", + "apps.allApps": "Todas as aplicações", + "apps.allTeams": "Todas as Equipas", + "apps.appLoadFailed": "Falha na aplicação. Por favor, recarregue.", + "apps.appNameHint": "Só pode utilizar letras, números e traços e não mais de 40 caracteres.", + "apps.appNameValidationMessage": "O nome pode conter letras minúsculas (a-z), números e traços entre.", + "apps.appNameWarning": "O nome da aplicação não pode ser alterado mais tarde.", + "apps.appsButtonCreate": "Criar App", + "apps.appsButtonCreateTeam": "Criar Equipa", + "apps.appsButtonFallbackTitle": "Apps e Equipas", + "apps.archiveFailed": "Falhou em arquivar a aplicação.", + "apps.create": "Criar App", + "apps.createBlankApp": "Nova App", + "apps.createBlankAppDescription": "Crie uma nova aplicação em branco sem conteúdo e esquemas.", + "apps.createFailed": "Falha na criação da aplicação. Por favor recarregue.", + "apps.createWithTemplate": "Criar {template} Amostra", + "apps.delete": "Excluir App", + "apps.deleteConfirmText": "Deseja mesmo eliminar esta aplicação?", + "apps.deleteConfirmTitle": "Eu entendo. Apagar a minha App", + "apps.deleteWarning": "Uma vez que apague uma aplicação, não há volta a dar. Todos os seus dados serão eliminados em segundo plano.", + "apps.empty": "Ainda não está a colaborar em nenhuma aplicação.", + "apps.generalSettings": "Geral", + "apps.generalSettingsDangerZone": "Zona de Perigo", + "apps.image": "Imagem", + "apps.imageDrop": "Deixe para carregar", + "apps.leave": "Deixar aplicativo", + "apps.leaveConfirmText": "Quer mesmo deixar esta aplicação?", + "apps.leaveConfirmTitle": "Deixe o aplicativo.", + "apps.leaveFailed": "Falha em deixar a aplicação. Por favor recarregue.", + "apps.listPageTitle": "Aplicativos", + "apps.loadAssetScriptsFailed": "Falhou em carregar scripts de ativos. Por favor, recarregue.", + "apps.loadFailed": "Falha na carga de apps. Por favor recarregue.", + "apps.loadSettingsFailed": "Falhou na atualização das definições de UI. Por favor, recarregue.", + "apps.removeImage": "Remover imagem", + "apps.removeImageFailed": "Falhou na remoção da imagem da aplicação. Por favor, recarregue.", + "apps.transfer": "Transferência", + "apps.transferFailed": "Falhou na transferência da aplicação. Por favor recarregue.", + "apps.transferTitle": "Transferência para a equipa", + "apps.transferWarning": "As equipas são usadas para partilhar subscrições.", + "apps.updateAssetScriptsFailed": "Falhou na atualização dos scripts de ativos. Por favor, recarregue.", + "apps.updateFailed": "Falha na atualização da aplicação. Por favor recarregue.", + "apps.updateSettingsFailed": "Falhou na atualização das definições de UI. Por favor, recarregue.", + "apps.uploadImage": "Deixe cair um ficheiro para substituir a imagem da aplicação. Use um tamanho quadrado.", + "apps.uploadImageButton": "Ficheiro upload", + "apps.uploadImageFailed": "Falhou em carregar a imagem. Por favor, recarregue.", + "apps.uploadImageTooBig": "A imagem da aplicação é muito grande.", + "apps.welcomeSubtitle": "Bem-vindo a Squidex.", + "apps.welcomeTitle": "Hi {user}", + "appSettings.editors.deleteConfirmText": "Deseja mesmo remover este URL do Editor?", + "appSettings.editors.deleteConfirmTitle": "Excluir URL do editor", + "appSettings.editors.description": "Gerencie os URLs para os editores personalizados para usá-los no designer de esquemas.", + "appSettings.editors.empty": "Nenhuma URL editor criada ainda.", + "appSettings.editors.title": "Editores Personalizados", + "appSettings.hideScheduler": "Ocultar diálogo para publicação programada", + "appSettings.patterns.deleteConfirmText": "Quer mesmo remover este padrão?", + "appSettings.patterns.deleteConfirmTitle": "Eliminar padrão", + "appSettings.patterns.description": "Os padrões são expressões regulares reutilizáveis para validação do campo de cordas.", + "appSettings.patterns.empty": "Nenhum padrão criado ainda.", + "appSettings.patterns.title": "Padrões", + "appSettings.refreshTooltip": "Atualizar configurações do UI", + "appSettings.reloaded": "Definições de UI recarregadas.", + "appSettings.title": "Definições de UI", + "assets.createFolder": "Criar Pasta", + "assets.createFolderFailed": "Falhou na criação de uma pasta de ficheiros. Por favor, recarregue.", + "assets.createFolderTooltip": "Criar nova pasta", + "assets.deleteConfirmText": "Quer mesmo apagar o ficheiro?", + "assets.deleteConfirmTitle": "Excluir o ficheiro", + "assets.deleteFailed": "Falhou em apagar o ficheiro. Por favor, recarregue.", + "assets.deleteFolderConfirmText": "Deseja mesmo eliminar a pasta e todos os ficheiros?", + "assets.deleteFolderConfirmTitle": "Eliminar pasta", + "assets.deleteMetadataConfirmText": "Quer mesmo remover estes metadados?", + "assets.deleteMetadataConfirmTitle": "Remover metadados", + "assets.deleteReferrerConfirmText": "O ficheiro é referenciado por um item de conteúdo.\n\nQuer mesmo apagar o ficheiro?", + "assets.deleteReferrerConfirmTitle": "Excluir o ficheiro", + "assets.downloadVersion": "Descarregue esta versão", + "assets.dropToUpdate": "Deixar para atualizar", + "assets.duplicateFile": "O ficheiro já foi carregado.", + "assets.edit": "Edição de ficheiros", + "assets.editor.flipHorizontally": "Virar horizontalmente", + "assets.editor.flipVertically": "Virar verticalmente", + "assets.editor.focusPointLabel": "Selecione posição do ponto de foco", + "assets.editor.focusPointPreview": "Pré-visualização para diferentes tamanhos", + "assets.editor.rotateLeft": "Girar à esquerda", + "assets.editor.rotateRight": "Girar à direita", + "assets.fileTooBig": "O ficheiro é muito grande.", + "assets.folderName": "Nome da pasta", + "assets.folderNameHint": "O nome da pasta é usado como nome de visor e pode não ser único.", + "assets.linkSelected": "Link ficheiros selecionados ({count})", + "assets.listPageTitle": "Ficheiros", + "assets.loadFailed": "Falhou em carregar os items. Por favor, recarregue.", + "assets.loadFoldersFailed": "Falhou em carregar pastas de ficheiros. Por favor, recarregue.", + "assets.loadTagsFailed": "Falhou em carregar etiquetas. Por favor, recarregue.", + "assets.metadata": "Metadados", + "assets.metadataAdd": "Adicionar metadados", + "assets.moveFailed": "Falha ao mover ficheiro. Por favor, recarregue.", + "assets.protected": "Protegido", + "assets.protectedHint": "Os ativos são públicos por defeito. Todos com o link podem descarregar o ficheiro. Se fizer um ficheiro protegido, apenas utilizadores autenticados (normalmente um cliente) podem descarregar o ficheiro.", + "assets.refreshTooltip": "Atualizar ficheiros", + "assets.reloaded": "Bens recarregados.", + "assets.removeConfirmText": "Quer mesmo remover o ficheiro?", + "assets.removeConfirmTitle": "Remover o ficheiro", + "assets.renameFolder": "Pasta de renome", + "assets.renameTagFailed": "Falhou em mudar o nome da etiqueta. Por favor, recarregue.", + "assets.replaceConfirmText": "Quer mesmo substituir o ativo por uma versão mais recente", + "assets.replaceConfirmTitle": "Substituir o ficheiro?", + "assets.replaceFailed": "Falhou em substituir o ficheiro. Por favor, recarregue.", + "assets.searchByName": "Pesquisar pelo nome", + "assets.searchByTags": "Pesquisar por tags", + "assets.selectMany": "Selecione ficheiros", + "assets.specialFolder.parent": "", + "assets.specialFolder.root": "", + "assets.tabFocusPoint": "Ponto de foco", + "assets.tabHistory": "História", + "assets.tabImage": "Imagem", + "assets.tabMetadata": "Metadados", + "assets.tabPreview": "Previsualizar", + "assets.tabTextEditor": "Editor de Texto", + "assets.updated": "O ficheiro foi atualizado.", + "assets.updateFailed": "Falhou na atualização do ficheiro. Por favor, recarregue.", + "assets.updateFolderFailed": "Falhou na atualização da pasta de ficheiros. Por favor, recarregue.", + "assets.uploadByDialog": "Selecione Arquivo(s)", + "assets.uploadByDrop": "Deixe cair ficheiros aqui para carregar", + "assets.uploaderUploadHere": "Sem upload em andamento, deixe cair os ficheiros aqui.", + "assets.uploadFailed": "Falhou no upload do ficheiro. Por favor, recarregue.", + "assets.uploadHint": "Deixe cair o ficheiro no item existente para substituir o ficheiro por uma versão mais recente.", + "assetScripts.reloaded": "Scripts de ficheiros recarregados.", + "backups.backupCountAssetsLabel": "Ficheiros", + "backups.backupCountAssetsTooltip": "Ficheiros arquivados", + "backups.backupCountEventsLabel": "Eventos", + "backups.backupCountEventsTooltip": "Eventos arquivados", + "backups.backupDownload": "Baixar", + "backups.backupDownloadLink": "Pronto", + "backups.backupDuration": "Duração", + "backups.deleteConfirmText": "Quer mesmo apagar a cópia de segurança?", + "backups.deleteConfirmTitle": "Eliminar backup", + "backups.deleted": "A cópia de segurança está prestes a ser apagada.", + "backups.deleteFailed": "Falhou em eliminar a cópia de segurança.", + "backups.empty": "Ainda não foram criados reforços.", + "backups.loadFailed": "Falhou em carregar backups.", + "backups.maximumReached": "Atingiu o número máximo de reforços: 10.", + "backups.refreshTooltip": "Atualizar backups", + "backups.reloaded": "Reforços recarregados.", + "backups.restore": "Restaurar backup", + "backups.restoreFailed": "Falhou em começar a restaurar.", + "backups.restoreLastStatus": "Última Operação De Restauro", + "backups.restoreLastUrl": "Url para backup", + "backups.restoreNewAppName": "Nome de aplicativo opcional", + "backups.restorePageTitle": "Restaurar backup", + "backups.restoreStarted": "A restauração começou, pode levar vários minutos para ser concluída.", + "backups.restoreStartedLabel": "Começou", + "backups.restoreStoppedLabel": "Parado", + "backups.restoreTitle": "Restaurar backup", + "backups.start": "Iniciar backup", + "backups.started": "O reforço começou, pode levar vários minutos para ser concluído.", + "backups.startedLabel": "Começou", + "backups.startFailed": "Falhou em começar o backup.", + "clients.add": "Adicionar Cliente", + "clients.add.description": "Adicione um cliente para dar a outras aplicações acesso ao seu conteúdo.", + "clients.add.title": "Adicionar um novo Cliente", + "clients.addFailed": "Falhou em adicionar cliente. Por favor, recarregue.", + "clients.allowAnonymous": "Permitir acesso anónimo.", + "clients.allowAnonymousHint": "Permitir o acesso à API sem acesso a todos os ficheiros configurados através do grupo deste cliente. Não dê mais do que um cliente acesso anónimo.", + "clients.apiCallsLimit": "Chamadas Max API", + "clients.apiCallsLimitHint": "Limite o número de chamadas API que este cliente pode fazer por mês para proteger o seu contingente API para outros clientes que são mais importantes.", + "clients.clientIdValidationMessage": "O nome só pode conter letras, números e traços.", + "clients.clientNamePlaceholder": "Insira o nome do cliente", + "clients.connect": "Ligar", + "clients.connectWizard.cli": "Conecte-se com Squidex CLI", + "clients.connectWizard.cliHint": "Descarregue o CLI e ligue-se a esta aplicação para iniciar backups, esquemas de sincronização ou conteúdo de exportação.", + "clients.connectWizard.cliStep1": "Obtenha o mais recente Squidex CLI", + "clients.connectWizard.cliStep1Download": "[Descarregue o CLI de Github] (https://github.com/Squidex/squidex-samples/releases)", + "clients.connectWizard.cliStep1Hint": "As versões contêm binários para todos os principais sistemas de funcionamento e um pequeno download se tiver instalado o .NET Core.", + "clients.connectWizard.cliStep2": "Adicione '' à sua variável '$PATH'", + "clients.connectWizard.cliStep3": "Adicione o nome da sua aplicação ao CLI config", + "clients.connectWizard.cliStep3Hint": "Pode gerir a configuração de várias aplicações no CLI e mudar para uma aplicação.", + "clients.connectWizard.cliStep4": "Mude para a sua aplicação no CLI", + "clients.connectWizard.manually": "Conecte-se manualmente", + "clients.connectWizard.manuallyHint": "Obtenha instruções sobre como estabelecer uma ligação com o Carteiro ou o caracol.", + "clients.connectWizard.manuallyStep1": "Obter um símbolo usando caracóis", + "clients.connectWizard.manuallyStep2": "Basta usar o seguinte token", + "clients.connectWizard.manuallyStep3": "Adicione o token como cabeçalho HTTP a todos os pedidos", + "clients.connectWizard.manuallyTokenHint": "Tokens normalmente expiram após 30 dias, mas você pode solicitar várias tokens.", + "clients.connectWizard.postManDocs": "Comece com o tutorial do Carteiro na [Documentação](https://docs.squidex.io/02-documentation/developer-guides/api-overview/postman).", + "clients.connectWizard.sdk": "Conecte-se à sua App com a SDK", + "clients.connectWizard.sdkHelp": "Precisa de outro SDK?", + "clients.connectWizard.sdkHelpLink": "Contacte-nos no Fórum de Apoio", + "clients.connectWizard.sdkHint": "Descarregue um SDK e estabeleça uma ligação a esta aplicação.", + "clients.connectWizard.sdkStep1": "Instale o .NET SDK", + "clients.connectWizard.sdkStep1Download": "O SDK está disponível em [nuget](https://www.nuget.org/packages/Squidex.ClientLibrary/)", + "clients.connectWizard.sdkStep2": "Criar um gestor de clientes", + "clients.connectWizard.step0Title": "Cliente de configuração", + "clients.connectWizard.step1Title": "Escolha o método de ligação", + "clients.connectWizard.step2Title": "Ligar", + "clients.deleteConfirmText": "Quer mesmo revogar o cliente?", + "clients.deleteConfirmTitle": "Revogar cliente", + "clients.empty": "Nenhum cliente foi criado ainda.", + "clients.loadFailed": "Falhou em carregar clientes. Por favor, recarregue.", + "clients.refreshTooltip": "Atualizar clientes", + "clients.reloaded": "Clientes recarregados.", + "clients.revokeFailed": "Falhou em revogar o cliente. Por favor, recarregue.", + "clients.tokenFailed": "Falhou em criar um símbolo. Por favor, reda o redando.", + "comments.create": "Criar um comentário", + "comments.createFailed": "Falhou em criar comentários.", + "comments.deleteConfirmText": "Quer mesmo apagar o comentário?", + "comments.deleteConfirmTitle": "Apagar comentário", + "comments.deleteFailed": "Não eliminou comentários.", + "comments.follow": "Seguir", + "comments.loadFailed": "Falhou em carregar comentários.", + "comments.title": "Comentários", + "comments.updateFailed": "Falhou em atualizar comentários.", + "common.actions": "Ações", + "common.administration": "Administração", + "common.administrationPageTitle": "Administração", + "common.api": "API", + "common.apps": "Aplicativos", + "common.aspectRatio": "AspectRatio", + "common.assets": "Ficheiros", + "common.assetScripts": "Scripts de ficheiros", + "common.back": "Voltar", + "common.backendError": "Erro de backend", + "common.backups": "Backups", + "common.bookmarks": "Marcadores", + "common.bytes": "bytes", + "common.cancel": "Cancelar", + "common.cancelAll": "cancelar todos", + "common.category": "Categorias", + "common.clear": "Claro", + "common.clientId": "ID do cliente", + "common.clients": "Clientes", + "common.clientSecret": "Segredo do Cliente", + "common.clipboardAdded": "O valor foi adicionado à sua área de transferência.", + "common.clone": "Clone", + "common.cluster": "Cluster", + "common.clusterPageTitle": "Cluster", + "common.comments": "Comentários", + "common.components": "Componentes", + "common.condition": "Condição", + "common.conditions": "Condições", + "common.confirm": "Confirmar", + "common.consumers": "Consumidores", + "common.content": "Conteúdo", + "common.contents": "Conteúdo", + "common.continue": "Continuar", + "common.contributors": "Contribuintes", + "common.copy": "Cópia", + "common.create": "Criar", + "common.created": "Criado", + "common.daily": "Diariamente", + "common.dashboard": "Painel de instrumentos", + "common.date": "Data", + "common.dateTimeEditor.local": "Local", + "common.dateTimeEditor.now": "Agora,", + "common.dateTimeEditor.nowTooltip": "Use agora (UTC)", + "common.dateTimeEditor.today": "Hoje", + "common.dateTimeEditor.todayTooltip": "Usar hoje (UTC)", + "common.dateTimeEditor.utc": "UTC", + "common.delete": "Excluir", + "common.description": "Descrição", + "common.designer": "Designer", + "common.details": "Detalhes", + "common.disable": "Desativar", + "common.disabled": "Deficientes", + "common.displayName": "Nome do visor", + "common.documentation": "Documentação", + "common.edit": "Editar", + "common.editing": "Edição", + "common.email": "Email", + "common.empty": "Sem resultados.", + "common.enable": "Ativar", + "common.enabled": "Habilidoso", + "common.error": "Erro", + "common.errorBack": "De volta à página anterior.", + "common.errorNoPermission": "Não tem as permissões para fazer isto.", + "common.errorNotFound": "Não encontrado", + "common.event": "Evento", + "common.events": "Eventos", + "common.executed": "Executado", + "common.expertMode": "Modo Especialista", + "common.extension": "Extensão", + "common.failed": "Falhou", + "common.fallback": "Recuo", + "common.field": "Campo", + "common.files": "Ficheiros", + "common.filters": "Filtros", + "common.folder": "Pasta", + "common.folders": "Pastas", + "common.from": "De", + "common.generalSettings": "Comun", + "common.generate": "Gerar", + "common.github": "Rio Github", + "common.height": "Altura", + "common.help": "Ajuda", + "common.helpTour": "Clique no ícone de ajuda para mostrar uma página de ajuda específica de contexto. Ir para", + "common.hide": "Esconder", + "common.hints": "Dicas", + "common.history": "História", + "common.httpConflict": "Falhou em fazer a atualização. Outro utilizador fez uma mudança. Por favor, recarregue.", + "common.httpLimit": "Excedeu o limite máximo de chamadas da API.", + "common.id": "Identidade", + "common.in": "in", + "common.label": "Etiqueta", + "common.language": "Língua", + "common.languages": "Línguas", + "common.lastExecuted": "Última execução", + "common.latitudeShort": "Anos", + "common.loading": "Carregamento", + "common.loadMore": "Carregar mais", + "common.logout": "Logout", + "common.logs": "Troncos", + "common.longitudeShort": "Lon", + "common.mapHide": "Mapa escondido", + "common.mapShow": "Mapa apresentação", + "common.message": "Mensagem", + "common.monthly": "Mensal", + "common.more": "Mais", + "common.name": "Nome", + "common.no": "Não", + "common.nothingChanged": "Nada foi mudado.", + "common.notSupported": "Não suportado", + "common.noValue": "- Sem valor -", + "common.openAPI": "Open API", + "common.or": "ou", + "common.pagerInfo": "{itemFirst}-{itemLast} de {numberOfItems}", + "common.pagerInfoNoTotal": "{itemFirst}-{itemLast} do total?", + "common.pagerReload": "Clique para recarregar a vista e obter o número total de itens", + "common.password": "Password", + "common.passwordConfirm": "Confirmar Password", + "common.pattern": "Padrão", + "common.patterns": "Padrões", + "common.permissions": "Permissões", + "common.preview": "Previsualizar", + "common.product": "CMS Headless Squidex", + "common.project": "Projeto", + "common.queryOperators.contains": "contém", + "common.queryOperators.empty": "está vazio", + "common.queryOperators.endsWith": "termina com", + "common.queryOperators.eq": "é igual a", + "common.queryOperators.exists": "existe", + "common.queryOperators.ge": "é maior ou igual a", + "common.queryOperators.gt": "é maior do que", + "common.queryOperators.le": "é menos ou igual a", + "common.queryOperators.lt": "é menos do que", + "common.queryOperators.matchs": "combina com", + "common.queryOperators.ne": "não é igual a", + "common.queryOperators.startsWith": "começa com", + "common.refresh": "Refrescar", + "common.remember": "Não pergunte de novo.", + "common.rename": "Renomear", + "common.renameTag": "Renomear Etiqueta", + "common.requiredHint": "Necessário", + "common.reset": "Reset", + "common.restore": "Restaurar", + "common.role": "Grupo", + "common.roles": "Grupos", + "common.rule": "Regra", + "common.rules": "Regras", + "common.sampleCodeLabel": "Código de amostra em", + "common.save": "Salvar", + "common.schema": "Esquema", + "common.schemas": "Esquemas", + "common.search": "Pesquisar", + "common.searchGoogleMaps": "Pesquisar Google Maps", + "common.searchResults": "Resultados da pesquisa", + "common.security": "Segurança", + "common.separateByLine": "Separar por linha", + "common.settings": "Configurções", + "common.sidebar": "Sidebar Extension", + "common.sidebarTour": "A navegação da barra lateral contém ligações específicas de contexto úteis. Aqui pode ver a história de como este esquema mudou ao longo do tempo.", + "common.skipped": "Ignorado", + "common.slug": "slug", + "common.stars.max": "Não deve ter mais de 15 estrelas", + "common.status": "Estado", + "common.statusChangeTo": "Mudar para", + "common.submit": "Enviar", + "common.subscription": "Assinatura", + "common.succeeded": "Conseguiu", + "common.tagAdd": ", para adicionar tag", + "common.tagAddReference": ", para adicionar referência", + "common.tagAddSchema": ", para adicionar esquema", + "common.tags": "Etiquetas", + "common.tagsAll": "Todas as etiquetas", + "common.teams": "Equipas", + "common.templates": "Modelos", + "common.time": "Hora", + "common.to": "Para", + "common.update": "Atualização", + "common.upload": "Upload", + "common.url": "URL", + "common.users": "Utilizadores", + "common.value": "Valor", + "common.weekly": "Semanal", + "common.width": "Largura", + "common.workflow": "Fluxo de trabalho", + "common.workflows": "Fluxos de trabalho", + "common.yes": "Sim", + "contents.addComponent": "Adicionar componente", + "contents.arrayAddItem": "Adicionar item", + "contents.arrayClear": "Limpar", + "contents.arrayClearConfirmText": "Quer mesmo limpar a matriz?", + "contents.arrayClearConfirmTitle": "Matriz clara", + "contents.arrayCloneItem": "Clone este item", + "contents.arrayCollapseAll": "Destrua todos os itens", + "contents.arrayCollapseItem": "Destrua este item", + "contents.arrayExpandAll": "Expandir todos os itens", + "contents.arrayExpandItem": "Expandir este item", + "contents.arrayMoveBottom": "Mova este item para o fundo", + "contents.arrayMoveDown": "Mova este item para baixo", + "contents.arrayMoveTop": "Mova este item para cima", + "contents.arrayMoveUp": "Mova este item para cima", + "contents.arrayNoFields": "Adicione primeiro um campo aninhado para adicionar itens.", + "contents.assetsUpload": "Deixe cair ficheiros ou clique", + "contents.autotranslate": "Transtração automática da linguagem mestra", + "contents.bulkFailed": "Falhou em eliminar ou atualizar o conteúdo. Por favor, recarregue.", + "contents.calendar": "Conteúdo Agendado", + "contents.cancelStatus": "Cancelar estado agendado", + "contents.cancelStatusConfirmText": "Deseja mesmo cancelar a atualização do estado agendada?", + "contents.cancelStatusConfirmTitle": "Cancelar estado agendado", + "contents.changeStatusTo": "Alterar o(s) item de conteúdo para {action}", + "contents.changeStatusToImmediately": "Desa um conjunto de {action} imediatamente.", + "contents.changeStatusToLater": "Definir para {action} numa data e hora posteriores.", + "contents.componentInvalid": "Componente inválido, o esquema foi eliminado.", + "contents.componentNoSchema": "Adicione pelo menos um esquema para definir o componente.", + "contents.componentsNoSchema": "Adicione pelo menos um esquema para adicionar componentes.", + "contents.contentNotValid": "Elemento de conteúdo não válido, verifique o campo com a barra vermelha à esquerda em todos os idiomas (se for lobrelável).", + "contents.contentTab.editor": "Editor", + "contents.contentTab.inspect": "Inspecione", + "contents.contentTab.references": "Referências", + "contents.contentTab.referencing": "Referenciação", + "contents.create": "Novo", + "contents.createContentTooltip": "Novos Conteúdos", + "contents.created": "Conteúdo criado com sucesso.", + "contents.createFailed": "Falhou em criar conteúdo. Por favor, recarregue.", + "contents.createPageTitle": "Criar Conteúdo", + "contents.createTitle": "Novos Conteúdos", + "contents.currentStatusLabel": "Versão atual", + "contents.deleteConfirmText": "Deseja mesmo apagar o conteúdo?", + "contents.deleteConfirmTitle": "Eliminar conteúdo", + "contents.deleteManyConfirmText": "Deseja mesmo eliminar os itens de conteúdo selecionados?", + "contents.deleteReferrerConfirmText": "O conteúdo é referenciado por outro item de conteúdo.\n\nDeseja mesmo eliminar este conteúdo?", + "contents.deleteReferrerConfirmTitle": "Eliminar conteúdo", + "contents.deleteVersionConfirmText": "Deseja mesmo eliminar esta versão?", + "contents.deleteVersionFailed": "Falhou em apagar a versão. Por favor, recarregue.", + "contents.draftNew": "Novo Esboço", + "contents.draftStatus": "Nova versão", + "contents.editPageTitle": "Editar Conteúdo", + "contents.fieldFullscreen": "Concentre-se neste campo e altere o modo de ecrã completo.", + "contents.idPlaceholder": "Defina um ID personalizado ou deixe vazio para permitir que o Squidex gere um.", + "contents.inspectContent": "Conteúdo", + "contents.inspectData": "Dados", + "contents.inspectFlatData": "Dados Planos", + "contents.languageModeAll": "Todas as Línguas", + "contents.languageModeSingle": "Língua única", + "contents.lastUpdatedLabel": "Última Atualização", + "contents.loadContent": "Carga", + "contents.loadContentFailed": "Falhou em carregar o conteúdo. Por favor, recarregue.", + "contents.loadDataFailed": "Falhou em carregar dados. Por favor, recarregue.", + "contents.loadFailed": "Falhou em carregar o conteúdo. Por favor, recarregue.", + "contents.loadVersionFailed": "Falhou em carregar uma nova versão. Por favor, recarregue.", + "contents.noReference": "- Sem referência -", + "contents.noReferences": "Este conteúdo não tem referências.", + "contents.noReferencing": "Este conteúdo não é referenciado por outro item.", + "contents.pendingChangesTextToChange": "Tem mudanças não salvas.\n\nQuando mudar o estado, vai perdê-los.\n\n**Você quer continuar de qualquer maneira?**", + "contents.pendingChangesTextToClose": "Tem mudanças não salvas.\n\nQuando fechar a visualização de conteúdo atual, irá perdê-los.\n\n**Você quer continuar de qualquer maneira?**", + "contents.pendingChangesTextToPreview": "Tem mudanças não salvas.\n\nNão os verá na pré-estreia.\n\n**Você quer continuar de qualquer maneira?**", + "contents.pendingChangesTitle": "Alterações não salvas", + "contents.publishAll": "Publicar Tudo", + "contents.referencesCreateNew": "Adicionar Novo", + "contents.referencesCreatePublish": "Criar e Publicar", + "contents.referencesLink": "Link conteúdo selecionado ({count})", + "contents.referencesSelectExisting": "Selecione Existente", + "contents.referencesSelectSchema": "Selecione {schema}", + "contents.refreshTooltip": "Atualizar conteúdos", + "contents.reloaded": "Conteúdo recarregado.", + "contents.removeConfirmText": "Quer mesmo remover o conteúdo?", + "contents.removeConfirmTitle": "Remover conteúdo", + "contents.saveAndPublish": "Salvar e Publicar", + "contents.scheduledAt": "em", + "contents.scheduledBy": "por", + "contents.scheduledTo": "Para", + "contents.scheduledToLabel": "Programado para", + "contents.scheduledTooltip": "Será definido para '{status}' em {time}.", + "contents.schemasPageTitle": "Conteúdo", + "contents.searchPlaceholder": "Pesquisa de texto completo", + "contents.searchSchemasPlaceholder": "Pesquisar", + "contents.selectionCount": "{count} itens selecionados", + "contents.statusQueries": "Consultas de Estado", + "contents.stockPhotoSearch": "Pesquisa por Fotos por Unsplash", + "contents.stockPhotoSearchEmpty": "Use a barra de pesquisa acima para encontrar fotos.", + "contents.unpublishReferrerConfirmText": "O conteúdo é referenciado por outro item de conteúdo publicado.\n\nQuer mesmo não publicar este conteúdo?", + "contents.unpublishReferrerConfirmTitle": "Conteúdo não publiciu", + "contents.unsavedChangesText": "Tem mudanças não salvas. Quer carregá-los agora?", + "contents.unsavedChangesTitle": "Alterações não salvas", + "contents.unsetValue": "Valor desaparato", + "contents.unsetValueConfirmText": "Se desaparasse o valor, poderá perder as alterações.\n\nQuer mesmo fazê-lo?", + "contents.unsetValueConfirmTitle": "Quer desaparassar o valor?", + "contents.updated": "Conteúdo atualizado com sucesso.", + "contents.updateFailed": "Falhou na atualização do conteúdo. Por favor, recarregue.", + "contents.validate": "Validar", + "contents.validationHint": "Por favor, lembre-se de verificar todos os idiomas quando vir erros de validação.", + "contents.versionCompare": "Comparar", + "contents.versionDelete": "Excluir esta versão", + "contents.versionViewing": "Versão de visualização **{version}***", + "contents.viewLatest": "Ver as últimas", + "contents.viewReset": "Ver por defeito de reposição", + "contributors.add": "Adicionar Colaborador", + "contributors.add.title": "Adicionar ou convidar colaborador", + "contributors.addFailed": "Não conseguiu adicionar contribuintes. Por favor, recarregue.", + "contributors.contributorAssigned": "Um novo utilizador com o endereço de e-mail introduzido foi criado e atribuído como contribuinte.", + "contributors.contributorAssignedExisting": "O utilizador foi designado", + "contributors.contributorAssignedInvited": "O utilizador foi convidado e designado.", + "contributors.contributorAssignedOld": "O utilizador foi adicionado como contribuinte.", + "contributors.deleteConfirmText": "Quer mesmo remover o contribuinte?", + "contributors.deleteConfirmTitle": "Remover colaborador", + "contributors.deleteFailed": "Falhou em eliminar os contribuintes. Por favor, recarregue.", + "contributors.emailPlaceholder": "Encontre o utilizador existente ou convide-o por e-mail", + "contributors.empty": "Não foram encontrados contribuintes.", + "contributors.import.emailsDetected": "E-mails detetados: {count}", + "contributors.import.run": "Adicionar Contribuintes", + "contributors.import.run2": "Importação", + "contributors.importButton": "Adicionar muitos contribuintes ao mesmo tempo", + "contributors.importHintg": "Uma grande equipa?", + "contributors.importTitle": "Contribuintes de importação", + "contributors.loadFailed": "Falhou em carregar os contribuintes. Por favor, recarregue.", + "contributors.planHint": "O seu plano permite até contribuintes {maxContributors} .", + "contributors.refreshTooltip": "Atualizar colaboradores", + "contributors.reloaded": "Os contribuintes recarregaram.", + "contributors.search": "Pesquisar", + "contributors.userNotFound": "O utilizador não existe.", + "dashboard.apiCallsCard": "Chamadas da API", + "dashboard.apiCallsChart": "Gráfico de chamadas da API", + "dashboard.apiCallsLimitLabel": "Limite mensal", + "dashboard.apiCallsSummaryCard": "Resumo das chamadas da API", + "dashboard.apiDocumentationCard": "Documentação da API", + "dashboard.apiPerformanceCard": "Desempenho da API (ms): {summary}ms avg", + "dashboard.apiPerformanceChart": "Gráfico de desempenho da API", + "dashboard.appsCard": "Aplicativos", + "dashboard.assetSizeCard": "Tamanho do ativo (MB", + "dashboard.assetSizeLabel": "Tamanho total", + "dashboard.assetSizeLimitLabel": "Limite total", + "dashboard.assetTotalSize": "Tamanho total de armazenamento do ativo", + "dashboard.assetUpdloadsCountChart": "Gráfico de contagem de uploads de ativos", + "dashboard.assetUploadsCard": "Uploads de Ativos", + "dashboard.assetUploadsSizeChart": "Gráfico de tamanho de uploads de ativos", + "dashboard.configSaved": "Configuração guardada.", + "dashboard.contentApi": "API de conteúdo", + "dashboard.contentApiDescription": "Documentação compatível com OpenAPI 3.0 para o seu conteúdo da aplicação.", + "dashboard.contentSummaryCard": "Número de itens", + "dashboard.currentMonthLabel": "Este mês", + "dashboard.downloadLog": "Registar baixar", + "dashboard.editConfig": "Editar Config", + "dashboard.githubCard": "Github card", + "dashboard.githubCardDescription": "Obtenha o código fonte de Github e reporte bugs ou peça apoio.", + "dashboard.historyCard": "Histórico", + "dashboard.pageTitle": "Painel de controle", + "dashboard.randomCatCard": "Gato aleatório", + "dashboard.randomDogCard": "Cão aleatório", + "dashboard.resetConfigConfirmText": "Deseja mesmo redefinir o painel de instrumentos ao padrão?", + "dashboard.resetConfigConfirmTitle": "Config de reset", + "dashboard.schemaNewCard": "Novo Esquema", + "dashboard.schemaNewCardDescription": "Um esquema define a estrutura do seu elemento de conteúdo.", + "dashboard.schemasCard": "Esquemas", + "dashboard.schemasCardDescription": "Obtenha uma visão do modelo de dados desta aplicação.", + "dashboard.stackedChart": "Empilhado", + "dashboard.supportCard": "Feedback & Suporte", + "dashboard.supportCardDescription": "Forneça funcionalidades de feedback e pedido para nos ajudar a melhorar a Squidex.", + "dashboard.trafficChart": "Gráfico de tráfego da API", + "dashboard.trafficHeader": "Tráfego (MB)", + "dashboard.trafficLimitLabel": "Limite mensal", + "dashboard.trafficSummaryCard": "Resumo do Tráfego da API", + "dashboard.welcomeText": "Bem-vindo à App **{app}***", + "dashboard.welcomeTextTeam": "Bem-vindos à equipa **{team}***", + "dashboard.welcomeTitle": "Hi {user}", + "eventConsumers.count": "Contagem", + "eventConsumers.loadFailed": "Falhou em carregar os consumidores de eventos. Por favor, recarregue.", + "eventConsumers.pageTitle": "Consumidores de Eventos", + "eventConsumers.position": "Posição", + "eventConsumers.refreshTooltip": "Atualizar os consumidores de eventos", + "eventConsumers.reloaded": "Evento Os consumidores recarregaram.", + "eventConsumers.reset": "Consumidor de eventos será reiniciado em breve", + "eventConsumers.resetFailed": "Falhou em repor o consumidor de eventos. Por favor, recarregue.", + "eventConsumers.resetTooltip": "Consumidor de eventos de reset", + "eventConsumers.started": "Consumidor de eventos será iniciado em breve", + "eventConsumers.startFailed": "Falhou em iniciar o consumidor de eventos. Por favor, recarregue.", + "eventConsumers.startTooltip": "Iniciar o consumidor de eventos", + "eventConsumers.stopFailed": "Falhou em parar o consumidor de eventos. Por favor, recarregue.", + "eventConsumers.stopped": "Consumidor de eventos será parado em breve", + "eventConsumers.stopTooltip": "Parar o consumidor de eventos", + "features.loadFailed": "Falhou na carga das características. Por favor, recarregue.", + "history.loadFailed": "Falhou em carregar a história. Por favor, recarregue.", + "history.title": "Atividade", + "languages.add": "Adicionar linguagem", + "languages.add.description": "Adicione um novo idioma que pretende apoiar para o seu conteúdo.", + "languages.add.title": "Adicione uma nova linguagem", + "languages.addFailed": "Falhou em adicionar linguagem. Por favor, recarregue.", + "languages.deleteConfirmText": "Quer mesmo remover a linguagem?", + "languages.deleteConfirmTitle": "Remover a linguagem", + "languages.deleteFailed": "Falhou em apagar o idioma. Por favor, recarregue.", + "languages.loadFailed": "Falhou em carregar línguas. Por favor, recarregue.", + "languages.master": "É Mestre", + "languages.masterHint": "Outras línguas recuam para o mestre se não for definido o recuo.", + "languages.optional": "É Opcional", + "languages.optionalHint": "Os valores das línguas opcionais não devem ser introduzidos, mesmo que seja necessário o campo.", + "languages.refreshTooltip": "Atualizar línguas", + "languages.reloaded": "Línguas recarregadas.", + "languages.updateFailed": "Falhou em mudar de linguagem. Por favor, recarregue.", + "news.headline": "O que há de novo?", + "news.title": "Novas Funcionalidades", + "notifications.empty": "Ainda não há notificações", + "notifo.subscripeTooltip": "Clique neste botão para subscrever todas as alterações e para receber notificações push.", + "plans.allApps": "A subscrição é partilhada entre todas as aplicações desta equipa. Verifique o painel de instrumentos para as aplicações atribuídas.", + "plans.billingPortal": "Portal de Faturação", + "plans.billingPortalHint": "Vá ao Portal de Faturação para obter o histórico de pagamentos e a visão geral da subscrição.", + "plans.change": "Alteração", + "plans.changeConfirmTitle": "Alterar subscrição", + "plans.changeFailed": "Falhou em mudar de plano. Por favor, recarregue.", + "plans.includedCalls": "Chamadas da API", + "plans.includedContributors": "Contribuintes", + "plans.includedStorage": "Armazenamento", + "plans.includedTraffic": "Tráfego", + "plans.loadFailed": "Falhou em carregar planos. Por favor, recarregue.", + "plans.managedByTeam": "A aplicação foi atribuída a uma equipa e, portanto, a subscrição é gerida pela equipa.", + "plans.noPlanConfigured": "Sem plano configurado, esta aplicação tem uso ilimitado.", + "plans.notPlanOwner": "Não criou a subscrição, pelo que não pode alterar o plano.", + "plans.perMonth": "Por mês", + "plans.perYear": "Por ano", + "plans.planOwner": "Proprietário", + "plans.referralEarned": "Valor ganho até agora: **{earned}**", + "plans.referralHint": "Ganhe dinheiro e partilhe o seguinte código de desconto para o seu amigo e família: **{code}***", + "plans.refreshTooltip": "Planos de Atualização", + "plans.reloaded": "Planos recarregados.", + "plans.selected": "Selecionado", + "profile.title": "Perfil", + "profile.userEmail": "Assinado com", + "roles.add": "Adicionar grupo", + "roles.add.description": "Adicione um novo grupo se precisar de permissão e políticas personalizadas.", + "roles.add.title": "Adicione um grupo personalizado", + "roles.addFailed": "Falha ao adicionar grupo. Por favor recarregue.", + "roles.customRoles": "Grupos personalizados", + "roles.default.owner": "Pode fazer tudo, incluindo apagar a app.", + "roles.default.reader": "Só pode ler bens e conteúdos.", + "roles.defaultRoles": "Funções predefinidos", + "roles.defaultRoles.hint": "As funções predefinidas não podem ser eliminadas e fazem sempre parte da sua aplicação.", + "roles.defaults.developer": "Pode utilizar a vista API, editar ativos, conteúdos, esquemas, regras, fluxos de trabalho e configurações.", + "roles.defaults.editor": "Pode editar ativos e conteúdos e ver fluxos de trabalho.", + "roles.deleteConfirmText": "Eliminar grupo", + "roles.deleteConfirmTitle": "Quer mesmo apagar o grupo?", + "roles.loadFailed": "Falhou em carregar papéis. Por favor, recarregue.", + "roles.loadPermissionsFailed": "Falhou em carregar permissões. Por favor, recarregue.", + "roles.permissions": "Permissões", + "roles.permissionsDescription": "As permissões restringem as operações e consultas permitidas a nível API e são uma funcionalidade de segurança.", + "roles.permissionsPlaceholder": "Comece a escrever para procurar permissões", + "roles.properties": "Propriedades", + "roles.properties.hideAPI": "Ocultar API", + "roles.properties.hideAssets": "Ocultar ficheiros", + "roles.properties.hideContents": "Ocultar {schema} Conteúdo", + "roles.properties.hideSchemas": "Esconder Esquemas", + "roles.properties.hideSettings": "Configurações de ocultação", + "roles.propertiesDescription": "As propriedades descrevem o comportamento da UI de Gestão, mas não fornecem segurança para a API.", + "roles.refreshTooltip": "Atualizar grupos", + "roles.reloaded": "Grupos recarregados.", + "roles.revokeFailed": "Falhou em revogar o grupo. Por favor, recarregue.", + "roles.roleNamePlaceholder": "Insira o nome da grupo", + "roles.updateFailed": "Falhou na atualização do grupo. Por favor, recarregue.", + "rules.actionData": "Dados de Ação", + "rules.actionHint": "A seleção do tipo de ação não pode ser alterada mais tarde.", + "rules.addSchema": "Adicionar Esquema", + "rules.advancedFormattingHint": "Você pode usar formatação avançada", + "rules.cancelFailed": "Falhou em cancelar a regra. Por favor, recarregue.", + "rules.conditionHint": "Condição opcional como expressão javascript", + "rules.conditionHint2": "As condições são expressões javascript que definem quando desencadear, por exemplo", + "rules.conditions.commentKeyword": "Apenas para palavras-chave de texto", + "rules.conditions.commentUser": "Utilizadores específicos", + "rules.conditions.contentValue": "O conteúdo tem valor", + "rules.conditions.event": "Eventos específicos", + "rules.conditions.images": "Apenas imagens", + "rules.conditions.largeAssets": "Grandes ativos", + "rules.conditions.schema": "Apenas esquema específico", + "rules.conditions.updatedBy": "Atualizado pelo utilizador", + "rules.conditions.usageDays": "Dias", + "rules.conditions.usageDaysHint": "O número de dias para verificar ou esvaziar para verificar o mês em curso.", + "rules.conditions.usageLimit": "Limite", + "rules.conditions.usageLimitHint": "A Api mensal chama para desencadear.", + "rules.create": "Nova Regra", + "rules.createFailed": "Falhou em criar regra. Por favor, recarregue.", + "rules.createTooltip": "Nova Regra", + "rules.deleteConfirmText": "Quer mesmo apagar a regra?", + "rules.deleteConfirmTitle": "Eliminar regra", + "rules.deleteFailed": "Falhou em apagar a regra. Por favor, recarregue.", + "rules.empty": "Nenhuma regra criada ainda.", + "rules.emptyAddRule": "Adicionar Regra", + "rules.enqueued": "A regra foi adicionada à fila.", + "rules.enrichedEvent": "Evento Enriquecido", + "rules.itemPageTitle": "Regra", + "rules.listPageTitle": "Regras", + "rules.loadFailed": "Falhou em carregar as regras. Por favor, recarregue.", + "rules.readMore": "Ler Mais", + "rules.refreshEventsTooltip": "Atualizar eventos", + "rules.refreshTooltip": "Atualizar regras", + "rules.reloaded": "Regras recarregadas.", + "rules.restarted": "A regra começará a funcionar em alguns segundos.", + "rules.ruleEvents.cancelAllConfirmText": "Quer mesmo cancelar todos os eventos?", + "rules.ruleEvents.cancelAllConfirmTitle": "Cancelar todos os eventos", + "rules.ruleEvents.cancelConfirmText": "Quer mesmo cancelar este evento?", + "rules.ruleEvents.cancelConfirmTitle": "Cancelar evento", + "rules.ruleEvents.cancelFailed": "Não cancelou os eventos de regras. Por favor, recarregue.", + "rules.ruleEvents.enqueue": "Enqueue", + "rules.ruleEvents.enqueued": "Eventos encadeados. Será reensificada em alguns segundos.", + "rules.ruleEvents.enqueueFailed": "Falhou em encascar o evento de regras. Por favor, recarregue.", + "rules.ruleEvents.lastInvokedLabel": "Última Invocação", + "rules.ruleEvents.listPageTitle": "Eventos de Regras", + "rules.ruleEvents.loadFailed": "Falhou em carregar eventos. Por favor, recarregue.", + "rules.ruleEvents.nextAttemptLabel": "A seguir", + "rules.ruleEvents.numAttemptsLabel": "Tentativas", + "rules.ruleEvents.reloaded": "RegrasEventos recarregados.", + "rules.ruleSimulator.listPageTitle": "Simulador", + "rules.ruleSyntax.if": "If", + "rules.ruleSyntax.then": "then", + "rules.run": "Repetição", + "rules.runFailed": "Falhou em executar a regra. Por favor, recarregue.", + "rules.runFromSnapshots": "Repetição dos Estados", + "rules.runningRule": "A regra '{name}' está atualmente em execução.", + "rules.runRuleConfirmText": "Quer mesmo gerir a regra para todos os eventos?", + "rules.runRuleConfirmTitle": "Regra de execução", + "rules.simulate": "Simular", + "rules.simulateTooltip": "Simular estas regras usando os últimos 100 eventos.", + "rules.simulation.actionCreated": "O trabalho é criado a partir do evento e ação enriquecidos e adicionado a uma fila de trabalho.", + "rules.simulation.actionExecuted": "O trabalho é tirado da fila e executado.", + "rules.simulation.errorConditionDoesNotMatch": "STOP: As expressões javascript no gatilho não correspondem ao evento.", + "rules.simulation.errorConditionPrecheckDoesNotMatch": "STOP: A condição no gatilho não corresponde ao evento.", + "rules.simulation.errorDisabled": "STOP: A regra está desativada.", + "rules.simulation.errorFailed": "Erro interno.", + "rules.simulation.errorFromRule": "STOP: O evento foi criado a partir de outra regra e será ignorado para evitar loops intermináveis.", + "rules.simulation.errorNoAction": "STOP: O tipo de ação é obsoleto e foi removido.", + "rules.simulation.errorNoTrigger": "STOP: O tipo de gatilho é obsoleto e foi removido.", + "rules.simulation.errorTooOld": "O evento é muito antigo.", + "rules.simulation.errorWrongEvent": "PARAR: O evento não corresponde ao gatilho.", + "rules.simulation.errorWrongEventForTrigger": "PARAR: O evento não corresponde ao gatilho.", + "rules.simulation.eventConditionEvaluated": "O evento enriquecido é avaliado, quer corresponda às condições e expressões javascript no gatilho.", + "rules.simulation.eventEnriched": "Evento é enriquecido com dados adicionais", + "rules.simulation.eventQueried": "Evento é consultado a partir da base de dados", + "rules.simulation.eventTriggerChecked": "O evento é testado para ver se corresponde ao gatilho e às condições básicas.", + "rules.simulator": "Simulador", + "rules.stop": "A regra vai parar em breve.", + "rules.triggerAll": "Gatilho em todos os eventos de conteúdo", + "rules.triggerConfirmText": "Quer mesmo desencadear a regra?", + "rules.triggerConfirmTitle": "Regra do gatilho", + "rules.triggerFailed": "Falhou em desencadear a regra. Por favor, recarregue.", + "rules.triggerHint": "A seleção do tipo de gatilho não pode ser alterada mais tarde.", + "rules.unnamed": "Regra sem nome", + "rules.updateFailed": "Falhou na atualização da regra. Por favor, recarregue.", + "schemas.addField": "Adicionar Campo", + "schemas.addFieldAndClose": "Criar e fechar", + "schemas.addFieldAndCreate": "Criar e adicionar campo", + "schemas.addFieldAndEdit": "Criar e editar campo", + "schemas.addFieldButton": "Adicionar Campo", + "schemas.addFieldFailed": "Falhou em adicionar campo. Por favor, recarregue.", + "schemas.addNestedField": "Adicionar Campo Aninhado", + "schemas.changeCategoryFailed": "Falhou em mudar de categoria. Por favor, recarregue.", + "schemas.clone": "Clonar Esquema", + "schemas.contentEditorUrl": "Extensão do editor de conteúdo", + "schemas.contentSidebarUrl": "Extensão da barra lateral de conteúdo", + "schemas.contentSidebarUrlHint": "URL para o plugin para a barra lateral na vista de detalhes.", + "schemas.contentsSidebarUrl": "Extensão da barra lateral de conteúdo", + "schemas.contentsSidebarUrlHint": "URL para o plugin para a barra lateral na vista da lista.", + "schemas.contextMenuTour": "Abra o menu de contexto para eliminar o esquema ou para criar alguns scripts para alterações de conteúdo.", + "schemas.create": "Criar Esquema", + "schemas.createCategory": "Criar nova categoria...", + "schemas.createFailed": "Falhou em criar esquema. Por favor, recarregue.", + "schemas.createSchemaTooltip": "Novo esquema", + "schemas.deleteConfirmText": "Quer mesmo apagar o esquema?", + "schemas.deleteConfirmTitle": "Remover Esquema", + "schemas.deleteFailed": "Falhou em apagar o esquema. Por favor, recarregue.", + "schemas.deleteFieldFailed": "Falhou em apagar o campo. Por favor, recarregue.", + "schemas.deleteRuleConfirmText": "Quer mesmo remover esta Regra de Campo?", + "schemas.deleteRuleConfirmTitle": "Remover a regra do campo", + "schemas.deleteUrlConfirmText": "Quer mesmo remover esta URL?", + "schemas.deleteUrlConfirmTitle": "Remover URL", + "schemas.disableFieldFailed": "Falhou em desativar o campo. Por favor, recarregue.", + "schemas.enableFieldFailed": "Falhou em ativar o campo. Por favor, recarregue.", + "schemas.export.deleteFields": "Eliminar campos", + "schemas.export.recreateFields": "Recriar campos", + "schemas.export.synchronize": "Sincronizar", + "schemas.field.allowedValues": "Valores Permitidos", + "schemas.field.createEnum": "Gerar GraphQL Enum.", + "schemas.field.createEnumHint": "Gere uma enumeração GraphQL para este campo. O formato de entrada já não é compatível com uma corda e pode ser uma mudança de rutura para o seu cliente.", + "schemas.field.defaultValue": "Valor Predefinido", + "schemas.field.defaultValues": "Valores predefinidos", + "schemas.field.defaultValuesHint": "Desaponha o valor predefinido por idioma e substitua a propriedade de valor predefinido, se definida. Só a use se realmente for necessário.", + "schemas.field.deleteConfirmText": "Quer mesmo apagar o campo?", + "schemas.field.deleteConfirmTitle": "Eliminar campo", + "schemas.field.disable": "Desativar na UI", + "schemas.field.disabledMarker": "Deficientes", + "schemas.field.editor": "Editor", + "schemas.field.editorUrl": "Editor Url", + "schemas.field.editorUrlHint": "Url para o seu plugin se usar um editor personalizado.", + "schemas.field.empty": "Nenhum campo ainda foi criado.", + "schemas.field.enable": "Ativar na UI", + "schemas.field.enabledMarker": "Habilitar", + "schemas.field.graphQLSchema": "GraphQL Esquema", + "schemas.field.graphQLSchemaHint": "Defina um esquema GraphQL para os valores json. Pode utilizar vários tipos para objetos aninhados.\nO primeiro tipo torna-se o tipo de campo. Apenas os objetos são suportados como tipos de raiz.", + "schemas.field.halfWidth": "Meia Largura", + "schemas.field.halfWidthHint": "Mostra o campo com apenas a meia largura quando na página de edição ou criação, quando há espaço suficiente.", + "schemas.field.hiddenMarker": "Escondido", + "schemas.field.hide": "Esconda-se na API", + "schemas.field.hintsHint": "Descreva este campo para documentação e uI.", + "schemas.field.inlineEditable": "Edição inline", + "schemas.field.isEmbeddable": "Está incorporando conteúdos e ativos", + "schemas.field.isEmbeddableHint": "Com esta opção, um formato personalizado é devolvido no GraphQL, onde os ativos ou conteúdos ligados podem ser recolhidos.", + "schemas.field.labelHint": "Mostrar o nome para documentação e a UI.", + "schemas.field.localizable": "Localizabilável", + "schemas.field.localizableHint": "Pode marcar o campo como ó querável. Significa que depende da língua, por exemplo, de um nome da cidade.", + "schemas.field.localizableMarker": "localizatável", + "schemas.field.lock": "Bloquear e evitar alterações", + "schemas.field.lockConfirmText": "AVISO: O bloqueio de um campo não pode ser desfeito! As definições de campo bloqueadas já não podem ser desbloqueadas, eliminadas ou alteradas.\n\nQuer mesmo trancar este campo?", + "schemas.field.lockConfirmTitle": "Campo de bloqueio", + "schemas.field.lockedMarker": "Bloqueado", + "schemas.field.nameHint": "O nome do campo na resposta da API.", + "schemas.field.namePlaceholder": "Insira o nome do campo", + "schemas.field.nameValidationMessage": "O nome deve ser um nome javascript válido na caixa do camelo.", + "schemas.field.placeholder": "Espaço reservado", + "schemas.field.placeholderHint": "Defina o espaço reservado para o controlo de entrada.", + "schemas.field.required": "Necessário", + "schemas.field.requiredOnPublish": "Necessário na publicação", + "schemas.field.show": "Espetáculo em API", + "schemas.field.tabCommon": "Comum", + "schemas.field.tabEditing": "Edição", + "schemas.field.tabMore": "Mais", + "schemas.field.tabValidation": "Validação", + "schemas.field.tagsHint": "Etiquetas para anotar o seu campo para processos de automação.", + "schemas.field.unique": "Único", + "schemas.field.visibleMarker": "Visível", + "schemas.fieldTypes.array.count": "Itens", + "schemas.fieldTypes.array.countMax": "Itens Max", + "schemas.fieldTypes.array.countMin": "Min Itens", + "schemas.fieldTypes.array.description": "Lista de objetos embutidos.", + "schemas.fieldTypes.array.uniqueFields": "Campos Únicos", + "schemas.fieldTypes.assets.allowDuplicates": "Permitir valores duplicados", + "schemas.fieldTypes.assets.count": "Contagem", + "schemas.fieldTypes.assets.countMax": "Ficheiros Max", + "schemas.fieldTypes.assets.countMin": "Min ficheiros", + "schemas.fieldTypes.assets.description": "Imagens, vídeos, documentos.", + "schemas.fieldTypes.assets.expectedType": "Tipo esperado", + "schemas.fieldTypes.assets.fileExtensions": "Extensões de ficheiros", + "schemas.fieldTypes.assets.folderId": "Pasta", + "schemas.fieldTypes.assets.folderIdHint": "A pasta de ficheiros para onde os novos ficheiros serão carregados.", + "schemas.fieldTypes.assets.previewFileName": "Apenas nome de ficheiro", + "schemas.fieldTypes.assets.previewImage": "Apenas miniatura ou nome de ficheiro se não uma imagem", + "schemas.fieldTypes.assets.previewImageAndFileName": "Miniatura e nome do ficheiro", + "schemas.fieldTypes.assets.previewMode": "Pré-visualizaçãoMode", + "schemas.fieldTypes.assets.previewModeHint": "O modo de pré-visualização dos ficheiros nas listas de conteúdos.", + "schemas.fieldTypes.assets.resolve": "Resolver o primeiro ficheiro", + "schemas.fieldTypes.assets.resolveHint": "Mostre o primeiro ficheiro referenciado na lista de conteúdos.", + "schemas.fieldTypes.assets.size": "Tamanho", + "schemas.fieldTypes.assets.sizeMax": "Tamanho min", + "schemas.fieldTypes.assets.sizeMin": "Tamanho máximo", + "schemas.fieldTypes.boolean.description": "Sim ou não, verdadeiro ou falso.", + "schemas.fieldTypes.component.description": "Incorporar outro esquema a este conteúdo.", + "schemas.fieldTypes.components.description": "Incorporar outros esquemas a este conteúdo como matriz.", + "schemas.fieldTypes.dateTime.defaultMode": "Modo predefinido", + "schemas.fieldTypes.dateTime.description": "Data eventos, horas de abertura.", + "schemas.fieldTypes.dateTime.format": "Padrão", + "schemas.fieldTypes.dateTime.formatHint": "O padrão quando mostrado na UI, veja: https://date-fns.org/v2.22.1/docs/format", + "schemas.fieldTypes.dateTime.rangeMax": "Valor Máximo", + "schemas.fieldTypes.dateTime.rangeMin": "Valor Min", + "schemas.fieldTypes.geolocation.description": "Coordenadas: latitude e longitude.", + "schemas.fieldTypes.json.description": "Dados em formato JSON, para programadores.", + "schemas.fieldTypes.number.description": "Identificação, número de pedido, classificação, quantidade.", + "schemas.fieldTypes.number.range": "Alcance", + "schemas.fieldTypes.number.rangeMax": "Valor Máximo", + "schemas.fieldTypes.number.rangeMin": "Valor Min", + "schemas.fieldTypes.references.count": "Itens", + "schemas.fieldTypes.references.countMax": "Itens Max", + "schemas.fieldTypes.references.countMin": "Min Itens", + "schemas.fieldTypes.references.description": "Links para outros itens de conteúdo.", + "schemas.fieldTypes.references.mustBePublished": "Só ter em conta as referências publicadas ao validar.", + "schemas.fieldTypes.references.resolve": "Resolver referências", + "schemas.fieldTypes.references.resolveHint": "Mostre o nome do item referenciado na lista de conteúdos quando maxItems estiver definido para 1.", + "schemas.fieldTypes.string.characters": "Personagens", + "schemas.fieldTypes.string.charactersMax": "Personagens Max", + "schemas.fieldTypes.string.charactersMin": "Personagens de Min", + "schemas.fieldTypes.string.contentType": "Tipo de Conteúdo", + "schemas.fieldTypes.string.description": "Títulos, nomes, parágrafos.", + "schemas.fieldTypes.string.folderId": "Pasta de ativos", + "schemas.fieldTypes.string.folderIdHint": "A pasta de ativos para onde os novos ativos serão carregados.", + "schemas.fieldTypes.string.length": "Comprimento", + "schemas.fieldTypes.string.lengthMax": "Comprimento máximo", + "schemas.fieldTypes.string.lengthMin": "Comprimento de Min", + "schemas.fieldTypes.string.pattern": "Padrão regex", + "schemas.fieldTypes.string.patternMessage": "Mensagem de padrão", + "schemas.fieldTypes.string.suggestions": "Sugestões", + "schemas.fieldTypes.string.wordHint": "A contagem de palavras e a contagem de caracteres são calculadas no texto simples. O texto simples é calculado com base no tipo de conteúdo definido, que pode ser Markdown ou HTML.", + "schemas.fieldTypes.string.words": "Palavras", + "schemas.fieldTypes.string.wordsMax": "Palavras Max", + "schemas.fieldTypes.string.wordsMin": "Min Palavras", + "schemas.fieldTypes.tags.count": "Itens", + "schemas.fieldTypes.tags.countMax": "Itens Max", + "schemas.fieldTypes.tags.countMin": "Min Itens", + "schemas.fieldTypes.tags.description": "Formato especial para tags.", + "schemas.fieldTypes.ui.description": "Separador para edição de UI.", + "schemas.hideFieldFailed": "Falhou em esconder o campo. Por favor, recarregue.", + "schemas.import": "Esquema de importação", + "schemas.listFields": "Campos de Lista", + "schemas.listFieldsEmpty": "Deixe cair aqui ou reencomenda-os para mostrar os campos na lista de conteúdos. Quando não é definido nenhum campo de lista, o primeiro campo é utilizado.", + "schemas.loadFailed": "Falhou em carregar esquemas. Por favor, recarregue.", + "schemas.loadSchemaFailed": "Falhou em carregar o esquema. Por favor, recarregue.", + "schemas.lockFieldFailed": "Falhou em bloquear o campo. Por favor, recarregue.", + "schemas.modeComponent": "Componente", + "schemas.modeComponentDescription": "Só pode ser incorporado em campos componentes...", + "schemas.modeMultiple": "Vários conteúdos", + "schemas.modeMultipleDescription": "O melhor para vários casos como posts de blog, páginas, autores, produtos...", + "schemas.modeSingle": "Conteúdo único", + "schemas.modeSingleDescription": "O melhor para casos individuais como a página inicial, políticas de privacidade, configurações...", + "schemas.nameWarning": "Estes valores não podem ser alterados mais tarde.", + "schemas.previewUrls.empty": "Sem urls de pré-visualização configurados.", + "schemas.previewUrls.help": "Check-out a página de ajuda integrada para saber mais sobre URL's de pré-visualização.", + "schemas.previewUrls.namePlaceholder": "Web ou Mobile", + "schemas.previewUrls.title": "URLs de pré-visualização", + "schemas.previewUrls.urlPlaceholder": "URL com variáveis", + "schemas.published": "Publicado", + "schemas.publishedTour": "Note que tem de publicar o esquema antes de poder adicionar conteúdo.", + "schemas.publishFailed": "Falhou em publicar o esquema. Por favor, recarregue.", + "schemas.referenceFields": "Campos de Referência", + "schemas.referenceFieldsEmpty": "Deixe cair aqui ou reencomenda-os para mostrar os campos quando referenciados por outro conteúdo. Quando não é definido nenhum campo de referência, os campos de lista são utilizados.", + "schemas.reloaded": "Os esquemas recarregaram.", + "schemas.reorderFieldsFailed": "Falhou em reordenar campos. Por favor, recarregue.", + "schemas.rules.action": "Ação", + "schemas.rules.condition": "Condição em Javascript", + "schemas.rules.empty": "Nenhuma regra de campo configurada.", + "schemas.rules.title": "Regras de Campo", + "schemas.rules.when": "quando", + "schemas.saved": "Esqquema salvo com sucesso.", + "schemas.saveFieldAndClose": "Salvar e fechar", + "schemas.saveFieldAndNew": "Guardar e adicionar campo", + "schemas.schemaHintsHint": "Descreva este esquema para documentação e interfaces de utilizador.", + "schemas.schemaLabelHint": "Nome de apresentação para documentaçao e UI.", + "schemas.schemaNameHint": "Só pode utilizar letras, números e traços e não mais de 40 caracteres.", + "schemas.schemaNameValidationMessage": "O nome só pode conter letras, números e traços.", + "schemas.schemaTagsHint": "Etiquetas para anotar o seu esquema para processos de automação.", + "schemas.searchPlaceholder": "Pesquisar", + "schemas.showFieldFailed": "Falhou em mostrar o campo. Por favor, recarregue.", + "schemas.synchronized": "Esquema sincronizado com sucesso.", + "schemas.synchronizeFailed": "Falhou em sincronizar o esquema. Por favor, recarregue.", + "schemas.tabFields": "Campos", + "schemas.tabJson": "Json", + "schemas.tableHeaders.created": "Criado", + "schemas.tableHeaders.createdBy": "Criado por", + "schemas.tableHeaders.createdByShort": "Por", + "schemas.tableHeaders.id": "Id", + "schemas.tableHeaders.lastModified": "Actualizado", + "schemas.tableHeaders.lastModifiedBy": "Actualizado por", + "schemas.tableHeaders.lastModifiedByShort": "Por", + "schemas.tableHeaders.nextStatus": "Próximo Estado", + "schemas.tableHeaders.status": "Estado", + "schemas.tableHeaders.translationStatus": "Estado da Tradução", + "schemas.tableHeaders.translationStatusAverage": "Estado médio da tradução", + "schemas.tableHeaders.version": "Versão", + "schemas.tabMore": "Mais", + "schemas.tabScripts": "Scripts", + "schemas.tabUI": "UI", + "schemas.ui": "Campos atribuídos", + "schemas.ui.unassignedFields": "Campos não atribuídos", + "schemas.unpublished": "Não publicado", + "schemas.unpublishFailed": "Falhou em não publicar o esquema. Por favor, recarregue.", + "schemas.updateFailed": "Falhou na atualização do esquema. Por favor, recarregue.", + "schemas.updateFieldFailed": "Falhou na atualização do campo. Por favor, recarregue.", + "schemas.updatePreviewUrlsFailed": "Falhou na configuração de urls de pré-visualização. Por favor, recarregue.", + "schemas.updateRulesFailed": "Falhou na atualização das regras do esquema. Por favor, recarregue.", + "schemas.updateScriptsFailed": "Falhou na atualização dos scripts de esquema. Por favor, recarregue.", + "schemas.updateUIFieldsFailed": "Falhou na atualização dos campos de UI. Por favor, recarregue.", + "schemas.validateOnPublish": "Validar ao publicar", + "schemas.validateOnPublishHint": "Utilize fluxos de trabalho personalizados quando necessitar de mais controlo para os estatutos que um conteúdo deve ser validado.", + "search.addFilter": "Adicionar filtro", + "search.addGroup": "Adicionar Grupo", + "search.addSorting": "Adicionar Classificação", + "search.advancedTour": "Clique neste ícone para mostrar o menu de pesquisa avançado!", + "search.customQuery": "Consulta personalizada", + "search.fullTextTour": "Pes para obter conteúdos com textos completos para todos os campos e para os direitos de texto.", + "search.help": "Ler mais sobre filtros em [Documentação](https://docs.squidex.io/04-guides/02-api.html).", + "search.myQueries": "Minhas consultas", + "search.nameQuery": "Diga o seu nome", + "search.queriesEmpty": "Procure por {types} e use ícone em forma de pesquisa para guardar consulta para todos os contribuintes.", + "search.queryAllNewestFirst": "Todos (o mais novo primeiro)", + "search.queryAllOldestFirst": "Todos (o mais velho primeiro)", + "search.quickNavPlaceholder": "Quick Nav (Prima 'q')", + "search.saveQueryMyself": "Guarde a consulta apenas para mim.", + "search.searchFailed": "Falhou em fazer uma busca. Por favor, recarregue.", + "search.sharedQueries": "Consultas partilhadas", + "search.sorting": "Triagem", + "start.login": "Iniciar sessão em Squidex", + "start.loginHint": "O botão de login abrirá um novo pop-up. Assim que tiver sucesso, redireciona-o para o portal de gestão Squidex.", + "start.madeBy": "Orgulhosamente feito por", + "start.madeByCopyright": "Sebastian Stehle e Colaboradores, 2016-2022", + "teams.create": "Criar", + "teams.createFailed": "Falhou na criação de uma equipa. Por favor, recarregue.", + "teams.empty": "Esta equipa ainda não tem aplicativos.", + "teams.leave": "Deixar a equipa", + "teams.leaveConfirmText": "Queres mesmo deixar esta equipa?", + "teams.leaveConfirmTitle": "Deixe a equipa.", + "teams.leaveFailed": "Falhou em deixar a equipa. Por favor, recarregue.", + "teams.loadFailed": "Falhou em carregar equipas. Por favor, recarregue.", + "teams.teamLoadFailed": "Falhou em carregar a equipa. Por favor, recarregue.", + "teams.teamNameHint": "Pode usar todos os personagens aqui.", + "teams.teamNameWarning": "O nome da equipa só é usado como nome de exibição e pode ser alterado mais tarde.", + "teams.updateFailed": "Falhou em atualizar a equipa. Por favor, recarregue.", + "templates.cliHint": "Descarregue o CLI em https://github.com/squidex/squidex-samples para utilizar os modelos.", + "templates.loadFailed": "Falhou em carregar modelos. Por favor, recarregue.", + "templates.refreshTooltip": "Modelos de atualização", + "templates.reloaded": "Modelos recarregados.", + "tour.joinForum": "Junte-se ao nosso Fórum", + "tour.joinGithub": "Junte-se a nós em Github", + "tour.skip": "Tour de salto", + "tour.step0Next": "Vamos dar uma vista de olhos.", + "tour.step0Text": "Pode começar a gerir e distribuir o seu conteúdo imediatamente, mas gostaríamos de o acompanhar primeiro...\n\nComo é que", + "tour.step1Next": "Continuar", + "tour.step1Text": "Uma App é o repositório do seu projeto, por exemplo (blog, web shop ou aplicativo móvel). Pode atribuir colaboradores à sua aplicação para trabalharem em conjunto.\n\nPode criar um número ilimitado de Apps em Squidex para gerir vários projetos ao mesmo tempo.", + "tour.step2Next": "Continua!", + "tour.step2Text": "Os esquemas definem a estrutura do seu conteúdo, os campos e os tipos de dados de um item de conteúdo.\n\nAntes de poder adicionar conteúdo ao seu esquema, certifique-se de carregar no botão 'Publicar' no topo para disponibilizar o esquema para as suas aplicações de conteúdoSettings.editores.", + "tour.step3Next": "Está quase!", + "tour.step3Text": "O conteúdo é o dado real da sua app que é agrupado pelo esquema.\n\nSelecione primeiro um esquema publicado e, em seguida, adicione conteúdo para este esquema.", + "tour.step4Next": "Apanhei!", + "tour.step4Text": "Os ativos contêm todos os ficheiros que também podem estar ligados ao seu conteúdo. Por exemplo, imagens, vídeos ou documentos.\n\nPode fazer o upload dos ativos aqui e usá-los mais tarde ou também carregá-los diretamente quando criar um novo item de conteúdo com um campo de ativos.", + "tour.step5Text": "Mas não é todo o apoio que podemos dar.\n\nPode ir a https://docs.squidex.io ler mais.\n\nQuer se juntar à nossa comunidade?", + "tour.step5Title": "Incrível, agora já sabes o básico!", + "tour.tooltipConfirm": "Entendi", + "tour.tooltipStop": "Terminar Tour", + "tour.welcome": "Bem vindo a", + "tour.welcomeProduct": "Squidex CMS", + "translate.translateFailed": "Falhou em traduzir texto. Por favor, recarregue.", + "usages.loadCallsFailed": "Falhou em carregar o uso das chamadas. Por favor, recarregue.", + "usages.loadMonthlyCallsFailed": "Falhou em carregar as chamadas mensais da API. Por favor, recarregue.", + "usages.loadStorageFailed": "Não conseguiu carregar o uso do armazenamento. Por favor, recarregue.", + "usages.loadTodayStorageFailed": "Falhou em carregar o tamanho do armazenamento de hoje. Por favor, recarregue.", + "users.create": "Novo", + "users.createFailed": "Falhou na criação do utilizador. Por favor, recarregue.", + "users.createPageTitle": "Criar Utilizador", + "users.createTitle": "Novo Utilizador", + "users.createTooltip": "Novo Utilizador", + "users.deleteConfirmText": "Deseja mesmo eliminar este utilizador?", + "users.deleteConfirmTitle": "Eliminar utilizador", + "users.deleteFailed": "Não conseguiu eliminar o utilizador. Por favor, recarregue.", + "users.editPageTitle": "Editar Utilizador", + "users.editTitle": "Editar Utilizador", + "users.listPageTitle": "Gestão de Utilizadores", + "users.listTitle": "Utilizadores", + "users.loadFailed": "Falhou em carregar os utilizadores. Por favor, recarregue.", + "users.loadUserFailed": "Falhou na carga do utilizador. Por favor, recarregue.", + "users.lockFailed": "Falhou em bloquear o utilizador. Por favor, recarregue.", + "users.lockTooltip": "Utilizador de bloqueio", + "users.passwordConfirmValidationMessage": "As palavras-passe devem ser as mesmas.", + "users.refreshTooltip": "Atualizar utilizadores", + "users.reloaded": "Os utilizadores recarregaram.", + "users.search": "Pesquisa rumo ao utilizador", + "users.unlockFailed": "Falhou em desbloquear o utilizador. Por favor, recarregue.", + "users.unlockTooltip": "Desbloquear Utilizador", + "users.updateFailed": "Falhou na atualização do utilizador. Por favor, recarregue.", + "validation.between": "{field} deve estar entre '{min}' e '{max}'.", + "validation.betweenlength": "{field|upper} deve ter entre o item {minlength} e {maxlength} item.", + "validation.betweenlengthstring": "{field|upper} deve ter entre {minlength} e {maxlength} caracteres).", + "validation.email": "{field|upper} deve ser um endereço de e-mail.", + "validation.exactly": "{field|upper} deve ser exatamente '{expect}'.", + "validation.exactlylength": "{field|upper} deve ter exatamente o item (s) esperado).", + "validation.exactlylengthstring": "{field|upper} deve ter exatamente caracteres {expect} caracteres).", + "validation.match": "{message}", + "validation.max": "{field|upper} deve ser menos ou igual a '{max}'.", + "validation.maxlength": "{field|upper} não deve ter mais do que {requiredlength} item(s).", + "validation.maxlengthstring": "{field|upper} não deve ter mais do que {requiredlength} caracteres).", + "validation.min": "{field|upper} deve ser maior ou igual a '{min}'.", + "validation.minlength": "{field|upper} deve ter pelo menos {requiredlength} item(s).", + "validation.minlengthstring": "{field|upper} deve ter pelo menos {requiredlength} caracteres).", + "validation.pattern": "{field|upper} não corresponde ao padrão.", + "validation.patternmessage": "{message}", + "validation.required": "{field|upper} é necessário.", + "validation.requiredTrue": "{field|upper} é necessário.", + "validation.uniqueobjectvalues": "{field|upper} tem itens com campos duplicados '{fields}'.", + "validation.uniquestrings": "{campo|upper} não deve conter valores duplicados.", + "validation.validarrayvalues": "{field|upper} contém um valor inválido: {invalidvalue}.", + "validation.validdatetime": "{field|upper} não é uma data válida.", + "validation.validvalues": "{field|upper} não é um valor válido.", + "workflows.add": "Adicionar fluxo de trabalho", + "workflows.add.description": "O nome do fluxo de trabalho é usado apenas na UI e não é mostrado aos editores.", + "workflows.add.title": "Adicione um novo fluxo de trabalho", + "workflows.addStep": "Adicionar Passo", + "workflows.createFailed": "Falhou em criar fluxo de trabalho. Por favor, recarregue.", + "workflows.deleteConfirmText": "Quer mesmo remover o fluxo de trabalho?", + "workflows.deleteConfirmTitle": "Eliminar fluxo de trabalho", + "workflows.deleteFailed": "Falhou em eliminar o Fluxo de Trabalho. Por favor, recarregue.", + "workflows.empty": "Ainda não foram criados fluxos de trabalho.", + "workflows.loadFailed": "Falhou em carregar fluxos de trabalho. Por favor, recarregue.", + "workflows.notNamed": "Fluxo de trabalho sem nome", + "workflows.preventUpdates": "Evitar atualizações", + "workflows.publishedNotRemovable": "Não pode ser removido", + "workflows.refreshTooltip": "Atualizar fluxos de trabalho", + "workflows.reloaded": "Fluxos de trabalho recarregados.", + "workflows.saved": "O fluxo de trabalho foi salvo.", + "workflows.schemasHint": "Restringir este fluxo de trabalho a esquemas específicos ou mantê-lo vazio para todos os esquemas.", + "workflows.syntax.expression": "Expressão", + "workflows.syntax.for": "para", + "workflows.syntax.when": "quando", + "workflows.tabEdit": "Edição", + "workflows.tabVisualize": "Visualizar", + "workflows.updateFailed": "Falhou na atualização do Fluxo de Trabalho. Por favor, recarregue.", + "workflows.validate": "Validar o conteúdo quando for alterado para este estado.", + "workflows.workflowNameHint": "Nome opcional para o fluxo de trabalho.", + "workflows.workflowNamePlaceholder": "Insira o nome do fluxo de trabalho" +} \ No newline at end of file diff --git a/backend/i18n/package-lock.json b/backend/i18n/package-lock.json new file mode 100644 index 000000000..496cb887a --- /dev/null +++ b/backend/i18n/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "i18n", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/backend/i18n/source/backend_pt.json b/backend/i18n/source/backend_pt.json new file mode 100644 index 000000000..1dd19d1d2 --- /dev/null +++ b/backend/i18n/source/backend_pt.json @@ -0,0 +1,399 @@ +{ + "annotations_AbsoluteUrl": "O campo {name|lower} deve ser uma URL absoluta.", + "annotations_Compare": "O campo {name|lower} deve ser o mesmo que {1.}.", + "annotations_EmailAddress": "O campo {name|lower} não é um endereço de e-mail válido.", + "annotations_Range": "O campo {name|lower} deve estar entre {min} e {max}.", + "annotations_RegularExpression": "O campo não é.", + "annotations_Required": "O campo {name|lower} é necessário.", + "annotations_StringLength": "O campo '{name|lower}' deve ser um texto com tamanho máximo de {max}.", + "annotations_StringLengthMinimum": "O campo '{name|lower}' deve ser um texto com tamanho mínimo de {min} e no máximo de {max}.", + "apps.clients.idAlreadyExists": "Um cliente com o mesmo id já existe.", + "apps.contributors.cannotChangeYourself": "Você não pode mudar seu próprio papel.", + "apps.contributors.maxReached": "Alcançou o tamanho máximo de colaboradors disponiveis para o seu plano.", + "apps.contributors.onlyOneOwner": "Não é possível remover o unico dono.", + "apps.languages.fallbackNotFound": "App não tem uma língua de reserva '{fallback}'.", + "apps.languages.languageAlreadyAdded": "Linguagem foi adicionada.", + "apps.languages.masterLanguageNoFallbacks": "A linguagem principal não pode ter linguagens de reserva.", + "apps.languages.masterLanguageNotOptional": "A linguagem principal não pode ser feita opcional.", + "apps.languages.masterLanguageNotRemovable": "A linguagem principal não pode ser removida.", + "apps.maximumTotalReached": "Você não pode criar mais aplicativos. Entre em contato com o suporte para remover essa restrição da sua conta.", + "apps.nameAlreadyExists": "Já existe uma app com esse nome.", + "apps.notImage": "Ficheiro não é uma imagem", + "apps.plans.assignedToTeam": "Plano é gerido por uma equipa.", + "apps.plans.notFound": "Um plano com este id não existe.", + "apps.plans.notPlanOwner": "Plano só pode ser alterado pelo utilizador que configurou inicialmente.", + "apps.roles.defaultRoleNotRemovable": "Não pode remover o grupo pré definido.", + "apps.roles.defaultRoleNotUpdateable": "Não pode alterar o grupo pré definido.", + "apps.roles.nameAlreadyExists": "Um grupo com o mesmo nome já existe.", + "apps.roles.usedRoleByClientsNotRemovable": "Não pode remover grupo quando tem um cliente associado.", + "apps.roles.usedRoleByContributorsNotRemovable": "Nãopode remover o grupo quando tem um colaborador associado.", + "apps.transfer.planAssigned": "A inscrição deve ser cancelada antes que o aplicativo possa ser transferido.", + "apps.transfer.teamNotFound": "A equipa não existe.", + "assets.folderNotFound": "A pasta de ficheiros não existe.", + "assets.folderRecursion": "Não é possível adicionar pasta à sua própria criança.", + "assets.maxSizeReached": "Você alcançou o tamanho máximo de ficheiros.", + "assets.referenced": "Os ficheiros são referenciados por um conteúdo e não podem ser excluídos.", + "backups.alreadyRunning": "Já se encontra um processo de backup em processamento.", + "backups.maxReached": "Não pode ter mais de {max} backups.", + "backups.restoreRunning": "Um processamento de restauro já se encontra a correr.", + "comments.noPermissions": "Só pode aceder as suas notificações.", + "comments.notUserComment": "Comentário foi criado por outro utilizador.", + "common.action": "Acção", + "common.aspectHeight": "Altura aspecto", + "common.aspectWidth": "Largura aspecto", + "common.calculatedDefaultValue": "Calculado o valor por defeito", + "common.clientd": "ID do cliente", + "common.clientId": "ID do cliente", + "common.clientSecret": "Segredo do cliente", + "common.contentType": "Tipo conteúdo", + "common.contributorId": "ID or email do colaborador", + "common.critical": "Critico", + "common.data": "Data", + "common.defaultValue": "Valor por defeito", + "common.displayName": "Nome apresentação", + "common.documentation": "Documentação", + "common.editor": "Editor", + "common.email": "Email", + "common.errorNoPermission": "Você não tem a permissão necessária.", + "common.field": "Campo", + "common.fieldIds": "IDs de campo", + "common.fieldName": "Nome do campo", + "common.file": "Ficheiro", + "common.folderName": "Nome da pasta", + "common.fullTextNotSupported": "Cláusula de busca de consulta não suportada.", + "common.httpContentTypeNotDefined": "O tipo de conteúdo do ficheiro não está definido.", + "common.httpFileNameNotDefined": "O nome do ficheiro não é definido.", + "common.httpInvalidRequest": "O modelo não é válido.", + "common.httpInvalidRequestFormat": "Pedido corpo tem um formato inválido.", + "common.httpOnlyAsUser": "Não permitido para clientes.", + "common.httpValidationError": "Erros de validação", + "common.initialStep": "Passo Inicial", + "common.jsError": "Erro ao executar script javascript: {message}", + "common.jsNotAllowed": "Script proibiu a operação.", + "common.jsParseError": "Erro ao executar script javascript com erro de sintaxe: {message}", + "common.jsRejected": "Script rejeitou a operação.", + "common.language": "Código da língua", + "common.login": "Entrar", + "common.logout": "Sair", + "common.maxCharacters": "Caracteres máximos", + "common.maxHeight": "Altura Máx", + "common.maxItems": "Items Máx", + "common.maxLength": "Comprimento Máx", + "common.maxSize": "Tamanho Máx", + "common.maxValue": "Valor Máx", + "common.maxWidth": "Largura Máx", + "common.maxWords": "Palavras Máx", + "common.minCharacters": "Min characters", + "common.minHeight": "Altura Min", + "common.minItems": "Items Min", + "common.minLength": "Comprimento Min", + "common.minSize": "Tamanho Min", + "common.minValue": "Valor Min", + "common.minWidth": "Largura Min", + "common.minWords": "Palavras Min", + "common.name": "Nome", + "common.notFoundValue": "- não encontrado -", + "common.numDays": "Num dias", + "common.odataFailure": "Falha ao analisar consulta: {message}, para a consulta: {odata}", + "common.odataFilterNotValid": "OData $filter clausula é inválida: {message}", + "common.odataNotSupported": "OData operação não é suportada pela consulta: {odata}", + "common.odataSearchNotValid": "OData $search clausula é invalida: {message}", + "common.oldPassword": "Password antiga", + "common.other": "Outro", + "common.partitioning": "Particionamento", + "common.password": "Password", + "common.passwordConfirm": "Confirmar", + "common.pattern": "Padrão", + "common.permissions": "Permissões", + "common.planId": "ID Plano", + "common.previewUrls": "pre-visualizar URLs", + "common.product": "Squidex Headless CMS", + "common.properties": "Propriedades", + "common.property": "Propriedade", + "common.readonlyMode": "App está em modo de leitura de momento.", + "common.remove": "Remover", + "common.resultTooLarge": "Resultado é muito grande para poder ser retornado. Use o parametro $take para reduzir o numero de items.", + "common.role": "Grupo", + "common.save": "Gravar", + "common.schemaId": "ID Esquema", + "common.signup": "Registar", + "common.success": "Sucesso", + "common.text": "Texto", + "common.trigger": "Gatilho", + "common.warning": "Aviso", + "common.workflow": "Fluxo de trabalho", + "common.workflowStep": "Passo", + "common.workflowTransition": "Trancisão", + "contents.bulkInsertQueryNotUnique": "Mais do que um conteúdo corresponde à consulta.", + "contents.componentNotCreatable": "O conteúdo do componente não pode ser criado.", + "contents.draftNotCreateForUnpublished": "Só pode criar uma nova ver~sao quando o conteúdo estiver publicado.", + "contents.draftToDeleteNotFound": "Não existe nada para remover.", + "contents.invalidAllQuery": "Os IDs ou o intervalo de programação devem ser definidos.", + "contents.invalidArrayOfObjects": "Json type inválido, esperado uma lista of objectos.", + "contents.invalidArrayOfStrings": "Json type inválido, esperado uma lista de textos.", + "contents.invalidBoolean": "Json type inválido, esperado um booleano.", + "contents.invalidComponentNoObject": "Json object inválido, esperado um object com campo 'schemaId'.", + "contents.invalidComponentNoType": "Componente inválido. Nenhum campo 'schemaId' encontrado.", + "contents.invalidComponentUnknownSchema": "Componente inválido. Esquema não encontrado.", + "contents.invalidGeolocation": "Json type inválido, esperado object de latitude/longitude.", + "contents.invalidGeolocationLatitude": "Latitude deve estár entre -90 e 90.", + "contents.invalidGeolocationLongitude": "Longitude deve estár entre -180 e 180.", + "contents.invalidNumber": "Json type inválido, esperado número.", + "contents.invalidString": "Json type inválido, esperado texto.", + "contents.listReferences": "{count} Referencia(s)", + "contents.referenced": "O conteúdo é referenciado por outro conteúdo e não pode ser removido ou não publicado.", + "contents.schemaNotPublished": "Esquema não está publicada.", + "contents.singletonNotChangeable": "Conteúdo único não pode ser actualizado.", + "contents.singletonNotCreatable": "Conteúdo único não pode ser criado.", + "contents.singletonNotDeletable": "Conteúdo único não pode ser removido.", + "contents.statusNotValid": "Status não está definido no fluxo de trabalho.", + "contents.statusTransitionNotAllowed": "Não foi possível alterar o estado {oldStatus} para {newStatus}.", + "contents.validation.aspectRatio": "Deve ter a proporção {width}:{height}.", + "contents.validation.assetNotFound": "Id {id} não encontrado.", + "contents.validation.assetType": "Não pertence ao tipo permitido: {type}.", + "contents.validation.between": "Deve ter entre {min} e {max}.", + "contents.validation.characterCount": "Deve ter exatamente {count} caractere(es).", + "contents.validation.charactersBetween": "Deve ter entre {min} e {max} caractere(es).", + "contents.validation.duplicates": "Não pode ter duplicados.", + "contents.validation.error": "Validação falhou com um erro interno.", + "contents.validation.exactValue": "Deve ter exatamente {value}.", + "contents.validation.extension": "Extensão não é permitida.", + "contents.validation.invalid": "Valor inválido.", + "contents.validation.itemCount": "Deve ter exatamente {count} item(s).", + "contents.validation.itemCountBetween": "Deve ter exatamente {min} e {max} item(s).", + "contents.validation.max": "Deve ser igual ou menor que {max}.", + "contents.validation.maxCharacters": "Não pode ter mais que {max} caracter(s).", + "contents.validation.maximumHeight": "Altura {height}px deve ser menos que {max}px.", + "contents.validation.maximumSize": "Tamanho {size} deve ser menos que {max}.", + "contents.validation.maximumWidth": "Largura {width}px deve ser menos que {max}px.", + "contents.validation.maxItems": "Não pode ter mais que {max} item(s).", + "contents.validation.maxLength": "Não pode ter mais que {max} caracter(s).", + "contents.validation.maxWords": "Não pode ter mais que {max} palavras(s).", + "contents.validation.min": "Deve ser maior ou igual que {min}.", + "contents.validation.minimumHeight": "Altura {height}px deve ser maior que {min}px.", + "contents.validation.minimumSize": "Tamanho of {size} deve ser maior que {min}.", + "contents.validation.minimumWidth": "Largura {width}px deve ser maior que {min}px.", + "contents.validation.minItems": "Deve ter no mínimo {min} item(s).", + "contents.validation.minLength": "Deve ter no mínimo {min} caracter(s).", + "contents.validation.minNormalCharacters": "Deve ter no mínimo {min} caracter(s).", + "contents.validation.minWords": "Deve ter no mínimo {min} word(s).", + "contents.validation.mustBeEmpty": "Value must not be defined.", + "contents.validation.normalCharacterCount": "Deve ter exactamente {count} caracter(s).", + "contents.validation.normalCharactersBetween": "Deve ter entre {min} e {max} caracter(s).", + "contents.validation.notAllowed": "Valor não é permitido.", + "contents.validation.pattern": "Deve seguir o padrão.", + "contents.validation.referenceNotFound": "Referencia '{id}' não encontrada.", + "contents.validation.referenceToInvalidSchema": "Referencia '{id}' com esquema inválido.", + "contents.validation.regexTooSlow": "Regex demasiado lento.", + "contents.validation.required": "Campo obrigatório.", + "contents.validation.unique": "Já existe um conteúdo com o mesmo valor.", + "contents.validation.uniqueObjectValues": "Não pode conter items com campos duplicados '{field}'.", + "contents.validation.unknownField": "{fieldType} não conhecido.", + "contents.validation.wordCount": "Deve ter exatamente {count} palavra(s).", + "contents.validation.wordsBetween": "Deve ter entre {min} e {max} palavra(s).", + "contents.workflowErrorUpdate": "O fluxo de trabalho não permite actualizar o estado {status}", + "dotnet_identity_DefaultEror": "Um erro desconhecido ocorreu.", + "dotnet_identity_DuplicateEmail": "Email já existe.", + "dotnet_identity_DuplicateUserName": "Email já está registado noutro utilizador. Pode actualizar o seu login externo para a sua conta se for a sua página de perfil.", + "dotnet_identity_InvalidEmail": "Email é inválido.", + "dotnet_identity_InvalidUserName": "Nome de utilizador '{0}' é invlálido, só pode conter letras ou digitos.", + "dotnet_identity_LoginAlreadyAssociated": "Um utilizador com este login já existe.", + "dotnet_identity_PasswordMismatch": "Password incorrecta.", + "dotnet_identity_PasswordRequiresDigit": "Passwords devem ter um digito ('0'-'9').", + "dotnet_identity_PasswordRequiresLower": "Passwords devem ter um letra minusculo ('a'-'z').", + "dotnet_identity_PasswordRequiresNonAlphanumeric": "Passwords devem ter um caracter não alfa numerico.", + "dotnet_identity_PasswordRequiresUniqueChars": "Passwords deve ter no mínimo {0} caracteres diferentes.", + "dotnet_identity_PasswordRequiresUpper": "Passwords devem ter um caracter maiusculo ('A'-'Z').", + "dotnet_identity_PasswordTooShort": "Passwords é muito curta.", + "dotnet_identity_PwnedError": "Esta password já apareceu numa violação de dados e não deve ser usada. Se já usou antes nalgum lado, por favor altere!", + "dotnet_identity_UserLockedOut": "User está bloqueado.", + "exceptions.domainObjectConflict": "Entidade ({id}) já existe.", + "exceptions.domainObjectDeleted": "Entidade ({id}) foi removida.", + "exceptions.domainObjectNotFound": "Entidade ({id}) não existe.", + "exceptions.domainObjectVersion": "Entidade ({id}) versão {expectedVersion} não encontrada, mas sim {currentVersion}.", + "history.apps.assetScriptsConfigured": "Scripts de ficheiros actualizados", + "history.apps.clientAdded": "cliente {[Id]} adicionado na app", + "history.apps.clientRevoked": "cliente {[Id]} revogado ", + "history.apps.clientUpdated": "cliente {[Id]} actualizado", + "history.apps.contributoreAssigned": "associado {user:[Contributor]} a {[Role]}", + "history.apps.contributoreRemoved": "removido {user:[Contributor]} da app", + "history.apps.created": "app criada.", + "history.apps.imageRemoved": "imagem da app removida", + "history.apps.imageUploaded": "carregada nova imagem da app", + "history.apps.languagedAdded": "adicionada língua {[Language]}", + "history.apps.languagedRemoved": "removida língua {[Language]}", + "history.apps.languagedSetToMaster": "alterada a língua principal para {[Language]}", + "history.apps.languagedUpdated": "actualizada língua {[Language]}", + "history.apps.planChanged": "alterado o plano para {[Plan]}", + "history.apps.planReset": "plano redifinido", + "history.apps.roleAdded": "adicionado grupo {[Name]}", + "history.apps.roleDeleted": "removido grupo {[Name]}", + "history.apps.roleUpdated": "actualizado grupo {[Name]}", + "history.apps.settingsUpdated": "Configurações UI actualizadas", + "history.apps.transfered": "actualizada app ao cliente", + "history.apps.updated": "actualizadas configurações gerais", + "history.apps.workflowAdded": "adicionado fluxo de trabalho {[Name]}.", + "history.apps.workflowDeleted": "fluxo de trabalho removido.", + "history.apps.workflowUpdated": "fluxo de trabalho actualizado.", + "history.assets.replaced": "ficheiro substituido.", + "history.assets.updated": "ficheiro actualizado.", + "history.assets.uploaded": "ficheiro carregado.", + "history.contents.created": "conteúdo criado {[Schema]}.", + "history.contents.deleted": "conteúdo removido {[Schema]}.", + "history.contents.draftCreated": "creado novo rascunho.", + "history.contents.draftDeleted": "removido rascunho.", + "history.contents.scheduleCompleted": "marcada alteração de estado de {[Schema]} para {[Status]}.", + "history.contents.scheduleFailed": "erro ao marcar alteração de estado para conteúdo {[Schema]}.", + "history.contents.updated": "conteúdo {[Schema]} actualizado.", + "history.schemas.created": "esquema {[Name]} criado.", + "history.schemas.deleted": "esquema {[Name]} removido.", + "history.schemas.fieldAdded": "adicionado campo {[Field]} no esquema {[Name]}.", + "history.schemas.fieldDeleted": "removido campo {[Field]} do esquema {[Name]}.", + "history.schemas.fieldDisabled": "desabilitado campo {[Field]} no esquema {[Name]}.", + "history.schemas.fieldHidden": "tem campo {[Field]} escondido no esquema {[Name]}.", + "history.schemas.fieldLocked": "campo {[Field]} bloqueado no esquema {[Name]}.", + "history.schemas.fieldShown": "mostar campo {[Field]} no esquema {[Name]}.", + "history.schemas.fieldsReordered": "re-ordenar campos no esquema {[Name]}.", + "history.schemas.fieldUpdated": "campo {[Field]} actualizado no esquema {[Name]}.", + "history.schemas.published": "esquema publicado {[Name]}.", + "history.schemas.scriptsConfigured": "configurado script no esquema {[Name]}.", + "history.schemas.unpublished": "despublicado esquema {[Name]}.", + "history.schemas.updated": "esquema {[Name]} actualizado.", + "history.statusChanged": "alterado estado {[Schema]} para {[Status]}.", + "history.teams.contributoreAssigned": "associado {user:[Contributor]} ao {[Role]}.", + "history.teams.contributoreRemoved": "removido {user:[Contributor]} da equipa.", + "history.teams.created": "foi criada a equipa {[Name]}.", + "history.teams.planChanged": "alterado plano para {[Plan]}.", + "history.teams.planReset": "plano redifinido.", + "history.teams.updated": "actualizadas configurações gerais e renomeado para {[Name]}.", + "login.githubPrivateEmail": "O seu Email é privado no Github. Altere para publico no Github e tente novamente.", + "rules.ruleAlreadyRunning": "Outra regra já se encontra a correr.", + "schemas.dateTimeCalculatedDefaultAndDefaultError": "Valor por defeito calculado e valor por defeito não podem ser usado em conjunto.", + "schemas.duplicateFieldName": "Campo '{field}' foi adicionado em duplicado.", + "schemas.fieldCannotBeUIField": "Campo não pode ser um campo UI.", + "schemas.fieldIsLocked": "Campo do esquema está bloqueado.", + "schemas.fieldNameAlreadyExists": "Um campo com o mesmo nome já existe.", + "schemas.fieldNotInSchema": "CAmpo não é parte do esquema.", + "schemas.fieldsNotCovered": "Ids do campo não cobrem todos os campos.", + "schemas.nameAlreadyExists": "Um esquema com o mesmo nome já existe.", + "schemas.noPermission": "Não tem permissões para este esquema.", + "schemas.notFoundId": "Esquema {id} não existe.", + "schemas.number.inlineEditorError": "Não é permitido alteração em linha no Radio editor.", + "schemas.onlyArraysHaveNested": "So campos lista podem ter campos aninhados.", + "schemas.onylArraysInRoot": "Campo aninhado não pode ser lista de campos.", + "schemas.references.resolveError": "Só pode resolver uma referencia quando MaxItems é 1.", + "schemas.string.inlineEditorError": "Alteração em linha só é permitida em dropdowns, slugs e input fields.", + "schemas.stringEditorsNeedAllowedValuesError": "Radio buttons ou listas dropdown precisam de campos disponiveis.", + "schemas.tags.editorNeedsAllowedValues": "Checkboxes ou listas dropdown precisam de campos disponiveis.", + "schemas.uiFieldCannotBeDisabled": "Campo UI não pode ser desabilitado.", + "schemas.uiFieldCannotBeEnabled": "Campo UI não pode ser habilitado.", + "schemas.uiFieldCannotBeHidden": "Campo UI não pode ser escondido.", + "schemas.uiFieldCannotBeShown": "Campo UI não pode ser mostrado.", + "search.contentResult": "{name} conteúdos", + "search.contentsResult": "{name} conteúdos", + "search.schemaResult": "{name} Esquema", + "setup.createUser.button": "Criado utilizador", + "setup.createUser.confirmPassword": "Confirmar", + "setup.createUser.failure": "Nem autenticação por password or usando um provedor externo como o Google está configurado. Por favor verifique as suas configurações e logs.", + "setup.createUser.headline": "Administrator", + "setup.createUser.headlineCreate": "Criar administrador", + "setup.createUser.loginHint": "Configurou pelo menos um provedor de autenticação externo como o Google. Faça o login novamente para tornar-se administrador.", + "setup.createUser.loginLink": "Ir para login.", + "setup.createUser.separator": "OU", + "setup.headline": "Instalação", + "setup.hint": "Está a ver este ecrã porque não existe ainda nenhum utilizador. Depois de criar um utilizador, este setup fica desabilitado.", + "setup.madeBy": "Orgulhosamente feito por", + "setup.madeByCopyright": "Sebastian Stehle e Contribuintes, 2016-2022", + "setup.ruleAppCreation.warningAdmins": "Com a sua configuração, apenas administradores podem criar novas apps. Se pretende alterar, altere esta variavel de sistema UI__ONLYADMINSCANCREATEAPPS=false.", + "setup.ruleAppCreation.warningAll": "Com a sua configuração, qualquer utilizador pode criar apps. Se pretende alterar, altere esta variavel de sistema UI__ONLYADMINSCANCREATEAPPS=true.", + "setup.ruleFolder.warning": "Está a usar armazenamento de ficheiros onde todos ficheiros são gravados no sistema de ficheiros local. Por favor lembrar incluir a pasta de ficheiros dentro da sua estratégia de backup e mapear para um volume, se estiver a usar docker.", + "setup.ruleFtp.warning": "Está a usar armazenamento de ficheiros com FTP. Não é recomendado usar este tipo devido a problemas de performance.", + "setup.ruleHttps.failure": "Não está a aceder a este site via https. Se este aviso não está correcto então Squidex não pode detectar o modo https, provavelmente a sua instância está por tras de uma reverse proxy como nginx. Confirme que http headers are forwarded properly, via the X-Forwarded-* headers.", + "setup.ruleHttps.success": "Parabéns, está aceder Squidex por detrás de uma conexão segura (https).", + "setup.rules.headline": "Lista de verificação do sistema", + "setup.ruleTeamCreation.warningAdmins": "Com a sua configuração, apenas administradores podem criar novas equipas. Se pretende alterar, altere esta variavel de sistema UI__ONLYADMINSCANCREATETEAMS=false.", + "setup.ruleTeamCreation.warningAll": "Com a sua configuração, qualquer utilizador pode criar equipas. Se pretende alterar, altere esta variavel de sistema UI__ONLYADMINSCANCREATETEAMS=true.", + "setup.ruleUrl.failure": "Deve aceder ao Squidex so atraves de um URL canónico e configurar este URL na variavel de ambiente URLS__BASEURL. A base de URL actual {actual} não coincide com {configured}. Esta variavel deve apontar para um URL publico onde a sua instancia Squidex está disponível.", + "setup.ruleUrl.success": "Parabéns, a variavel de ambiente URLS__BASEURL environment está configurada correctamente. Esta variavel deve apontar para um URL publico no qual a sua instância de Suidex está disponível.", + "setup.title": "Instalação", + "users.accessDenied.text": "Operação não permitida, a sua conta pode estár bloqueada.", + "users.accessDenied.title": "Accesso bloqueado", + "users.consent.agree": "Eu concordo!", + "users.consent.cookiesHeadline": "Cookies & Analytics", + "users.consent.cookiesText": "

Entendo e concordo que o Squidex usa cookies para garantir que você obtenha a melhor experiência em nossa plataforma e para armazenar seu status de login..

Entendo e concordo que o Squidex integrou o Google Analytics (com a função de anonimizador). O Google Analytics é um serviço de análise da web para coletar e analisar dados sobre o comportamento dos utilizadors.

Eu aceito as politicas privadas.

", + "users.consent.emailHeadline": "E-Mailsa automáticos (opcional)", + "users.consent.emailText": "Entendo e concordo que o Squidex envia e-mails para me informar sobre novos ficheiros, alterações de última hora e tempos de inatividade.", + "users.consent.headline": "Nós precisamos do seu consentimento", + "users.consent.needed": "Voçê deve dar o seu consentimento.", + "users.consent.piiHeadline": "Informação pessoal", + "users.consent.piiText": "Entendo e concordo que o Squidex coleta as seguintes informações privadas que são recuperadas de provedores de autenticação externos, como Google, Microsoft ou Github.
  • Informações pessoais básicas (nome, sobrenome e foto) são fornecidas a todos os outros utilizadors para que possam adicioná-lo ao seu espaço de trabalho.
  • A qualquer momento, você tem a opção de alterar essas informações para anonimizar sua conta.
  • Sua conta de utilizador tem um identificador exclusivo e, para todas as suas alterações, rastreamos que você fez essas alterações e forneceu essas informações a outros utilizadors.
", + "users.consent.title": "Consentimento", + "users.deleteYourselfError": "Não pode remover a si proprio.", + "users.error.headline": "Operação falhada", + "users.error.text": "Pedimos desculpa mas aconteceu algo de errado.", + "users.error.title": "Erro", + "users.errorHappened": "Ocorreu uma exceção inesperada.", + "users.lockedOutText": "Sua conta está bloqueada, entre em contato com o administrador.", + "users.lockedOutTitle": "Conta bloqueada", + "users.lockYourselfError": "Você não pode se trancar.", + "users.login.askAdmin": "", + "users.login.emailPlaceholder": "Introduzir Email", + "users.login.error": "Email ou password incorrecta", + "users.login.loginWith": "{action} com {provider}", + "users.login.noAccountLoginAction": "Carregue aqui para entrar", + "users.login.noAccountLoginQuestion": "Já registado?", + "users.login.noAccountSignupAction": "Carregue aqui para registar", + "users.login.noAccountSignupQuestion": "Sem conta?", + "users.login.passwordPlaceholder": "Introduzir Password", + "users.login.separator": "OU", + "users.logout.headline": "Desconectado!", + "users.logout.text": "!Por favor feche a janela.", + "users.logout.title": "Sair", + "users.noEmailAddress": "Não podemos obter o endereço de e-mail do provedor de autenticação.", + "users.profile.addLoginDone": "Login adicionado com sucesso.", + "users.profile.changePassword": "Alterar Password", + "users.profile.changePasswordDone": "Password alterada com sucesso.", + "users.profile.clientHint": "Use as credenciais do cliente para acessar a API com suas informações de perfil e permissões", + "users.profile.clientTitle": "cliente", + "users.profile.confirmPassword": "Confirmar", + "users.profile.generateClient": "Gerar", + "users.profile.generateClientDone": "Segredo do cliente gerado com sucesso.", + "users.profile.headline": "Editar perfil", + "users.profile.hideProfile": "Não mostre o seu perfil a outros", + "users.profile.loginsTitle": "Logins", + "users.profile.passwordTitle": "Password", + "users.profile.pii": "Informação pessoal", + "users.profile.propertiesHint": "Use propriedades personalizadas para regras e scripts.", + "users.profile.propertiesTitle": "Properiedades", + "users.profile.propertyAdd": "Adicionar propriedade", + "users.profile.removeLoginDone": "Provedor de login removido com sucesso.", + "users.profile.setPassword": "Set Password", + "users.profile.setPasswordDone": "Password configurada com sucesso.", + "users.profile.title": "Perfil", + "users.profile.updateProfileDone": "Conta atualizada com sucesso.", + "users.profile.updatePropertiesDone": "Conta atualizada com sucesso.", + "users.profile.uploadPicture": "Carregar foto", + "users.profile.uploadPictureDone": "Foto carregada com sucesso.", + "users.unlockYourselfError": "Você não pode desbloquear a si mesmo.", + "users.userLocked": "O usuário não tem permissão para fazer login.", + "users.userNotFound": "Não foi possível encontrar o utilizador.", + "validation.between": "{property|upper} deve estar entre {min} e {max}.", + "validation.greaterEqualsThan": "{property|upper} deve ser maior ou igual {other|lower}.", + "validation.greaterThan": "{property|upper} deve ser maior que {other|lower}.", + "validation.javascriptProperty": "{property|upper} não é um nome de propriedade Javascript.", + "validation.lessEqualsThan": "{property|upper} deve ser menor ou igual {other|lower}.", + "validation.lessThan": "{property|upper} deve ser menor que {other|lower}.", + "validation.notAnImage": "A imagem não é uma imagem válida.", + "validation.notAnValidSvg": "O SVG é malicioso e contém tags de script.", + "validation.onlyOneFile": "Só pode carregar um ficheiro.", + "validation.required": "{property|upper} é obrigatório.", + "validation.requiredBoth": "Se {property1|lower} ou {property2|lower} são utilizador ambos têm de ser definidos.", + "validation.requiredValue": "O valor deve ser definido.", + "validation.slug": "{property|upper} não é um slug válido.", + "validation.valid": "{property|upper} não é um valor válido.", + "workflows.overlap": "Múltiplos fluxos de trabalho cobrem todos os esquemas.", + "workflows.publishedIsInitial": "A etapa inicial não pode ser a etapa publicada.", + "workflows.publishedNotDefined": "O fluxo de trabalho deve ter uma etapa publicada.", + "workflows.publishedStepNotFound": "A transição tem um destino inválido.", + "workflows.schemaOverlap": "O esquema '{schema}' é coberto por vários fluxos de trabalho." +} \ No newline at end of file diff --git a/backend/i18n/source/frontend_pt.json b/backend/i18n/source/frontend_pt.json new file mode 100644 index 000000000..93256083b --- /dev/null +++ b/backend/i18n/source/frontend_pt.json @@ -0,0 +1,1111 @@ +{ + "api.contentApi": "API de conteúdo", + "api.generalApi": "API Geral", + "api.graphql": "GraphQL", + "api.graphqlPageTitle": "GraphQL", + "api.pageTitle": "API", + "api.title": "API", + "apps.allApps": "Todas as aplicações", + "apps.allTeams": "Todas as Equipas", + "apps.appLoadFailed": "Falha na aplicação. Por favor, recarregue.", + "apps.appNameHint": "Só pode utilizar letras, números e traços e não mais de 40 caracteres.", + "apps.appNameValidationMessage": "O nome pode conter letras minúsculas (a-z), números e traços entre.", + "apps.appNameWarning": "O nome da aplicação não pode ser alterado mais tarde.", + "apps.appsButtonCreate": "Criar App", + "apps.appsButtonCreateTeam": "Criar Equipa", + "apps.appsButtonFallbackTitle": "Apps e Equipas", + "apps.archiveFailed": "Falhou em arquivar a aplicação.", + "apps.create": "Criar App", + "apps.createBlankApp": "Nova App", + "apps.createBlankAppDescription": "Crie uma nova aplicação em branco sem conteúdo e esquemas.", + "apps.createFailed": "Falha na criação da aplicação. Por favor recarregue.", + "apps.createWithTemplate": "Criar {template} Amostra", + "apps.delete": "Excluir App", + "apps.deleteConfirmText": "Deseja mesmo eliminar esta aplicação?", + "apps.deleteConfirmTitle": "Eu entendo. Apagar a minha App", + "apps.deleteWarning": "Uma vez que apague uma aplicação, não há volta a dar. Todos os seus dados serão eliminados em segundo plano.", + "apps.empty": "Ainda não está a colaborar em nenhuma aplicação.", + "apps.generalSettings": "Geral", + "apps.generalSettingsDangerZone": "Zona de Perigo", + "apps.image": "Imagem", + "apps.imageDrop": "Deixe para carregar", + "apps.leave": "Deixar aplicativo", + "apps.leaveConfirmText": "Quer mesmo deixar esta aplicação?", + "apps.leaveConfirmTitle": "Deixe o aplicativo.", + "apps.leaveFailed": "Falha em deixar a aplicação. Por favor recarregue.", + "apps.listPageTitle": "Aplicativos", + "apps.loadAssetScriptsFailed": "Falhou em carregar scripts de ativos. Por favor, recarregue.", + "apps.loadFailed": "Falha na carga de apps. Por favor recarregue.", + "apps.loadSettingsFailed": "Falhou na atualização das definições de UI. Por favor, recarregue.", + "apps.removeImage": "Remover imagem", + "apps.removeImageFailed": "Falhou na remoção da imagem da aplicação. Por favor, recarregue.", + "apps.transfer": "Transferência", + "apps.transferFailed": "Falhou na transferência da aplicação. Por favor recarregue.", + "apps.transferTitle": "Transferência para a equipa", + "apps.transferWarning": "As equipas são usadas para partilhar subscrições.", + "apps.updateAssetScriptsFailed": "Falhou na atualização dos scripts de ativos. Por favor, recarregue.", + "apps.updateFailed": "Falha na atualização da aplicação. Por favor recarregue.", + "apps.updateSettingsFailed": "Falhou na atualização das definições de UI. Por favor, recarregue.", + "apps.uploadImage": "Deixe cair um ficheiro para substituir a imagem da aplicação. Use um tamanho quadrado.", + "apps.uploadImageButton": "Ficheiro upload", + "apps.uploadImageFailed": "Falhou em carregar a imagem. Por favor, recarregue.", + "apps.uploadImageTooBig": "A imagem da aplicação é muito grande.", + "apps.welcomeSubtitle": "Bem-vindo a Squidex.", + "apps.welcomeTitle": "Hi {user}", + "appSettings.editors.deleteConfirmText": "Deseja mesmo remover este URL do Editor?", + "appSettings.editors.deleteConfirmTitle": "Excluir URL do editor", + "appSettings.editors.description": "Gerencie os URLs para os editores personalizados para usá-los no designer de esquemas.", + "appSettings.editors.empty": "Nenhuma URL editor criada ainda.", + "appSettings.editors.title": "Editores Personalizados", + "appSettings.hideScheduler": "Ocultar diálogo para publicação programada", + "appSettings.patterns.deleteConfirmText": "Quer mesmo remover este padrão?", + "appSettings.patterns.deleteConfirmTitle": "Eliminar padrão", + "appSettings.patterns.description": "Os padrões são expressões regulares reutilizáveis para validação do campo de cordas.", + "appSettings.patterns.empty": "Nenhum padrão criado ainda.", + "appSettings.patterns.title": "Padrões", + "appSettings.refreshTooltip": "Atualizar configurações do UI", + "appSettings.reloaded": "Definições de UI recarregadas.", + "appSettings.title": "Definições de UI", + "assets.createFolder": "Criar Pasta", + "assets.createFolderFailed": "Falhou na criação de uma pasta de ficheiros. Por favor, recarregue.", + "assets.createFolderTooltip": "Criar nova pasta", + "assets.deleteConfirmText": "Quer mesmo apagar o ficheiro?", + "assets.deleteConfirmTitle": "Excluir o ficheiro", + "assets.deleteFailed": "Falhou em apagar o ficheiro. Por favor, recarregue.", + "assets.deleteFolderConfirmText": "Deseja mesmo eliminar a pasta e todos os ficheiros?", + "assets.deleteFolderConfirmTitle": "Eliminar pasta", + "assets.deleteMetadataConfirmText": "Quer mesmo remover estes metadados?", + "assets.deleteMetadataConfirmTitle": "Remover metadados", + "assets.deleteReferrerConfirmText": "O ficheiro é referenciado por um item de conteúdo.\n\nQuer mesmo apagar o ficheiro?", + "assets.deleteReferrerConfirmTitle": "Excluir o ficheiro", + "assets.downloadVersion": "Descarregue esta versão", + "assets.dropToUpdate": "Deixar para atualizar", + "assets.duplicateFile": "O ficheiro já foi carregado.", + "assets.edit": "Edição de ficheiros", + "assets.editor.flipHorizontally": "Virar horizontalmente", + "assets.editor.flipVertically": "Virar verticalmente", + "assets.editor.focusPointLabel": "Selecione posição do ponto de foco", + "assets.editor.focusPointPreview": "Pré-visualização para diferentes tamanhos", + "assets.editor.rotateLeft": "Girar à esquerda", + "assets.editor.rotateRight": "Girar à direita", + "assets.fileTooBig": "O ficheiro é muito grande.", + "assets.folderName": "Nome da pasta", + "assets.folderNameHint": "O nome da pasta é usado como nome de visor e pode não ser único.", + "assets.linkSelected": "Link ficheiros selecionados ({count})", + "assets.listPageTitle": "Ficheiros", + "assets.loadFailed": "Falhou em carregar os items. Por favor, recarregue.", + "assets.loadFoldersFailed": "Falhou em carregar pastas de ficheiros. Por favor, recarregue.", + "assets.loadTagsFailed": "Falhou em carregar etiquetas. Por favor, recarregue.", + "assets.metadata": "Metadados", + "assets.metadataAdd": "Adicionar metadados", + "assets.moveFailed": "Falha ao mover ficheiro. Por favor, recarregue.", + "assets.protected": "Protegido", + "assets.protectedHint": "Os ativos são públicos por defeito. Todos com o link podem descarregar o ficheiro. Se fizer um ficheiro protegido, apenas utilizadores autenticados (normalmente um cliente) podem descarregar o ficheiro.", + "assets.refreshTooltip": "Atualizar ficheiros", + "assets.reloaded": "Bens recarregados.", + "assets.removeConfirmText": "Quer mesmo remover o ficheiro?", + "assets.removeConfirmTitle": "Remover o ficheiro", + "assets.renameFolder": "Pasta de renome", + "assets.renameTagFailed": "Falhou em mudar o nome da etiqueta. Por favor, recarregue.", + "assets.replaceConfirmText": "Quer mesmo substituir o ativo por uma versão mais recente", + "assets.replaceConfirmTitle": "Substituir o ficheiro?", + "assets.replaceFailed": "Falhou em substituir o ficheiro. Por favor, recarregue.", + "assets.searchByName": "Pesquisar pelo nome", + "assets.searchByTags": "Pesquisar por tags", + "assets.selectMany": "Selecione ficheiros", + "assets.specialFolder.parent": "", + "assets.specialFolder.root": "", + "assets.tabFocusPoint": "Ponto de foco", + "assets.tabHistory": "História", + "assets.tabImage": "Imagem", + "assets.tabMetadata": "Metadados", + "assets.tabPreview": "Previsualizar", + "assets.tabTextEditor": "Editor de Texto", + "assets.updated": "O ficheiro foi atualizado.", + "assets.updateFailed": "Falhou na atualização do ficheiro. Por favor, recarregue.", + "assets.updateFolderFailed": "Falhou na atualização da pasta de ficheiros. Por favor, recarregue.", + "assets.uploadByDialog": "Selecione Arquivo(s)", + "assets.uploadByDrop": "Deixe cair ficheiros aqui para carregar", + "assets.uploaderUploadHere": "Sem upload em andamento, deixe cair os ficheiros aqui.", + "assets.uploadFailed": "Falhou no upload do ficheiro. Por favor, recarregue.", + "assets.uploadHint": "Deixe cair o ficheiro no item existente para substituir o ficheiro por uma versão mais recente.", + "assetScripts.reloaded": "Scripts de ficheiros recarregados.", + "backups.backupCountAssetsLabel": "Ficheiros", + "backups.backupCountAssetsTooltip": "Ficheiros arquivados", + "backups.backupCountEventsLabel": "Eventos", + "backups.backupCountEventsTooltip": "Eventos arquivados", + "backups.backupDownload": "Baixar", + "backups.backupDownloadLink": "Pronto", + "backups.backupDuration": "Duração", + "backups.deleteConfirmText": "Quer mesmo apagar a cópia de segurança?", + "backups.deleteConfirmTitle": "Eliminar backup", + "backups.deleted": "A cópia de segurança está prestes a ser apagada.", + "backups.deleteFailed": "Falhou em eliminar a cópia de segurança.", + "backups.empty": "Ainda não foram criados reforços.", + "backups.loadFailed": "Falhou em carregar backups.", + "backups.maximumReached": "Atingiu o número máximo de reforços: 10.", + "backups.refreshTooltip": "Atualizar backups", + "backups.reloaded": "Reforços recarregados.", + "backups.restore": "Restaurar backup", + "backups.restoreFailed": "Falhou em começar a restaurar.", + "backups.restoreLastStatus": "Última Operação De Restauro", + "backups.restoreLastUrl": "Url para backup", + "backups.restoreNewAppName": "Nome de aplicativo opcional", + "backups.restorePageTitle": "Restaurar backup", + "backups.restoreStarted": "A restauração começou, pode levar vários minutos para ser concluída.", + "backups.restoreStartedLabel": "Começou", + "backups.restoreStoppedLabel": "Parado", + "backups.restoreTitle": "Restaurar backup", + "backups.start": "Iniciar backup", + "backups.started": "O reforço começou, pode levar vários minutos para ser concluído.", + "backups.startedLabel": "Começou", + "backups.startFailed": "Falhou em começar o backup.", + "clients.add": "Adicionar Cliente", + "clients.add.description": "Adicione um cliente para dar a outras aplicações acesso ao seu conteúdo.", + "clients.add.title": "Adicionar um novo Cliente", + "clients.addFailed": "Falhou em adicionar cliente. Por favor, recarregue.", + "clients.allowAnonymous": "Permitir acesso anónimo.", + "clients.allowAnonymousHint": "Permitir o acesso à API sem acesso a todos os ficheiros configurados através do grupo deste cliente. Não dê mais do que um cliente acesso anónimo.", + "clients.apiCallsLimit": "Chamadas Max API", + "clients.apiCallsLimitHint": "Limite o número de chamadas API que este cliente pode fazer por mês para proteger o seu contingente API para outros clientes que são mais importantes.", + "clients.clientIdValidationMessage": "O nome só pode conter letras, números e traços.", + "clients.clientNamePlaceholder": "Insira o nome do cliente", + "clients.connect": "Ligar", + "clients.connectWizard.cli": "Conecte-se com Squidex CLI", + "clients.connectWizard.cliHint": "Descarregue o CLI e ligue-se a esta aplicação para iniciar backups, esquemas de sincronização ou conteúdo de exportação.", + "clients.connectWizard.cliStep1": "Obtenha o mais recente Squidex CLI", + "clients.connectWizard.cliStep1Download": "[Descarregue o CLI de Github] (https://github.com/Squidex/squidex-samples/releases)", + "clients.connectWizard.cliStep1Hint": "As versões contêm binários para todos os principais sistemas de funcionamento e um pequeno download se tiver instalado o .NET Core.", + "clients.connectWizard.cliStep2": "Adicione '' à sua variável '$PATH'", + "clients.connectWizard.cliStep3": "Adicione o nome da sua aplicação ao CLI config", + "clients.connectWizard.cliStep3Hint": "Pode gerir a configuração de várias aplicações no CLI e mudar para uma aplicação.", + "clients.connectWizard.cliStep4": "Mude para a sua aplicação no CLI", + "clients.connectWizard.manually": "Conecte-se manualmente", + "clients.connectWizard.manuallyHint": "Obtenha instruções sobre como estabelecer uma ligação com o Carteiro ou o caracol.", + "clients.connectWizard.manuallyStep1": "Obter um símbolo usando caracóis", + "clients.connectWizard.manuallyStep2": "Basta usar o seguinte token", + "clients.connectWizard.manuallyStep3": "Adicione o token como cabeçalho HTTP a todos os pedidos", + "clients.connectWizard.manuallyTokenHint": "Tokens normalmente expiram após 30 dias, mas você pode solicitar várias tokens.", + "clients.connectWizard.postManDocs": "Comece com o tutorial do Carteiro na [Documentação](https://docs.squidex.io/02-documentation/developer-guides/api-overview/postman).", + "clients.connectWizard.sdk": "Conecte-se à sua App com a SDK", + "clients.connectWizard.sdkHelp": "Precisa de outro SDK?", + "clients.connectWizard.sdkHelpLink": "Contacte-nos no Fórum de Apoio", + "clients.connectWizard.sdkHint": "Descarregue um SDK e estabeleça uma ligação a esta aplicação.", + "clients.connectWizard.sdkStep1": "Instale o .NET SDK", + "clients.connectWizard.sdkStep1Download": "O SDK está disponível em [nuget](https://www.nuget.org/packages/Squidex.ClientLibrary/)", + "clients.connectWizard.sdkStep2": "Criar um gestor de clientes", + "clients.connectWizard.step0Title": "Cliente de configuração", + "clients.connectWizard.step1Title": "Escolha o método de ligação", + "clients.connectWizard.step2Title": "Ligar", + "clients.deleteConfirmText": "Quer mesmo revogar o cliente?", + "clients.deleteConfirmTitle": "Revogar cliente", + "clients.empty": "Nenhum cliente foi criado ainda.", + "clients.loadFailed": "Falhou em carregar clientes. Por favor, recarregue.", + "clients.refreshTooltip": "Atualizar clientes", + "clients.reloaded": "Clientes recarregados.", + "clients.revokeFailed": "Falhou em revogar o cliente. Por favor, recarregue.", + "clients.tokenFailed": "Falhou em criar um símbolo. Por favor, reda o redando.", + "comments.create": "Criar um comentário", + "comments.createFailed": "Falhou em criar comentários.", + "comments.deleteConfirmText": "Quer mesmo apagar o comentário?", + "comments.deleteConfirmTitle": "Apagar comentário", + "comments.deleteFailed": "Não eliminou comentários.", + "comments.follow": "Seguir", + "comments.loadFailed": "Falhou em carregar comentários.", + "comments.title": "Comentários", + "comments.updateFailed": "Falhou em atualizar comentários.", + "common.actions": "Ações", + "common.administration": "Administração", + "common.administrationPageTitle": "Administração", + "common.api": "API", + "common.apps": "Aplicativos", + "common.aspectRatio": "AspectRatio", + "common.assets": "Ficheiros", + "common.assetScripts": "Scripts de ficheiros", + "common.back": "Voltar", + "common.backendError": "Erro de backend", + "common.backups": "Backups", + "common.bookmarks": "Marcadores", + "common.bytes": "bytes", + "common.cancel": "Cancelar", + "common.cancelAll": "cancelar todos", + "common.category": "Categorias", + "common.clear": "Claro", + "common.clientId": "ID do cliente", + "common.clients": "Clientes", + "common.clientSecret": "Segredo do Cliente", + "common.clipboardAdded": "O valor foi adicionado à sua área de transferência.", + "common.clone": "Clone", + "common.cluster": "Cluster", + "common.clusterPageTitle": "Cluster", + "common.comments": "Comentários", + "common.components": "Componentes", + "common.condition": "Condição", + "common.conditions": "Condições", + "common.confirm": "Confirmar", + "common.consumers": "Consumidores", + "common.content": "Conteúdo", + "common.contents": "Conteúdo", + "common.continue": "Continuar", + "common.contributors": "Contribuintes", + "common.copy": "Cópia", + "common.create": "Criar", + "common.created": "Criado", + "common.daily": "Diariamente", + "common.dashboard": "Painel de instrumentos", + "common.date": "Data", + "common.dateTimeEditor.local": "Local", + "common.dateTimeEditor.now": "Agora,", + "common.dateTimeEditor.nowTooltip": "Use agora (UTC)", + "common.dateTimeEditor.today": "Hoje", + "common.dateTimeEditor.todayTooltip": "Usar hoje (UTC)", + "common.dateTimeEditor.utc": "UTC", + "common.delete": "Excluir", + "common.description": "Descrição", + "common.designer": "Designer", + "common.details": "Detalhes", + "common.disable": "Desativar", + "common.disabled": "Deficientes", + "common.displayName": "Nome do visor", + "common.documentation": "Documentação", + "common.edit": "Editar", + "common.editing": "Edição", + "common.email": "Email", + "common.empty": "Sem resultados.", + "common.enable": "Ativar", + "common.enabled": "Habilidoso", + "common.error": "Erro", + "common.errorBack": "De volta à página anterior.", + "common.errorNoPermission": "Não tem as permissões para fazer isto.", + "common.errorNotFound": "Não encontrado", + "common.event": "Evento", + "common.events": "Eventos", + "common.executed": "Executado", + "common.expertMode": "Modo Especialista", + "common.extension": "Extensão", + "common.failed": "Falhou", + "common.fallback": "Recuo", + "common.field": "Campo", + "common.files": "Ficheiros", + "common.filters": "Filtros", + "common.folder": "Pasta", + "common.folders": "Pastas", + "common.from": "De", + "common.generalSettings": "Comun", + "common.generate": "Gerar", + "common.github": "Rio Github", + "common.height": "Altura", + "common.help": "Ajuda", + "common.helpTour": "Clique no ícone de ajuda para mostrar uma página de ajuda específica de contexto. Ir para", + "common.hide": "Esconder", + "common.hints": "Dicas", + "common.history": "História", + "common.httpConflict": "Falhou em fazer a atualização. Outro utilizador fez uma mudança. Por favor, recarregue.", + "common.httpLimit": "Excedeu o limite máximo de chamadas da API.", + "common.id": "Identidade", + "common.in": "in", + "common.label": "Etiqueta", + "common.language": "Língua", + "common.languages": "Línguas", + "common.lastExecuted": "Última execução", + "common.latitudeShort": "Anos", + "common.loading": "Carregamento", + "common.loadMore": "Carregar mais", + "common.logout": "Logout", + "common.logs": "Troncos", + "common.longitudeShort": "Lon", + "common.mapHide": "Mapa escondido", + "common.mapShow": "Mapa apresentação", + "common.message": "Mensagem", + "common.monthly": "Mensal", + "common.more": "Mais", + "common.name": "Nome", + "common.no": "Não", + "common.nothingChanged": "Nada foi mudado.", + "common.notSupported": "Não suportado", + "common.noValue": "- Sem valor -", + "common.openAPI": "Open API", + "common.or": "ou", + "common.pagerInfo": "{itemFirst}-{itemLast} de {numberOfItems}", + "common.pagerInfoNoTotal": "{itemFirst}-{itemLast} do total?", + "common.pagerReload": "Clique para recarregar a vista e obter o número total de itens", + "common.password": "Password", + "common.passwordConfirm": "Confirmar Password", + "common.pattern": "Padrão", + "common.patterns": "Padrões", + "common.permissions": "Permissões", + "common.preview": "Previsualizar", + "common.product": "CMS Headless Squidex", + "common.project": "Projeto", + "common.queryOperators.contains": "contém", + "common.queryOperators.empty": "está vazio", + "common.queryOperators.endsWith": "termina com", + "common.queryOperators.eq": "é igual a", + "common.queryOperators.exists": "existe", + "common.queryOperators.ge": "é maior ou igual a", + "common.queryOperators.gt": "é maior do que", + "common.queryOperators.le": "é menos ou igual a", + "common.queryOperators.lt": "é menos do que", + "common.queryOperators.matchs": "combina com", + "common.queryOperators.ne": "não é igual a", + "common.queryOperators.startsWith": "começa com", + "common.refresh": "Refrescar", + "common.remember": "Não pergunte de novo.", + "common.rename": "Renomear", + "common.renameTag": "Renomear Etiqueta", + "common.requiredHint": "Necessário", + "common.reset": "Reset", + "common.restore": "Restaurar", + "common.role": "Grupo", + "common.roles": "Grupos", + "common.rule": "Regra", + "common.rules": "Regras", + "common.sampleCodeLabel": "Código de amostra em", + "common.save": "Salvar", + "common.schema": "Esquema", + "common.schemas": "Esquemas", + "common.search": "Pesquisar", + "common.searchGoogleMaps": "Pesquisar Google Maps", + "common.searchResults": "Resultados da pesquisa", + "common.security": "Segurança", + "common.separateByLine": "Separar por linha", + "common.settings": "Configurções", + "common.sidebar": "Sidebar Extension", + "common.sidebarTour": "A navegação da barra lateral contém ligações específicas de contexto úteis. Aqui pode ver a história de como este esquema mudou ao longo do tempo.", + "common.skipped": "Ignorado", + "common.slug": "slug", + "common.stars.max": "Não deve ter mais de 15 estrelas", + "common.status": "Estado", + "common.statusChangeTo": "Mudar para", + "common.submit": "Enviar", + "common.subscription": "Assinatura", + "common.succeeded": "Conseguiu", + "common.tagAdd": ", para adicionar tag", + "common.tagAddReference": ", para adicionar referência", + "common.tagAddSchema": ", para adicionar esquema", + "common.tags": "Etiquetas", + "common.tagsAll": "Todas as etiquetas", + "common.teams": "Equipas", + "common.templates": "Modelos", + "common.time": "Hora", + "common.to": "Para", + "common.update": "Atualização", + "common.upload": "Upload", + "common.url": "URL", + "common.users": "Utilizadores", + "common.value": "Valor", + "common.weekly": "Semanal", + "common.width": "Largura", + "common.workflow": "Fluxo de trabalho", + "common.workflows": "Fluxos de trabalho", + "common.yes": "Sim", + "contents.addComponent": "Adicionar componente", + "contents.arrayAddItem": "Adicionar item", + "contents.arrayClear": "Limpar", + "contents.arrayClearConfirmText": "Quer mesmo limpar a matriz?", + "contents.arrayClearConfirmTitle": "Matriz clara", + "contents.arrayCloneItem": "Clone este item", + "contents.arrayCollapseAll": "Destrua todos os itens", + "contents.arrayCollapseItem": "Destrua este item", + "contents.arrayExpandAll": "Expandir todos os itens", + "contents.arrayExpandItem": "Expandir este item", + "contents.arrayMoveBottom": "Mova este item para o fundo", + "contents.arrayMoveDown": "Mova este item para baixo", + "contents.arrayMoveTop": "Mova este item para cima", + "contents.arrayMoveUp": "Mova este item para cima", + "contents.arrayNoFields": "Adicione primeiro um campo aninhado para adicionar itens.", + "contents.assetsUpload": "Deixe cair ficheiros ou clique", + "contents.autotranslate": "Transtração automática da linguagem mestra", + "contents.bulkFailed": "Falhou em eliminar ou atualizar o conteúdo. Por favor, recarregue.", + "contents.calendar": "Conteúdo Agendado", + "contents.cancelStatus": "Cancelar estado agendado", + "contents.cancelStatusConfirmText": "Deseja mesmo cancelar a atualização do estado agendada?", + "contents.cancelStatusConfirmTitle": "Cancelar estado agendado", + "contents.changeStatusTo": "Alterar o(s) item de conteúdo para {action}", + "contents.changeStatusToImmediately": "Desa um conjunto de {action} imediatamente.", + "contents.changeStatusToLater": "Definir para {action} numa data e hora posteriores.", + "contents.componentInvalid": "Componente inválido, o esquema foi eliminado.", + "contents.componentNoSchema": "Adicione pelo menos um esquema para definir o componente.", + "contents.componentsNoSchema": "Adicione pelo menos um esquema para adicionar componentes.", + "contents.contentNotValid": "Elemento de conteúdo não válido, verifique o campo com a barra vermelha à esquerda em todos os idiomas (se for lobrelável).", + "contents.contentTab.editor": "Editor", + "contents.contentTab.inspect": "Inspecione", + "contents.contentTab.references": "Referências", + "contents.contentTab.referencing": "Referenciação", + "contents.create": "Novo", + "contents.createContentTooltip": "Novos Conteúdos", + "contents.created": "Conteúdo criado com sucesso.", + "contents.createFailed": "Falhou em criar conteúdo. Por favor, recarregue.", + "contents.createPageTitle": "Criar Conteúdo", + "contents.createTitle": "Novos Conteúdos", + "contents.currentStatusLabel": "Versão atual", + "contents.deleteConfirmText": "Deseja mesmo apagar o conteúdo?", + "contents.deleteConfirmTitle": "Eliminar conteúdo", + "contents.deleteManyConfirmText": "Deseja mesmo eliminar os itens de conteúdo selecionados?", + "contents.deleteReferrerConfirmText": "O conteúdo é referenciado por outro item de conteúdo.\n\nDeseja mesmo eliminar este conteúdo?", + "contents.deleteReferrerConfirmTitle": "Eliminar conteúdo", + "contents.deleteVersionConfirmText": "Deseja mesmo eliminar esta versão?", + "contents.deleteVersionFailed": "Falhou em apagar a versão. Por favor, recarregue.", + "contents.draftNew": "Novo Esboço", + "contents.draftStatus": "Nova versão", + "contents.editPageTitle": "Editar Conteúdo", + "contents.fieldFullscreen": "Concentre-se neste campo e altere o modo de ecrã completo.", + "contents.idPlaceholder": "Defina um ID personalizado ou deixe vazio para permitir que o Squidex gere um.", + "contents.inspectContent": "Conteúdo", + "contents.inspectData": "Dados", + "contents.inspectFlatData": "Dados Planos", + "contents.languageModeAll": "Todas as Línguas", + "contents.languageModeSingle": "Língua única", + "contents.lastUpdatedLabel": "Última Atualização", + "contents.loadContent": "Carga", + "contents.loadContentFailed": "Falhou em carregar o conteúdo. Por favor, recarregue.", + "contents.loadDataFailed": "Falhou em carregar dados. Por favor, recarregue.", + "contents.loadFailed": "Falhou em carregar o conteúdo. Por favor, recarregue.", + "contents.loadVersionFailed": "Falhou em carregar uma nova versão. Por favor, recarregue.", + "contents.noReference": "- Sem referência -", + "contents.noReferences": "Este conteúdo não tem referências.", + "contents.noReferencing": "Este conteúdo não é referenciado por outro item.", + "contents.pendingChangesTextToChange": "Tem mudanças não salvas.\n\nQuando mudar o estado, vai perdê-los.\n\n**Você quer continuar de qualquer maneira?**", + "contents.pendingChangesTextToClose": "Tem mudanças não salvas.\n\nQuando fechar a visualização de conteúdo atual, irá perdê-los.\n\n**Você quer continuar de qualquer maneira?**", + "contents.pendingChangesTextToPreview": "Tem mudanças não salvas.\n\nNão os verá na pré-estreia.\n\n**Você quer continuar de qualquer maneira?**", + "contents.pendingChangesTitle": "Alterações não salvas", + "contents.publishAll": "Publicar Tudo", + "contents.referencesCreateNew": "Adicionar Novo", + "contents.referencesCreatePublish": "Criar e Publicar", + "contents.referencesLink": "Link conteúdo selecionado ({count})", + "contents.referencesSelectExisting": "Selecione Existente", + "contents.referencesSelectSchema": "Selecione {schema}", + "contents.refreshTooltip": "Atualizar conteúdos", + "contents.reloaded": "Conteúdo recarregado.", + "contents.removeConfirmText": "Quer mesmo remover o conteúdo?", + "contents.removeConfirmTitle": "Remover conteúdo", + "contents.saveAndPublish": "Salvar e Publicar", + "contents.scheduledAt": "em", + "contents.scheduledBy": "por", + "contents.scheduledTo": "Para", + "contents.scheduledToLabel": "Programado para", + "contents.scheduledTooltip": "Será definido para '{status}' em {time}.", + "contents.schemasPageTitle": "Conteúdo", + "contents.searchPlaceholder": "Pesquisa de texto completo", + "contents.searchSchemasPlaceholder": "Pesquisar", + "contents.selectionCount": "{count} itens selecionados", + "contents.statusQueries": "Consultas de Estado", + "contents.stockPhotoSearch": "Pesquisa por Fotos por Unsplash", + "contents.stockPhotoSearchEmpty": "Use a barra de pesquisa acima para encontrar fotos.", + "contents.unpublishReferrerConfirmText": "O conteúdo é referenciado por outro item de conteúdo publicado.\n\nQuer mesmo não publicar este conteúdo?", + "contents.unpublishReferrerConfirmTitle": "Conteúdo não publiciu", + "contents.unsavedChangesText": "Tem mudanças não salvas. Quer carregá-los agora?", + "contents.unsavedChangesTitle": "Alterações não salvas", + "contents.unsetValue": "Valor desaparato", + "contents.unsetValueConfirmText": "Se desaparasse o valor, poderá perder as alterações.\n\nQuer mesmo fazê-lo?", + "contents.unsetValueConfirmTitle": "Quer desaparassar o valor?", + "contents.updated": "Conteúdo atualizado com sucesso.", + "contents.updateFailed": "Falhou na atualização do conteúdo. Por favor, recarregue.", + "contents.validate": "Validar", + "contents.validationHint": "Por favor, lembre-se de verificar todos os idiomas quando vir erros de validação.", + "contents.versionCompare": "Comparar", + "contents.versionDelete": "Excluir esta versão", + "contents.versionViewing": "Versão de visualização **{version}***", + "contents.viewLatest": "Ver as últimas", + "contents.viewReset": "Ver por defeito de reposição", + "contributors.add": "Adicionar Colaborador", + "contributors.add.title": "Adicionar ou convidar colaborador", + "contributors.addFailed": "Não conseguiu adicionar contribuintes. Por favor, recarregue.", + "contributors.contributorAssigned": "Um novo utilizador com o endereço de e-mail introduzido foi criado e atribuído como contribuinte.", + "contributors.contributorAssignedExisting": "O utilizador foi designado", + "contributors.contributorAssignedInvited": "O utilizador foi convidado e designado.", + "contributors.contributorAssignedOld": "O utilizador foi adicionado como contribuinte.", + "contributors.deleteConfirmText": "Quer mesmo remover o contribuinte?", + "contributors.deleteConfirmTitle": "Remover colaborador", + "contributors.deleteFailed": "Falhou em eliminar os contribuintes. Por favor, recarregue.", + "contributors.emailPlaceholder": "Encontre o utilizador existente ou convide-o por e-mail", + "contributors.empty": "Não foram encontrados contribuintes.", + "contributors.import.emailsDetected": "E-mails detetados: {count}", + "contributors.import.run": "Adicionar Contribuintes", + "contributors.import.run2": "Importação", + "contributors.importButton": "Adicionar muitos contribuintes ao mesmo tempo", + "contributors.importHintg": "Uma grande equipa?", + "contributors.importTitle": "Contribuintes de importação", + "contributors.loadFailed": "Falhou em carregar os contribuintes. Por favor, recarregue.", + "contributors.planHint": "O seu plano permite até contribuintes {maxContributors} .", + "contributors.refreshTooltip": "Atualizar colaboradores", + "contributors.reloaded": "Os contribuintes recarregaram.", + "contributors.search": "Pesquisar", + "contributors.userNotFound": "O utilizador não existe.", + "dashboard.apiCallsCard": "Chamadas da API", + "dashboard.apiCallsChart": "Gráfico de chamadas da API", + "dashboard.apiCallsLimitLabel": "Limite mensal", + "dashboard.apiCallsSummaryCard": "Resumo das chamadas da API", + "dashboard.apiDocumentationCard": "Documentação da API", + "dashboard.apiPerformanceCard": "Desempenho da API (ms): {summary}ms avg", + "dashboard.apiPerformanceChart": "Gráfico de desempenho da API", + "dashboard.appsCard": "Aplicativos", + "dashboard.assetSizeCard": "Tamanho do ativo (MB", + "dashboard.assetSizeLabel": "Tamanho total", + "dashboard.assetSizeLimitLabel": "Limite total", + "dashboard.assetTotalSize": "Tamanho total de armazenamento do ativo", + "dashboard.assetUpdloadsCountChart": "Gráfico de contagem de uploads de ativos", + "dashboard.assetUploadsCard": "Uploads de Ativos", + "dashboard.assetUploadsSizeChart": "Gráfico de tamanho de uploads de ativos", + "dashboard.configSaved": "Configuração guardada.", + "dashboard.contentApi": "API de conteúdo", + "dashboard.contentApiDescription": "Documentação compatível com OpenAPI 3.0 para o seu conteúdo da aplicação.", + "dashboard.contentSummaryCard": "Número de itens", + "dashboard.currentMonthLabel": "Este mês", + "dashboard.downloadLog": "Registar baixar", + "dashboard.editConfig": "Editar Config", + "dashboard.githubCard": "Github card", + "dashboard.githubCardDescription": "Obtenha o código fonte de Github e reporte bugs ou peça apoio.", + "dashboard.historyCard": "Histórico", + "dashboard.pageTitle": "Painel de controle", + "dashboard.randomCatCard": "Gato aleatório", + "dashboard.randomDogCard": "Cão aleatório", + "dashboard.resetConfigConfirmText": "Deseja mesmo redefinir o painel de instrumentos ao padrão?", + "dashboard.resetConfigConfirmTitle": "Config de reset", + "dashboard.schemaNewCard": "Novo Esquema", + "dashboard.schemaNewCardDescription": "Um esquema define a estrutura do seu elemento de conteúdo.", + "dashboard.schemasCard": "Esquemas", + "dashboard.schemasCardDescription": "Obtenha uma visão do modelo de dados desta aplicação.", + "dashboard.stackedChart": "Empilhado", + "dashboard.supportCard": "Feedback & Suporte", + "dashboard.supportCardDescription": "Forneça funcionalidades de feedback e pedido para nos ajudar a melhorar a Squidex.", + "dashboard.trafficChart": "Gráfico de tráfego da API", + "dashboard.trafficHeader": "Tráfego (MB)", + "dashboard.trafficLimitLabel": "Limite mensal", + "dashboard.trafficSummaryCard": "Resumo do Tráfego da API", + "dashboard.welcomeText": "Bem-vindo à App **{app}***", + "dashboard.welcomeTextTeam": "Bem-vindos à equipa **{team}***", + "dashboard.welcomeTitle": "Hi {user}", + "eventConsumers.count": "Contagem", + "eventConsumers.loadFailed": "Falhou em carregar os consumidores de eventos. Por favor, recarregue.", + "eventConsumers.pageTitle": "Consumidores de Eventos", + "eventConsumers.position": "Posição", + "eventConsumers.refreshTooltip": "Atualizar os consumidores de eventos", + "eventConsumers.reloaded": "Evento Os consumidores recarregaram.", + "eventConsumers.reset": "Consumidor de eventos será reiniciado em breve", + "eventConsumers.resetFailed": "Falhou em repor o consumidor de eventos. Por favor, recarregue.", + "eventConsumers.resetTooltip": "Consumidor de eventos de reset", + "eventConsumers.started": "Consumidor de eventos será iniciado em breve", + "eventConsumers.startFailed": "Falhou em iniciar o consumidor de eventos. Por favor, recarregue.", + "eventConsumers.startTooltip": "Iniciar o consumidor de eventos", + "eventConsumers.stopFailed": "Falhou em parar o consumidor de eventos. Por favor, recarregue.", + "eventConsumers.stopped": "Consumidor de eventos será parado em breve", + "eventConsumers.stopTooltip": "Parar o consumidor de eventos", + "features.loadFailed": "Falhou na carga das características. Por favor, recarregue.", + "history.loadFailed": "Falhou em carregar a história. Por favor, recarregue.", + "history.title": "Atividade", + "languages.add": "Adicionar linguagem", + "languages.add.description": "Adicione um novo idioma que pretende apoiar para o seu conteúdo.", + "languages.add.title": "Adicione uma nova linguagem", + "languages.addFailed": "Falhou em adicionar linguagem. Por favor, recarregue.", + "languages.deleteConfirmText": "Quer mesmo remover a linguagem?", + "languages.deleteConfirmTitle": "Remover a linguagem", + "languages.deleteFailed": "Falhou em apagar o idioma. Por favor, recarregue.", + "languages.loadFailed": "Falhou em carregar línguas. Por favor, recarregue.", + "languages.master": "É Mestre", + "languages.masterHint": "Outras línguas recuam para o mestre se não for definido o recuo.", + "languages.optional": "É Opcional", + "languages.optionalHint": "Os valores das línguas opcionais não devem ser introduzidos, mesmo que seja necessário o campo.", + "languages.refreshTooltip": "Atualizar línguas", + "languages.reloaded": "Línguas recarregadas.", + "languages.updateFailed": "Falhou em mudar de linguagem. Por favor, recarregue.", + "news.headline": "O que há de novo?", + "news.title": "Novas Funcionalidades", + "notifications.empty": "Ainda não há notificações", + "notifo.subscripeTooltip": "Clique neste botão para subscrever todas as alterações e para receber notificações push.", + "plans.allApps": "A subscrição é partilhada entre todas as aplicações desta equipa. Verifique o painel de instrumentos para as aplicações atribuídas.", + "plans.billingPortal": "Portal de Faturação", + "plans.billingPortalHint": "Vá ao Portal de Faturação para obter o histórico de pagamentos e a visão geral da subscrição.", + "plans.change": "Alteração", + "plans.changeConfirmTitle": "Alterar subscrição", + "plans.changeFailed": "Falhou em mudar de plano. Por favor, recarregue.", + "plans.includedCalls": "Chamadas da API", + "plans.includedContributors": "Contribuintes", + "plans.includedStorage": "Armazenamento", + "plans.includedTraffic": "Tráfego", + "plans.loadFailed": "Falhou em carregar planos. Por favor, recarregue.", + "plans.managedByTeam": "A aplicação foi atribuída a uma equipa e, portanto, a subscrição é gerida pela equipa.", + "plans.noPlanConfigured": "Sem plano configurado, esta aplicação tem uso ilimitado.", + "plans.notPlanOwner": "Não criou a subscrição, pelo que não pode alterar o plano.", + "plans.perMonth": "Por mês", + "plans.perYear": "Por ano", + "plans.planOwner": "Proprietário", + "plans.referralEarned": "Valor ganho até agora: **{earned}**", + "plans.referralHint": "Ganhe dinheiro e partilhe o seguinte código de desconto para o seu amigo e família: **{code}***", + "plans.refreshTooltip": "Planos de Atualização", + "plans.reloaded": "Planos recarregados.", + "plans.selected": "Selecionado", + "profile.title": "Perfil", + "profile.userEmail": "Assinado com", + "roles.add": "Adicionar grupo", + "roles.add.description": "Adicione um novo grupo se precisar de permissão e políticas personalizadas.", + "roles.add.title": "Adicione um grupo personalizado", + "roles.addFailed": "Falha ao adicionar grupo. Por favor recarregue.", + "roles.customRoles": "Grupos personalizados", + "roles.default.owner": "Pode fazer tudo, incluindo apagar a app.", + "roles.default.reader": "Só pode ler bens e conteúdos.", + "roles.defaultRoles": "Funções predefinidos", + "roles.defaultRoles.hint": "As funções predefinidas não podem ser eliminadas e fazem sempre parte da sua aplicação.", + "roles.defaults.developer": "Pode utilizar a vista API, editar ativos, conteúdos, esquemas, regras, fluxos de trabalho e configurações.", + "roles.defaults.editor": "Pode editar ativos e conteúdos e ver fluxos de trabalho.", + "roles.deleteConfirmText": "Eliminar grupo", + "roles.deleteConfirmTitle": "Quer mesmo apagar o grupo?", + "roles.loadFailed": "Falhou em carregar papéis. Por favor, recarregue.", + "roles.loadPermissionsFailed": "Falhou em carregar permissões. Por favor, recarregue.", + "roles.permissions": "Permissões", + "roles.permissionsDescription": "As permissões restringem as operações e consultas permitidas a nível API e são uma funcionalidade de segurança.", + "roles.permissionsPlaceholder": "Comece a escrever para procurar permissões", + "roles.properties": "Propriedades", + "roles.properties.hideAPI": "Ocultar API", + "roles.properties.hideAssets": "Ocultar ficheiros", + "roles.properties.hideContents": "Ocultar {schema} Conteúdo", + "roles.properties.hideSchemas": "Esconder Esquemas", + "roles.properties.hideSettings": "Configurações de ocultação", + "roles.propertiesDescription": "As propriedades descrevem o comportamento da UI de Gestão, mas não fornecem segurança para a API.", + "roles.refreshTooltip": "Atualizar grupos", + "roles.reloaded": "Grupos recarregados.", + "roles.revokeFailed": "Falhou em revogar o grupo. Por favor, recarregue.", + "roles.roleNamePlaceholder": "Insira o nome da grupo", + "roles.updateFailed": "Falhou na atualização do grupo. Por favor, recarregue.", + "rules.actionData": "Dados de Ação", + "rules.actionHint": "A seleção do tipo de ação não pode ser alterada mais tarde.", + "rules.addSchema": "Adicionar Esquema", + "rules.advancedFormattingHint": "Você pode usar formatação avançada", + "rules.cancelFailed": "Falhou em cancelar a regra. Por favor, recarregue.", + "rules.conditionHint": "Condição opcional como expressão javascript", + "rules.conditionHint2": "As condições são expressões javascript que definem quando desencadear, por exemplo", + "rules.conditions.commentKeyword": "Apenas para palavras-chave de texto", + "rules.conditions.commentUser": "Utilizadores específicos", + "rules.conditions.contentValue": "O conteúdo tem valor", + "rules.conditions.event": "Eventos específicos", + "rules.conditions.images": "Apenas imagens", + "rules.conditions.largeAssets": "Grandes ativos", + "rules.conditions.schema": "Apenas esquema específico", + "rules.conditions.updatedBy": "Atualizado pelo utilizador", + "rules.conditions.usageDays": "Dias", + "rules.conditions.usageDaysHint": "O número de dias para verificar ou esvaziar para verificar o mês em curso.", + "rules.conditions.usageLimit": "Limite", + "rules.conditions.usageLimitHint": "A Api mensal chama para desencadear.", + "rules.create": "Nova Regra", + "rules.createFailed": "Falhou em criar regra. Por favor, recarregue.", + "rules.createTooltip": "Nova Regra", + "rules.deleteConfirmText": "Quer mesmo apagar a regra?", + "rules.deleteConfirmTitle": "Eliminar regra", + "rules.deleteFailed": "Falhou em apagar a regra. Por favor, recarregue.", + "rules.empty": "Nenhuma regra criada ainda.", + "rules.emptyAddRule": "Adicionar Regra", + "rules.enqueued": "A regra foi adicionada à fila.", + "rules.enrichedEvent": "Evento Enriquecido", + "rules.itemPageTitle": "Regra", + "rules.listPageTitle": "Regras", + "rules.loadFailed": "Falhou em carregar as regras. Por favor, recarregue.", + "rules.readMore": "Ler Mais", + "rules.refreshEventsTooltip": "Atualizar eventos", + "rules.refreshTooltip": "Atualizar regras", + "rules.reloaded": "Regras recarregadas.", + "rules.restarted": "A regra começará a funcionar em alguns segundos.", + "rules.ruleEvents.cancelAllConfirmText": "Quer mesmo cancelar todos os eventos?", + "rules.ruleEvents.cancelAllConfirmTitle": "Cancelar todos os eventos", + "rules.ruleEvents.cancelConfirmText": "Quer mesmo cancelar este evento?", + "rules.ruleEvents.cancelConfirmTitle": "Cancelar evento", + "rules.ruleEvents.cancelFailed": "Não cancelou os eventos de regras. Por favor, recarregue.", + "rules.ruleEvents.enqueue": "Enqueue", + "rules.ruleEvents.enqueued": "Eventos encadeados. Será reensificada em alguns segundos.", + "rules.ruleEvents.enqueueFailed": "Falhou em encascar o evento de regras. Por favor, recarregue.", + "rules.ruleEvents.lastInvokedLabel": "Última Invocação", + "rules.ruleEvents.listPageTitle": "Eventos de Regras", + "rules.ruleEvents.loadFailed": "Falhou em carregar eventos. Por favor, recarregue.", + "rules.ruleEvents.nextAttemptLabel": "A seguir", + "rules.ruleEvents.numAttemptsLabel": "Tentativas", + "rules.ruleEvents.reloaded": "RegrasEventos recarregados.", + "rules.ruleSimulator.listPageTitle": "Simulador", + "rules.ruleSyntax.if": "If", + "rules.ruleSyntax.then": "then", + "rules.run": "Repetição", + "rules.runFailed": "Falhou em executar a regra. Por favor, recarregue.", + "rules.runFromSnapshots": "Repetição dos Estados", + "rules.runningRule": "A regra '{name}' está atualmente em execução.", + "rules.runRuleConfirmText": "Quer mesmo gerir a regra para todos os eventos?", + "rules.runRuleConfirmTitle": "Regra de execução", + "rules.simulate": "Simular", + "rules.simulateTooltip": "Simular estas regras usando os últimos 100 eventos.", + "rules.simulation.actionCreated": "O trabalho é criado a partir do evento e ação enriquecidos e adicionado a uma fila de trabalho.", + "rules.simulation.actionExecuted": "O trabalho é tirado da fila e executado.", + "rules.simulation.errorConditionDoesNotMatch": "STOP: As expressões javascript no gatilho não correspondem ao evento.", + "rules.simulation.errorConditionPrecheckDoesNotMatch": "STOP: A condição no gatilho não corresponde ao evento.", + "rules.simulation.errorDisabled": "STOP: A regra está desativada.", + "rules.simulation.errorFailed": "Erro interno.", + "rules.simulation.errorFromRule": "STOP: O evento foi criado a partir de outra regra e será ignorado para evitar loops intermináveis.", + "rules.simulation.errorNoAction": "STOP: O tipo de ação é obsoleto e foi removido.", + "rules.simulation.errorNoTrigger": "STOP: O tipo de gatilho é obsoleto e foi removido.", + "rules.simulation.errorTooOld": "O evento é muito antigo.", + "rules.simulation.errorWrongEvent": "PARAR: O evento não corresponde ao gatilho.", + "rules.simulation.errorWrongEventForTrigger": "PARAR: O evento não corresponde ao gatilho.", + "rules.simulation.eventConditionEvaluated": "O evento enriquecido é avaliado, quer corresponda às condições e expressões javascript no gatilho.", + "rules.simulation.eventEnriched": "Evento é enriquecido com dados adicionais", + "rules.simulation.eventQueried": "Evento é consultado a partir da base de dados", + "rules.simulation.eventTriggerChecked": "O evento é testado para ver se corresponde ao gatilho e às condições básicas.", + "rules.simulator": "Simulador", + "rules.stop": "A regra vai parar em breve.", + "rules.triggerAll": "Gatilho em todos os eventos de conteúdo", + "rules.triggerConfirmText": "Quer mesmo desencadear a regra?", + "rules.triggerConfirmTitle": "Regra do gatilho", + "rules.triggerFailed": "Falhou em desencadear a regra. Por favor, recarregue.", + "rules.triggerHint": "A seleção do tipo de gatilho não pode ser alterada mais tarde.", + "rules.unnamed": "Regra sem nome", + "rules.updateFailed": "Falhou na atualização da regra. Por favor, recarregue.", + "schemas.addField": "Adicionar Campo", + "schemas.addFieldAndClose": "Criar e fechar", + "schemas.addFieldAndCreate": "Criar e adicionar campo", + "schemas.addFieldAndEdit": "Criar e editar campo", + "schemas.addFieldButton": "Adicionar Campo", + "schemas.addFieldFailed": "Falhou em adicionar campo. Por favor, recarregue.", + "schemas.addNestedField": "Adicionar Campo Aninhado", + "schemas.changeCategoryFailed": "Falhou em mudar de categoria. Por favor, recarregue.", + "schemas.clone": "Clonar Esquema", + "schemas.contentEditorUrl": "Extensão do editor de conteúdo", + "schemas.contentSidebarUrl": "Extensão da barra lateral de conteúdo", + "schemas.contentSidebarUrlHint": "URL para o plugin para a barra lateral na vista de detalhes.", + "schemas.contentsSidebarUrl": "Extensão da barra lateral de conteúdo", + "schemas.contentsSidebarUrlHint": "URL para o plugin para a barra lateral na vista da lista.", + "schemas.contextMenuTour": "Abra o menu de contexto para eliminar o esquema ou para criar alguns scripts para alterações de conteúdo.", + "schemas.create": "Criar Esquema", + "schemas.createCategory": "Criar nova categoria...", + "schemas.createFailed": "Falhou em criar esquema. Por favor, recarregue.", + "schemas.createSchemaTooltip": "Novo esquema", + "schemas.deleteConfirmText": "Quer mesmo apagar o esquema?", + "schemas.deleteConfirmTitle": "Remover Esquema", + "schemas.deleteFailed": "Falhou em apagar o esquema. Por favor, recarregue.", + "schemas.deleteFieldFailed": "Falhou em apagar o campo. Por favor, recarregue.", + "schemas.deleteRuleConfirmText": "Quer mesmo remover esta Regra de Campo?", + "schemas.deleteRuleConfirmTitle": "Remover a regra do campo", + "schemas.deleteUrlConfirmText": "Quer mesmo remover esta URL?", + "schemas.deleteUrlConfirmTitle": "Remover URL", + "schemas.disableFieldFailed": "Falhou em desativar o campo. Por favor, recarregue.", + "schemas.enableFieldFailed": "Falhou em ativar o campo. Por favor, recarregue.", + "schemas.export.deleteFields": "Eliminar campos", + "schemas.export.recreateFields": "Recriar campos", + "schemas.export.synchronize": "Sincronizar", + "schemas.field.allowedValues": "Valores Permitidos", + "schemas.field.createEnum": "Gerar GraphQL Enum.", + "schemas.field.createEnumHint": "Gere uma enumeração GraphQL para este campo. O formato de entrada já não é compatível com uma corda e pode ser uma mudança de rutura para o seu cliente.", + "schemas.field.defaultValue": "Valor Predefinido", + "schemas.field.defaultValues": "Valores predefinidos", + "schemas.field.defaultValuesHint": "Desaponha o valor predefinido por idioma e substitua a propriedade de valor predefinido, se definida. Só a use se realmente for necessário.", + "schemas.field.deleteConfirmText": "Quer mesmo apagar o campo?", + "schemas.field.deleteConfirmTitle": "Eliminar campo", + "schemas.field.disable": "Desativar na UI", + "schemas.field.disabledMarker": "Deficientes", + "schemas.field.editor": "Editor", + "schemas.field.editorUrl": "Editor Url", + "schemas.field.editorUrlHint": "Url para o seu plugin se usar um editor personalizado.", + "schemas.field.empty": "Nenhum campo ainda foi criado.", + "schemas.field.enable": "Ativar na UI", + "schemas.field.enabledMarker": "Habilitar", + "schemas.field.graphQLSchema": "GraphQL Esquema", + "schemas.field.graphQLSchemaHint": "Defina um esquema GraphQL para os valores json. Pode utilizar vários tipos para objetos aninhados.\nO primeiro tipo torna-se o tipo de campo. Apenas os objetos são suportados como tipos de raiz.", + "schemas.field.halfWidth": "Meia Largura", + "schemas.field.halfWidthHint": "Mostra o campo com apenas a meia largura quando na página de edição ou criação, quando há espaço suficiente.", + "schemas.field.hiddenMarker": "Escondido", + "schemas.field.hide": "Esconda-se na API", + "schemas.field.hintsHint": "Descreva este campo para documentação e uI.", + "schemas.field.inlineEditable": "Edição inline", + "schemas.field.isEmbeddable": "Está incorporando conteúdos e ativos", + "schemas.field.isEmbeddableHint": "Com esta opção, um formato personalizado é devolvido no GraphQL, onde os ativos ou conteúdos ligados podem ser recolhidos.", + "schemas.field.labelHint": "Mostrar o nome para documentação e a UI.", + "schemas.field.localizable": "Localizabilável", + "schemas.field.localizableHint": "Pode marcar o campo como ó querável. Significa que depende da língua, por exemplo, de um nome da cidade.", + "schemas.field.localizableMarker": "localizatável", + "schemas.field.lock": "Bloquear e evitar alterações", + "schemas.field.lockConfirmText": "AVISO: O bloqueio de um campo não pode ser desfeito! As definições de campo bloqueadas já não podem ser desbloqueadas, eliminadas ou alteradas.\n\nQuer mesmo trancar este campo?", + "schemas.field.lockConfirmTitle": "Campo de bloqueio", + "schemas.field.lockedMarker": "Bloqueado", + "schemas.field.nameHint": "O nome do campo na resposta da API.", + "schemas.field.namePlaceholder": "Insira o nome do campo", + "schemas.field.nameValidationMessage": "O nome deve ser um nome javascript válido na caixa do camelo.", + "schemas.field.placeholder": "Espaço reservado", + "schemas.field.placeholderHint": "Defina o espaço reservado para o controlo de entrada.", + "schemas.field.required": "Necessário", + "schemas.field.requiredOnPublish": "Necessário na publicação", + "schemas.field.show": "Espetáculo em API", + "schemas.field.tabCommon": "Comum", + "schemas.field.tabEditing": "Edição", + "schemas.field.tabMore": "Mais", + "schemas.field.tabValidation": "Validação", + "schemas.field.tagsHint": "Etiquetas para anotar o seu campo para processos de automação.", + "schemas.field.unique": "Único", + "schemas.field.visibleMarker": "Visível", + "schemas.fieldTypes.array.count": "Itens", + "schemas.fieldTypes.array.countMax": "Itens Max", + "schemas.fieldTypes.array.countMin": "Min Itens", + "schemas.fieldTypes.array.description": "Lista de objetos embutidos.", + "schemas.fieldTypes.array.uniqueFields": "Campos Únicos", + "schemas.fieldTypes.assets.allowDuplicates": "Permitir valores duplicados", + "schemas.fieldTypes.assets.count": "Contagem", + "schemas.fieldTypes.assets.countMax": "Ficheiros Max", + "schemas.fieldTypes.assets.countMin": "Min ficheiros", + "schemas.fieldTypes.assets.description": "Imagens, vídeos, documentos.", + "schemas.fieldTypes.assets.expectedType": "Tipo esperado", + "schemas.fieldTypes.assets.fileExtensions": "Extensões de ficheiros", + "schemas.fieldTypes.assets.folderId": "Pasta", + "schemas.fieldTypes.assets.folderIdHint": "A pasta de ficheiros para onde os novos ficheiros serão carregados.", + "schemas.fieldTypes.assets.previewFileName": "Apenas nome de ficheiro", + "schemas.fieldTypes.assets.previewImage": "Apenas miniatura ou nome de ficheiro se não uma imagem", + "schemas.fieldTypes.assets.previewImageAndFileName": "Miniatura e nome do ficheiro", + "schemas.fieldTypes.assets.previewMode": "Pré-visualizaçãoMode", + "schemas.fieldTypes.assets.previewModeHint": "O modo de pré-visualização dos ficheiros nas listas de conteúdos.", + "schemas.fieldTypes.assets.resolve": "Resolver o primeiro ficheiro", + "schemas.fieldTypes.assets.resolveHint": "Mostre o primeiro ficheiro referenciado na lista de conteúdos.", + "schemas.fieldTypes.assets.size": "Tamanho", + "schemas.fieldTypes.assets.sizeMax": "Tamanho min", + "schemas.fieldTypes.assets.sizeMin": "Tamanho máximo", + "schemas.fieldTypes.boolean.description": "Sim ou não, verdadeiro ou falso.", + "schemas.fieldTypes.component.description": "Incorporar outro esquema a este conteúdo.", + "schemas.fieldTypes.components.description": "Incorporar outros esquemas a este conteúdo como matriz.", + "schemas.fieldTypes.dateTime.defaultMode": "Modo predefinido", + "schemas.fieldTypes.dateTime.description": "Data eventos, horas de abertura.", + "schemas.fieldTypes.dateTime.format": "Padrão", + "schemas.fieldTypes.dateTime.formatHint": "O padrão quando mostrado na UI, veja: https://date-fns.org/v2.22.1/docs/format", + "schemas.fieldTypes.dateTime.rangeMax": "Valor Máximo", + "schemas.fieldTypes.dateTime.rangeMin": "Valor Min", + "schemas.fieldTypes.geolocation.description": "Coordenadas: latitude e longitude.", + "schemas.fieldTypes.json.description": "Dados em formato JSON, para programadores.", + "schemas.fieldTypes.number.description": "Identificação, número de pedido, classificação, quantidade.", + "schemas.fieldTypes.number.range": "Alcance", + "schemas.fieldTypes.number.rangeMax": "Valor Máximo", + "schemas.fieldTypes.number.rangeMin": "Valor Min", + "schemas.fieldTypes.references.count": "Itens", + "schemas.fieldTypes.references.countMax": "Itens Max", + "schemas.fieldTypes.references.countMin": "Min Itens", + "schemas.fieldTypes.references.description": "Links para outros itens de conteúdo.", + "schemas.fieldTypes.references.mustBePublished": "Só ter em conta as referências publicadas ao validar.", + "schemas.fieldTypes.references.resolve": "Resolver referências", + "schemas.fieldTypes.references.resolveHint": "Mostre o nome do item referenciado na lista de conteúdos quando maxItems estiver definido para 1.", + "schemas.fieldTypes.string.characters": "Personagens", + "schemas.fieldTypes.string.charactersMax": "Personagens Max", + "schemas.fieldTypes.string.charactersMin": "Personagens de Min", + "schemas.fieldTypes.string.contentType": "Tipo de Conteúdo", + "schemas.fieldTypes.string.description": "Títulos, nomes, parágrafos.", + "schemas.fieldTypes.string.folderId": "Pasta de ativos", + "schemas.fieldTypes.string.folderIdHint": "A pasta de ativos para onde os novos ativos serão carregados.", + "schemas.fieldTypes.string.length": "Comprimento", + "schemas.fieldTypes.string.lengthMax": "Comprimento máximo", + "schemas.fieldTypes.string.lengthMin": "Comprimento de Min", + "schemas.fieldTypes.string.pattern": "Padrão regex", + "schemas.fieldTypes.string.patternMessage": "Mensagem de padrão", + "schemas.fieldTypes.string.suggestions": "Sugestões", + "schemas.fieldTypes.string.wordHint": "A contagem de palavras e a contagem de caracteres são calculadas no texto simples. O texto simples é calculado com base no tipo de conteúdo definido, que pode ser Markdown ou HTML.", + "schemas.fieldTypes.string.words": "Palavras", + "schemas.fieldTypes.string.wordsMax": "Palavras Max", + "schemas.fieldTypes.string.wordsMin": "Min Palavras", + "schemas.fieldTypes.tags.count": "Itens", + "schemas.fieldTypes.tags.countMax": "Itens Max", + "schemas.fieldTypes.tags.countMin": "Min Itens", + "schemas.fieldTypes.tags.description": "Formato especial para tags.", + "schemas.fieldTypes.ui.description": "Separador para edição de UI.", + "schemas.hideFieldFailed": "Falhou em esconder o campo. Por favor, recarregue.", + "schemas.import": "Esquema de importação", + "schemas.listFields": "Campos de Lista", + "schemas.listFieldsEmpty": "Deixe cair aqui ou reencomenda-os para mostrar os campos na lista de conteúdos. Quando não é definido nenhum campo de lista, o primeiro campo é utilizado.", + "schemas.loadFailed": "Falhou em carregar esquemas. Por favor, recarregue.", + "schemas.loadSchemaFailed": "Falhou em carregar o esquema. Por favor, recarregue.", + "schemas.lockFieldFailed": "Falhou em bloquear o campo. Por favor, recarregue.", + "schemas.modeComponent": "Componente", + "schemas.modeComponentDescription": "Só pode ser incorporado em campos componentes...", + "schemas.modeMultiple": "Vários conteúdos", + "schemas.modeMultipleDescription": "O melhor para vários casos como posts de blog, páginas, autores, produtos...", + "schemas.modeSingle": "Conteúdo único", + "schemas.modeSingleDescription": "O melhor para casos individuais como a página inicial, políticas de privacidade, configurações...", + "schemas.nameWarning": "Estes valores não podem ser alterados mais tarde.", + "schemas.previewUrls.empty": "Sem urls de pré-visualização configurados.", + "schemas.previewUrls.help": "Check-out a página de ajuda integrada para saber mais sobre URL's de pré-visualização.", + "schemas.previewUrls.namePlaceholder": "Web ou Mobile", + "schemas.previewUrls.title": "URLs de pré-visualização", + "schemas.previewUrls.urlPlaceholder": "URL com variáveis", + "schemas.published": "Publicado", + "schemas.publishedTour": "Note que tem de publicar o esquema antes de poder adicionar conteúdo.", + "schemas.publishFailed": "Falhou em publicar o esquema. Por favor, recarregue.", + "schemas.referenceFields": "Campos de Referência", + "schemas.referenceFieldsEmpty": "Deixe cair aqui ou reencomenda-os para mostrar os campos quando referenciados por outro conteúdo. Quando não é definido nenhum campo de referência, os campos de lista são utilizados.", + "schemas.reloaded": "Os esquemas recarregaram.", + "schemas.reorderFieldsFailed": "Falhou em reordenar campos. Por favor, recarregue.", + "schemas.rules.action": "Ação", + "schemas.rules.condition": "Condição em Javascript", + "schemas.rules.empty": "Nenhuma regra de campo configurada.", + "schemas.rules.title": "Regras de Campo", + "schemas.rules.when": "quando", + "schemas.saved": "Esqquema salvo com sucesso.", + "schemas.saveFieldAndClose": "Salvar e fechar", + "schemas.saveFieldAndNew": "Guardar e adicionar campo", + "schemas.schemaHintsHint": "Descreva este esquema para documentação e interfaces de utilizador.", + "schemas.schemaLabelHint": "Nome de apresentação para documentaçao e UI.", + "schemas.schemaNameHint": "Só pode utilizar letras, números e traços e não mais de 40 caracteres.", + "schemas.schemaNameValidationMessage": "O nome só pode conter letras, números e traços.", + "schemas.schemaTagsHint": "Etiquetas para anotar o seu esquema para processos de automação.", + "schemas.searchPlaceholder": "Pesquisar", + "schemas.showFieldFailed": "Falhou em mostrar o campo. Por favor, recarregue.", + "schemas.synchronized": "Esquema sincronizado com sucesso.", + "schemas.synchronizeFailed": "Falhou em sincronizar o esquema. Por favor, recarregue.", + "schemas.tabFields": "Campos", + "schemas.tabJson": "Json", + "schemas.tableHeaders.created": "Criado", + "schemas.tableHeaders.createdBy": "Criado por", + "schemas.tableHeaders.createdByShort": "Por", + "schemas.tableHeaders.id": "Id", + "schemas.tableHeaders.lastModified": "Actualizado", + "schemas.tableHeaders.lastModifiedBy": "Actualizado por", + "schemas.tableHeaders.lastModifiedByShort": "Por", + "schemas.tableHeaders.nextStatus": "Próximo Estado", + "schemas.tableHeaders.status": "Estado", + "schemas.tableHeaders.translationStatus": "Estado da Tradução", + "schemas.tableHeaders.translationStatusAverage": "Estado médio da tradução", + "schemas.tableHeaders.version": "Versão", + "schemas.tabMore": "Mais", + "schemas.tabScripts": "Scripts", + "schemas.tabUI": "UI", + "schemas.ui": "Campos atribuídos", + "schemas.ui.unassignedFields": "Campos não atribuídos", + "schemas.unpublished": "Não publicado", + "schemas.unpublishFailed": "Falhou em não publicar o esquema. Por favor, recarregue.", + "schemas.updateFailed": "Falhou na atualização do esquema. Por favor, recarregue.", + "schemas.updateFieldFailed": "Falhou na atualização do campo. Por favor, recarregue.", + "schemas.updatePreviewUrlsFailed": "Falhou na configuração de urls de pré-visualização. Por favor, recarregue.", + "schemas.updateRulesFailed": "Falhou na atualização das regras do esquema. Por favor, recarregue.", + "schemas.updateScriptsFailed": "Falhou na atualização dos scripts de esquema. Por favor, recarregue.", + "schemas.updateUIFieldsFailed": "Falhou na atualização dos campos de UI. Por favor, recarregue.", + "schemas.validateOnPublish": "Validar ao publicar", + "schemas.validateOnPublishHint": "Utilize fluxos de trabalho personalizados quando necessitar de mais controlo para os estatutos que um conteúdo deve ser validado.", + "search.addFilter": "Adicionar filtro", + "search.addGroup": "Adicionar Grupo", + "search.addSorting": "Adicionar Classificação", + "search.advancedTour": "Clique neste ícone para mostrar o menu de pesquisa avançado!", + "search.customQuery": "Consulta personalizada", + "search.fullTextTour": "Pes para obter conteúdos com textos completos para todos os campos e para os direitos de texto.", + "search.help": "Ler mais sobre filtros em [Documentação](https://docs.squidex.io/04-guides/02-api.html).", + "search.myQueries": "Minhas consultas", + "search.nameQuery": "Diga o seu nome", + "search.queriesEmpty": "Procure por {types} e use ícone em forma de pesquisa para guardar consulta para todos os contribuintes.", + "search.queryAllNewestFirst": "Todos (o mais novo primeiro)", + "search.queryAllOldestFirst": "Todos (o mais velho primeiro)", + "search.quickNavPlaceholder": "Quick Nav (Prima 'q')", + "search.saveQueryMyself": "Guarde a consulta apenas para mim.", + "search.searchFailed": "Falhou em fazer uma busca. Por favor, recarregue.", + "search.sharedQueries": "Consultas partilhadas", + "search.sorting": "Triagem", + "start.login": "Iniciar sessão em Squidex", + "start.loginHint": "O botão de login abrirá um novo pop-up. Assim que tiver sucesso, redireciona-o para o portal de gestão Squidex.", + "start.madeBy": "Orgulhosamente feito por", + "start.madeByCopyright": "Sebastian Stehle e Colaboradores, 2016-2022", + "teams.create": "Criar", + "teams.createFailed": "Falhou na criação de uma equipa. Por favor, recarregue.", + "teams.empty": "Esta equipa ainda não tem aplicativos.", + "teams.leave": "Deixar a equipa", + "teams.leaveConfirmText": "Queres mesmo deixar esta equipa?", + "teams.leaveConfirmTitle": "Deixe a equipa.", + "teams.leaveFailed": "Falhou em deixar a equipa. Por favor, recarregue.", + "teams.loadFailed": "Falhou em carregar equipas. Por favor, recarregue.", + "teams.teamLoadFailed": "Falhou em carregar a equipa. Por favor, recarregue.", + "teams.teamNameHint": "Pode usar todos os personagens aqui.", + "teams.teamNameWarning": "O nome da equipa só é usado como nome de exibição e pode ser alterado mais tarde.", + "teams.updateFailed": "Falhou em atualizar a equipa. Por favor, recarregue.", + "templates.cliHint": "Descarregue o CLI em https://github.com/squidex/squidex-samples para utilizar os modelos.", + "templates.loadFailed": "Falhou em carregar modelos. Por favor, recarregue.", + "templates.refreshTooltip": "Modelos de atualização", + "templates.reloaded": "Modelos recarregados.", + "tour.joinForum": "Junte-se ao nosso Fórum", + "tour.joinGithub": "Junte-se a nós em Github", + "tour.skip": "Tour de salto", + "tour.step0Next": "Vamos dar uma vista de olhos.", + "tour.step0Text": "Pode começar a gerir e distribuir o seu conteúdo imediatamente, mas gostaríamos de o acompanhar primeiro...\n\nComo é que", + "tour.step1Next": "Continuar", + "tour.step1Text": "Uma App é o repositório do seu projeto, por exemplo (blog, web shop ou aplicativo móvel). Pode atribuir colaboradores à sua aplicação para trabalharem em conjunto.\n\nPode criar um número ilimitado de Apps em Squidex para gerir vários projetos ao mesmo tempo.", + "tour.step2Next": "Continua!", + "tour.step2Text": "Os esquemas definem a estrutura do seu conteúdo, os campos e os tipos de dados de um item de conteúdo.\n\nAntes de poder adicionar conteúdo ao seu esquema, certifique-se de carregar no botão 'Publicar' no topo para disponibilizar o esquema para as suas aplicações de conteúdoSettings.editores.", + "tour.step3Next": "Está quase!", + "tour.step3Text": "O conteúdo é o dado real da sua app que é agrupado pelo esquema.\n\nSelecione primeiro um esquema publicado e, em seguida, adicione conteúdo para este esquema.", + "tour.step4Next": "Apanhei!", + "tour.step4Text": "Os ativos contêm todos os ficheiros que também podem estar ligados ao seu conteúdo. Por exemplo, imagens, vídeos ou documentos.\n\nPode fazer o upload dos ativos aqui e usá-los mais tarde ou também carregá-los diretamente quando criar um novo item de conteúdo com um campo de ativos.", + "tour.step5Text": "Mas não é todo o apoio que podemos dar.\n\nPode ir a https://docs.squidex.io ler mais.\n\nQuer se juntar à nossa comunidade?", + "tour.step5Title": "Incrível, agora já sabes o básico!", + "tour.tooltipConfirm": "Entendi", + "tour.tooltipStop": "Terminar Tour", + "tour.welcome": "Bem vindo a", + "tour.welcomeProduct": "Squidex CMS", + "translate.translateFailed": "Falhou em traduzir texto. Por favor, recarregue.", + "usages.loadCallsFailed": "Falhou em carregar o uso das chamadas. Por favor, recarregue.", + "usages.loadMonthlyCallsFailed": "Falhou em carregar as chamadas mensais da API. Por favor, recarregue.", + "usages.loadStorageFailed": "Não conseguiu carregar o uso do armazenamento. Por favor, recarregue.", + "usages.loadTodayStorageFailed": "Falhou em carregar o tamanho do armazenamento de hoje. Por favor, recarregue.", + "users.create": "Novo", + "users.createFailed": "Falhou na criação do utilizador. Por favor, recarregue.", + "users.createPageTitle": "Criar Utilizador", + "users.createTitle": "Novo Utilizador", + "users.createTooltip": "Novo Utilizador", + "users.deleteConfirmText": "Deseja mesmo eliminar este utilizador?", + "users.deleteConfirmTitle": "Eliminar utilizador", + "users.deleteFailed": "Não conseguiu eliminar o utilizador. Por favor, recarregue.", + "users.editPageTitle": "Editar Utilizador", + "users.editTitle": "Editar Utilizador", + "users.listPageTitle": "Gestão de Utilizadores", + "users.listTitle": "Utilizadores", + "users.loadFailed": "Falhou em carregar os utilizadores. Por favor, recarregue.", + "users.loadUserFailed": "Falhou na carga do utilizador. Por favor, recarregue.", + "users.lockFailed": "Falhou em bloquear o utilizador. Por favor, recarregue.", + "users.lockTooltip": "Utilizador de bloqueio", + "users.passwordConfirmValidationMessage": "As palavras-passe devem ser as mesmas.", + "users.refreshTooltip": "Atualizar utilizadores", + "users.reloaded": "Os utilizadores recarregaram.", + "users.search": "Pesquisa rumo ao utilizador", + "users.unlockFailed": "Falhou em desbloquear o utilizador. Por favor, recarregue.", + "users.unlockTooltip": "Desbloquear Utilizador", + "users.updateFailed": "Falhou na atualização do utilizador. Por favor, recarregue.", + "validation.between": "{field} deve estar entre '{min}' e '{max}'.", + "validation.betweenlength": "{field|upper} deve ter entre o item {minlength} e {maxlength} item.", + "validation.betweenlengthstring": "{field|upper} deve ter entre {minlength} e {maxlength} caracteres).", + "validation.email": "{field|upper} deve ser um endereço de e-mail.", + "validation.exactly": "{field|upper} deve ser exatamente '{expect}'.", + "validation.exactlylength": "{field|upper} deve ter exatamente o item (s) esperado).", + "validation.exactlylengthstring": "{field|upper} deve ter exatamente caracteres {expect} caracteres).", + "validation.match": "{message}", + "validation.max": "{field|upper} deve ser menos ou igual a '{max}'.", + "validation.maxlength": "{field|upper} não deve ter mais do que {requiredlength} item(s).", + "validation.maxlengthstring": "{field|upper} não deve ter mais do que {requiredlength} caracteres).", + "validation.min": "{field|upper} deve ser maior ou igual a '{min}'.", + "validation.minlength": "{field|upper} deve ter pelo menos {requiredlength} item(s).", + "validation.minlengthstring": "{field|upper} deve ter pelo menos {requiredlength} caracteres).", + "validation.pattern": "{field|upper} não corresponde ao padrão.", + "validation.patternmessage": "{message}", + "validation.required": "{field|upper} é necessário.", + "validation.requiredTrue": "{field|upper} é necessário.", + "validation.uniqueobjectvalues": "{field|upper} tem itens com campos duplicados '{fields}'.", + "validation.uniquestrings": "{campo|upper} não deve conter valores duplicados.", + "validation.validarrayvalues": "{field|upper} contém um valor inválido: {invalidvalue}.", + "validation.validdatetime": "{field|upper} não é uma data válida.", + "validation.validvalues": "{field|upper} não é um valor válido.", + "workflows.add": "Adicionar fluxo de trabalho", + "workflows.add.description": "O nome do fluxo de trabalho é usado apenas na UI e não é mostrado aos editores.", + "workflows.add.title": "Adicione um novo fluxo de trabalho", + "workflows.addStep": "Adicionar Passo", + "workflows.createFailed": "Falhou em criar fluxo de trabalho. Por favor, recarregue.", + "workflows.deleteConfirmText": "Quer mesmo remover o fluxo de trabalho?", + "workflows.deleteConfirmTitle": "Eliminar fluxo de trabalho", + "workflows.deleteFailed": "Falhou em eliminar o Fluxo de Trabalho. Por favor, recarregue.", + "workflows.empty": "Ainda não foram criados fluxos de trabalho.", + "workflows.loadFailed": "Falhou em carregar fluxos de trabalho. Por favor, recarregue.", + "workflows.notNamed": "Fluxo de trabalho sem nome", + "workflows.preventUpdates": "Evitar atualizações", + "workflows.publishedNotRemovable": "Não pode ser removido", + "workflows.refreshTooltip": "Atualizar fluxos de trabalho", + "workflows.reloaded": "Fluxos de trabalho recarregados.", + "workflows.saved": "O fluxo de trabalho foi salvo.", + "workflows.schemasHint": "Restringir este fluxo de trabalho a esquemas específicos ou mantê-lo vazio para todos os esquemas.", + "workflows.syntax.expression": "Expressão", + "workflows.syntax.for": "para", + "workflows.syntax.when": "quando", + "workflows.tabEdit": "Edição", + "workflows.tabVisualize": "Visualizar", + "workflows.updateFailed": "Falhou na atualização do Fluxo de Trabalho. Por favor, recarregue.", + "workflows.validate": "Validar o conteúdo quando for alterado para este estado.", + "workflows.workflowNameHint": "Nome opcional para o fluxo de trabalho.", + "workflows.workflowNamePlaceholder": "Insira o nome do fluxo de trabalho" +} \ No newline at end of file diff --git a/backend/i18n/translator/Squidex.Translator/Commands.cs b/backend/i18n/translator/Squidex.Translator/Commands.cs index 6dd4d1f6a..42ce0d58a 100644 --- a/backend/i18n/translator/Squidex.Translator/Commands.cs +++ b/backend/i18n/translator/Squidex.Translator/Commands.cs @@ -140,7 +140,7 @@ public class Commands throw new ArgumentException("Folder does not exist.", nameof(arguments)); } - var supportedLocales = new string[] { "en", "nl", "it", "zh" }; + var supportedLocales = new string[] { "en", "nl", "it", "zh", "pt" }; var locales = supportedLocales; diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs index 7e8e2ee30..d4b2bc53e 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs @@ -89,6 +89,9 @@ public sealed partial class MongoAssetRepository : MongoRepositoryBase 0 }) { var filter = BuildFilter(appId, q.Ids.ToHashSet()); @@ -98,10 +101,10 @@ public sealed partial class MongoAssetRepository : MongoRepositoryBase x.LastModified).ThenBy(x => x.Id) .QueryLimit(q.Query) .QuerySkip(q.Query) - .ToListRandomAsync(Collection, q.Query.Random, ct); + .ToListRandomAsync(Collection, query.Random, ct); long assetTotal = assetEntities.Count; - if (assetEntities.Count >= q.Query.Take || q.Query.Skip > 0) + if (assetEntities.Count >= query.Take || query.Skip > 0) { if (q.NoTotal) { @@ -117,8 +120,6 @@ public sealed partial class MongoAssetRepository : MongoRepositoryBase= q.Query.Take || q.Query.Skip > 0) + if (assetEntities.Count >= query.Take || query.Skip > 0) { - var isDefaultQuery = q.Query.Filter == null; + var isDefaultQuery = query.Filter == null; if (q.NoTotal || (q.NoSlowTotal && !isDefaultQuery)) { diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs index 8bf3c7f79..d0067f2be 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs @@ -180,17 +180,17 @@ public sealed class MongoContentCollection : MongoRepositoryBase { schema }, q, ct); } - if (q.Referencing == default) + if (q.Referencing != default) { - if (queryInDedicatedCollection != null) - { - return await queryInDedicatedCollection.QueryAsync(schema, q, ct); - } + return await queryReferences.QueryAsync(app, new List { schema }, q, ct); + } - return await queryByQuery.QueryAsync(schema, q, ct); + if (queryInDedicatedCollection != null) + { + return await queryInDedicatedCollection.QueryAsync(schema, q, ct); } - return ResultList.Empty(); + return await queryByQuery.QueryAsync(schema, q, ct); } catch (MongoCommandException ex) when (ex.Code == 96) { diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Extensions.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Extensions.cs index 20a764f46..cbe813b90 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Extensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/Extensions.cs @@ -106,8 +106,8 @@ public static class Extensions var result = collection.Find(filter) .QuerySort(query) - .QueryLimit(query) .QuerySkip(query) + .QueryLimit(query) .ToListRandomAsync(collection, query.Random, ct); return await result; diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs index 6fff3f624..3168ee434 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByIds.cs @@ -28,7 +28,8 @@ internal sealed class QueryByIds : OperationBase return ReadonlyList.Empty(); } - var filter = CreateFilter(appId, null, ids); + // Create a filter from the Ids and ensure that the content ids match to the app ID. + var filter = CreateFilter(appId, null, ids, null); var contentEntities = await Collection.FindStatusAsync(filter, ct); @@ -43,12 +44,16 @@ internal sealed class QueryByIds : OperationBase return ResultList.Empty(); } - var filter = CreateFilter(app.Id, schemas.Select(x => x.Id), q.Ids.ToHashSet()); + // We need to translate the query names to the document field names in MongoDB. + var query = q.Query.AdjustToModel(app.Id); - var contentEntities = await FindContentsAsync(q.Query, filter, ct); + // Create a filter from the Ids and ensure that the content ids match to the schema IDs. + var filter = CreateFilter(app.Id, schemas.Select(x => x.Id), q.Ids.ToHashSet(), query.Filter); + + var contentEntities = await FindContentsAsync(query, filter, ct); var contentTotal = (long)contentEntities.Count; - if (contentTotal >= q.Query.Take || q.Query.Skip > 0) + if (contentTotal >= query.Take || query.Skip > 0) { if (q.NoTotal) { @@ -68,14 +73,16 @@ internal sealed class QueryByIds : OperationBase { var result = Collection.Find(filter) - .QueryLimit(query) + .QuerySort(query) .QuerySkip(query) + .QueryLimit(query) .ToListRandomAsync(Collection, query.Random, ct); return await result; } - private static FilterDefinition CreateFilter(DomainId appId, IEnumerable? schemaIds, HashSet ids) + private static FilterDefinition CreateFilter(DomainId appId, IEnumerable? schemaIds, HashSet ids, + FilterNode? filter) { var filters = new List>(); @@ -101,6 +108,11 @@ internal sealed class QueryByIds : OperationBase filters.Add(Filter.Ne(x => x.IsDeleted, true)); + if (filter != null) + { + filters.Add(filter.BuildFilter()); + } + return Filter.And(filters); } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs index df2901be2..f0ddbb441 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryByQuery.cs @@ -66,9 +66,9 @@ internal sealed class QueryByQuery : OperationBase var contentEntities = await Collection.QueryContentsAsync(filter, query, ct); var contentTotal = (long)contentEntities.Count; - if (contentTotal >= q.Query.Take || q.Query.Skip > 0) + if (contentTotal >= query.Take || query.Skip > 0) { - if (q.NoTotal || (q.NoSlowTotal && q.Query.Filter != null)) + if (q.NoTotal || (q.NoSlowTotal && query.Filter != null)) { contentTotal = -1; } @@ -98,9 +98,9 @@ internal sealed class QueryByQuery : OperationBase var contentEntities = await Collection.QueryContentsAsync(filter, query, ct); var contentTotal = (long)contentEntities.Count; - if (contentTotal >= q.Query.Take || q.Query.Skip > 0) + if (contentTotal >= query.Take || query.Skip > 0) { - if (q.NoTotal || (q.NoSlowTotal && q.Query.Filter != null)) + if (q.NoTotal || (q.NoSlowTotal && query.Filter != null)) { contentTotal = -1; } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryInDedicatedCollection.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryInDedicatedCollection.cs index ba853375f..d810e913d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryInDedicatedCollection.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Operations/QueryInDedicatedCollection.cs @@ -91,9 +91,9 @@ internal sealed class QueryInDedicatedCollection : MongoBase var contentEntities = await contentCollection.QueryContentsAsync(filter, query, ct); var contentTotal = (long)contentEntities.Count; - if (contentTotal >= q.Query.Take || q.Query.Skip > 0) + if (contentTotal >= query.Take || query.Skip > 0) { - if (q.NoTotal || (q.NoSlowTotal && q.Query.Filter != null)) + if (q.NoTotal || (q.NoSlowTotal && query.Filter != null)) { contentTotal = -1; } diff --git a/backend/src/Squidex.Shared/Texts.pt.resx b/backend/src/Squidex.Shared/Texts.pt.resx new file mode 100644 index 000000000..be0d55f60 --- /dev/null +++ b/backend/src/Squidex.Shared/Texts.pt.resx @@ -0,0 +1,1276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + O campo {name|lower} deve ser uma URL absoluta. + + + O campo {0} deve ser uma URL absoluta. + + + O campo {name|lower} deve ser o mesmo que {1.}. + + + O campo {0} deve ser o mesmo que {1}. + + + O campo {name|lower} não é um endereço de e-mail válido. + + + O campo {0} não é um endereço de e-mail válido. + + + O campo {name|lower} deve estar entre {min} e {max}. + + + O campo {0} deve estar entre {1} e {2}. + + + O campo não é. + + + O campo não é. + + + O campo {name|lower} é necessário. + + + O campo {0} é necessário. + + + O campo '{name|lower}' deve ser um texto com tamanho máximo de {max}. + + + O campo '{0}' deve ser um texto com tamanho máximo de {1}. + + + O campo '{name|lower}' deve ser um texto com tamanho mínimo de {min} e no máximo de {max}. + + + O campo '{0}' deve ser um texto com tamanho mínimo de {1} e no máximo de {2}. + + + Um cliente com o mesmo id já existe. + + + Você não pode mudar seu próprio papel. + + + Alcançou o tamanho máximo de colaboradors disponiveis para o seu plano. + + + Não é possível remover o unico dono. + + + App não tem uma língua de reserva '{fallback}'. + + + Linguagem foi adicionada. + + + A linguagem principal não pode ter linguagens de reserva. + + + A linguagem principal não pode ser feita opcional. + + + A linguagem principal não pode ser removida. + + + Você não pode criar mais aplicativos. Entre em contato com o suporte para remover essa restrição da sua conta. + + + Já existe uma app com esse nome. + + + Ficheiro não é uma imagem + + + Plano é gerido por uma equipa. + + + Um plano com este id não existe. + + + Plano só pode ser alterado pelo utilizador que configurou inicialmente. + + + Não pode remover o grupo pré definido. + + + Não pode alterar o grupo pré definido. + + + Um grupo com o mesmo nome já existe. + + + Não pode remover grupo quando tem um cliente associado. + + + Nãopode remover o grupo quando tem um colaborador associado. + + + A inscrição deve ser cancelada antes que o aplicativo possa ser transferido. + + + A equipa não existe. + + + A pasta de ficheiros não existe. + + + Não é possível adicionar pasta à sua própria criança. + + + Você alcançou o tamanho máximo de ficheiros. + + + Os ficheiros são referenciados por um conteúdo e não podem ser excluídos. + + + Já se encontra um processo de backup em processamento. + + + Não pode ter mais de {max} backups. + + + Um processamento de restauro já se encontra a correr. + + + Só pode aceder as suas notificações. + + + Comentário foi criado por outro utilizador. + + + Acção + + + Altura aspecto + + + Largura aspecto + + + Calculado o valor por defeito + + + ID do cliente + + + ID do cliente + + + Segredo do cliente + + + Tipo conteúdo + + + ID or email do colaborador + + + Critico + + + Data + + + Valor por defeito + + + Nome apresentação + + + Documentação + + + Editor + + + Email + + + Você não tem a permissão necessária. + + + Campo + + + IDs de campo + + + Nome do campo + + + Ficheiro + + + Nome da pasta + + + Cláusula de busca de consulta não suportada. + + + O tipo de conteúdo do ficheiro não está definido. + + + O nome do ficheiro não é definido. + + + O modelo não é válido. + + + Pedido corpo tem um formato inválido. + + + Não permitido para clientes. + + + Erros de validação + + + Passo Inicial + + + Erro ao executar script javascript: {message} + + + Script proibiu a operação. + + + Erro ao executar script javascript com erro de sintaxe: {message} + + + Script rejeitou a operação. + + + Código da língua + + + Entrar + + + Sair + + + Caracteres máximos + + + Altura Máx + + + Items Máx + + + Comprimento Máx + + + Tamanho Máx + + + Valor Máx + + + Largura Máx + + + Palavras Máx + + + Min characters + + + Altura Min + + + Items Min + + + Comprimento Min + + + Tamanho Min + + + Valor Min + + + Largura Min + + + Palavras Min + + + Nome + + + - não encontrado - + + + Num dias + + + Falha ao analisar consulta: {message}, para a consulta: {odata} + + + OData $filter clausula é inválida: {message} + + + OData operação não é suportada pela consulta: {odata} + + + OData $search clausula é invalida: {message} + + + Password antiga + + + Outro + + + Particionamento + + + Password + + + Confirmar + + + Padrão + + + Permissões + + + ID Plano + + + pre-visualizar URLs + + + Squidex Headless CMS + + + Propriedades + + + Propriedade + + + App está em modo de leitura de momento. + + + Remover + + + Resultado é muito grande para poder ser retornado. Use o parametro $take para reduzir o numero de items. + + + Grupo + + + Gravar + + + ID Esquema + + + Registar + + + Sucesso + + + Texto + + + Gatilho + + + Aviso + + + Fluxo de trabalho + + + Passo + + + Trancisão + + + Mais do que um conteúdo corresponde à consulta. + + + O conteúdo do componente não pode ser criado. + + + Só pode criar uma nova ver~sao quando o conteúdo estiver publicado. + + + Não existe nada para remover. + + + Os IDs ou o intervalo de programação devem ser definidos. + + + Json type inválido, esperado uma lista of objectos. + + + Json type inválido, esperado uma lista de textos. + + + Json type inválido, esperado um booleano. + + + Json object inválido, esperado um object com campo 'schemaId'. + + + Componente inválido. Nenhum campo 'schemaId' encontrado. + + + Componente inválido. Esquema não encontrado. + + + Json type inválido, esperado object de latitude/longitude. + + + Latitude deve estár entre -90 e 90. + + + Longitude deve estár entre -180 e 180. + + + Json type inválido, esperado número. + + + Json type inválido, esperado texto. + + + {count} Referencia(s) + + + O conteúdo é referenciado por outro conteúdo e não pode ser removido ou não publicado. + + + Esquema não está publicada. + + + Conteúdo único não pode ser actualizado. + + + Conteúdo único não pode ser criado. + + + Conteúdo único não pode ser removido. + + + Status não está definido no fluxo de trabalho. + + + Não foi possível alterar o estado {oldStatus} para {newStatus}. + + + Deve ter a proporção {width}:{height}. + + + Id {id} não encontrado. + + + Não pertence ao tipo permitido: {type}. + + + Deve ter entre {min} e {max}. + + + Deve ter exatamente {count} caractere(es). + + + Deve ter entre {min} e {max} caractere(es). + + + Não pode ter duplicados. + + + Validação falhou com um erro interno. + + + Deve ter exatamente {value}. + + + Extensão não é permitida. + + + Valor inválido. + + + Deve ter exatamente {count} item(s). + + + Deve ter exatamente {min} e {max} item(s). + + + Deve ser igual ou menor que {max}. + + + Não pode ter mais que {max} caracter(s). + + + Altura {height}px deve ser menos que {max}px. + + + Tamanho {size} deve ser menos que {max}. + + + Largura {width}px deve ser menos que {max}px. + + + Não pode ter mais que {max} item(s). + + + Não pode ter mais que {max} caracter(s). + + + Não pode ter mais que {max} palavras(s). + + + Deve ser maior ou igual que {min}. + + + Altura {height}px deve ser maior que {min}px. + + + Tamanho of {size} deve ser maior que {min}. + + + Largura {width}px deve ser maior que {min}px. + + + Deve ter no mínimo {min} item(s). + + + Deve ter no mínimo {min} caracter(s). + + + Deve ter no mínimo {min} caracter(s). + + + Deve ter no mínimo {min} word(s). + + + Value must not be defined. + + + Deve ter exactamente {count} caracter(s). + + + Deve ter entre {min} e {max} caracter(s). + + + Valor não é permitido. + + + Deve seguir o padrão. + + + Referencia '{id}' não encontrada. + + + Referencia '{id}' com esquema inválido. + + + Regex demasiado lento. + + + Campo obrigatório. + + + Já existe um conteúdo com o mesmo valor. + + + Não pode conter items com campos duplicados '{field}'. + + + {fieldType} não conhecido. + + + Deve ter exatamente {count} palavra(s). + + + Deve ter entre {min} e {max} palavra(s). + + + O fluxo de trabalho não permite actualizar o estado {status} + + + Um erro desconhecido ocorreu. + + + Email já existe. + + + Email já está registado noutro utilizador. Pode actualizar o seu login externo para a sua conta se for a sua página de perfil. + + + Email é inválido. + + + Nome de utilizador '{0}' é invlálido, só pode conter letras ou digitos. + + + Um utilizador com este login já existe. + + + Password incorrecta. + + + Passwords devem ter um digito ('0'-'9'). + + + Passwords devem ter um letra minusculo ('a'-'z'). + + + Passwords devem ter um caracter não alfa numerico. + + + Passwords deve ter no mínimo {0} caracteres diferentes. + + + Passwords devem ter um caracter maiusculo ('A'-'Z'). + + + Passwords é muito curta. + + + Esta password já apareceu numa violação de dados e não deve ser usada. Se já usou antes nalgum lado, por favor altere! + + + User está bloqueado. + + + Entidade ({id}) já existe. + + + Entidade ({id}) foi removida. + + + Entidade ({id}) não existe. + + + Entidade ({id}) versão {expectedVersion} não encontrada, mas sim {currentVersion}. + + + Scripts de ficheiros actualizados + + + cliente {[Id]} adicionado na app + + + cliente {[Id]} revogado + + + cliente {[Id]} actualizado + + + associado {user:[Contributor]} a {[Role]} + + + removido {user:[Contributor]} da app + + + app criada. + + + imagem da app removida + + + carregada nova imagem da app + + + adicionada língua {[Language]} + + + removida língua {[Language]} + + + alterada a língua principal para {[Language]} + + + actualizada língua {[Language]} + + + alterado o plano para {[Plan]} + + + plano redifinido + + + adicionado grupo {[Name]} + + + removido grupo {[Name]} + + + actualizado grupo {[Name]} + + + Configurações UI actualizadas + + + actualizada app ao cliente + + + actualizadas configurações gerais + + + adicionado fluxo de trabalho {[Name]}. + + + fluxo de trabalho removido. + + + fluxo de trabalho actualizado. + + + ficheiro substituido. + + + ficheiro actualizado. + + + ficheiro carregado. + + + conteúdo criado {[Schema]}. + + + conteúdo removido {[Schema]}. + + + creado novo rascunho. + + + removido rascunho. + + + marcada alteração de estado de {[Schema]} para {[Status]}. + + + erro ao marcar alteração de estado para conteúdo {[Schema]}. + + + conteúdo {[Schema]} actualizado. + + + esquema {[Name]} criado. + + + esquema {[Name]} removido. + + + adicionado campo {[Field]} no esquema {[Name]}. + + + removido campo {[Field]} do esquema {[Name]}. + + + desabilitado campo {[Field]} no esquema {[Name]}. + + + tem campo {[Field]} escondido no esquema {[Name]}. + + + campo {[Field]} bloqueado no esquema {[Name]}. + + + mostar campo {[Field]} no esquema {[Name]}. + + + re-ordenar campos no esquema {[Name]}. + + + campo {[Field]} actualizado no esquema {[Name]}. + + + esquema publicado {[Name]}. + + + configurado script no esquema {[Name]}. + + + despublicado esquema {[Name]}. + + + esquema {[Name]} actualizado. + + + alterado estado {[Schema]} para {[Status]}. + + + associado {user:[Contributor]} ao {[Role]}. + + + removido {user:[Contributor]} da equipa. + + + foi criada a equipa {[Name]}. + + + alterado plano para {[Plan]}. + + + plano redifinido. + + + actualizadas configurações gerais e renomeado para {[Name]}. + + + O seu Email é privado no Github. Altere para publico no Github e tente novamente. + + + Outra regra já se encontra a correr. + + + Valor por defeito calculado e valor por defeito não podem ser usado em conjunto. + + + Campo '{field}' foi adicionado em duplicado. + + + Campo não pode ser um campo UI. + + + Campo do esquema está bloqueado. + + + Um campo com o mesmo nome já existe. + + + CAmpo não é parte do esquema. + + + Ids do campo não cobrem todos os campos. + + + Um esquema com o mesmo nome já existe. + + + Não tem permissões para este esquema. + + + Esquema {id} não existe. + + + Não é permitido alteração em linha no Radio editor. + + + So campos lista podem ter campos aninhados. + + + Campo aninhado não pode ser lista de campos. + + + Só pode resolver uma referencia quando MaxItems é 1. + + + Alteração em linha só é permitida em dropdowns, slugs e input fields. + + + Radio buttons ou listas dropdown precisam de campos disponiveis. + + + Checkboxes ou listas dropdown precisam de campos disponiveis. + + + Campo UI não pode ser desabilitado. + + + Campo UI não pode ser habilitado. + + + Campo UI não pode ser escondido. + + + Campo UI não pode ser mostrado. + + + {name} conteúdos + + + {name} conteúdos + + + {name} Esquema + + + Criado utilizador + + + Confirmar + + + Nem autenticação por password or usando um provedor externo como o Google está configurado. Por favor verifique as suas configurações e logs. + + + Administrator + + + Criar administrador + + + Configurou pelo menos um provedor de autenticação externo como o Google. Faça o login novamente para tornar-se administrador. + + + Ir para login. + + + OU + + + Instalação + + + Está a ver este ecrã porque não existe ainda nenhum utilizador. Depois de criar um utilizador, este setup fica desabilitado. + + + Orgulhosamente feito por + + + Sebastian Stehle e Contribuintes, 2016-2022 + + + Com a sua configuração, apenas administradores podem criar novas apps. Se pretende alterar, altere esta variavel de sistema <code>UI__ONLYADMINSCANCREATEAPPS=false</code>. + + + Com a sua configuração, qualquer utilizador pode criar apps. Se pretende alterar, altere esta variavel de sistema <code>UI__ONLYADMINSCANCREATEAPPS=true</code>. + + + Está a usar <strong>armazenamento de ficheiros</strong> onde todos ficheiros são gravados no sistema de ficheiros local. Por favor lembrar incluir a pasta de ficheiros dentro da sua estratégia de backup e mapear para um volume, se estiver a usar docker. + + + Está a usar <strong>armazenamento de ficheiros com FTP</strong>. Não é recomendado usar este tipo devido a problemas de performance. + + + Não está a aceder a este site via https. Se este aviso não está correcto então Squidex não pode detectar o modo https, provavelmente a sua instância está por tras de uma reverse proxy como nginx. Confirme que http headers are forwarded properly, via the <code>X-Forwarded-*</code> headers. + + + Parabéns, está aceder Squidex por detrás de uma conexão segura (https). + + + Lista de verificação do sistema + + + Com a sua configuração, apenas administradores podem criar novas equipas. Se pretende alterar, altere esta variavel de sistema <code>UI__ONLYADMINSCANCREATETEAMS=false</code>. + + + Com a sua configuração, qualquer utilizador pode criar equipas. Se pretende alterar, altere esta variavel de sistema <code>UI__ONLYADMINSCANCREATETEAMS=true</code>. + + + Deve aceder ao Squidex so atraves de um URL canónico e configurar este URL na variavel de ambiente <code>URLS__BASEURL</code>. A base de URL actual <code>{actual}</code> não coincide com <code>{configured}</code>. Esta variavel deve apontar para um URL publico onde a sua instancia Squidex está disponível. + + + Parabéns, a variavel de ambiente <code>URLS__BASEURL</code> environment está configurada correctamente. Esta variavel deve apontar para um URL publico no qual a sua instância de Suidex está disponível. + + + Instalação + + + Operação não permitida, a sua conta pode estár bloqueada. + + + Accesso bloqueado + + + Eu concordo! + + + Cookies & Analytics + + + <p> Entendo e concordo que o Squidex usa cookies para garantir que você obtenha a melhor experiência em nossa plataforma e para armazenar seu status de login.. </p><p> Entendo e concordo que o Squidex integrou o Google Analytics (com a função de anonimizador). O Google Analytics é um serviço de análise da web para coletar e analisar dados sobre o comportamento dos utilizadors. </p><p> Eu aceito as <a href="{privacyUrl}" target="_blank" rel="noopener">politicas privadas</a>.</p> + + + E-Mailsa automáticos (opcional) + + + Entendo e concordo que o Squidex envia e-mails para me informar sobre novos ficheiros, alterações de última hora e tempos de inatividade. + + + Nós precisamos do seu consentimento + + + Voçê deve dar o seu consentimento. + + + Informação pessoal + + + Entendo e concordo que o Squidex coleta as seguintes informações privadas que são recuperadas de provedores de autenticação externos, como Google, Microsoft ou Github. <ul class="personal-information"> <li> Informações pessoais básicas (nome, sobrenome e foto) são fornecidas a todos os outros utilizadors para que possam adicioná-lo ao seu espaço de trabalho. </li><li> A qualquer momento, você tem a opção de alterar essas informações para anonimizar sua conta. </li><li> Sua conta de utilizador tem um identificador exclusivo e, para todas as suas alterações, rastreamos que você fez essas alterações e forneceu essas informações a outros utilizadors. </li></ul> + + + Consentimento + + + Não pode remover a si proprio. + + + Operação falhada + + + Pedimos desculpa mas aconteceu algo de errado. + + + Erro + + + Ocorreu uma exceção inesperada. + + + Sua conta está bloqueada, entre em contato com o administrador. + + + Conta bloqueada + + + Você não pode se trancar. + + + + + + Introduzir Email + + + Email ou password incorrecta + + + {action} com <strong>{provider}</strong> + + + Carregue aqui para entrar + + + Já registado? + + + Carregue aqui para registar + + + Sem conta? + + + Introduzir Password + + + OU + + + Desconectado! + + + !Por favor feche a janela. + + + Sair + + + Não podemos obter o endereço de e-mail do provedor de autenticação. + + + Login adicionado com sucesso. + + + Alterar Password + + + Password alterada com sucesso. + + + Use as credenciais do cliente para acessar a API com suas informações de perfil e permissões + + + cliente + + + Confirmar + + + Gerar + + + Segredo do cliente gerado com sucesso. + + + Editar perfil + + + Não mostre o seu perfil a outros + + + Logins + + + Password + + + Informação pessoal + + + Use propriedades personalizadas para regras e scripts. + + + Properiedades + + + Adicionar propriedade + + + Provedor de login removido com sucesso. + + + Set Password + + + Password configurada com sucesso. + + + Perfil + + + Conta atualizada com sucesso. + + + Conta atualizada com sucesso. + + + Carregar foto + + + Foto carregada com sucesso. + + + Você não pode desbloquear a si mesmo. + + + O usuário não tem permissão para fazer login. + + + Não foi possível encontrar o utilizador. + + + {property|upper} deve estar entre {min} e {max}. + + + {property|upper} deve ser maior ou igual {other|lower}. + + + {property|upper} deve ser maior que {other|lower}. + + + {property|upper} não é um nome de propriedade Javascript. + + + {property|upper} deve ser menor ou igual {other|lower}. + + + {property|upper} deve ser menor que {other|lower}. + + + A imagem não é uma imagem válida. + + + O SVG é malicioso e contém tags de script. + + + Só pode carregar um ficheiro. + + + {property|upper} é obrigatório. + + + Se {property1|lower} ou {property2|lower} são utilizador ambos têm de ser definidos. + + + O valor deve ser definido. + + + {property|upper} não é um slug válido. + + + {property|upper} não é um valor válido. + + + Múltiplos fluxos de trabalho cobrem todos os esquemas. + + + A etapa inicial não pode ser a etapa publicada. + + + O fluxo de trabalho deve ter uma etapa publicada. + + + A transição tem um destino inválido. + + + O esquema '{schema}' é coberto por vários fluxos de trabalho. + + \ No newline at end of file diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsSharedController.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsSharedController.cs index d70edfd7a..7c7e74f1f 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsSharedController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsSharedController.cs @@ -43,8 +43,6 @@ public sealed class ContentsSharedController : ApiController /// /// You can read the generated documentation for your app at /api/content/{appName}/docs. /// - [HttpGet] - [HttpPost] [Route("content/{app}/graphql/")] [Route("content/{app}/graphql/batch")] [ApiPermissionOrAnonymous] diff --git a/backend/src/Squidex/Config/Web/WebExtensions.cs b/backend/src/Squidex/Config/Web/WebExtensions.cs index e603cb327..fa768dd02 100644 --- a/backend/src/Squidex/Config/Web/WebExtensions.cs +++ b/backend/src/Squidex/Config/Web/WebExtensions.cs @@ -32,7 +32,7 @@ public static class WebExtensions public static IApplicationBuilder UseSquidexLocalization(this IApplicationBuilder app) { - var supportedCultures = new[] { "en", "nl", "it", "zh" }; + var supportedCultures = new[] { "en", "nl", "it", "zh", "pt" }; var localizationOptions = new RequestLocalizationOptions() .SetDefaultCulture(supportedCultures[0]) diff --git a/backend/src/Squidex/wwwroot/scripts/editor-sdk.js b/backend/src/Squidex/wwwroot/scripts/editor-sdk.js index cbf082c45..e0d131830 100644 --- a/backend/src/Squidex/wwwroot/scripts/editor-sdk.js +++ b/backend/src/Squidex/wwwroot/scripts/editor-sdk.js @@ -39,6 +39,20 @@ function isFunction(value) { return typeof value === 'function'; } +function isArrayOfStrings(value) { + if (!Array.isArray(value)) { + return false; + } + + for (var i = 0; i < value.length; i++) { + if (!isString(value[i])) { + return false; + } + } + + return true; +} + function SquidexPlugin() { var initHandler; var initCalled = false; @@ -82,7 +96,7 @@ function SquidexPlugin() { var editor = { /** - * Get the current value. + * Get the current context. */ getContext: function () { return context; @@ -140,13 +154,13 @@ function SquidexPlugin() { }; return editor; - } function SquidexFormField() { var context; var currentConfirm; var currentPickAssets; + var currentPickContents; var disabled = false; var disabledHandler; var formValue; @@ -218,6 +232,8 @@ function SquidexFormField() { if (event.source !== window) { var type = event.data.type; + console.log('Received Message: ' + type); + if (type === 'disabled') { var newDisabled = event.data.isDisabled; @@ -278,6 +294,14 @@ function SquidexFormField() { currentPickAssets.callback(event.data.result); } } + } else if (type === 'pickContentsResult') { + var correlationId = event.data.correlationId; + + if (currentPickContents && currentPickContents.correlationId === correlationId) { + if (typeof currentPickContents.callback === 'function') { + currentPickContents.callback(event.data.result); + } + } } } } @@ -462,6 +486,29 @@ function SquidexFormField() { } }, + /** + * Shows the dialog to pick assets. + * + * @param {string} schemas: The list of schema names. + * @param {function} callback The callback to invoke when the dialog is completed or closed. + */ + pickContents: function (schemas, callback) { + if (!isFunction(callback) || !isArrayOfStrings(schemas)) { + return; + } + + var correlationId = new Date().getTime().toString(); + + currentPickContents = { + correlationId: correlationId, + callback: callback + }; + + if (window.parent) { + window.parent.postMessage({ type: 'pickContents', correlationId: correlationId, schemas: schemas }, '*'); + } + }, + /** * Register an function that is called when the field is initialized. * diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs index fb3821823..94e6ff23d 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs @@ -6,11 +6,9 @@ // ========================================================================== using System.Net; -using System.Runtime.Intrinsics.X86; using Squidex.Assets; using Squidex.ClientLibrary.Management; using TestSuite.Fixtures; -using Xunit.Sdk; #pragma warning disable SA1300 // Element should begin with upper-case letter #pragma warning disable SA1507 // Code should not contain multiple blank lines in a row @@ -80,44 +78,12 @@ public class AssetTests : IClassFixture var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); - var pausingStream = new PauseStream(fileParameter.Data, 0.25); - var pausingFile = new FileParameter(pausingStream, fileParameter.FileName, fileParameter.ContentType); - - var numUploads = 0; - var numConflicts = 0; - - await using (pausingFile.Data) - { - using var cts = new CancellationTokenSource(5000); - - while (progress.Asset == null) - { - // When the previous request is still in progress we just give it another try. - if (progress.Exception is SquidexManagementException { StatusCode: 409 } && numConflicts < 3) - { - numConflicts++; - - progress.ResetException(); - - // Wait a little bit to finish the request on the server. - await Task.Delay(100, cts.Token); - } - else if (progress.Exception != null) - { - break; - } - - pausingStream.Reset(); - - await _.Assets.UploadAssetAsync(_.AppName, pausingFile, progress.AsOptions(), cts.Token); - numUploads++; - } - } + await UploadInChunksAsync(fileParameter); Assert.Null(progress.Exception); Assert.NotEmpty(progress.Progress); Assert.NotNull(progress.Asset); - Assert.True(numUploads > 1); + Assert.True(progress.Uploads.Count > 1); await using (var stream = new FileStream("Assets/SampleVideo_1280x720_1mb.mp4", FileMode.Open)) { @@ -242,7 +208,7 @@ public class AssetTests : IClassFixture [Fact] public async Task Should_replace_asset_using_tus_in_chunks() { - for (var i = 0; i < 5; i++) + for (var i = 0; i < 1; i++) { // STEP 1: Create asset var asset_1 = await _.Assets.UploadFileAsync(_.AppName, "Assets/logo-squared.png", "image/png"); @@ -253,45 +219,12 @@ public class AssetTests : IClassFixture var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); - var pausingStream = new PauseStream(fileParameter.Data, 0.25); - var pausingFile = new FileParameter(pausingStream, fileParameter.FileName, fileParameter.ContentType); - - var numUploads = 0; - var numConflicts = 0; - - await using (pausingFile.Data) - { - using var cts = new CancellationTokenSource(5000); - - // When the previous request is still in progress we just give it another try. - while (progress.Asset == null) - { - // When the previous request is still in progress we just give it another try. - if (progress.Exception is SquidexManagementException { StatusCode: 409 } && numConflicts < 3) - { - numConflicts++; - - progress.ResetException(); - - // Wait a little bit to finish the request on the server. - await Task.Delay(100, cts.Token); - } - else if (progress.Exception != null) - { - break; - } - - pausingStream.Reset(); - - await _.Assets.UploadAssetAsync(_.AppName, pausingFile, progress.AsOptions(asset_1.Id), cts.Token); - numUploads++; - } - } + await UploadInChunksAsync(fileParameter, asset_1.Id); Assert.Null(progress.Exception); Assert.NotEmpty(progress.Progress); Assert.NotNull(progress.Asset); - Assert.True(numUploads > 1); + Assert.True(progress.Uploads.Count > 1); await using (var stream = new FileStream("Assets/SampleVideo_1280x720_1mb.mp4", FileMode.Open)) { @@ -699,12 +632,36 @@ public class AssetTests : IClassFixture Assert.NotEqual(asset_1.FileSize, asset_2.FileSize); } + private async Task UploadInChunksAsync(FileParameter fileParameter, string id = null) + { + var pausingStream = new PauseStream(fileParameter.Data, 0.25); + var pausingFile = new FileParameter(pausingStream, fileParameter.FileName, fileParameter.ContentType) + { + ContentLength = fileParameter.Data.Length + }; + + await using (pausingFile.Data) + { + using var cts = new CancellationTokenSource(5000); + + while (progress.Asset == null && progress.Exception == null && !cts.IsCancellationRequested) + { + pausingStream.Reset(); + + await _.Assets.UploadAssetAsync(_.AppName, pausingFile, progress.AsOptions(id), cts.Token); + progress.Uploaded(); + } + } + } + public class ProgressHandler : IAssetProgressHandler { - public string FileId { get; private set; } + public string FileId { get; private set; } = Guid.NewGuid().ToString(); public List Progress { get; } = new List(); + public List Uploads { get; } = new List(); + public Exception Exception { get; private set; } public AssetDto Asset { get; private set; } @@ -719,17 +676,14 @@ public class AssetTests : IClassFixture return options; } - public void ResetException() + public void Uploaded() { - Exception = null; + Uploads.Add(Progress.LastOrDefault()); } public Task OnCompletedAsync(AssetUploadCompletedEvent @event, CancellationToken ct) { - // This is a previous exception, so we can unset it. - ResetException(); - Asset = @event.Asset; return Task.CompletedTask; } @@ -751,28 +705,44 @@ public class AssetTests : IClassFixture public Task OnFailedAsync(AssetUploadExceptionEvent @event, CancellationToken ct) { - if (@event.Exception.InnerException is not PauseException) - { - Exception = @event.Exception; - } - + Exception = @event.Exception; return Task.CompletedTask; } } - private sealed class PauseException : Exception + public class PauseStream : DelegateStream { - } + private readonly int maxLength; + private long totalRead; + private long totalRemaining; + private long seekStart; - private sealed class PauseStream : DelegateStream - { - private readonly double pauseAfter = 1; - private int totalRead; + public override long Length + { + get => Math.Min(maxLength, totalRemaining); + } + + public override long Position + { + get => base.Position - seekStart; + set => throw new NotSupportedException(); + } public PauseStream(Stream innerStream, double pauseAfter) : base(innerStream) { - this.pauseAfter = pauseAfter; + maxLength = (int)Math.Floor(innerStream.Length * pauseAfter) + 1; + + totalRemaining = innerStream.Length; + } + + public override long Seek(long offset, SeekOrigin origin) + { + var position = seekStart = base.Seek(offset, origin); + + totalRemaining = base.Length - position; + + return position; } public void Reset() @@ -783,9 +753,16 @@ public class AssetTests : IClassFixture public override async ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken = default) { - if (totalRead > Length * pauseAfter) + var remaining = Length - totalRead; + + if (remaining <= 0) + { + return 0; + } + + if (remaining < buffer.Length) { - throw new PauseException(); + buffer = buffer[.. (int)remaining]; } var bytesRead = await base.ReadAsync(buffer, cancellationToken); diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/ContentFixture.cs b/backend/tools/TestSuite/TestSuite.ApiTests/ContentFixture.cs index b4103e996..46bd67d02 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/ContentFixture.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/ContentFixture.cs @@ -9,7 +9,7 @@ using TestSuite.Fixtures; namespace TestSuite.ApiTests; -public sealed class ContentFixture : TestSchemaFixtureBase +public class ContentFixture : TestSchemaFixtureBase { public ContentFixture() : base("my-writes") diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryFixture.cs b/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryFixture.cs index ca3862bf4..c0d582b12 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryFixture.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryFixture.cs @@ -38,7 +38,10 @@ public sealed class ContentQueryFixture : TestSchemaFixtureBase nested2 = index } }), - Geo = GeoJson.Point(index, index, oldFormat: index % 2 == 1), + Geo = GeoJson.Point( + index + 100, + index, + oldFormat: index % 2 == 1), Localized = new Dictionary { ["en"] = index.ToString(CultureInfo.InvariantCulture) diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryTests.cs index b8d43cb39..9f7b63422 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/ContentQueryTests.cs @@ -361,7 +361,7 @@ public class ContentQueryTests : IClassFixture [Fact] public async Task Should_query_by_near_location_with_odata() { - var q = new ContentQuery { Filter = "geo.distance(data/geo/iv, geography'POINT(3 3)') lt 1000" }; + var q = new ContentQuery { Filter = "geo.distance(data/geo/iv, geography'POINT(103 3)') lt 1000" }; var items = await _.Contents.WaitForContentAsync(q, x => true, TimeSpan.FromSeconds(30)); @@ -381,7 +381,7 @@ public class ContentQueryTests : IClassFixture op = "lt", value = new { - longitude = 3, + longitude = 103, latitude = 3, distance = 1000 } @@ -397,7 +397,7 @@ public class ContentQueryTests : IClassFixture [Fact] public async Task Should_query_by_near_geoson_location_with_odata() { - var q = new ContentQuery { Filter = "geo.distance(data/geo/iv, geography'POINT(4 4)') lt 1000" }; + var q = new ContentQuery { Filter = "geo.distance(data/geo/iv, geography'POINT(104 4)') lt 1000" }; var items = await _.Contents.WaitForContentAsync(q, x => true, TimeSpan.FromSeconds(30)); @@ -466,7 +466,7 @@ public class ContentQueryTests : IClassFixture op = "lt", value = new { - longitude = 4, + longitude = 104, latitude = 4, distance = 1000 } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLFixture.cs b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLFixture.cs new file mode 100644 index 000000000..0e6eb1a88 --- /dev/null +++ b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLFixture.cs @@ -0,0 +1,195 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.ClientLibrary; +using Squidex.ClientLibrary.Management; + +#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row + +namespace TestSuite.ApiTests; + +public sealed class GraphQLFixture : ContentFixture +{ + public sealed class DynamicEntity : Content + { + } + + public override async Task InitializeAsync() + { + await base.InitializeAsync(); + + await CreateSchemasAsync(); + await CreateContentsAsync(); + } + + private async Task CreateSchemasAsync() + { + async Task CreateSchemaAsync(CreateSchemaDto request) + { + try + { + var response = await Schemas.PostSchemaAsync(AppName, request); + + return response.Id; + } + catch (SquidexManagementException ex) + { + if (ex.StatusCode != 400) + { + throw; + } + + var schema = await Schemas.GetSchemaAsync(AppName, request.Name); + + return schema.Id; + } + } + + // STEP 1: Create cities schema. + var createCitiesRequest = new CreateSchemaDto + { + Name = "cities", + Fields = new List + { + new UpsertSchemaFieldDto + { + Name = "name", + Properties = new StringFieldPropertiesDto() + } + }, + IsPublished = true + }; + + var citiesId = await CreateSchemaAsync(createCitiesRequest); + + + // STEP 2: Create states schema. + var createStatesRequest = new CreateSchemaDto + { + Name = "states", + Fields = new List + { + new UpsertSchemaFieldDto + { + Name = "name", + Properties = new StringFieldPropertiesDto() + }, + new UpsertSchemaFieldDto + { + Name = "cities", + Properties = new ReferencesFieldPropertiesDto + { + SchemaIds = new List { citiesId } + } + } + }, + IsPublished = true + }; + + var statesId = await CreateSchemaAsync(createStatesRequest); + + + // STEP 3: Create countries schema. + var createCountriesRequest = new CreateSchemaDto + { + Name = "countries", + Fields = new List + { + new UpsertSchemaFieldDto + { + Name = "name", + Properties = new StringFieldPropertiesDto() + }, + new UpsertSchemaFieldDto + { + Name = "states", + Properties = new ReferencesFieldPropertiesDto + { + SchemaIds = new List { statesId } + } + } + }, + IsPublished = true + }; + + await CreateSchemaAsync(createCountriesRequest); + } + + private async Task CreateContentsAsync() + { + var countriesClient = ClientManager.CreateContentsClient("countries"); + var countriesResponse = await countriesClient.GetAsync(); + + if (countriesResponse.Total > 0) + { + return; + } + + async Task CreateCityAsync(string name) + { + var citySAData = new + { + name = new + { + iv = name + } + }; + + var citiesClient = ClientManager.CreateContentsClient("cities"); + + var city = await citiesClient.CreateAsync(citySAData, ContentCreateOptions.AsPublish); + + return city.Id; + } + + async Task CreateStateAsync(string name, string cityId) + { + var citySAData = new + { + name = new + { + iv = name + }, + cities = new + { + iv = new[] { cityId } + } + }; + + var statesClient = ClientManager.CreateContentsClient("states"); + + var state = await statesClient.CreateAsync(citySAData, ContentCreateOptions.AsPublish); + + return state.Id; + } + + // STEP 1: Create state 1 + var sachsenCapital = await CreateCityAsync("Leipzig"); + var sachstenState = await CreateStateAsync("Sachsen", sachsenCapital); + + + // STEP 1: Create state 2 + var badenWCapital = await CreateCityAsync("Stuttgart"); + var badenWState = await CreateStateAsync("Baden Württemberg", badenWCapital); + + + // STEP 3: Create country + var countryData = new + { + name = new + { + iv = "Germany" + }, + states = new + { + iv = new[] { sachstenState, badenWState } + } + }; + + await countriesClient.CreateAsync(countryData, ContentCreateOptions.AsPublish); + } +} diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs new file mode 100644 index 000000000..d8556a9b7 --- /dev/null +++ b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs @@ -0,0 +1,144 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Reactive.Linq; +using GraphQL; +using GraphQL.Client.Http; +using GraphQL.Client.Serializer.Newtonsoft; +using Squidex.ClientLibrary; +using Squidex.ClientLibrary.Management; +using TestSuite.Model; + +namespace TestSuite.ApiTests; + +#pragma warning disable SA1300 // Element should begin with upper-case letter +#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row + +public class GraphQLSubscriptionTests : IClassFixture +{ + public ContentFixture _ { get; set; } + + public GraphQLSubscriptionTests(ContentFixture fixture) + { + _ = fixture; + } + + private sealed class ContentChangesResult + { + public ContentChanges ContentChanges { get; set; } + } + + private sealed class ContentChanges + { + public string Id { get; set; } + } + + private sealed class AssetChangesResult + { + public AssetChanges AssetChanges { get; set; } + } + + private sealed class AssetChanges + { + public string Id { get; set; } + } + + [Fact] + public async Task Should_listen_to_content_changes() + { + var client = await CreateClient(); + + + // STEP 1: Subscribe to changes. + var contentChanges = new GraphQLRequest + { + Query = @" + subscription { + contentChanges { + id + } + }" + }; + + var contentId = Guid.NewGuid().ToString(); + + var subscriptionStream + = client.CreateSubscriptionStream(contentChanges); + + var publishedContent = + subscriptionStream.Where(x => x.Data.ContentChanges.Id == contentId).Timeout(TimeSpan.FromSeconds(30)) + .FirstOrDefaultAsync(); + + + // STEP 2: Create Content. + await _.Contents.CreateAsync(new TestEntityData(), new ContentCreateOptions { Id = contentId }); + + + // STEP 3: Wait for publication. + var publishedResult = await publishedContent; + + Assert.Equal(contentId, publishedResult.Data.ContentChanges.Id); + } + + [Fact] + public async Task Should_listen_to_asset_changes() + { + var client = await CreateClient(); + + + // STEP 1: Subscribe to changes. + var assetChanges = new GraphQLRequest + { + Query = @" + subscription { + assetChanges { + id + } + }" + }; + + var assetId = Guid.NewGuid().ToString(); + + var subscriptionStream + = client.CreateSubscriptionStream(assetChanges); + + var publishedAsset = + subscriptionStream.Where(x => x.Data.AssetChanges.Id == assetId).Timeout(TimeSpan.FromSeconds(30)) + .FirstOrDefaultAsync(); + + + // STEP 2: Create asset. + var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); + + await using (fileParameter.Data) + { + await _.Assets.UploadAssetAsync(_.AppName, fileParameter, new AssetUploadOptions { Id = assetId }); + } + + // STEP 3: Wait for publication. + var publishedResult = await publishedAsset; + + Assert.Equal(assetId, publishedResult.Data.AssetChanges.Id); + } + + private async Task CreateClient() + { + var accessToken = await _.ClientManager.Options.Authenticator.GetBearerTokenAsync(_.AppName, default); + + var options = new GraphQLHttpClientOptions + { + EndPoint = new Uri(_.ClientManager.GenerateUrl($"/api/content/{_.AppName}/graphql?access_token={accessToken}")) + }; + + var client = new GraphQLHttpClient(options, new NewtonsoftJsonSerializer()); + + await client.InitializeWebsocketConnection(); + + return client; + } +} diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs index b9ef3008b..5a2dd76cb 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs @@ -7,7 +7,6 @@ using Newtonsoft.Json.Linq; using Squidex.ClientLibrary; -using Squidex.ClientLibrary.Management; using TestSuite.Model; #pragma warning disable SA1300 // Element should begin with upper-case letter @@ -15,53 +14,15 @@ using TestSuite.Model; namespace TestSuite.ApiTests; -public sealed class GraphQLTests : IClassFixture +public sealed class GraphQLTests : IClassFixture { - public ContentFixture _ { get; } + public GraphQLFixture _ { get; } - public GraphQLTests(ContentFixture fixture) + public GraphQLTests(GraphQLFixture fixture) { _ = fixture; } - public sealed class DynamicEntity : Content - { - } - - public sealed class Country - { - public CountryData Data { get; set; } - } - - public sealed class CountryData - { - public string Name { get; set; } - - public List States { get; set; } - } - - public sealed class State - { - public StateData Data { get; set; } - } - - public sealed class StateData - { - public string Name { get; set; } - - public List Cities { get; set; } - } - - public sealed class City - { - public CityData Data { get; set; } - } - - public sealed class CityData - { - public string Name { get; set; } - } - [Fact] public async Task Should_query_json() { @@ -92,38 +53,20 @@ public sealed class GraphQLTests : IClassFixture }".Replace("", content_0.Id, StringComparison.Ordinal) }; - var result1 = await _.SharedContents.GraphQlAsync(query); + var result = await _.SharedContents.GraphQlAsync(query); - Assert.Equal(1, result1["findMyWritesContent"]["flatData"]["json"]["value"].Value()); - Assert.Equal(2, result1["findMyWritesContent"]["flatData"]["json"]["obj"]["value"].Value()); + Assert.Equal(1, result["findMyWritesContent"]["flatData"]["json"]["value"].Value()); + Assert.Equal(2, result["findMyWritesContent"]["flatData"]["json"]["obj"]["value"].Value()); } [Fact] - public async Task Should_create_and_query_with_graphql() + public async Task Should_query_graphql_reference_selectors() { - try - { - await CreateSchemasAsync(); - } - catch - { - // Do nothing - } - - try - { - await CreateContentsAsync(); - } - catch - { - // Do nothing - } - var query = new { query = @" { - queryCountriesContents { + countries: queryCountriesContents { data: flatData { name, states { @@ -141,134 +84,144 @@ public sealed class GraphQLTests : IClassFixture }" }; - var result1 = await _.SharedContents.GraphQlAsync(query); + var result = await _.SharedContents.GraphQlAsync(query); - var typed = result1["queryCountriesContents"].ToObject>(); + var cityNames = + result["countries"].ToObject>()[0].Data.States + .SelectMany(x => x.Data.Cities) + .Select(x => x.Data.Name) + .Order(); - Assert.Equal("Leipzig", typed[0].Data.States[0].Data.Cities[0].Data.Name); + Assert.Equal(new[] { "Leipzig", "Stuttgart" }, cityNames); } - private async Task CreateSchemasAsync() + [Fact] + public async Task Should_query_graphql_reference_operator() { - // STEP 1: Create cities schema. - var createCitiesRequest = new CreateSchemaDto + var query = new { - Name = "cities", - Fields = new List - { - new UpsertSchemaFieldDto + query = @" { - Name = "name", - Properties = new StringFieldPropertiesDto() - } - }, - IsPublished = true + countries: queryCountriesContents { + data: flatData { + name, + states { + data: flatData { + name + }, + cities: referencesCitiesContents { + data: flatData { + name + } + } + } + } + } + }" }; - var cities = await _.Schemas.PostSchemaAsync(_.AppName, createCitiesRequest); + var result = await _.SharedContents.GraphQlAsync(query); + + var cityNames = + result["countries"] + .SelectMany(x => x["data"]["states"]) + .SelectMany(x => x["cities"]) + .Select(x => x["data"]["name"].Value()) + .Order(); + Assert.Equal(new[] { "Leipzig", "Stuttgart" }, cityNames); + } - // STEP 2: Create states schema. - var createStatesRequest = new CreateSchemaDto + [Fact] + public async Task Should_query_graphql_reference_operator_with_filter() + { + var query = new { - Name = "states", - Fields = new List - { - new UpsertSchemaFieldDto - { - Name = "name", - Properties = new StringFieldPropertiesDto() - }, - new UpsertSchemaFieldDto + query = @" { - Name = "cities", - Properties = new ReferencesFieldPropertiesDto - { - SchemaIds = new List { cities.Id } + countries: queryCountriesContents { + data: flatData { + name, + states { + data: flatData { + name + }, + cities: referencesCitiesContents(filter: ""data/name/iv eq 'Leipzig'"") { + data: flatData { + name + } + } + } + } } - } - }, - IsPublished = true + }" }; - var states = await _.Schemas.PostSchemaAsync(_.AppName, createStatesRequest); - + var result = await _.SharedContents.GraphQlAsync(query); - // STEP 3: Create countries schema. - var createCountriesRequest = new CreateSchemaDto - { - Name = "countries", - Fields = new List - { - new UpsertSchemaFieldDto - { - Name = "name", - Properties = new StringFieldPropertiesDto() - }, - new UpsertSchemaFieldDto - { - Name = "states", - Properties = new ReferencesFieldPropertiesDto - { - SchemaIds = new List { states.Id } - } - } - }, - IsPublished = true - }; + var cityNames = + result["countries"] + .SelectMany(x => x["data"]["states"]) + .SelectMany(x => x["cities"]) + .Select(x => x["data"]["name"].Value()) + .Order(); - await _.Schemas.PostSchemaAsync(_.AppName, createCountriesRequest); + Assert.Equal(new[] { "Leipzig" }, cityNames); } - private async Task CreateContentsAsync() + [Fact] + public async Task Should_query_graphql_referencing_operator() { - // STEP 1: Create city - var cityData = new + var query = new { - name = new - { - iv = "Leipzig" - } + query = @" + { + cities: queryCitiesContents { + states: referencingStatesContents { + data: flatData { + name + } + } + } + }" }; - var citiesClient = _.ClientManager.CreateContentsClient("cities"); + var result = await _.SharedContents.GraphQlAsync(query); - var city = await citiesClient.CreateAsync(cityData, ContentCreateOptions.AsPublish); + var stateNames = + result["cities"] + .SelectMany(x => x["states"]) + .Select(x => x["data"]["name"].Value()) + .Order(); + Assert.Equal(new[] { "Baden Württemberg", "Sachsen" }, stateNames); + } - // STEP 2: Create city - var stateData = new + [Fact] + public async Task Should_query_graphql_referencing_operator_with_filter() + { + var query = new { - name = new - { - iv = "Saxony" - }, - cities = new - { - iv = new[] { city.Id } - } + query = @" + { + cities: queryCitiesContents { + states: referencingStatesContents(filter: ""data/name/iv eq 'Sachsen'"") { + data: flatData { + name + } + } + } + }" }; - var statesClient = _.ClientManager.CreateContentsClient("states"); - - var state = await statesClient.CreateAsync(stateData, ContentCreateOptions.AsPublish); - - - // STEP 3: Create country - var countryData = new - { - name = new - { - iv = "Germany" - }, - states = new - { - iv = new[] { state.Id } - } - }; + var result = await _.SharedContents.GraphQlAsync(query); - var countriesClient = _.ClientManager.CreateContentsClient("countries"); + var stateNames = + result["cities"] + .SelectMany(x => x["states"]) + .Select(x => x["data"]["name"].Value()) + .Order(); - await countriesClient.CreateAsync(countryData, ContentCreateOptions.AsPublish); + Assert.Equal(new[] { "Sachsen" }, stateNames); } } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj b/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj index fe017df41..81af41129 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj +++ b/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj @@ -15,14 +15,16 @@ - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + diff --git a/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj b/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj index 939c9be40..a26900858 100644 --- a/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj +++ b/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj @@ -6,11 +6,11 @@ enable - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/backend/tools/TestSuite/TestSuite.Shared/Model/Geography.cs b/backend/tools/TestSuite/TestSuite.Shared/Model/Geography.cs new file mode 100644 index 000000000..ca5a91d1d --- /dev/null +++ b/backend/tools/TestSuite/TestSuite.Shared/Model/Geography.cs @@ -0,0 +1,44 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +#pragma warning disable MA0048 // File name must match type name + +namespace TestSuite.Model; + +public sealed class Country +{ + public CountryData Data { get; set; } +} + +public sealed class CountryData +{ + public string Name { get; set; } + + public List States { get; set; } +} + +public sealed class State +{ + public StateData Data { get; set; } +} + +public sealed class StateData +{ + public string Name { get; set; } + + public List Cities { get; set; } +} + +public sealed class City +{ + public CityData Data { get; set; } +} + +public sealed class CityData +{ + public string Name { get; set; } +} diff --git a/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj b/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj index 99da4fce3..deebcbee1 100644 --- a/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj +++ b/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj @@ -6,18 +6,18 @@ enable - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + - - + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b42d8d7b3..71983f546 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -28,7 +28,7 @@ "angular-mentions": "1.5.0", "angular2-chartjs": "0.5.1", "babel-polyfill": "6.26.0", - "bootstrap": "5.2.2", + "bootstrap": "5.2.3", "core-js": "3.25.5", "cropperjs": "2.0.0-alpha.1", "date-fns": "2.29.3", @@ -14773,7 +14773,9 @@ "license": "ISC" }, "node_modules/bootstrap": { - "version": "5.2.2", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "funding": [ { "type": "github", @@ -14784,7 +14786,6 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.6" } @@ -16252,8 +16253,9 @@ }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, - "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -24457,7 +24459,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } @@ -26621,8 +26624,9 @@ }, "node_modules/proxy-middleware": { "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -28248,8 +28252,9 @@ }, "node_modules/send": { "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -42433,7 +42438,9 @@ "dev": true }, "bootstrap": { - "version": "5.2.2", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "requires": {} }, "boxen": { @@ -43406,6 +43413,8 @@ }, "cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { "object-assign": "^4", @@ -48838,7 +48847,9 @@ "dev": true }, "object-assign": { - "version": "4.1.1" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-copy": { "version": "0.1.0", @@ -50125,6 +50136,8 @@ }, "proxy-middleware": { "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", "dev": true }, "prr": { @@ -51183,6 +51196,8 @@ }, "send": { "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", diff --git a/frontend/package.json b/frontend/package.json index 725aa8c7e..5cb636266 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,7 +35,7 @@ "angular-mentions": "1.5.0", "angular2-chartjs": "0.5.1", "babel-polyfill": "6.26.0", - "bootstrap": "5.2.2", + "bootstrap": "5.2.3", "core-js": "3.25.5", "cropperjs": "2.0.0-alpha.1", "date-fns": "2.29.3", diff --git a/frontend/src/app/_theme.html b/frontend/src/app/_theme.html index 4c2ee6fca..4699dec0e 100644 --- a/frontend/src/app/_theme.html +++ b/frontend/src/app/_theme.html @@ -100,7 +100,7 @@
- +
@@ -131,7 +131,7 @@
- +
@@ -676,19 +676,19 @@
- +
- +
- +
Success! You've done it.
@@ -696,7 +696,7 @@
- +
Shucks, try again.
@@ -708,13 +708,13 @@
You have entered an invalid value.
- +
- +
The app name cannot be changed later. @@ -730,7 +730,7 @@
- +
@@ -745,7 +745,7 @@
$ - .00 @@ -758,7 +758,7 @@
- diff --git a/frontend/src/app/features/administration/pages/users/user-page.component.html b/frontend/src/app/features/administration/pages/users/user-page.component.html index a8c9b271a..770417c9c 100644 --- a/frontend/src/app/features/administration/pages/users/user-page.component.html +++ b/frontend/src/app/features/administration/pages/users/user-page.component.html @@ -46,7 +46,7 @@ - +
diff --git a/frontend/src/app/features/assets/pages/asset-tag-dialog.component.html b/frontend/src/app/features/assets/pages/asset-tag-dialog.component.html index 271c3dafb..1514b5f4e 100644 --- a/frontend/src/app/features/assets/pages/asset-tag-dialog.component.html +++ b/frontend/src/app/features/assets/pages/asset-tag-dialog.component.html @@ -12,7 +12,7 @@ - +
diff --git a/frontend/src/app/features/content/shared/forms/assets-editor.component.html b/frontend/src/app/features/content/shared/forms/assets-editor.component.html index 67563ca28..d6b4293d5 100644 --- a/frontend/src/app/features/content/shared/forms/assets-editor.component.html +++ b/frontend/src/app/features/content/shared/forms/assets-editor.component.html @@ -80,5 +80,5 @@
- + \ No newline at end of file diff --git a/frontend/src/app/features/content/shared/forms/field-editor.component.html b/frontend/src/app/features/content/shared/forms/field-editor.component.html index 36a05dfe5..25f938123 100644 --- a/frontend/src/app/features/content/shared/forms/field-editor.component.html +++ b/frontend/src/app/features/content/shared/forms/field-editor.component.html @@ -28,13 +28,14 @@ + [language]="language" + [languages]="languages"> @@ -173,10 +174,10 @@ - + - + diff --git a/frontend/src/app/features/content/shared/forms/iframe-editor.component.html b/frontend/src/app/features/content/shared/forms/iframe-editor.component.html index ab6c6619c..424a9e513 100644 --- a/frontend/src/app/features/content/shared/forms/iframe-editor.component.html +++ b/frontend/src/app/features/content/shared/forms/iframe-editor.component.html @@ -1,11 +1,20 @@
-
- +
+
- - + + + + + + diff --git a/frontend/src/app/features/content/shared/forms/iframe-editor.component.scss b/frontend/src/app/features/content/shared/forms/iframe-editor.component.scss index 25d1dafdc..7fe08d916 100644 --- a/frontend/src/app/features/content/shared/forms/iframe-editor.component.scss +++ b/frontend/src/app/features/content/shared/forms/iframe-editor.component.scss @@ -17,4 +17,15 @@ iframe { iframe { height: 100% !important; } +} + +.expanded { + @include absolute(50px, 0, 0, 0); + overflow: hidden; + + iframe { + height: 100% !important; + overflow-x: auto !important; + overflow-y: auto !important; + } } \ No newline at end of file diff --git a/frontend/src/app/features/content/shared/forms/iframe-editor.component.ts b/frontend/src/app/features/content/shared/forms/iframe-editor.component.ts index 43557f693..5bdc3f411 100644 --- a/frontend/src/app/features/content/shared/forms/iframe-editor.component.ts +++ b/frontend/src/app/features/content/shared/forms/iframe-editor.component.ts @@ -9,7 +9,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Even import { AbstractControl } from '@angular/forms'; import { Router } from '@angular/router'; import { DialogModel, DialogService, disabled$, StatefulComponent, Types, value$ } from '@app/framework'; -import { AppsState, AssetDto, computeEditorUrl } from '@app/shared'; +import { AppLanguageDto, AppsState, AssetDto, computeEditorUrl, ContentDto } from '@app/shared'; interface State { // True, when the editor is shown as fullscreen. @@ -17,7 +17,7 @@ interface State { } @Component({ - selector: 'sqx-iframe-editor[context][formField][formIndex][formValue][formControlBinding]', + selector: 'sqx-iframe-editor[context][formField][formIndex][formValue][formControlBinding][language][languages]', styleUrls: ['./iframe-editor.component.scss'], templateUrl: './iframe-editor.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -26,7 +26,6 @@ export class IFrameEditorComponent extends StatefulComponent implements O private value: any; private isInitialized = false; private isDisabled = false; - private assetsCorrelationId: any; @ViewChild('iframe', { static: false }) public iframe!: ElementRef; @@ -38,10 +37,10 @@ export class IFrameEditorComponent extends StatefulComponent implements O public inner!: ElementRef; @Output() - public expandedChange = new EventEmitter(); + public isExpandedChange = new EventEmitter(); @Input() - public expanded = false; + public isExpanded = false; @Input() public context: any = {}; @@ -56,7 +55,10 @@ export class IFrameEditorComponent extends StatefulComponent implements O public formIndex?: number | null; @Input() - public language?: string | null; + public language!: AppLanguageDto; + + @Input() + public languages!: ReadonlyArray; @Input() public formControlBinding!: AbstractControl; @@ -73,8 +75,13 @@ export class IFrameEditorComponent extends StatefulComponent implements O public computedUrl = ''; + public assetsCorrelationId: any; public assetsDialog = new DialogModel(); + public contentsCorrelationId: any; + public contentsSchemas?: string[]; + public contentsDialog = new DialogModel(); + constructor(changeDetector: ChangeDetectorRef, private readonly appsState: AppsState, private readonly dialogs: DialogService, @@ -161,8 +168,8 @@ export class IFrameEditorComponent extends StatefulComponent implements O } else if (type === 'expanded') { const { mode } = event.data; - if (mode !== this.expanded) { - this.expandedChange.emit(); + if (mode !== this.isExpanded) { + this.isExpandedChange.emit(); } } else if (type === 'valueChanged') { const { value } = event.data; @@ -201,6 +208,14 @@ export class IFrameEditorComponent extends StatefulComponent implements O this.assetsCorrelationId = correlationId; this.assetsDialog.show(); } + } else if (type === 'pickContents') { + const { correlationId, schemas } = event.data; + + if (correlationId) { + this.contentsCorrelationId = correlationId; + this.contentsSchemas = schemas; + this.contentsDialog.show(); + } } this.detectChanges(); @@ -217,6 +232,16 @@ export class IFrameEditorComponent extends StatefulComponent implements O this.assetsDialog.hide(); } + public pickContents(contents: ReadonlyArray) { + if (this.contentsCorrelationId) { + this.sendMessage('pickContentsResult', { correlationId: this.contentsCorrelationId, result: contents }); + + this.contentsCorrelationId = null; + } + + this.contentsDialog.hide(); + } + public updateValue(obj: any) { if (!Types.equals(obj, this.value)) { this.value = obj; @@ -250,7 +275,7 @@ export class IFrameEditorComponent extends StatefulComponent implements O } private sendExpanded() { - this.sendMessage('expandedChanged', { expanded: this.expanded }); + this.sendMessage('expandedChanged', { expanded: this.isExpanded }); } private sendDisabled() { diff --git a/frontend/src/app/features/content/shared/forms/stock-photo-editor.component.html b/frontend/src/app/features/content/shared/forms/stock-photo-editor.component.html index 6427ba248..1803fbaa4 100644 --- a/frontend/src/app/features/content/shared/forms/stock-photo-editor.component.html +++ b/frontend/src/app/features/content/shared/forms/stock-photo-editor.component.html @@ -8,7 +8,7 @@ - +
diff --git a/frontend/src/app/features/rules/shared/triggers/content-changed-trigger.component.html b/frontend/src/app/features/rules/shared/triggers/content-changed-trigger.component.html index 9f4108a4e..67275eb43 100644 --- a/frontend/src/app/features/rules/shared/triggers/content-changed-trigger.component.html +++ b/frontend/src/app/features/rules/shared/triggers/content-changed-trigger.component.html @@ -21,7 +21,7 @@ {{triggerSchema.schema.displayName}} - - +
@@ -15,7 +15,7 @@ - + {{ 'schemas.schemaLabelHint' | sqxTranslate }}
@@ -25,7 +25,7 @@ - + {{ 'schemas.schemaHintsHint' | sqxTranslate }}
diff --git a/frontend/src/app/features/schemas/pages/schema/fields/field-wizard.component.html b/frontend/src/app/features/schemas/pages/schema/fields/field-wizard.component.html index 693c79721..71e30dbaf 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/field-wizard.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/field-wizard.component.html @@ -53,7 +53,7 @@
- +
diff --git a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-common.component.html b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-common.component.html index b99b27668..5a1a512aa 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-common.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-common.component.html @@ -3,7 +3,7 @@
- + {{ 'schemas.field.nameHint' | sqxTranslate }} @@ -17,7 +17,7 @@
- + {{ 'schemas.field.labelHint' | sqxTranslate }} @@ -31,7 +31,7 @@
- + {{ 'schemas.field.hintsHint' | sqxTranslate }} diff --git a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form.component.html b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form.component.html index 24ed6cd0d..3f9ed1771 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form.component.html @@ -60,6 +60,6 @@
-
+
\ No newline at end of file diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/boolean-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/boolean-ui.component.html index 7d5d16529..855cad2e6 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/types/boolean-ui.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/boolean-ui.component.html @@ -3,7 +3,7 @@
- + {{ 'schemas.field.placeholderHint' | sqxTranslate }} diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html index e57c9a606..4062c8dc2 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/date-time-ui.component.html @@ -3,7 +3,7 @@
- + {{ 'schemas.field.placeholderHint' | sqxTranslate }} @@ -14,7 +14,7 @@
- + diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/number-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/number-ui.component.html index f4b0fa537..010e606c5 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/types/number-ui.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/number-ui.component.html @@ -3,7 +3,7 @@
- + {{ 'schemas.field.placeholderHint' | sqxTranslate }} diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/string-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/string-ui.component.html index b9d367ccb..2fb8c2afd 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/types/string-ui.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/string-ui.component.html @@ -3,7 +3,7 @@
- + {{ 'schemas.field.placeholderHint' | sqxTranslate }} diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/string-validation.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/string-validation.component.html index df50a2b55..28f183503 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/types/string-validation.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/string-validation.component.html @@ -32,7 +32,7 @@
- + @@ -57,7 +57,7 @@
- +
@@ -119,7 +119,7 @@
- +
@@ -127,7 +127,7 @@
- + {{ 'schemas.field.defaultValuesHint' | sqxTranslate }} diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/tags-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/tags-ui.component.html index e860e4a5c..501933cf0 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/types/tags-ui.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/tags-ui.component.html @@ -3,7 +3,7 @@
- + {{ 'schemas.field.placeholderHint' | sqxTranslate }} diff --git a/frontend/src/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.html b/frontend/src/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.html index 486ad568f..9e6cbe85b 100644 --- a/frontend/src/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.html +++ b/frontend/src/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.html @@ -16,13 +16,13 @@
- +
- +
diff --git a/frontend/src/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.html b/frontend/src/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.html index 2b1f1b69f..176d13416 100644 --- a/frontend/src/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.html +++ b/frontend/src/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.html @@ -32,7 +32,7 @@
- +
diff --git a/frontend/src/app/features/schemas/pages/schemas/schema-form.component.html b/frontend/src/app/features/schemas/pages/schemas/schema-form.component.html index 391aecc0d..b1c06ce2c 100644 --- a/frontend/src/app/features/schemas/pages/schemas/schema-form.component.html +++ b/frontend/src/app/features/schemas/pages/schemas/schema-form.component.html @@ -18,7 +18,7 @@ - + {{ 'schemas.schemaNameHint' | sqxTranslate }} diff --git a/frontend/src/app/features/settings/pages/clients/client-add-form.component.html b/frontend/src/app/features/settings/pages/clients/client-add-form.component.html index f54cf393e..248cfc4d4 100644 --- a/frontend/src/app/features/settings/pages/clients/client-add-form.component.html +++ b/frontend/src/app/features/settings/pages/clients/client-add-form.component.html @@ -6,7 +6,7 @@
- +
diff --git a/frontend/src/app/features/settings/pages/roles/role-add-form.component.html b/frontend/src/app/features/settings/pages/roles/role-add-form.component.html index a72f6fcd3..90ec68db3 100644 --- a/frontend/src/app/features/settings/pages/roles/role-add-form.component.html +++ b/frontend/src/app/features/settings/pages/roles/role-add-form.component.html @@ -7,7 +7,7 @@
- +
diff --git a/frontend/src/app/framework/angular/forms/editable-title.component.html b/frontend/src/app/framework/angular/forms/editable-title.component.html index a6af55ddd..b3eb41977 100644 --- a/frontend/src/app/framework/angular/forms/editable-title.component.html +++ b/frontend/src/app/framework/angular/forms/editable-title.component.html @@ -5,7 +5,7 @@
- +
diff --git a/frontend/src/app/framework/angular/forms/editors/autocomplete.component.html b/frontend/src/app/framework/angular/forms/editors/autocomplete.component.html index 7a1cce8cc..c454fc03b 100644 --- a/frontend/src/app/framework/angular/forms/editors/autocomplete.component.html +++ b/frontend/src/app/framework/angular/forms/editors/autocomplete.component.html @@ -1,5 +1,5 @@
-
- - +
@@ -118,7 +118,7 @@ - +
@@ -33,12 +33,12 @@ icon-wrap_text
- - + +
liga: - +
@@ -47,12 +47,12 @@ icon-fullscreen_exit
- - + +
liga: - +
@@ -61,12 +61,12 @@ icon-fullscreen
- - + +
liga: - +
@@ -75,12 +75,12 @@ icon-enter
- - + +
liga: - +
@@ -89,12 +89,12 @@ icon-zoom_out
- - + +
liga: - +
@@ -103,12 +103,12 @@ icon-zoom_in
- - + +
liga: - +
@@ -117,12 +117,12 @@ icon-flip
- - + +
liga: - +
@@ -131,12 +131,12 @@ icon-rotate_right
- - + +
liga: - +
@@ -145,12 +145,12 @@ icon-rotate_left
- - + +
liga: - +
@@ -159,12 +159,12 @@ icon-create_new_folder
- - + +
liga: - +
@@ -173,12 +173,12 @@ icon-folder
- - + +
liga: - +
@@ -187,12 +187,12 @@ icon-help2
- - + +
liga: - +
@@ -201,12 +201,12 @@ icon-trigger-Manual
- - + +
liga: - +
@@ -215,12 +215,12 @@ icon-play-line
- - + +
liga: - +
@@ -229,12 +229,12 @@ icon-corner-down-right
- - + +
liga: - +
@@ -243,12 +243,12 @@ icon-info-outline
- - + +
liga: - +
@@ -257,12 +257,12 @@ icon-upload-2
- - + +
liga: - +
@@ -271,12 +271,12 @@ icon-translate
- - + +
liga: - +
@@ -285,12 +285,12 @@ icon-arrow_back
- - + +
liga: - +
@@ -299,12 +299,12 @@ icon-external-link
- - + +
liga: - +
@@ -313,12 +313,12 @@ icon-minus-square
- - + +
liga: - +
@@ -327,12 +327,12 @@ icon-plus-square
- - + +
liga: - +
@@ -341,12 +341,12 @@ icon-drag2
- - + +
liga: - +
@@ -355,12 +355,12 @@ icon-comments
- - + +
liga: - +
@@ -369,12 +369,12 @@ icon-backup
- - + +
liga: - +
@@ -383,12 +383,12 @@ icon-support
- - + +
liga: - +
@@ -397,12 +397,12 @@ icon-control-RichText
- - + +
liga: - +
@@ -411,12 +411,12 @@ icon-download
- - + +
liga: - +
@@ -428,12 +428,12 @@ icon-backups
- - + +
liga: - +
@@ -442,12 +442,12 @@ icon-clients
- - + +
liga: - +
@@ -456,12 +456,12 @@ icon-contributors
- - + +
liga: - +
@@ -470,12 +470,12 @@ icon-languages
- - + +
liga: - +
@@ -484,12 +484,12 @@ icon-patterns
- - + +
liga: - +
@@ -498,12 +498,12 @@ icon-roles
- - + +
liga: - +
@@ -512,12 +512,12 @@ icon-subscription
- - + +
liga: - +
@@ -526,12 +526,12 @@ icon-workflows
- - + +
liga: - +
@@ -540,12 +540,12 @@ icon-component
- - + +
liga: - +
@@ -554,12 +554,12 @@ icon-plugin
- - + +
liga: - +
@@ -568,12 +568,12 @@ icon-angle-double-right
- - + +
liga: - +
@@ -582,12 +582,12 @@ icon-angle-double-left
- - + +
liga: - +
@@ -596,12 +596,12 @@ icon-filter-filled
- - + +
liga: - +
@@ -610,12 +610,12 @@ icon-clone
- - + +
liga: - +
@@ -624,12 +624,12 @@ icon-control-Tags
- - + +
liga: - +
@@ -638,12 +638,12 @@ icon-control-Checkboxes
- - + +
liga: - +
@@ -652,12 +652,12 @@ icon-control-List
- - + +
liga: - +
@@ -666,12 +666,12 @@ icon-control-Html
- - + +
liga: - +
@@ -680,12 +680,12 @@ icon-single-content
- - + +
liga: - +
@@ -694,12 +694,12 @@ icon-search-Content
- - + +
liga: - +
@@ -708,12 +708,12 @@ icon-type-Component
- - + +
liga: - +
@@ -722,12 +722,12 @@ icon-multiple-content
- - + +
liga: - +
@@ -736,12 +736,12 @@ icon-type-Components
- - + +
liga: - +
@@ -750,12 +750,12 @@ icon-type-Array
- - + +
liga: - +
@@ -764,12 +764,12 @@ icon-exclamation
- - + +
liga: - +
@@ -778,12 +778,12 @@ icon-orleans
- - + +
liga: - +
@@ -792,12 +792,12 @@ icon-document-lock
- - + +
liga: - +
@@ -806,12 +806,12 @@ icon-document-unpublish
- - + +
liga: - +
@@ -820,12 +820,12 @@ icon-angle-down
- - + +
liga: - +
@@ -834,12 +834,12 @@ icon-angle-left
- - + +
liga: - +
@@ -848,12 +848,12 @@ icon-angle-right
- - + +
liga: - +
@@ -862,12 +862,12 @@ icon-angle-up
- - + +
liga: - +
@@ -876,12 +876,12 @@ icon-api
- - + +
liga: - +
@@ -890,12 +890,12 @@ icon-assets
- - + +
liga: - +
@@ -904,12 +904,12 @@ icon-search-Asset
- - + +
liga: - +
@@ -918,12 +918,12 @@ icon-bug
- - + +
liga: - +
@@ -932,12 +932,12 @@ icon-caret-down
- - + +
liga: - +
@@ -946,12 +946,12 @@ icon-caret-left
- - + +
liga: - +
@@ -960,12 +960,12 @@ icon-caret-right
- - + +
liga: - +
@@ -974,12 +974,12 @@ icon-caret-up
- - + +
liga: - +
@@ -988,12 +988,12 @@ icon-contents
- - + +
liga: - +
@@ -1002,12 +1002,12 @@ icon-trigger-ContentChanged
- - + +
liga: - +
@@ -1016,12 +1016,12 @@ icon-control-Date
- - + +
liga: - +
@@ -1030,12 +1030,12 @@ icon-control-DateTime
- - + +
liga: - +
@@ -1044,12 +1044,12 @@ icon-control-Markdown
- - + +
liga: - +
@@ -1058,12 +1058,12 @@ icon-grid
- - + +
liga: - +
@@ -1072,12 +1072,12 @@ icon-list1
- - + +
liga: - +
@@ -1086,12 +1086,12 @@ icon-user-o
- - + +
liga: - +
@@ -1100,12 +1100,12 @@ icon-rules
- - + +
liga: - +
@@ -1114,12 +1114,12 @@ icon-search-Rule
- - + +
liga: - +
@@ -1131,12 +1131,12 @@ icon-type-UI
- - + +
liga: - +
@@ -1145,12 +1145,12 @@ icon-prerender
- - + +
liga: - +
@@ -1159,12 +1159,12 @@ icon-circle
- - + +
liga: - +
@@ -1173,12 +1173,12 @@ icon-control-Slug
- - + +
liga: - +
@@ -1187,12 +1187,12 @@ icon-type-Tags
- - + +
liga: - +
@@ -1201,12 +1201,12 @@ icon-activity
- - + +
liga: - +
@@ -1215,12 +1215,12 @@ icon-history
- - + +
liga: - +
@@ -1229,12 +1229,12 @@ icon-time
- - + +
liga: - +
@@ -1243,12 +1243,12 @@ icon-add
- - + +
liga: - +
@@ -1257,12 +1257,12 @@ icon-plus
- - + +
liga: - +
@@ -1271,12 +1271,12 @@ icon-check-circle
- - + +
liga: - +
@@ -1285,12 +1285,12 @@ icon-check-circle-filled
- - + +
liga: - +
@@ -1299,12 +1299,12 @@ icon-close
- - + +
liga: - +
@@ -1313,12 +1313,12 @@ icon-type-References
- - + +
liga: - +
@@ -1327,12 +1327,12 @@ icon-control-Checkbox
- - + +
liga: - +
@@ -1341,12 +1341,12 @@ icon-control-Dropdown
- - + +
liga: - +
@@ -1355,12 +1355,12 @@ icon-control-Input
- - + +
liga: - +
@@ -1369,12 +1369,12 @@ icon-control-Radio
- - + +
liga: - +
@@ -1383,12 +1383,12 @@ icon-control-TextArea
- - + +
liga: - +
@@ -1397,12 +1397,12 @@ icon-control-Toggle
- - + +
liga: - +
@@ -1411,12 +1411,12 @@ icon-copy
- - + +
liga: - +
@@ -1425,12 +1425,12 @@ icon-dashboard
- - + +
liga: - +
@@ -1439,12 +1439,12 @@ icon-search-Dashboard
- - + +
liga: - +
@@ -1453,12 +1453,12 @@ icon-delete
- - + +
liga: - +
@@ -1467,12 +1467,12 @@ icon-bin
- - + +
liga: - +
@@ -1481,12 +1481,12 @@ icon-delete-filled
- - + +
liga: - +
@@ -1495,12 +1495,12 @@ icon-document-delete
- - + +
liga: - +
@@ -1509,12 +1509,12 @@ icon-document-disable
- - + +
liga: - +
@@ -1523,12 +1523,12 @@ icon-document-publish
- - + +
liga: - +
@@ -1537,12 +1537,12 @@ icon-drag
- - + +
liga: - +
@@ -1551,12 +1551,12 @@ icon-filter
- - + +
liga: - +
@@ -1565,12 +1565,12 @@ icon-github
- - + +
liga: - +
@@ -1579,12 +1579,12 @@ icon-help
- - + +
liga: - +
@@ -1593,12 +1593,12 @@ icon-location
- - + +
liga: - +
@@ -1607,12 +1607,12 @@ icon-control-Map
- - + +
liga: - +
@@ -1621,12 +1621,12 @@ icon-type-Geolocation
- - + +
liga: - +
@@ -1635,12 +1635,12 @@ icon-logo
- - + +
liga: - +
@@ -1649,12 +1649,12 @@ icon-media
- - + +
liga: - +
@@ -1663,12 +1663,12 @@ icon-type-Assets
- - + +
liga: - +
@@ -1677,12 +1677,12 @@ icon-trigger-AssetChanged
- - + +
liga: - +
@@ -1691,12 +1691,12 @@ icon-control-StockPhoto
- - + +
liga: - +
@@ -1705,12 +1705,12 @@ icon-more
- - + +
liga: - +
@@ -1719,12 +1719,12 @@ icon-dots
- - + +
liga: - +
@@ -1733,12 +1733,12 @@ icon-pencil
- - + +
liga: - +
@@ -1747,12 +1747,12 @@ icon-reference
- - + +
liga: - +
@@ -1761,12 +1761,12 @@ icon-schemas
- - + +
liga: - +
@@ -1775,12 +1775,12 @@ icon-search-Schema
- - + +
liga: - +
@@ -1789,12 +1789,12 @@ icon-search
- - + +
liga: - +
@@ -1803,12 +1803,12 @@ icon-settings
- - + +
liga: - +
@@ -1817,12 +1817,12 @@ icon-search-Setting
- - + +
liga: - +
@@ -1831,12 +1831,12 @@ icon-type-Boolean
- - + +
liga: - +
@@ -1845,12 +1845,12 @@ icon-type-DateTime
- - + +
liga: - +
@@ -1859,12 +1859,12 @@ icon-type-Json
- - + +
liga: - +
@@ -1873,12 +1873,12 @@ icon-json
- - + +
liga: - +
@@ -1887,12 +1887,12 @@ icon-type-Number
- - + +
liga: - +
@@ -1901,12 +1901,12 @@ icon-type-String
- - + +
liga: - +
@@ -1915,12 +1915,12 @@ icon-user
- - + +
liga: - +
@@ -1929,12 +1929,12 @@ icon-upload-3
- - + +
liga: - +
@@ -1943,12 +1943,12 @@ icon-upload-4
- - + +
liga: - +
@@ -1960,12 +1960,12 @@ icon-arrow-right
- - + +
liga: - +
@@ -1974,12 +1974,12 @@ icon-upload
- - + +
liga: - +
@@ -1988,12 +1988,12 @@ icon-caret-bottom
- - + +
liga: - +
@@ -2002,12 +2002,12 @@ icon-caret-top
- - + +
liga: - +
@@ -2016,12 +2016,12 @@ icon-show
- - + +
liga: - +
@@ -2030,12 +2030,12 @@ icon-show-all
- - + +
liga: - +
@@ -2044,12 +2044,12 @@ icon-hide
- - + +
liga: - +
@@ -2058,12 +2058,12 @@ icon-hide-all
- - + +
liga: - +
@@ -2072,12 +2072,12 @@ icon-spinner2
- - + +
liga: - +
@@ -2086,12 +2086,12 @@ icon-star-full
- - + +
liga: - +
@@ -2100,12 +2100,12 @@ icon-star-empty
- - + +
liga: - +
@@ -2114,12 +2114,12 @@ icon-twitter
- - + +
liga: - +
@@ -2128,12 +2128,12 @@ icon-hour-glass
- - + +
liga: - +
@@ -2142,12 +2142,12 @@ icon-spinner
- - + +
liga: - +
@@ -2156,12 +2156,12 @@ icon-clock
- - + +
liga: - +
@@ -2170,12 +2170,12 @@ icon-bin2
- - + +
liga: - +
@@ -2184,12 +2184,12 @@ icon-earth
- - + +
liga: - +
@@ -2198,12 +2198,12 @@ icon-elapsed
- - + +
liga: - +
@@ -2212,12 +2212,12 @@ icon-google
- - + +
liga: - +
@@ -2226,12 +2226,12 @@ icon-lock
- - + +
liga: - +
@@ -2240,12 +2240,12 @@ icon-microsoft
- - + +
liga: - +
@@ -2254,12 +2254,12 @@ icon-pause
- - + +
liga: - +
@@ -2268,12 +2268,12 @@ icon-play
- - + +
liga: - +
@@ -2282,12 +2282,12 @@ icon-reset
- - + +
liga: - +
@@ -2296,12 +2296,12 @@ icon-settings2
- - + +
liga: - +
@@ -2310,12 +2310,12 @@ icon-timeout
- - + +
liga: - +
@@ -2324,12 +2324,12 @@ icon-unlocked
- - + +
liga: - +
@@ -2341,12 +2341,12 @@ icon-control-Color
- - + +
liga: - +
@@ -2355,12 +2355,12 @@ icon-browser
- - + +
liga: - +
@@ -2369,12 +2369,12 @@ icon-checkmark
- - + +
liga: - +
@@ -2383,12 +2383,12 @@ icon-control-Stars
- - + +
liga: - +
@@ -2400,12 +2400,12 @@ icon-grid1
- - + +
liga: - +
@@ -2414,12 +2414,12 @@ icon-list
- - + +
liga: - +
@@ -2428,12 +2428,12 @@ icon-info
- - + +
liga: - +
@@ -2446,7 +2446,7 @@ min="8" value="48" /> px -