Merge branch 'the-djmaze:master' into master

This commit is contained in:
Justyn Freeman 2023-02-07 10:33:47 -05:00 committed by GitHub
commit 919acff536
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
59 changed files with 283 additions and 212 deletions

View file

@ -1,4 +1,4 @@
import { doc, createElement } from 'Common/Globals';
import { createElement } from 'Common/Globals';
import { forEachObjectEntry, pInt } from 'Common/Utils';
import { SettingsUserStore } from 'Stores/User/Settings';
@ -14,27 +14,13 @@ const
"'": '''
},
// eslint-disable-next-line max-len
hcont = Element.fromHTML('<div area="hidden" style="position:absolute;top:0;left:-200vw;max-width:max(50vw,400px);max-height:50vh"></div>'),
blockquoteSwitcher = () => {
SettingsUserStore.collapseBlockquotes() &&
// tpl.content.querySelectorAll('blockquote').forEach(node => {
[...tpl.content.querySelectorAll('blockquote')].reverse().forEach(node => {
let h = node.scrollHeight;
/*
if (!h) {
// Attempt to get height
hcont.innerHTML = node.outerHTML;
h = hcont.scrollHeight;
hcont.innerHTML = '';
}
*/
if (0 === h || 100 < h) {
const el = Element.fromHTML('<details class="sm-bq-switcher"><summary>•••</summary></details>');
node.replaceWith(el);
el.append(node);
}
const el = Element.fromHTML('<details class="sm-bq-switcher"><summary>•••</summary></details>');
node.replaceWith(el);
el.append(node);
});
},
@ -103,8 +89,6 @@ const
return url;
};
doc.body.append(hcont);
export const
/**
@ -119,6 +103,7 @@ export const
* @returns {string}
*/
cleanHtml = (html, oAttachments) => {
let aColor;
const
debug = false, // Config()->Get('debug', 'enable', false);
detectHiddenImages = true, // !!SettingsGet('try_to_detect_hidden_images'),
@ -137,11 +122,7 @@ export const
// convert body attributes to CSS
tasks = {
link: value => {
if (/^#[a-fA-Z0-9]{3,6}$/.test(value)) {
tpl.content.querySelectorAll('a').forEach(node => node.style.color || (node.style.color = value))
}
},
link: value => aColor = value,
text: (value, node) => node.style.color = value,
topmargin: (value, node) => node.style.marginTop = pInt(value) + 'px',
leftmargin: (value, node) => node.style.marginLeft = pInt(value) + 'px',
@ -178,9 +159,11 @@ export const
'colspan', 'rowspan', 'headers'
],
disallowedTags = [
'HEAD','STYLE','SVG','SCRIPT','TITLE','LINK','BASE','META',
'STYLE','SVG','SCRIPT','TITLE','LINK','BASE','META',
'INPUT','OUTPUT','SELECT','BUTTON','TEXTAREA',
'BGSOUND','KEYGEN','SOURCE','OBJECT','EMBED','APPLET','IFRAME','FRAME','FRAMESET','VIDEO','AUDIO','AREA','MAP'
// Not supported by <template> element
// ,'HTML','HEAD','BODY'
],
nonEmptyTags = [
'A','B','EM','I','SPAN','STRONG'
@ -188,11 +171,11 @@ export const
tpl.innerHTML = html
// .replace(/<pre[^>]*>[\s\S]*?<\/pre>/gi, pre => pre.replace(/\n/g, '\n<br>'))
.replace(/<!doctype[^>]*>/gi, '')
.replace(/<\?xml[^>]*\?>/gi, '')
// Not supported by <template> element
// .replace(/<!doctype[^>]*>/gi, '')
// .replace(/<\?xml[^>]*\?>/gi, '')
.replace(/<(\/?)body(\s[^>]*)?>/gi, '<$1div class="mail-body"$2>')
.replace(/<\/?(html|head)[^>]*>/gi, '')
// .replace(/<\/?(html|head)[^>]*>/gi, '')
// Fix Reddit https://github.com/the-djmaze/snappymail/issues/540
.replace(/<span class="preview-text"[\s\S]+?<\/span>/, '')
// https://github.com/the-djmaze/snappymail/issues/900
@ -303,6 +286,7 @@ export const
// setAttribute('rel', 'external nofollow noopener noreferrer');
}
setAttribute('tabindex', '-1');
aColor && !oElement.style.color && (oElement.style.color = aColor);
}
// if (['CENTER','FORM'].includes(name)) {

View file

@ -75,6 +75,7 @@ export class MessageModel extends AbstractModel {
this.messageId = '';
this.inReplyTo = '';
this.references = '';
this.autocrypt = {};
addObservablesTo(this, {
subject: '',
@ -111,7 +112,6 @@ export class MessageModel extends AbstractModel {
readReceipt: '',
autocrypt: '',
// rfc8621
id: '',
// threadId: '',
@ -150,8 +150,19 @@ export class MessageModel extends AbstractModel {
}
});
return tagOptions
}
},
whitelistOptions: () => {
let options = [];
if ('match' === SettingsUserStore.viewImages()) {
let from = this.from[0],
list = SettingsUserStore.viewImagesWhitelist();
from && options.push(from.email);
this.html().match(/src=["'][^"']+/g)?.forEach(m => options.push(m.replace(/^.+(:\/\/[^/]+).+$/, '$1')));
options = options.filter(txt => !list.includes(txt));
}
return options.unique();
}
});
}
@ -277,22 +288,13 @@ export class MessageModel extends AbstractModel {
body.classList.toggle('plain', 0);
if (!this.isSpam() && FolderUserStore.spamFolder() != this.folder) {
if ('always' === SettingsUserStore.viewImages()) {
if (('dkim' === SettingsUserStore.viewImages() && 'pass' === this.dkim[0]?.[0])
|| 'always' === SettingsUserStore.viewImages()
) {
this.showExternalImages();
}
if ('match' === SettingsUserStore.viewImages()) {
let regex = SettingsUserStore.viewImagesWhitelist()
.trim()
.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&')
.replace(/[\s\r\n,;:]+/g, '|')
.replace(/\|+/g, '|');
if (regex.length) {
console.log('whitelist images = '+regex);
regex = new RegExp(regex);
this.showExternalImages(
(this.from[0]?.email.match(regex)/* || this.sender[0]?.email.match(regex)*/) ? null : regex
);
}
this.showExternalImages(1);
}
}
@ -384,6 +386,20 @@ export class MessageModel extends AbstractModel {
showExternalImages(regex) {
const body = this.body;
if (body && this.hasImages()) {
if (regex) {
regex = SettingsUserStore.viewImagesWhitelist()
.trim()
.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&')
.replace(/[\s\r\n,;:]+/g, '|')
.replace(/\|+/g, '|');
if (regex) {
console.log('whitelist images = '+regex);
regex = new RegExp(regex);
if (this.from[0]?.email.match(regex)) {
regex = 0;
}
}
}
let hasImages = false,
isValid = src => {
if (!regex || src.match(regex)) {

View file

@ -840,6 +840,8 @@ export class ComposePopupView extends AbstractViewPopup {
this.aDraftInfo = ['reply', message.uid, message.folder];
this.sInReplyTo = message.messageId;
this.sReferences = (message.messageId + ' ' + message.references).trim();
// OpenPGP “Transferable Public Key”
// message.autocrypt?.keydata
break;
case ComposeType.Forward:

View file

@ -499,6 +499,13 @@ export class MailMessageView extends AbstractViewRight {
currentMessage().showExternalImages();
}
whitelistText(txt) {
let value = (SettingsUserStore.viewImagesWhitelist().trim() + '\n' + txt).trim();
SettingsUserStore.viewImagesWhitelist(value);
Remote.saveSetting('ViewImagesWhitelist', value);
currentMessage().showExternalImages(1);
}
/**
* @returns {string}
*/

View file

@ -9,8 +9,8 @@ class MailboxDetectPlugin extends \RainLoop\Plugins\AbstractPlugin
NAME = 'MailboxDetect',
AUTHOR = 'SnappyMail',
URL = 'https://snappymail.eu/',
VERSION = '2.2',
RELEASE = '2023-01-23',
VERSION = '2.3',
RELEASE = '2023-02-07',
REQUIRED = '2.25.0',
CATEGORY = 'General',
LICENSE = 'MIT',
@ -36,7 +36,7 @@ class MailboxDetectPlugin extends \RainLoop\Plugins\AbstractPlugin
$oActions = \RainLoop\Api::Actions();
$oAccount = $oActions->getAccountFromToken();
if (!$oAccount) {
\error_log('No Account');
$this->Logger()->Write('No Account');
return;
}
$oSettingsLocal = $oActions->SettingsProvider(true)->Load($oAccount);
@ -114,8 +114,9 @@ class MailboxDetectPlugin extends \RainLoop\Plugins\AbstractPlugin
foreach ($found as $role => $folders) {
if (isset($folders[0])) {
// Set the first as default
// \error_log("Set role {$role}");
$aResponse['Result']['@Collection'][$folders[0]]['role'] = $role;
$aFolder = &$aResponse['Result']['@Collection'][$folders[0]];
$this->Logger()->Write("Set {$role} mailbox to {$aFolder['fullName']}");
$aFolder['role'] = $role;
} else if ($this->Config()->Get('plugin', 'autocreate_system_folders', false)) {
try
{
@ -136,19 +137,22 @@ class MailboxDetectPlugin extends \RainLoop\Plugins\AbstractPlugin
}
}
*/
// \error_log("Create mailbox {$sFolderNameToCreate}");
$oFolder = $oActions->MailClient()->FolderCreate(
$this->Logger()->Write("Create {$role} mailbox {$sFolderNameToCreate}");
$aFolder = $oActions->MailClient()->FolderCreate(
$sFolderNameToCreate,
$sParent,
true,
$sDelimiter
);
$aResponse['Result']['@Collection'][] = \json_encode($oFolder);
)->jsonSerialize();
$aFolder['role'] = $role;
$aResponse['Result']['@Collection'][] = $aFolder;
}
catch (\Throwable $oException)
{
$this->Logger()->WriteException($oException);
}
} else {
$this->Logger()->Write("Mailbox for {$role} not created");
}
}
}

View file

@ -478,7 +478,7 @@ class BodyStructure implements \JsonSerializable
$oStructure->sContentType = \strtolower(\trim($sContentTypeMain.'/'.$sContentTypeSub));
$oStructure->aContentTypeParams = $aContentTypeParams;
$oStructure->sCharset = $sCharset;
$oStructure->sContentID = $sContentID;
$oStructure->sContentID = \trim($sContentID);
$oStructure->sDescription = $sDescription;
$oStructure->sMailEncodingName = \strtolower($sMailEncodingName);
$oStructure->sDisposition = \strtolower($sDisposition);

View file

@ -485,6 +485,14 @@ class Message implements \JsonSerializable
$this->aFlagsLowerCase
));
$aAutocrypt = [];
if ($this->sAutocrypt) {
foreach (\explode(';', $this->sAutocrypt) as $entry) {
$entry = \explode('=', \trim($entry), 2);
$aAutocrypt[$entry[0]] = $entry[1];
}
}
return array(
'@Object' => 'Object/Message',
'folder' => $this->sFolder,
@ -512,7 +520,7 @@ class Message implements \JsonSerializable
'threads' => $this->aThreads,
'unsubsribeLinks' => $this->UnsubsribeLinks,
'readReceipt' => '',
'autocrypt' => $this->sAutocrypt,
'autocrypt' => $aAutocrypt ?: null,
'attachments' => $this->Attachments,

View file

@ -1166,7 +1166,7 @@ trait Messages
foreach ($aAttachments as $sTempName => $aData) {
$sFileName = (string) $aData['name'];
$bIsInline = (bool) $aData['inline'];
$sCID = (string) $aData['cid'];
$sCID = (string) $aData['cId'];
$sContentLocation = (string) $aData['location'];
$sMimeType = (string) $aData['type'];

View file

@ -226,26 +226,22 @@ abstract class Upgrade
// Prevents Apache access error due to directories being 0700
public static function fixPermissions($mode = 0755) : void
{
\umask(0022);
$target = \rtrim(APP_INDEX_ROOT_PATH, '\\/');
// Prevent Apache access error due to directories being 0700
foreach (\glob("{$target}/snappymail/v/*", \GLOB_ONLYDIR) as $dir) {
\chmod($dir, 0755);
$iterator = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator("{$dir}/static", \FilesystemIterator::SKIP_DOTS),
\RecursiveIteratorIterator::SELF_FIRST
);
foreach ($items as $item) {
if ($item->isDir()) {
\chmod($item, 0755);
}
}
$iterator = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator("{$dir}/themes", \FilesystemIterator::SKIP_DOTS),
\RecursiveIteratorIterator::SELF_FIRST
);
foreach ($items as $item) {
if ($item->isDir()) {
\chmod($item, 0755);
foreach (['static','themes'] as $folder) {
$iterator = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator("{$dir}/{$folder}", \FilesystemIterator::SKIP_DOTS),
\RecursiveIteratorIterator::SELF_FIRST
);
foreach ($items as $item) {
if ($item->isDir()) {
\chmod($item, 0755);
} else if ($item->isFile()) {
\chmod($item, 0644);
}
}
}
}

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -197,7 +197,7 @@
"PLACEHOLDER_ENTER_DISPLAY_NAME": "Entrez le nom à afficher",
"PLACEHOLDER_ENTER_LAST_NAME": "Entrez votre nom",
"PLACEHOLDER_ENTER_FIRST_NAME": "Entrez votre prénom",
"PLACEHOLDER_ENTER_NICK_NAME": "Enter le pseudonyme",
"PLACEHOLDER_ENTER_NICK_NAME": "Entrez le pseudonyme",
"LABEL_READ_ONLY": "Lecture seule",
"ADD_MENU_LABEL": "Ajouter",
"ADD_MENU_NICKNAME": "Pseudonyme",
@ -400,7 +400,7 @@
"USE_CHECKBOXES_IN_LIST": "Afficher des cases à cocher dans la liste",
"USE_THREADS": "Regrouper en conversations",
"REPLY_SAME_FOLDER": "Placer les réponses dans le dossier du message",
"PREFER_HTML": "Préférer le HTML au texte pur",
"PREFER_HTML": "Préférer le HTML au texte brut",
"PREFER_HTML_INFO": "Les messages arrivent parfois dans les deux formats. Cette option contrôle si vous voulez que la partie HTML ou la partie texte brut soit affichée.",
"REMOVE_COLORS": "Supprimer les couleurs d'arrière-plan et de texte du message",
"MESSAGE_PER_PAGE": "Messages par page",
@ -419,8 +419,9 @@
"LIST_SIMPLE_ATTACHMENTS": "Liste simple des pièces jointes",
"LIST_MESSAGES_GROUPED": "Lister les messages groupés (lors du tri par Date ou Destinataire)",
"EXTERNAL_IMAGES": "Images externes",
"IMAGES_OPTION_ASK": "Toujours demandez",
"IMAGES_OPTION_ASK": "Toujours demander",
"IMAGES_OPTION_WHITELIST": "Ajouter à la liste blanche ou demander",
"IMAGES_OPTION_DKIM": "Toujours afficher quand DKIM est valide",
"IMAGES_OPTION_ALWAYS": "Toujours afficher",
"IMAGES_WHITELIST": "Liste blanche Images"
},
@ -458,7 +459,7 @@
"HELP_SHOW_HIDE_FOLDER": "Afficher\/masquer le dossier",
"HELP_CHECK_FOR_NEW_MESSAGES": "Cocher\/Décocher pour les nouveaux messages",
"HIDE_UNSUBSCRIBED": "Masquer les dossiers désabonnés",
"UNHIDE_KOLAB_FOLDERS": "Unhide Kolab folders",
"UNHIDE_KOLAB_FOLDERS": "Afficher les dossiers Kolab",
"TYPE_CALENDAR": "Calendrier",
"TYPE_CONFIGURATION": "Configuration",
"TYPE_CONTACTS": "Contacts",

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -5,7 +5,7 @@
"SAVE": "Guardar",
"TEST": "Testar",
"UPDATE": "Atualizar",
"USERNAME": "Nome de usuário",
"USERNAME": "Nome de utilizador",
"PASSWORD": "Palavra-passe",
"CANCEL": "Cancelar"
},
@ -42,7 +42,7 @@
"LABEL_ATTACHMENT_SIZE_LIMIT": "Tamanho limite dos anexos",
"LABEL_ALLOW_ADDITIONAL_ACCOUNTS": "Permitir contas adicionais",
"LABEL_ALLOW_IDENTITIES": "Permitir múltiplas identidades",
"ALERT_DATA_ACCESS": "A pasta \"Data\" está acessível. Por favor, configure o seu servidor web para impedir o acesso à pasta \"data\" a partir do exterior. Leia mais aqui:",
"ALERT_DATA_ACCESS": "A pasta \"data\" está acessível. Por favor, configure o seu servidor web para impedir o acesso à pasta \"data\" a partir do exterior. Leia mais aqui:",
"ALERT_WARNING": "Aviso!",
"HTML_ALERT_WEAK_PASSWORD": "Está a usar a palavra-passe de administração predefinida.\n<br>\nPor razões de segurança\n<strong><a href=\"#\/security\">mude<\/a><\/strong>\na palavra-passe agora.\n"
},
@ -65,11 +65,11 @@
"LABEL_ENABLE_CONTACTS": "Ativar contactos",
"LABEL_ALLOW_SYNC": "Permitir sincronização de contactos (com servidor CardDAV externo)",
"LABEL_STORAGE_TYPE": "Tipo",
"LABEL_STORAGE_DSN": "Dsn",
"LABEL_STORAGE_DSN": "Nome da Origem de Dados (DSN)",
"LABEL_STORAGE_USER": "Utilizador",
"LABEL_STORAGE_PASSWORD": "Palavra-passe",
"ALERT_NOTICE": "Aviso!",
"SUGGESTIONS_LIMIT": "Suggestions limit",
"SUGGESTIONS_LIMIT": "Limite de sugestões",
"HTML_ALERT_DO_NOT_USE_THIS_DATABASE": "Não use este tipo de base de dados com uma grande quantidade de utilizadores ativos.",
"HTML_ALERT_DOES_NOT_SUPPORTED": "O seu sistema não suporta contactos.\n<br>\nPrecisa instalar ou ativar a extensão <strong>PDO (SQLite \/ MySQL \/ PostgreSQL)<\/strong> no seu servidor.\n"
},
@ -89,7 +89,7 @@
"LABEL_CURRENT_PASSWORD": "Palavra-passe atual",
"LABEL_NEW_PASSWORD": "Nova palavra-passe",
"LABEL_REPEAT_PASSWORD": "Repetir",
"LABEL_REQUIRE_VERIFICATION": "Obrigar a verificação dos certificados SSL utilizados",
"LABEL_REQUIRE_VERIFICATION": "Exigir a verificação dos certificados SSL",
"LABEL_ALLOW_SELF_SIGNED": "Permitir certificados autoassinados"
},
"TAB_PACKAGES": {
@ -101,7 +101,7 @@
},
"TAB_ABOUT": {
"LEGEND_ABOUT": "Acerca",
"LABEL_TAG_HINT": "Cliente de email moderno e rápido, baseado em tecnologia web",
"LABEL_TAG_HINT": "Cliente de correio web simples, moderno e rápido",
"LABEL_ALL_RIGHTS_RESERVED": "Todos os direitos reservados.",
"HINT_READ_CHANGE_LOG": "Por favor leia a lista de modificações antes de atualizar.",
"HINT_IS_UP_TO_DATE": "SnappyMail está atualizado.",
@ -124,11 +124,11 @@
"LABEL_SERVER": "Servidor",
"LABEL_PORT": "Porta",
"LABEL_SECURE": "Segurança",
"TIMEOUT": "Timeout",
"DISABLE_CAPABILITIES": "Disable capabilities",
"LIMITS": "Limits",
"FOLDERS": "Folders",
"MESSAGES": "Messages",
"TIMEOUT": "Tempo de espera",
"DISABLE_CAPABILITIES": "Desativar capacidades",
"LIMITS": "Limites",
"FOLDERS": "Pastas",
"MESSAGES": "Mensagens",
"LABEL_WHITE_LIST": "Lista Branca",
"SECURE_OPTION_NONE": "Nenhuma",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve",
@ -165,11 +165,11 @@
"UNKNOWN_ERROR": "Erro desconhecido"
},
"NOTIFICATIONS": {
"REQUEST_ERROR": "Request failed",
"REQUEST_ABORTED": "Request is aborted",
"REQUEST_TIMEOUT": "Request timed out",
"REQUEST_ERROR": "A solicitação falhou",
"REQUEST_ABORTED": "A solicitação foi abortada",
"REQUEST_TIMEOUT": "A solicitação expirou",
"INVALID_TOKEN": "Token inválido",
"AUTH_ERROR": "Falha na autenticação",
"AUTH_ERROR": "A autenticação falhou",
"DOMAIN_ALREADY_EXISTS": "O domínio já existe",
"CANT_SAVE_PLUGIN_SETTINGS": "Não é possível guardar as definições",
"CANT_INSTALL_PACKAGE": "Não foi possível instalar a extensão",

View file

@ -1,9 +1,9 @@
{
"BACK_LINK": "Recarregar",
"NO_SCRIPT_TITLE": "É necessário JavaScript para esta aplicação.",
"NO_SCRIPT_DESC": "O suporte de JavaScript não está disponível no seu navegador.\nPor favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente.\n",
"NO_SCRIPT_DESC": "O suporte de JavaScript não está disponível no seu navegador.\nPor favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente.",
"NO_COOKIE_TITLE": "É necessário suporte de Cookies para esta aplicação.",
"NO_COOKIE_DESC": "O suporte de Cookies não está disponível no seu navegador.\nPor favor ative o suporte de Cookies nas definições do seu navegador e tente novamente.\n",
"NO_COOKIE_DESC": "O suporte de Cookies não está disponível no seu navegador.\nPor favor ative o suporte de Cookies nas definições do seu navegador e tente novamente.",
"BAD_BROWSER_TITLE": "O seu navegador está desatualizado.",
"BAD_BROWSER_DESC": "Para usar todas as funções da aplicação,\ntransfira e instale um destes navegadores:\n"
"BAD_BROWSER_DESC": "Para usar todas as funções da aplicação,\ntransfira e instale um navegador recente."
}

View file

@ -22,10 +22,10 @@
"NOT_SPAM": "Não é spam",
"USERNAME": "Nome de usuário",
"PASSWORD": "Palavra-passe",
"REMEMBER": "Remember",
"REMEMBER": "Lembrar",
"REPLY_TO": "Resp.-Para",
"SAVE": "Guardar",
"SAVE_CHANGES": "Save changes?",
"SAVE_CHANGES": "Guardar alterações?",
"SEARCH": "Pesquisar",
"SPAM": "Spam",
"SUBJECT": "Assunto",
@ -34,7 +34,7 @@
"SERVER_MESSAGE": "Mensagem do servidor",
"YES": "Sim",
"NO": "Não",
"INACTIVE": "Inactive",
"INACTIVE": "Inativo",
"DEFAULT": "predefinida",
"HELP": "Ajuda"
},
@ -152,7 +152,7 @@
"SPAM_SCORE": "Pontuação de Spam",
"HAS_VIRUS_WARNING": "AVISO: vírus detetado",
"TAGS": "Marcadores",
"NEW_TAG": "New tag"
"NEW_TAG": "Novo marcador"
},
"MESSAGE_TAGS": {
"$important": "Importante",
@ -171,17 +171,17 @@
"SEARCHING_DESC": "A pesquisar..."
},
"CONTACTS": {
"TAB_CONTACT": "Contact",
"TAB_LOCATIONS": "Locations",
"TAB_BUSINESS": "Business",
"LABEL_ORGANIZATION": "Organization",
"LABEL_DEPARTMENT": "Department",
"LABEL_TITLE": "Title",
"TAB_CRYPTO": "Crypto",
"ASK": "Ask",
"NEVER": "Never",
"ALWAYS": "Always",
"ALWAYS_IF_POSSIBLE": "Always if possible",
"TAB_CONTACT": "Contactos",
"TAB_LOCATIONS": "Localizações",
"TAB_BUSINESS": "Empresa",
"LABEL_ORGANIZATION": "Empresa",
"LABEL_DEPARTMENT": "Departamento",
"LABEL_TITLE": "Cargo",
"TAB_CRYPTO": "Criptografia",
"ASK": "Perguntar",
"NEVER": "Nunca",
"ALWAYS": "Sempre",
"ALWAYS_IF_POSSIBLE": "Sempre que possível",
"BUTTON_ADD_CONTACT": "Adicionar contacto",
"BUTTON_CREATE_CONTACT": "Criar",
"BUTTON_UPDATE_CONTACT": "Atualizar",
@ -203,7 +203,7 @@
"ADD_MENU_NICKNAME": "Alcunha",
"ADD_MENU_NOTE": "Notas",
"ADD_MENU_PHONE": "Telefone",
"ADD_MENU_URL": "URL",
"ADD_MENU_URL": "Website",
"ADD_MENU_ADDRESS": "Morada",
"ADD_MENU_BIRTHDAY": "Aniversário",
"ADD_MENU_TAGS": "Marcadores",
@ -226,18 +226,18 @@
"NO_ATTACHMENTS_HERE_DESC": "Sem anexos aqui.",
"ATTACHMENTS_ERROR_DESC": "Aviso! Nem todos os anexos foram carregados.",
"ATTACHMENTS_UPLOAD_ERROR_DESC": "Ainda não foram carregados todos os anexos",
"ALLOW_SPELLCHECK": "Enable browser spelling checker",
"ALLOW_SPELLCHECK": "Ativar corretor ortográfico do navegador",
"BUTTON_REQUEST_READ_RECEIPT": "Pedir um recibo de leitura",
"BUTTON_MARK_AS_IMPORTANT": "Marcar como importante",
"BUTTON_REQUEST_DSN": "Pedir um recibo de entrega",
"BUTTON_REQUIRE_TLS": "Require secure delivery"
"BUTTON_REQUIRE_TLS": "Exigir entrega segura"
},
"POPUPS_ASK": {
"DESC_WANT_CLOSE_THIS_WINDOW": "Tem a certeza de que quer fechar esta janela?",
"DESC_WANT_DELETE_MESSAGES": "Tem a certeza de que quer eliminar a(s) mensagem(s)?"
},
"POPUPS_LANGUAGES": {
"TITLE_LANGUAGES": "Escolha o idioma"
"TITLE_LANGUAGES": "Escolha o seu idioma"
},
"POPUPS_ADD_ACCOUNT": {
"TITLE_ADD_ACCOUNT": "Adicionar conta?",
@ -316,7 +316,7 @@
"MARK_AS_READ_LABEL": "Marcar como lida",
"REPLY_INTERVAL_LABEL": "Intervalo de resposta (dias)",
"KEEP_LABEL": "Manter",
"STOP_LABEL": "Stop further processing of rules",
"STOP_LABEL": "Interromper o processamento das regras",
"VACATION_SUBJECT_LABEL": "Assunto (opcional)",
"VACATION_MESSAGE_LABEL": "Mensagem",
"VACATION_RECIPIENTS_LABEL": "Destinatários (separados por vírgula)",
@ -356,7 +356,7 @@
},
"EDITOR": {
"TEXT_SWITCHER_PLAIN_TEXT": "HTML <-> TEXTO",
"TEXT_SWITCHER_SOURCE": "HTML <-> SOURCE"
"TEXT_SWITCHER_SOURCE": "HTML <-> FONTE"
},
"SETTINGS_LABELS": {
"GENERAL": "Geral",
@ -385,7 +385,7 @@
"SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Geral",
"LANGUAGE": "Idioma",
"HOUR_FORMAT": "Hour format",
"HOUR_FORMAT": "Formato da hora",
"IDENTITY": "Identidade",
"LAYOUT": "Apresentação",
"LAYOUT_NO_SPLIT": "Sem separação",
@ -396,7 +396,7 @@
"EDITOR_PLAIN": "Texto simples",
"VIEW_OPTIONS": "Ver opções",
"USE_PREVIEW_PANE": "Use o painel de pré-visualização",
"HIDE_DELETED_MESSAGES": "Ocultar mensagens marcadas para exclusão",
"HIDE_DELETED_MESSAGES": "Ocultar mensagens marcadas para eliminação",
"USE_CHECKBOXES_IN_LIST": "Apresentar caixas de seleção na lista",
"USE_THREADS": "Usar tópicos de conversa",
"REPLY_SAME_FOLDER": "Colocar respostas na pasta das mensagens a que responde",
@ -404,25 +404,26 @@
"PREFER_HTML_INFO": "Por vezes as mensagens são recebidas em ambos os formatos. Esta opção determina se prefere apresentar o conteúdo em HTML ou em texto simples.",
"REMOVE_COLORS": "Retirar imagens de fundo e coloração de texto do corpo das mensagens",
"MESSAGE_PER_PAGE": "Mensagens por página",
"CHECK_MAIL_INTERVAL": "Check mail interval",
"CHECK_MAIL_INTERVAL": "Intervalo de verificação do correio",
"MARK_MESSAGE_READ_AFTER": "Marcar mensagem como lida após",
"MSG_DEFAULT_ACTION": "Default action",
"MSG_DEFAULT_ACTION": "Ação predefinida",
"SECONDS": "segundos",
"MINUTES": "minutes",
"MINUTES": "minutos",
"NOTIFICATIONS": "Notificações",
"SOUND_NOTIFICATION": "Notificações sonoras",
"CHROME_NOTIFICATION_DESC": "Apresentar notificações para novas mensagens",
"CHROME_NOTIFICATION_DESC_DENIED": "(Bloqueado pelo navegador)",
"COLLAPSE_BLOCKQUOTES": "Collapse quoted text",
"MAX_QUOTE_LEVEL": "Maximum visible quoted text levels",
"LIST_INLINE_ATTACHMENTS": "Show inline attachments in list",
"LIST_SIMPLE_ATTACHMENTS": "Simple attachments list",
"LIST_MESSAGES_GROUPED": "List messages grouped (when sorting by date or from)",
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
"COLLAPSE_BLOCKQUOTES": "Minimizar texto citado",
"MAX_QUOTE_LEVEL": "Níveis máximos de texto citado visíveis",
"LIST_INLINE_ATTACHMENTS": "Mostrar na lista de anexos os anexos integrados no corpo",
"LIST_SIMPLE_ATTACHMENTS": "Lista simples de anexos",
"LIST_MESSAGES_GROUPED": "Agrupar mensagens listadas (quando ordenadas por data ou remetente)",
"EXTERNAL_IMAGES": "Imagens externas",
"IMAGES_OPTION_ASK": "Perguntar sempre",
"IMAGES_OPTION_WHITELIST": "Lista Branca ou perguntar",
"IMAGES_OPTION_DKIM": "Mostrar sempre que DKIM for válido",
"IMAGES_OPTION_ALWAYS": "Mostrar sempre",
"IMAGES_WHITELIST": "Lista Branca de imagens"
},
"SETTINGS_CONTACTS": {
"LABEL_CONTACTS_AUTOSAVE": "Adicionar destinatários automaticamente à sua lista de endereços",
@ -436,7 +437,7 @@
"SETTINGS_THEMES": {
"LEGEND_THEMES": "Temas",
"LABEL_BACKGROUND": "Imagem de fundo",
"LABEL_FONTS": "Fonts",
"LABEL_FONTS": "Tipos de letra",
"BUTTON_UPLOAD_BACKGROUND_IMAGE": "Carregar imagem de fundo (JPG, PNG)",
"ERROR_FILE_IS_TOO_BIG": "Ficheiro muito grande",
"ERROR_FILE_TYPE_ERROR": "Tipo de ficheiro inválido (apenas JPG e PNG)",
@ -457,8 +458,8 @@
"HELP_DELETE_FOLDER": "Eliminar pasta",
"HELP_SHOW_HIDE_FOLDER": "Mostrar\/ocultar pasta",
"HELP_CHECK_FOR_NEW_MESSAGES": "Procurar\/não procurar novas mensagens",
"HIDE_UNSUBSCRIBED": "Esconder pastas não-subscritas",
"UNHIDE_KOLAB_FOLDERS": "Unhide Kolab folders",
"HIDE_UNSUBSCRIBED": "Esconder pastas não subscritas",
"UNHIDE_KOLAB_FOLDERS": "Tonar pastas Kolab visíveis",
"TYPE_CALENDAR": "Calendário",
"TYPE_CONFIGURATION": "Configuração",
"TYPE_CONTACTS": "Contactos",
@ -474,7 +475,7 @@
"BUTTON_ADD_ACCOUNT": "Adicionar uma conta",
"BUTTON_ADD_IDENTITY": "Adicionar uma identidade",
"LOADING_PROCESS": "A atualizar...",
"SHOW_UNREAD": "Show unread messages count"
"SHOW_UNREAD": "Mostrar contador de mensagens não lidas"
},
"SETTINGS_OPENPGP": {
"BUTTON_IMPORT_KEY": "Importar chave",
@ -522,11 +523,11 @@
"LABEL_CLOSE_COMPOSE": "Fechar janela de composição"
},
"NOTIFICATIONS": {
"REQUEST_ERROR": "Request failed",
"REQUEST_ABORTED": "Request is aborted",
"REQUEST_TIMEOUT": "Request timed out",
"REQUEST_ERROR": "A solicitação falhou",
"REQUEST_ABORTED": "A solicitação foi abortada",
"REQUEST_TIMEOUT": "A solicitação expirou",
"INVALID_TOKEN": "Token inválido",
"AUTH_ERROR": "Falha na autenticação",
"AUTH_ERROR": "A autenticação falhou",
"CONNECTION_ERROR": "Não foi possível ligar ao servidor",
"DOMAIN_ALREADY_EXISTS": "O domínio já existe",
"DOMAIN_NOT_ALLOWED": "Este domínio não é permitido",

View file

@ -5,7 +5,7 @@
"SAVE": "Guardar",
"TEST": "Testar",
"UPDATE": "Atualizar",
"USERNAME": "Nome de usuário",
"USERNAME": "Nome de utilizador",
"PASSWORD": "Palavra-passe",
"CANCEL": "Cancelar"
},
@ -42,7 +42,7 @@
"LABEL_ATTACHMENT_SIZE_LIMIT": "Tamanho limite dos anexos",
"LABEL_ALLOW_ADDITIONAL_ACCOUNTS": "Permitir contas adicionais",
"LABEL_ALLOW_IDENTITIES": "Permitir múltiplas identidades",
"ALERT_DATA_ACCESS": "A pasta \"Data\" está acessível. Por favor, configure o seu servidor web para impedir o acesso à pasta \"data\" a partir do exterior. Leia mais aqui:",
"ALERT_DATA_ACCESS": "A pasta \"data\" está acessível. Por favor, configure o seu servidor web para impedir o acesso à pasta \"data\" a partir do exterior. Leia mais aqui:",
"ALERT_WARNING": "Aviso!",
"HTML_ALERT_WEAK_PASSWORD": "Está a usar a palavra-passe de administração predefinida.\n<br>\nPor razões de segurança\n<strong><a href=\"#\/security\">mude<\/a><\/strong>\na palavra-passe agora.\n"
},
@ -65,11 +65,11 @@
"LABEL_ENABLE_CONTACTS": "Ativar contactos",
"LABEL_ALLOW_SYNC": "Permitir sincronização de contactos (com servidor CardDAV externo)",
"LABEL_STORAGE_TYPE": "Tipo",
"LABEL_STORAGE_DSN": "Dsn",
"LABEL_STORAGE_DSN": "Nome da Origem de Dados (DSN)",
"LABEL_STORAGE_USER": "Utilizador",
"LABEL_STORAGE_PASSWORD": "Palavra-passe",
"ALERT_NOTICE": "Aviso!",
"SUGGESTIONS_LIMIT": "Suggestions limit",
"SUGGESTIONS_LIMIT": "Limite de sugestões",
"HTML_ALERT_DO_NOT_USE_THIS_DATABASE": "Não use este tipo de base de dados com uma grande quantidade de utilizadores ativos.",
"HTML_ALERT_DOES_NOT_SUPPORTED": "O seu sistema não suporta contactos.\n<br>\nPrecisa instalar ou ativar a extensão <strong>PDO (SQLite \/ MySQL \/ PostgreSQL)<\/strong> no seu servidor.\n"
},
@ -89,7 +89,7 @@
"LABEL_CURRENT_PASSWORD": "Palavra-passe atual",
"LABEL_NEW_PASSWORD": "Nova palavra-passe",
"LABEL_REPEAT_PASSWORD": "Repetir",
"LABEL_REQUIRE_VERIFICATION": "Obrigar a verificação dos certificados SSL utilizados",
"LABEL_REQUIRE_VERIFICATION": "Exigir a verificação dos certificados SSL",
"LABEL_ALLOW_SELF_SIGNED": "Permitir certificados autoassinados"
},
"TAB_PACKAGES": {
@ -101,7 +101,7 @@
},
"TAB_ABOUT": {
"LEGEND_ABOUT": "Acerca",
"LABEL_TAG_HINT": "Cliente de email moderno e rápido, baseado em tecnologia web",
"LABEL_TAG_HINT": "Cliente de correio web simples, moderno e rápido",
"LABEL_ALL_RIGHTS_RESERVED": "Todos os direitos reservados.",
"HINT_READ_CHANGE_LOG": "Por favor leia a lista de modificações antes de atualizar.",
"HINT_IS_UP_TO_DATE": "SnappyMail está atualizado.",
@ -124,11 +124,11 @@
"LABEL_SERVER": "Servidor",
"LABEL_PORT": "Porta",
"LABEL_SECURE": "Segurança",
"TIMEOUT": "Timeout",
"DISABLE_CAPABILITIES": "Disable capabilities",
"LIMITS": "Limits",
"FOLDERS": "Folders",
"MESSAGES": "Messages",
"TIMEOUT": "Tempo de espera",
"DISABLE_CAPABILITIES": "Desativar capacidades",
"LIMITS": "Limites",
"FOLDERS": "Pastas",
"MESSAGES": "Mensagens",
"LABEL_WHITE_LIST": "Lista Branca",
"SECURE_OPTION_NONE": "Nenhuma",
"LABEL_ALLOW_SIEVE_SCRIPTS": "Permitir scripts sieve",
@ -165,11 +165,11 @@
"UNKNOWN_ERROR": "Erro desconhecido"
},
"NOTIFICATIONS": {
"REQUEST_ERROR": "Request failed",
"REQUEST_ABORTED": "Request is aborted",
"REQUEST_TIMEOUT": "Request timed out",
"REQUEST_ERROR": "A solicitação falhou",
"REQUEST_ABORTED": "A solicitação foi abortada",
"REQUEST_TIMEOUT": "A solicitação expirou",
"INVALID_TOKEN": "Token inválido",
"AUTH_ERROR": "Falha na autenticação",
"AUTH_ERROR": "A autenticação falhou",
"DOMAIN_ALREADY_EXISTS": "O domínio já existe",
"CANT_SAVE_PLUGIN_SETTINGS": "Não é possível guardar as definições",
"CANT_INSTALL_PACKAGE": "Não foi possível instalar a extensão",

View file

@ -1,9 +1,9 @@
{
"BACK_LINK": "Recarregar",
"NO_SCRIPT_TITLE": "É necessário JavaScript para esta aplicação.",
"NO_SCRIPT_DESC": "O suporte de JavaScript não está disponível no seu navegador.\nPor favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente.\n",
"NO_SCRIPT_DESC": "O suporte de JavaScript não está disponível no seu navegador.\nPor favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente.",
"NO_COOKIE_TITLE": "É necessário suporte de Cookies para esta aplicação.",
"NO_COOKIE_DESC": "O suporte de Cookies não está disponível no seu navegador.\nPor favor ative o suporte de Cookies nas definições do seu navegador e tente novamente.\n",
"NO_COOKIE_DESC": "O suporte de Cookies não está disponível no seu navegador.\nPor favor ative o suporte de Cookies nas definições do seu navegador e tente novamente.",
"BAD_BROWSER_TITLE": "O seu navegador está desatualizado.",
"BAD_BROWSER_DESC": "Para usar todas as funções da aplicação,\ntransfira e instale um destes navegadores:\n"
"BAD_BROWSER_DESC": "Para usar todas as funções da aplicação,\ntransfira e instale um navegador recente."
}

View file

@ -22,10 +22,10 @@
"NOT_SPAM": "Não é spam",
"USERNAME": "Nome de usuário",
"PASSWORD": "Palavra-passe",
"REMEMBER": "Remember",
"REMEMBER": "Lembrar",
"REPLY_TO": "Resp.-Para",
"SAVE": "Guardar",
"SAVE_CHANGES": "Save changes?",
"SAVE_CHANGES": "Guardar alterações?",
"SEARCH": "Pesquisar",
"SPAM": "Spam",
"SUBJECT": "Assunto",
@ -34,7 +34,7 @@
"SERVER_MESSAGE": "Mensagem do servidor",
"YES": "Sim",
"NO": "Não",
"INACTIVE": "Inactive",
"INACTIVE": "Inativo",
"DEFAULT": "predefinida",
"HELP": "Ajuda"
},
@ -152,7 +152,7 @@
"SPAM_SCORE": "Pontuação de Spam",
"HAS_VIRUS_WARNING": "AVISO: vírus detetado",
"TAGS": "Marcadores",
"NEW_TAG": "New tag"
"NEW_TAG": "Novo marcador"
},
"MESSAGE_TAGS": {
"$important": "Importante",
@ -171,17 +171,17 @@
"SEARCHING_DESC": "A pesquisar..."
},
"CONTACTS": {
"TAB_CONTACT": "Contact",
"TAB_LOCATIONS": "Locations",
"TAB_BUSINESS": "Business",
"LABEL_ORGANIZATION": "Organization",
"LABEL_DEPARTMENT": "Department",
"LABEL_TITLE": "Title",
"TAB_CRYPTO": "Crypto",
"ASK": "Ask",
"NEVER": "Never",
"ALWAYS": "Always",
"ALWAYS_IF_POSSIBLE": "Always if possible",
"TAB_CONTACT": "Contactos",
"TAB_LOCATIONS": "Localizações",
"TAB_BUSINESS": "Empresa",
"LABEL_ORGANIZATION": "Empresa",
"LABEL_DEPARTMENT": "Departamento",
"LABEL_TITLE": "Cargo",
"TAB_CRYPTO": "Criptografia",
"ASK": "Perguntar",
"NEVER": "Nunca",
"ALWAYS": "Sempre",
"ALWAYS_IF_POSSIBLE": "Sempre que possível",
"BUTTON_ADD_CONTACT": "Adicionar contacto",
"BUTTON_CREATE_CONTACT": "Criar",
"BUTTON_UPDATE_CONTACT": "Atualizar",
@ -203,7 +203,7 @@
"ADD_MENU_NICKNAME": "Alcunha",
"ADD_MENU_NOTE": "Notas",
"ADD_MENU_PHONE": "Telefone",
"ADD_MENU_URL": "URL",
"ADD_MENU_URL": "Website",
"ADD_MENU_ADDRESS": "Morada",
"ADD_MENU_BIRTHDAY": "Aniversário",
"ADD_MENU_TAGS": "Marcadores",
@ -226,18 +226,18 @@
"NO_ATTACHMENTS_HERE_DESC": "Sem anexos aqui.",
"ATTACHMENTS_ERROR_DESC": "Aviso! Nem todos os anexos foram carregados.",
"ATTACHMENTS_UPLOAD_ERROR_DESC": "Ainda não foram carregados todos os anexos",
"ALLOW_SPELLCHECK": "Enable browser spelling checker",
"ALLOW_SPELLCHECK": "Ativar corretor ortográfico do navegador",
"BUTTON_REQUEST_READ_RECEIPT": "Pedir um recibo de leitura",
"BUTTON_MARK_AS_IMPORTANT": "Marcar como importante",
"BUTTON_REQUEST_DSN": "Pedir um recibo de entrega",
"BUTTON_REQUIRE_TLS": "Require secure delivery"
"BUTTON_REQUIRE_TLS": "Exigir entrega segura"
},
"POPUPS_ASK": {
"DESC_WANT_CLOSE_THIS_WINDOW": "Tem a certeza de que quer fechar esta janela?",
"DESC_WANT_DELETE_MESSAGES": "Tem a certeza de que quer eliminar a(s) mensagem(s)?"
},
"POPUPS_LANGUAGES": {
"TITLE_LANGUAGES": "Escolha o idioma"
"TITLE_LANGUAGES": "Escolha o seu idioma"
},
"POPUPS_ADD_ACCOUNT": {
"TITLE_ADD_ACCOUNT": "Adicionar conta?",
@ -316,7 +316,7 @@
"MARK_AS_READ_LABEL": "Marcar como lida",
"REPLY_INTERVAL_LABEL": "Intervalo de resposta (dias)",
"KEEP_LABEL": "Manter",
"STOP_LABEL": "Stop further processing of rules",
"STOP_LABEL": "Interromper o processamento das regras",
"VACATION_SUBJECT_LABEL": "Assunto (opcional)",
"VACATION_MESSAGE_LABEL": "Mensagem",
"VACATION_RECIPIENTS_LABEL": "Destinatários (separados por vírgula)",
@ -356,16 +356,16 @@
},
"EDITOR": {
"TEXT_SWITCHER_PLAIN_TEXT": "HTML <-> TEXTO",
"TEXT_SWITCHER_SOURCE": "HTML <-> SOURCE"
"TEXT_SWITCHER_SOURCE": "HTML <-> FONTE"
},
"SETTINGS_LABELS": {
"GENERAL": "General",
"CONTACTS": "Contacts",
"FOLDERS": "Folders",
"ACCOUNTS": "Accounts",
"FILTERS": "Filters",
"SECURITY": "Security",
"THEMES": "Themes"
"GENERAL": "Geral",
"CONTACTS": "Contactos",
"FOLDERS": "Pastas",
"ACCOUNTS": "Contas",
"FILTERS": "Filtros",
"SECURITY": "Segurança",
"THEMES": "Temas"
},
"SETTINGS_FILTERS": {
"SIMPLE": "Simples",
@ -385,7 +385,7 @@
"SETTINGS_GENERAL": {
"LEGEND_GENERAL": "Geral",
"LANGUAGE": "Idioma",
"HOUR_FORMAT": "Hour format",
"HOUR_FORMAT": "Formato da hora",
"IDENTITY": "Identidade",
"LAYOUT": "Apresentação",
"LAYOUT_NO_SPLIT": "Sem separação",
@ -396,7 +396,7 @@
"EDITOR_PLAIN": "Texto simples",
"VIEW_OPTIONS": "Ver opções",
"USE_PREVIEW_PANE": "Use o painel de pré-visualização",
"HIDE_DELETED_MESSAGES": "Ocultar mensagens marcadas para exclusão",
"HIDE_DELETED_MESSAGES": "Ocultar mensagens marcadas para eliminação",
"USE_CHECKBOXES_IN_LIST": "Apresentar caixas de seleção na lista",
"USE_THREADS": "Usar tópicos de conversa",
"REPLY_SAME_FOLDER": "Colocar respostas na pasta das mensagens a que responde",
@ -404,25 +404,26 @@
"PREFER_HTML_INFO": "Por vezes as mensagens são recebidas em ambos os formatos. Esta opção determina se prefere apresentar o conteúdo em HTML ou em texto simples.",
"REMOVE_COLORS": "Retirar imagens de fundo e coloração de texto do corpo das mensagens",
"MESSAGE_PER_PAGE": "Mensagens por página",
"CHECK_MAIL_INTERVAL": "Check mail interval",
"CHECK_MAIL_INTERVAL": "Intervalo de verificação do correio",
"MARK_MESSAGE_READ_AFTER": "Marcar mensagem como lida após",
"MSG_DEFAULT_ACTION": "Default action",
"MSG_DEFAULT_ACTION": "Ação predefinida",
"SECONDS": "segundos",
"MINUTES": "minutes",
"MINUTES": "minutos",
"NOTIFICATIONS": "Notificações",
"SOUND_NOTIFICATION": "Notificações sonoras",
"CHROME_NOTIFICATION_DESC": "Apresentar notificações para novas mensagens",
"CHROME_NOTIFICATION_DESC_DENIED": "(Bloqueado pelo navegador)",
"COLLAPSE_BLOCKQUOTES": "Collapse quoted text",
"MAX_QUOTE_LEVEL": "Maximum visible quoted text levels",
"LIST_INLINE_ATTACHMENTS": "Show inline attachments in list",
"LIST_SIMPLE_ATTACHMENTS": "Simple attachments list",
"LIST_MESSAGES_GROUPED": "List messages grouped (when sorting by date or from)",
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
"COLLAPSE_BLOCKQUOTES": "Minimizar texto citado",
"MAX_QUOTE_LEVEL": "Níveis máximos de texto citado visíveis",
"LIST_INLINE_ATTACHMENTS": "Mostrar na lista de anexos os anexos integrados no corpo",
"LIST_SIMPLE_ATTACHMENTS": "Lista simples de anexos",
"LIST_MESSAGES_GROUPED": "Agrupar mensagens listadas (quando ordenadas por data ou remetente)",
"EXTERNAL_IMAGES": "Imagens externas",
"IMAGES_OPTION_ASK": "Perguntar sempre",
"IMAGES_OPTION_WHITELIST": "Lista Branca ou perguntar",
"IMAGES_OPTION_DKIM": "Mostrar sempre que DKIM for válido",
"IMAGES_OPTION_ALWAYS": "Mostrar sempre",
"IMAGES_WHITELIST": "Lista Branca de imagens"
},
"SETTINGS_CONTACTS": {
"LABEL_CONTACTS_AUTOSAVE": "Adicionar destinatários automaticamente à sua lista de endereços",
@ -436,7 +437,7 @@
"SETTINGS_THEMES": {
"LEGEND_THEMES": "Temas",
"LABEL_BACKGROUND": "Imagem de fundo",
"LABEL_FONTS": "Fonts",
"LABEL_FONTS": "Tipos de letra",
"BUTTON_UPLOAD_BACKGROUND_IMAGE": "Carregar imagem de fundo (JPG, PNG)",
"ERROR_FILE_IS_TOO_BIG": "Ficheiro muito grande",
"ERROR_FILE_TYPE_ERROR": "Tipo de ficheiro inválido (apenas JPG e PNG)",
@ -457,8 +458,8 @@
"HELP_DELETE_FOLDER": "Eliminar pasta",
"HELP_SHOW_HIDE_FOLDER": "Mostrar\/ocultar pasta",
"HELP_CHECK_FOR_NEW_MESSAGES": "Procurar\/não procurar novas mensagens",
"HIDE_UNSUBSCRIBED": "Esconder pastas não-subscritas",
"UNHIDE_KOLAB_FOLDERS": "Unhide Kolab folders",
"HIDE_UNSUBSCRIBED": "Esconder pastas não subscritas",
"UNHIDE_KOLAB_FOLDERS": "Tonar pastas Kolab visíveis",
"TYPE_CALENDAR": "Calendário",
"TYPE_CONFIGURATION": "Configuração",
"TYPE_CONTACTS": "Contactos",
@ -474,7 +475,7 @@
"BUTTON_ADD_ACCOUNT": "Adicionar uma conta",
"BUTTON_ADD_IDENTITY": "Adicionar uma identidade",
"LOADING_PROCESS": "A atualizar...",
"SHOW_UNREAD": "Show unread messages count"
"SHOW_UNREAD": "Mostrar contador de mensagens não lidas"
},
"SETTINGS_OPENPGP": {
"BUTTON_IMPORT_KEY": "Importar chave",
@ -522,11 +523,11 @@
"LABEL_CLOSE_COMPOSE": "Fechar janela de composição"
},
"NOTIFICATIONS": {
"REQUEST_ERROR": "Request failed",
"REQUEST_ABORTED": "Request is aborted",
"REQUEST_TIMEOUT": "Request timed out",
"REQUEST_ERROR": "A solicitação falhou",
"REQUEST_ABORTED": "A solicitação foi abortada",
"REQUEST_TIMEOUT": "A solicitação expirou",
"INVALID_TOKEN": "Token inválido",
"AUTH_ERROR": "Falha na autenticação",
"AUTH_ERROR": "A autenticação falhou",
"CONNECTION_ERROR": "Não foi possível ligar ao servidor",
"DOMAIN_ALREADY_EXISTS": "O domínio já existe",
"DOMAIN_NOT_ALLOWED": "Este domínio não é permitido",

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -421,6 +421,7 @@
"EXTERNAL_IMAGES": "External images",
"IMAGES_OPTION_ASK": "Always ask",
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
"IMAGES_OPTION_DKIM": "Show always when DKIM is valid",
"IMAGES_OPTION_ALWAYS": "Show always",
"IMAGES_WHITELIST": "Images whitelist"
},

View file

@ -279,8 +279,19 @@
</span>
</div>
<div class="showImages" data-bind="visible: message().hasImages(), click: showImages"
data-icon="🖼" data-i18n="MESSAGE/BUTTON_SHOW_IMAGES"></div>
<div class="showImages" data-bind="visible: message().hasImages()">
<div class="btn" data-bind="click: showImages" data-icon="🖼" data-i18n="MESSAGE/BUTTON_SHOW_IMAGES"></div>
<div class="btn-group" data-bind="registerBootstrapDropdown: true" style="display: inline-block">
<a class="btn dropdown-toggle" id="whitelist-dropdown-id" data-icon="🖼" href="#" tabindex="-1"><span data-i18n="SETTINGS_GENERAL/IMAGES_WHITELIST"></span></a>
<menu class="dropdown-menu right-edge" role="menu" aria-labelledby="whitelist-dropdown-id">
<!-- ko foreach: message().whitelistOptions() -->
<li role="presentation">
<a href="#" tabindex="-1" data-bind="click: $root.whitelistText, text: $data"></a>
</li>
<!-- /ko -->
</menu>
</div>
</div>
</div>
<div class="openpgp-control encrypted" data-bind="visible: message().pgpEncrypted(), css: {'success': message().pgpDecrypted()}">

View file

@ -231,6 +231,7 @@
<select data-bind="value: viewImages">
<option value="ask" data-i18n="SETTINGS_GENERAL/IMAGES_OPTION_ASK"></option>
<option value="match" data-i18n="SETTINGS_GENERAL/IMAGES_OPTION_WHITELIST"></option>
<option value="dkim" data-i18n="SETTINGS_GENERAL/IMAGES_OPTION_DKIM"></option>
<option value="always" data-i18n="SETTINGS_GENERAL/IMAGES_OPTION_ALWAYS"></option>
</select>
</div>

View file

@ -4,6 +4,7 @@
--main-color: #333;
--main-bg-color: #48525C;
--main-bg-image: url("images/background.jpg");
--main-bg-size: cover;
/* LOADING */
--loading-color: #fff;

View file

@ -4,6 +4,7 @@
--main-color: #333;
--main-bg-color: #B3274E;
--main-bg-image: url("images/background.jpg");
--main-bg-size: cover;
/* LOADING */
--loading-color: #fff;

View file

@ -4,6 +4,7 @@
--main-color: #333;
--main-bg-color: #48525C;
--main-bg-image: url("images/background.jpg");
--main-bg-size: cover;
/* LOADING */
--loading-color: #fff;

View file

@ -6,6 +6,7 @@
--main-color: #fff;
--main-bg-color: #48525C;
--main-bg-image: url("images/background.jpg");
--main-bg-size: cover;
/* LOADING */
--loading-color: #ddd;

View file

@ -4,6 +4,7 @@
--main-color: #333;
--main-bg-color: #010101;
--main-bg-image: url("images/background.jpg");
--main-bg-size: cover;
/* LOADING */
--loading-color: #fff;

View file

@ -1,5 +1,7 @@
:root {
color-scheme: light;
/* MAIN */
--main-color: #333;
--main-bg-color: #e3e3e3;
@ -103,6 +105,3 @@
--smDialogShrink: 20px;
--smMainShadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.rl-mobile {
--smDialogShrink: 50px;
}