diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json index 9471114b0..f815b66c3 100644 --- a/dashboard/public/translation/en.json +++ b/dashboard/public/translation/en.json @@ -269,7 +269,7 @@ "addUserAction": "Add User" }, "user": { - "fullName": "Full Name", + "fullName": "Full name", "username": "Username", "role": "Role", "groups": "Groups", @@ -286,7 +286,7 @@ "errorDisplayNameRequired": "Name is required", "activeCheckbox": "User is active", "displayNamePlaceholder": "Optional. If not provided, user can provide during sign up", - "fallbackEmailPlaceholder": "Optional. If not specified, primary email will be used", + "fallbackEmailPlaceholder": "If not specified, primary email will be used", "external2FA": "2FA setup is managed by external authentication source", "ldapGroups": "LDAP Groups" }, @@ -361,7 +361,7 @@ "setGhostDialog": { "title": "Create password to impersonate {{ username }}", "description": "Set a temporary password to login on behalf of this user in apps or the dashboard. This password is valid for 6 hours.", - "password": "Password", + "password": "Temporary Password", "setPassword": "Set Password", "generatePassword": "Generate Password" }, diff --git a/dashboard/public/translation/nl.json b/dashboard/public/translation/nl.json index f8a64c051..fe5a259bb 100644 --- a/dashboard/public/translation/nl.json +++ b/dashboard/public/translation/nl.json @@ -379,13 +379,14 @@ "label": "Beperk toegang" }, "enabled": "Ingeschakeld", - "description": "Cloudron kan ingezet worden als gebruikers Directory Server voor externe applicaties.", + "description": "De LDAP server kan gebruikt worden door externe applicaties t.b.v. authenticatie.", "secret": { "label": "Koppel wachtwoord", "description": "Alle LDAP verzoeken moeten geauthentiseerd worden met dit geheim en de gebruiker DN {{ userDN }}", "url": "Server URL" }, - "cloudflarePortWarning": "Cloudflare proxy moet uitgeschakeld zijn op het domein van het dashboard om de LDAP server te kunnen bereiken" + "cloudflarePortWarning": "Cloudflare proxy moet uitgeschakeld zijn op het domein van het dashboard om de LDAP server te kunnen bereiken", + "title": "LDAP Server" }, "userImportDialog": { "title": "Importeer gebruikers", @@ -2047,7 +2048,7 @@ "logoutRedirectUri": "Logout callback URL (optioneel)" }, "title": "OpenID aanbieder", - "description": "Cloudron kan als een OpenID Connect aanbieder voor interne apps en externe diensten fungeren.", + "description": "De OpenID aanbieder kan gebruikt worden door externe applicaties voor single sign-on.", "editClientDialog": { "title": "Bewerk Client {{ client }}" }, @@ -2062,6 +2063,11 @@ "keysEndpoint": "Sleutels Eindpunt", "tokenEndpoint": "Token Eindpunt", "authEndpoint": "Auth Eindpunt" + }, + "clients": { + "title": "OpenID Clients", + "newClient": "Nieuwe Client", + "empty": "Geen OpenID Clients" } }, "automation": "Automatisering", diff --git a/dashboard/public/translation/pt.json b/dashboard/public/translation/pt.json index 43d0a5f62..e67381f5e 100644 --- a/dashboard/public/translation/pt.json +++ b/dashboard/public/translation/pt.json @@ -202,7 +202,7 @@ "errorEmailRequired": "É necessário um endereço de correio eletrónico válido" }, "changePassword": { - "title": "Alterar a sua palavra-passe", + "title": "Alterar palavra-passe", "errorPasswordInvalid": "A palavra-passe deve ter pelo menos entre 8 e 265 carateres.", "currentPassword": "Palavra-passe atual", "newPassword": "Nova palavra-passe", @@ -320,13 +320,15 @@ "enabled": "Ativado", "ipRestriction": { "label": "Restringir Acesso", - "placeholder": "Endereço de IP ou Sub-rede separado por linha" + "placeholder": "Endereço de IP ou Sub-rede separado por linha", + "description": "Limite o acesso do Servidor de Diretoria para IPs ou intervalos específicos. As linhas que começam com # são tratadas como comentários." }, "secret": { "label": "Associar Palavra-passe", "url": "URL do Servidor" }, - "description": "Cloudron pode atuar como um servidor de diretoria do utilizador central para as aplicações externas." + "description": "O servidor LDAP pode ser utilizado pelas aplicações externas para autenticação.", + "title": "Servidor LDAP" }, "users": { "superadminTooltip": "Este utilizador é um super administrador", @@ -348,7 +350,7 @@ "transferOwnershipTooltip": "Transferir Propriedade" }, "groups": { - "emptyPlaceholder": "Ainda sem grupos", + "emptyPlaceholder": "Não há grupos disponíveis", "title": "Grupos", "count": "Total de grupos: {{ count }}", "newGroupAction": "Novo Grupo", @@ -397,7 +399,7 @@ "title": "Editar utilizador {{ username }}" }, "deleteGroupDialog": { - "description": "Este grupo ainda tem {{ memberCount }} membro(s). Tem a certeza que este grupo não é utilizado?", + "description": "Este grupo tem {{ memberCount }} membro(s). Deseja remover este grupo?", "deleteAction": "Eliminar", "title": "Eliminar grupo {{ name }}" }, @@ -462,7 +464,7 @@ "password": "Palavra-passe", "setPassword": "Definir Palavra-passe", "generatePassword": "Gerar Palavra-passe", - "title": "Crie palavra-passe para se passar por {{ username }}", + "title": "Criar palavra-passe para se passar por {{ username }}", "description": "Defina uma palavra-passe temporária para fazer iniciar a sessão em nome deste utilizador nas aplicações ou no painel. Esta palavra-passe é válida por 6 horas." }, "setGhost": { @@ -615,7 +617,9 @@ "solrNotRunning": "Parado", "acl": "Correio ACL", "solrEnabled": "Ativado", - "spamFilter": "Filtragem de lixo do correio eletrónico" + "spamFilter": "Filtragem de lixo do correio eletrónico", + "changeDomainProgress": "A alterar domínio de ''e-mail'':", + "solrFts": "Pesquisa de Texto Completo" }, "domains": { "domain": "Domínio", @@ -635,6 +639,9 @@ "spamFilterDialog": { "title": "Filtragem de Lixo de Correio Eletrónico", "blacklisteAddresses": "Endereços na lista de bloqueios" + }, + "changeMailSizeDialog": { + "size": "Tamanho máximo em ''megabytes'':" } }, "email": { @@ -715,7 +722,8 @@ "copyConcurrencyDescription": "Número de cópias de ficheiros em paralelo quando realizar a cópia de segurança.", "name": "Nome", "encryptionHint": "Dica da Encriptação da Palavra-passe", - "usesEncryption": "A cópia de segurança utiliza encriptação" + "usesEncryption": "A cópia de segurança utiliza encriptação", + "mountPoint": "Ponto de montagem" }, "schedule": { "schedule": "Agendar", @@ -787,6 +795,11 @@ }, "archive": { "description": "Os arquivos eliminados são limpos de acordo com a política da cópia de segurança." + }, + "target": { + "addDialog": { + "title": "Adicionar Armazenamento de Cópias de Segurança" + } } }, "passwordReset": { @@ -858,7 +871,7 @@ "title": "Zona Horária do Sistema" }, "language": { - "description": "O idioma predefinido deste Cloudron pode ser definido aqui. Isto também será utilizado para as mensagens transacionais, tais como convite do utilizador e redefinição da palavra-passe. Cada utilizador ainda pode alterar individualmente o idioma preferido do painel no perfil.", + "description": "Define o idioma predefinido para Cloudron e mensagens do sistema. (por exemplo, convites, redefinições de palavra-passe). Os utilizadores podem substituir o idioma do painel no seu perfil.", "title": "Idioma" }, "privateDockerRegistry": { @@ -938,7 +951,7 @@ }, "help": { "title": "Ajuda", - "description": "Por favor, utilize os seguintes recursos para ajuda e apoio:\n* [Fórum do Cloudron]({{ forumLink }}) - Por favor, utilize as categorias específicas da Aplicação e Apoio para questões.\n* [Documentação do Cloudron e Base de Conhecimentos]({{ docsLink }})\n* [API e Empacotamento da Aplicação Personalizado]({{ packagingLink }})\n" + "description": "Por favor, utilize os seguintes recursos para ajuda e apoio:\n* \n* [Fórum do Cloudron]({{ forumLink }}) - Por favor, utilize as categorias específicas da Aplicação e Apoio para questões.\n* [Documentação]({{ docsLink }})\n* [Empacotamento de Aplicação]({{ packagingLink }})\n* [API]({{ packagingLink }})" }, "remoteSupport": { "title": "Apoio Remoto", @@ -1072,7 +1085,7 @@ "activationTime": "Hora de Criação do Cloudron" }, "locale": { - "title": "Definições de Local" + "title": "Local" }, "graphs": { "title": "Gráficos" @@ -1234,7 +1247,7 @@ "mountStatus": "Estado da Montagem", "type": "Tipo", "localDirectory": "Diretoria Local", - "remountActionTooltip": "Remontar Volume", + "remountActionTooltip": "Remontar", "editVolumeDialog": { "title": "Editar volume {{ name }}" }, @@ -1253,7 +1266,7 @@ }, "hostPath": "Destino", "name": "Nome", - "openFileManagerActionTooltip": "Abrir Gestor de Ficheiros", + "openFileManagerActionTooltip": "Gestor de Ficheiros", "title": "Volumes", "addVolumeAction": "Adicionar Volume", "removeVolumeActionTooltip": "Remover Volume", diff --git a/dashboard/src/components/ApplinkDialog.vue b/dashboard/src/components/ApplinkDialog.vue index 9e22e3997..c7d36650c 100644 --- a/dashboard/src/components/ApplinkDialog.vue +++ b/dashboard/src/components/ApplinkDialog.vue @@ -31,7 +31,6 @@ const id = ref(''); const upstreamUri = ref(''); const label = ref(''); const tags = ref([]); -const iconFile = ref(null); const iconUrl = ref(''); const accessRestrictionOption = ref(''); const accessRestriction = ref({ @@ -53,8 +52,9 @@ const isValid = computed(() => { return true; }); +let iconFile = null; function onIconChanged(file) { - iconFile.value = file; + iconFile = file; } async function onSubmit() { @@ -73,10 +73,10 @@ async function onSubmit() { data.accessRestriction.groups = accessRestriction.value.groups.map(function (g) { return g.id; }); } - if (iconFile.value === 'fallback') { // user reset the icon + if (iconFile === 'fallback') { // user reset the icon data.icon = ''; - } else if (iconFile.value !== 'src') { // user loaded custom icon - data.icon = (await getDataURLFromFile(iconFile.value)).replace(/^data:image\/[a-z]+;base64,/, ''); + } else if (iconFile !== 'src') { // user loaded custom icon + data.icon = (await getDataURLFromFile(iconFile)).replace(/^data:image\/[a-z]+;base64,/, ''); } let error; @@ -118,7 +118,7 @@ defineExpose({ upstreamUri.value = applink ? applink.upstreamUri : ''; label.value = applink ? applink.label : ''; iconUrl.value = applink ? applink.iconUrl : 'fallback'; - iconFile.value = applink?.iconUrl ? 'src' : 'fallback'; + iconFile = applink?.iconUrl ? 'src' : 'fallback'; tags.value = applink ? applink.tags : []; accessRestrictionOption.value = applink && applink.accessRestriction ? 'groups' : 'any'; accessRestriction.value = applink && applink.accessRestriction ? applink.accessRestriction : { users: [], groups: [] }; diff --git a/dashboard/src/components/ImagePicker.vue b/dashboard/src/components/ImagePicker.vue index 466710dec..230c82ed2 100644 --- a/dashboard/src/components/ImagePicker.vue +++ b/dashboard/src/components/ImagePicker.vue @@ -26,9 +26,15 @@ const internalSrc = ref(''); const isChanged = ref(false); const busy = ref(false); +function reset() { + isChanged.value = false; + internalSrc.value = props.src; +} + +defineExpose({ reset }); + watchEffect(() => { internalSrc.value = props.src; - isChanged.value = false; }); function dataURLtoFile(dataURL, filename) { @@ -147,6 +153,8 @@ function onChanged(event) { internalSrc.value = canvas.toDataURL('image/png'); isChanged.value = true; + + console.log('internalSrc is now some data url'); emit('changed', file); }; @@ -180,6 +188,7 @@ function onError() {