# 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() {
+